Jump to content


Octavarium

เป็นสมาชิกตั้งแต่ 7 กุมภาพันธ์ 2555
ออฟไลน์ เข้าใช้งานครั้งล่าสุด: 15 กรกฎาคม 2557 23:24
-----

#296037 จากก้นบึ้งของหัวใจ ... ฝากให้พี่น้องไทยทุกคนเอาไปคิด

โดย Octavarium on 13 มิถุนายน พ.ศ. 2555 - 16:23

ก่อนอื่นต้องคอยดูว่าหลังจากสิ้นทักษิณแล้ว พวกแนวร่วมระดับแกนนำคนอื่นๆมันจะยอมจบหรือไม่ ลำพังชาวบ้านธรรมดาที่เป็นเสื้อแดงคงไม่มีใครคิดจะไปทำอะไรพวกเขาต่อหรอกครับ อภัยกันได้

แต่...ไอ้พวกตัวเป้งๆทั้งหลายน่ะ ผมว่าไม่ควรปล่อยไปเป็นเชื้อในวันข้างหน้าจะรักษาโรคร้ายก็ควรให้มันหายขาด จัดการไปตามกฏหมาย อย่านิรโทษให้พวกแกนนำ
ดูอย่างพวกหัวคอมมิวนิสต์สมัยก่อนสิครับ ทุกวันนี้มันเป็น สส. นักวิชาการ หรือเป็นอาจารย์มหาลัยคอยล้างสมองเด็กรุ่นใหม่อยู่ทุกวัน ก็ไม่ใช่เพราะเหลือเชื้อร้ายเอาไว้หรือครับ

พวกนี้ ควรดำเนินคดีต่อ ถ้ามันยอมเข้าสู่กระบวนการยุติธรรมน่ะนะ รับโทษตามกฏหมายแล้วก็ค่อยให้อภัยกัน
อยู่ๆจะบอกให้แล้วๆกันไปโดยที่พวกมันยังไม่หยุดพฤติกรรมชั่ว มันไม่ใช่แล้วครับ จะจบได้พวกมันต้องหยุดก่อน

“Great danger lies in the notion that we can reason with evil


#258334 มีคำคมอะไรกันบ้าง ขอหน่อย

โดย Octavarium on 17 พฤษภาคม พ.ศ. 2555 - 23:43

All that is necessary for the triumph of evil is that good men do nothing.

สิ่งที่คนชั่วคนชั่วต้องการเพื่อให้ได้มาซึ่งชัยชนะ ก็คือให้คนดีอยู่เฉยๆไม่ทำอะไรเลย


#169133 สถาบันไหนที่สอนการสร้างคอมฯ เรียนเชิญคุณตะกวด โคฉาด

โดย Octavarium on 7 มีนาคม พ.ศ. 2555 - 19:42

Flowchart นี่ใช้แค่ตอนสอบสมัยเรียน com sci สิบกว่าปีก่อน เอาเข้าจริงไม่เคยได้ใช้งานมันอีกเลย
ใครจะมาว่างนั่งเขียน flow ให้เสียเวลา เหมือนอย่างที่มีคนว่า เอาแค่คอมเม้นท์ก็ยังไม่ค่อยเขียนกันเลย

พวกที่ไม่รู้เรื่องพออ่านคำว่า low level language คงจะนึกว่ามันง่ายละมั้งครับเลยนึกไปเองว่าภาษา C
(หรือจะรวม assembly) เป็นภาษาเด็กๆ
ผมไม่ได้เรียนวิศวะฯ เลยไม่รู้ลึกถึงระดับวงจรของ hardware แต่ภาษา assembly ที่ผมชื่นชอบเอง
ก็เกือบจะเป็นการสื่อสารโดยตรงกับ CPU เหมือนกัน เพียงแต่ว่าจริงๆแล้วคำสั่งมันไม่ได้เป็นเลข
ฐานสองเหมือนที่หลายคนเข้าใจ รูปแบบการแปลงคำสั่ง (instruction set) จาก assembly เป็นคำสั่งของ CPU
จะแตกต่างกันไปตามแต่ชนิดของ CPU (Intel+AMD, ARM หรือพวก Mac จะมีชุดคำสั่งของตัวเองเอามาใช้แทนกันไม่ได้)
แต่ภาษาระดับสูงบางตัวจะเป็น cross platform คือสามารถใช้ได้บนหลาย CPU เพียงแต่ต้องเอาไป compile ใหม่

Flowchart ไม่ได้เกี่ยวอะไรเลย ลองดู code ที่ผมงัดเอามาจากในโปรเจคเล็กๆนี่ดูก็ได้ว่า
โปรเจคที่ใหญ่ๆกว่านี้มันจะมานั่งเขียนโฟลวไหวมั้ย

(sync เวลาคอมของเราให้ตรงกับกับเซิฟเวอร์)

.const

fixpoint64 struct
int_part DWORD ?
fraction DWORD ?
fixpoint64 ends

fixpoint32 struct
int_part WORD ?
fraction WORD ?
fixpoint32 ends

NTP_DATA struct
	LI_VN_Mode  BYTE ?
	Stratum   BYTE ?
	Poll   BYTE ?
	Precision  BYTE ?
	RootDelay  fixpoint32 <>
	RootDispersion fixpoint32 <>
	ReferenceIdentifier DWORD ?
	ReferenceTimestamp fixpoint64 <>
	OriginateTimestamp fixpoint64 <>
	ReceiveTimestamp fixpoint64 <>
	TransmitTimestamp fixpoint64 <>
NTP_DATA ends

.data?

remotetime SYSTEMTIME <?>

.code

GetTimeFromNTP PROC uses ebx esi szServer:DWORD, lpTime:DWORD
LOCAL wsadata:WSADATA
LOCAL Socket:SOCKET
LOCAL ip:sockaddr_in
LOCAL sz[SIZEOF NTP_DATA]:CHAR
LOCAL ipLen:DWORD
LOCAL ntpRequest:NTP_DATA
LOCAL ntp:NTP_DATA
LOCAL qw:QWORD
LOCAL syst:SYSTEMTIME
LOCAL base:SYSTEMTIME
LOCAL ipname:DWORD
LOCAL txtbuff[128]:BYTE

xor ebx, ebx
mov ipname, 0
Invoke WSAStartup,2,ADDR wsadata
mov Socket, rv(socket,AF_INET,SOCK_DGRAM,0)
.if (Socket!=INVALID_SOCKET)
  Invoke gethostbyname, CTXT("time1.nimt.or.th") ;szServer
  .if (eax)
   mov esi,eax
   .if ([esi].hostent.h_list)
	mov eax,[esi].hostent.h_list
	mov eax,[eax]
	.if (eax)
	 mov esi,[eax]
	 Invoke inet_ntoa,esi
	 mov ipname, eax
	 Invoke lstrcat, eax, CTXT(":123")
	 Invoke RtlZeroMemory,ADDR ip,SIZEOF ip
	 mov ip.sin_family,AF_INET
	 mov ip.sin_port,123 SHL 8
	 mov ip.sin_addr.S_un.S_addr,esi
	
	 Invoke connect,Socket,ADDR ip,SIZEOF ip
	
	 Invoke RtlZeroMemory,ADDR ntpRequest,SIZEOF ntpRequest
	 mov ntpRequest.LI_VN_Mode,(4 SHL 3) OR 3  ; version 4, mode = 3 = client
	
	 .if rv(sendto,Socket,ADDR ntpRequest,SIZEOF ntpRequest,0,ADDR ip,SIZEOF ip) != SOCKET_ERROR
	  mov ipLen,SIZEOF ip
	  .if rv(recvfrom,Socket,ADDR ntp,SIZEOF ntp,0,ADDR ip,ADDR ipLen) != SOCKET_ERROR
	   lea esi,ntp
	  
	   mov eax,[esi].NTP_DATA.TransmitTimestamp.int_part
	   bswap eax
	   mov [esi].NTP_DATA.TransmitTimestamp.int_part,eax
	   mov eax,[esi].NTP_DATA.TransmitTimestamp.fraction
	   bswap eax
	   mov [esi].NTP_DATA.TransmitTimestamp.fraction,eax
	   finit
	   m2m DWORD ptr qw[0],[esi].NTP_DATA.TransmitTimestamp.fraction
	   m2m DWORD ptr qw[4],0
	   fild qw
	   mov DWORD ptr qw[0],0
	   mov DWORD ptr qw[4],1
	   fild qw
	   fdivp st(1),st
	   m2m DWORD ptr qw[0],[esi].NTP_DATA.TransmitTimestamp.int_part
	   m2m DWORD ptr qw[4],0
	   fild qw
	   faddp st(1),st
	   mov base.wYear,1900
	   mov base.wMonth,1
	   mov base.wDay,1
	   mov base.wHour,0
	   mov base.wMinute,0
	   mov base.wSecond,0
	   mov base.wMilliseconds,0
	  
	   Invoke SystemTimeToFileTime,ADDR base,ADDR qw
	  
	   fmul FP8(1.0E7)
	   fild qw
	   faddp st(1),st
	   fistp qw
	  
	   Invoke FileTimeToLocalFileTime,ADDR qw,ADDR qw
	   Invoke FileTimeToSystemTime,ADDR qw,ADDR syst
	   Invoke MemCopy, ADDR syst, lpTime, SIZEOF SYSTEMTIME
	  
	   Invoke wsprintf, ADDR txtbuff, CTXT("%02lu/%02lu/%04lu  %02lu:%02lu:%02lu.%03lu"), syst.wDay,syst.wMonth,syst.wYear,syst.wHour,syst.wMinute,syst.wSecond,syst.wMilliseconds
	   mov bl, 0
	  .else
	   mov bl, -4
	  .endif
	 .else
	  mov bl, -3
	 .endif
	.else
	 mov bl, -5
	.endif
   .else
	mov bl, -6
   .endif
  .else
   mov bl, -2
  .endif
  Invoke closesocket,Socket
.else
  mov bl, -1
.endif
Invoke WSACleanup
lea edx, txtbuff
lea ecx, syst
movsx eax, bl
ret
GetTimeFromNTP endp

SyncTimeWithNTP PROC uses ebx edi esi
LOCAL hProcessToken:DWORD
LOCAL lpTime:DWORD
LOCAL TP_NEW:TOKEN_PRIVILEGES
Invoke CalculateHash
Invoke GetTimeFromNTP,CTXT("time1.nimt.or.th"), OFFSET remotetime
.if (eax==0)
  mov ebx, edx
  Invoke wsprintf, OFFSET WTF0, CTXT("Response from time1.nimt.or.th is ""%s"".",13), ebx
		Invoke LookupPrivilegeValue, NULL, CTXT("SeSystemtimePrivilege"), ADDR TP_NEW.Privileges.Luid
		mov TP_NEW.Privileges.Attributes, SE_PRIVILEGE_ENABLED
		mov TP_NEW.PrivilegeCount, 1
		Invoke GetCurrentProcess
  mov edx, eax
  Invoke OpenProcessToken, edx, TOKEN_ALL_ACCESS, ADDR hProcessToken
		Invoke AdjustTokenPrivileges, hProcessToken, FALSE, ADDR TP_NEW, NULL, NULL, NULL
  Invoke SetLocalTime, OFFSET remotetime
  mov TP_NEW.Privileges.Attributes, SE_PRIVILEGE_REMOVED
  mov TP_NEW.PrivilegeCount, 1
  Invoke AdjustTokenPrivileges, hProcessToken, FALSE, ADDR TP_NEW, NULL, NULL, NULL
  Invoke UpdateMessageLog, hCBSystem, 1, 00444444h, OFFSET WTF0
.elseif (eax==-1)
  Invoke UpdateMessageLog, hCBSystem, 1, 00000080h, CTXT("Failed create socket.",13)
.elseif (eax==-2)
  Invoke UpdateMessageLog, hCBSystem, 1, 00000080h, CTXT("Failed to resolve time server.",13)
.elseif (eax==-3)
  Invoke UpdateMessageLog, hCBSystem, 1, 00000080h, CTXT("Error calling sendto() function.",13)
.elseif (eax==-4)
  Invoke UpdateMessageLog, hCBSystem, 1, 00000080h, CTXT("Error calling recvfrom() function.",13)
.else
  Invoke UpdateMessageLog, hCBSystem, 1, 00000080h, CTXT("Internal error.",13)
.endif
ret
SyncTimeWithNTP ENDP