|
Random Number
random number หรือ ตัวเลขสุ่ม คือตัวเลขที่สร้างขึ้นมา โดยไม่มีรูปแบบหรือลำดับแน่นอน มีลักษณะเหมือนการสุ่ม คือเป็นเลขมั่วๆ
random number แบ่งได้เป็น 2 แบบ คือ แบบที่เกิดในธรรมชาติ ควบคุมและทำนายไม่ได้ กับแบบที่มนุษย์คำนวนขึ้นมาเอง
แบบที่เกิดในธรรมชาติ ตัวอย่างเช่น
noise ทั้งหลาย thermal noise ในสารกึ่งตัวนำ การแผ่รังสีจากสารกัมมันตภาพรังสี สัณญาณวิทยุจากชั้นบรรยากาศ บางทีเรียก random number แบบนี้ว่าเป็น true random number เพราะมันทำนายไม่ได้ ถือเป็นเลขสุ่มอย่างแท้จริง
แบบที่มนุษย์คำนวนขึ้นมาเอง เป็นการใช้ algorithm ทาง math ทำการคำนวนเพื่อให้ได้ตัวเลขที่ดูเหมือนสุ่ม เรียกว่าเป็นเลขสุ่มอย่างเทียม pseudorandom number algorithm ที่ใช้ทำ pseudorandom number มีด้วยกันหลายตัว แต่ที่ใช้กันแพร่หลายที่สุดคือ linear congruential generator ใน entry นี้จะยกตัวอย่างของ linear congruential generator มาให้ดูกันครับ
linear congruential generator เป็นการสร้างตัวเลขสุ่มโดยใช้สมการดังนี้ Xn+1 = (aXn + c) mod m เมื่อ a, c และ m เป็นค่าคงที่ และ mod m คือการหาเศษเหลือจากการหารด้วย m
ตัวเลขสุ่มที่ได้จากสมการนี้คือค่าของ Xn+1 จะเป็นผลมาจากค่าของตัวเลขสุ่มตัวก่อนหน้า Xn เรียกได้ว่าเลขสุ่มแต่ละตัวจะเป็นผลมาจากเลขสุ่มตัวก่อนหน้า เลขสุ่มตัวแรกคือ X1 ส่วน X0 เป็นค่าเริ่มต้น เรียกว่า seed ลักษณะที่สำคัญของ linear congruential generator คือ ถ้าเริ่มต้นที่ seed เดียวกัน จะได้ชุดตัวเลขสุ่มออกมาเหมือนเดิมทุกครั้ง
คุณภาพของตัวเลขสุ่ม ที่ได้จาก linear congruential generator จะขึ้นอยู่กับการเลือกค่าคงที่ a, c และ m การวิเคราะห์ว่าควรเลือกค่าคงที่พวกนี้อย่างไร เป็นเรื่องปวดหัวสำหรับผมมาก เพราะจะไม่ค่อยรู้เรื่องครับ
เอาเป็นว่าถ้าใครสนใจอยากรู้ว่า เค้าเลือกค่ากันยังไง ก็ลองอ่านหนังสือของ Donald E. Knuth เรื่อง The Art of Computer Programming เล่มที่สอง chapter ที่สามเรื่อง Random numbers ดู หรือจะค้นจาก net ก็มี paper ให้อ่านมากมาย
เรามาดูที่เค้าเลือกไว้แล้วดีกว่า
ตัวอย่างแรกมาจากหนังสือ The C Programming Language Brian W. Kernighan Dennis M. Ritchie ใน chapter ที่สอง หัวข้อ 2.7 Type Conversions unsigned long int next = 1; /* rand: return pseudo-random integer on 0..32767 */ int rand(void) { next = next * 1103515245 + 12345; return (unsigned int)(next/65536) % 32768; } /* srand: set seed for rand() */ void srand(unsigned int seed) { next = seed; }
ในตัวอย่างด้านบน ตรงที่ next = next * 1103515245 + 12345; ดูคล้ายกับจะเป็น linear congruential โดยมี a = 1103515245 c = 12345 แต่ไม่มีการ mod ด้วย m จริงๆแล้ว มันมีการ mod อยู่ด้วย แต่เป็นการ mod แบบอัตโนมัติครับ
มาดูว่า mod แบบอัตโนมัติหมายความว่าอย่างไร สมมุติเรามี variable x เป็น unsigned short มีขนาด 16 bits ค่าสูงสุดของ 16 bits คือ 0xFFFF หรือ 65535 ไม่ว่าเราจะทำอะไรกับ x ก็ตาม เช่น เอาไปบวกหนึ่งหรือคูณล้าน เช่น unsigned short x = 123; x = x + 1; x = x * 1000000; ค่าที่เกิน 16 bits ก็ล้นออกไป สุดท้าย x ก็มีค่าไม่เกิน 16 bits และไม่เกินค่าสูงสุดของ 16 bits คือ 0xFFFF อยู่ดี เทียบเท่ากับเอา x ไป mod กับค่าสูงสุด+1 (0x10000) ดังนั้นสอง statement ด้านบน ก็เหมือนกับ x = (x +1) % 0x10000; x = (x * 1000000) % 0x10000; สรุปว่า ไม่ว่าเราจะทำอะไรกับ variable ก็จะเหมือนมี mod อยู่ด้วยเสมอ คือ mod ด้วย ค่าสูงสุดของ variable บวกหนึ่ง เป็น mod แบบอัตโนมัติ
กลับมาที่ตัวอย่างของเรา variable next มี type เป็น unsigned long ค่าสูงสุดของ unsigned long คือ ULONG_MAX สามารถดูได้จาก file limits.h ถ้า unsigned long มีขนาด 32 bits ULONG_MAX จะเท่ากับ 0xFFFFFFFF หรือ 4294967295
สรุปว่า next = next * 1103515245 + 12345; เป็น linear congruential ที่มี a = 1103515245 c = 12345 m = 4294967296
ส่วนตรง return (unsigned int)(next/65536) % 32768 เป็นแค่การเลือกค่าบาง bit ไปใช้ next/65536 จะเทียบเท่ากับการ shift bit next>>16
ส่วน % 32768 ถึงเป็นการ mod แต่ผลที่ได้เป็นการเลือกค่าเฉพาะ 15 bits ซึ่งเทียบเท่ากับการ and & 0x7FFF หรือ & 32767
สรุปว่า return (unsigned int)(next/65536) % 32768 เป็นการ shift bit ลงมา 16 bits แล้วเลือกเอาแค่ 15 bits
ขอออกนอกเรื่องหน่อยนะครับ เรื่อง การหาร กลายเป็น shift bit และ mod กลายเป็น and อย่างที่อธิบายไปนี่ compiler อาจจะทำให้เอง เป็นส่วนหนึ่งของการ optimize เวลา compile เพราะการคูณและการหารเป็น operation ที่ใช้เวลานาน โดยเฉพาะการหาร จะใช้เวลานานกว่า operation อื่น ดังนั้นถ้ามีช่องทาง compiler ก็จะพยายาม optimize ให้ ลองดู ตัวอย่าง #include <stdio.h> unsigned long next = 1; unsigned int random() { next = next * 1103515245 + 12345; return (unsigned int)(next/65536) % 32768; } int main() { printf("%d",random()); return 0; }
ตัวอย่างด้านบนถ้าไป compile ด้วย Visual C++ 6.0 โดยเลือก option ให้ compiler สร้าง assembly ด้วย ไปที่ Project Settings เลือก tab C/C++ เลือก Category: เป็น Listing Files และเลือก Listing file type เป็น Assembly with Source Code หลัง compile จะได้ file .asm ซึ่งจะแสดงให้เห็นว่า compiler แปลง C statement ไปเป็น assembly ยังไง ลองดู asm ที่ผมได้ ตัดมาเฉพาะตอน return (unsigned int)(next/65536) % 32768; ; 5 : return (unsigned int)(next/65536) % 32768; shr eax, 16 ; 00000010H and eax, 32767 ; 00007fffH
แต่ถ้าใช้ gcc บน linux ก็ใช้ -S เช่น gcc -S -O test_mod.c จะได้ file asm เป็น test_mod.s ลองดู asm ที่ผมตัดมาเฉพาะตอน return (unsigned int)(next/65536) % 32768; shrl $16, %eax andl $32767, %eax leave ret
ทั้งสองกรณีด้านบน compiler จะแปลง return (unsigned int)(next/65536) % 32768; ไปเป็น shift right 16 bits ตามด้วย and 32767 ทำเหมือนกันทั้ง Visual C++ และ gcc เลยครับ
กลับมาเรื่องตัวอย่างของ linear congruential generator
ลองมาดู function rand() จาก library ของ Visual C++ 6.0 กันบ้าง ใน MSDN ไม่มีรายละเอียดการทำงานของ rand() เราลองมาหาดูว่า rand() มันทำงานยังไง
ลองสร้าง project ใน Visual C++ 6.0 เป็นแบบ Win32 Console Application แล้วเอา code ด้านล่างไป compile และ run ใน debug mode ดู #include <stdio.h> #include <stdlib.h> int main() { int r = rand(); printf("%d",r); return 0; } ให้ set breakpoint ที่บรรทัด int r = rand(); พอสั่ง run มันจะมาหยุดที่บรรทัดนี้ ทำ step into เพื่อเข้าไปใน rand() มันจะถามหา source code ของ rand.c ให้กด cancel Visual C++ จะแสดง assembly code ของ rand() ดังนี้ rand: 00401100 push ebp 00401101 mov ebp,esp 00401103 mov eax,[holdrand (00424a30)] 00401108 imul eax,eax,343FDh 0040110E add eax,269EC3h 00401113 mov [holdrand (00424a30)],eax 00401118 mov eax,[holdrand (00424a30)] 0040111D sar eax,10h 00401120 and eax,7FFFh 00401125 pop ebp 00401126 ret
จาก code ด้านบนจะเห็น 00401108 imul eax,eax,343FDh 0040110E add eax,269EC3h เป็นการคูณด้วย 343FDh แล้วบวกด้วย 269EC3h และไม่มีการ mod จึงเป็น mod แบบอัตโนมัติ ส่วน 0040111D sar eax,10h 00401120 and eax,7FFFh เป็นการ shift right 16 bits ตามด้วย and กับ 7FFFh จึงเป็นการเลือก bits เหมือนตัวอย่างด้านบน
จึงสรุปได้ว่า rand() จาก library ของ Visual C++ 6.0 เป็น linear congruential generator ที่มี a = 0x343FD c = 0x269EC3 m = 4294967296
อีกตัวอย่างหนึ่งของ linear congruential generator คือ Class Random จาก package java.util
นี่เป็น code จาก method next ของ Class Random ครับ synchronized protected int next(int bits) { seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1); return (int)(seed >>> (48 - bits)); }
code ตรง seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1); เป็น linear congruential ที่มี a = 0x5DEECE66D c = 0xB ส่วน & ((1L << 48) - 1) เป็นการ mod ด้วย (1L << 48) ซึ่ง (1L << 48) ก็คือ (2 ยกกำลัง 48) นั่นเอง สรุปว่า m = 2 ยกกำลัง 48
ทำไมถึงใช้ linear congruential generator กันอย่างแพร่หลาย
ถ้าดูจากสมการ Xn+1 = (aXn + c) mod m จะเห็นว่า มันไม่ได้เป็น math ที่ซับซ้อนเกินไป สามารถทำความเข้าใจและเขียน code ได้ง่าย นอกจากนี้ ถ้าเลือกค่า m ดีๆ ยังหลีกเลี่ยงการทำ mod ทำให้โปรแกรมทำงานได้เร็ว เลยเป็นที่นิยมใช้กันอย่างแพร่หลาย
แต่อย่าลืมว่า seed เดียวกัน จะได้ชุดตัวเลขสุ่มออกมาเหมือนเดิมทุกครั้งนะครับ
Create Date : 04 ตุลาคม 2551 | | |
Last Update : 7 ตุลาคม 2551 22:23:42 น. |
Counter : 6447 Pageviews. |
| |
|
|
|
|
เรื่องของ XOR
วันนี้มาย้อนอดีตสมัยเรียน math เรื่องของ Exclusive Or หรือ XOR กันหน่อยนะครับ XOR เป็น logical operation ที่มี truth table เป็น
XOR ที่ใช้ในโปรแกรมจะเป็นแบบ binary หรือ bitwise operation ไม่ใช่แบบ logical operation เราจะใช้สัญลักษณ์ ^ แทน XOR เหมือนที่ใช้ในภาษา C/C++, JAVA, C#
จาก truth table ด้านบน มีเรื่องน่าสนใจหลายเรื่องครับ
XOR จะเหมือนการบวกเลขฐานสองโดยที่ไม่นับทด ลองบวกเลขฐานสองดู 0+0 = 0 0+1 = 1 1+0 = 1 1+1 = 10 พอไม่นับทด 1+1 ก็จะเหลือแค่หลักเดียวคือ 0 1+1 = 0 จะเห็นได้ว่าผลลัพธ์เหมือนใน truth table ด้านบนเลย
XOR สามารถสลับตำแหน่งได้ พอ XOR เหมือนการบวก มันเลยมีลักษณะแบบเดียวกับการบวก คือ สามารถสลับตำแหน่ง หรือ ทำอะไรก่อนหลังได้ เช่น a^b^c a^c^b (a^b)^c a^(b^c) (a^c)^b จะได้ค่าเท่ากันหมด ภาษา math เรียกว่า commutativity กับ associativity (จำเค้ามาครับ)
XOR กับ 0 จะได้ค่าเท่าเดิม a^0 = a ไม่ว่า a จะเป็น 0 หรือ 1
XOR กับ 1 จะเป็นการกลับค่า a^1 = ~a เดิม a เป็น 0 ก็จะได้ค่าเป็น 1 เดิม a เป็น 1 ก็จะได้ค่าเป็น 0
XOR เอาไว้หาความต่าง ค่าที่เหมือนกัน XOR กันจะได้ 0 0^0 = 0 1^1 = 0 ค่าที่ต่างกัน XOR กันจะได้ 1 0^1 = 1 1^0 = 1
ค่าเหมือนกันนำมา XOR กัน ค่านั้นจะหายไป เช่น a^b^a สลับตำแหน่ง จะได้ a^a^b a^a (ค่าเหมือนกัน) จะได้ 0 0^b = b ดังนั้น a^b^a = b เหมือนเอา a มาฆ่า a
สามเหลี่ยมของ XOR ถ้า a^b แล้วได้ c เอา b^c จะได้ a และ c^a จะได้ b เป็นเหมือนรูปสามเหลี่ยม
แล้วเราใช้ XOR ทำอะไรกันบ้าง
นอกจากโปรแกรมคำนวนทาง math แบบลึกๆ หรือโปรแกรมที่ต้องเลียนแบบการทำงานของ hardware แล้ว เราแทบไม่ค่อยได้ใช้ XOR กันเลย ที่พอนึกออกคือ
ใช้เคลียร์ค่าให้เป็น 0 เช่น การเคลียร์ค่าของ register ax ในภาษา assembly xor ax, ax ถึงแม้ว่ามันจะทำให้ code อ่านยากสักหน่อย แต่นัยว่ามันเร็วกว่าการทำ mov ax, 0 ก็มันเป็นภาษา assembly ต้องการความเร็วครับ
ใช้กลับค่า (toggle) ให้ 0 เป็น 1 และให้ 1 เป็น 0 เช่น การกลับค่าของ bit 0 (ค่า 1) ถ้าไม่ใช้ XOR ก็ต้องเขียนประมาณนี้ if (f&1) f &= ~1; else f |= 1; ถ้าใช้ XOR ก็ statement เดียว f ^= 1;
ใช้สลับค่า (swap) เช่น function swap void swap(int *v1, int *v2) { *v1^=*v2; *v2^=*v1; *v1^=*v2; } หรือเขียนใหม่เป็น macro แบบนี้ #define SWAP(v1,v2) { (v1)^=(v2); (v2)^=(v1); (v1)^=(v2); }
ใช้หาความต่าง เช่นในการบีบอัดภาพเคลื่อนไหว เรามีภาพเป็น frame F1, F2, F3, ... ปรกติภาพในแต่ละ frame จะมีความแตกต่างกับ frame ที่อยู่ถัดไป ไม่มาก ถ้านำภาพ frame แรกมา XOR กับ frame ถัดไป pixel ที่เหมือนกันจะได้ค่าเป็น 0 pixel ที่ต่างกันจะได้ค่าเป็น 1 (หรือค่าอื่นที่ไม่เป็น 0) ผลคือ จะได้ 0 เป็นจำนวนมาก และที่ไม่เป็น 0 ในบริเวณที่มีการเคลื่อนไหว พอมี 0 ซะส่วนใหญ่ การบีบอัดก็จะทำได้ง่าย และมีขนาดเล็ก D1=F1^F2 D2=F2^F3 D3=F3^F4 ... ผลที่ได้ F1,D1,D2,D3.... ได้ frame แรก (F1) กับ D1,D2,D3.... ซึ่งแต่ละ Dn จะมีขนาดเล็ก เวลาขยายภาพกลับก็ทำโดยใช้ สามเหลี่ยมของ XOR คือ ในเมื่อ D1=F1^F2 ดังนั้น F2=F1^D1 และต่อๆไป F3=F2^D2 F4=F3^D3
ใช้ในการเข้ารหัสและถอดรหัส encrypt/decrypt สมมุติว่า P คือข้อความที่จะเข้ารหัส K คือ password หรือ key C คือข้อความที่เข้ารหัสแล้ว โดยที่ C=P^K จากสามเหลี่ยมของ XOR P=C^K พูดง่ายๆคือ เอาข้อความ XOR กับ key แล้วส่งไป ที่ปลายทางรับข้อความมาแล้ว XOR กับ key เดียวกัน จะได้ข้อความเดิมกลับมา
ถ้า key ที่ใช้เป็น true random number และใช้ (XOR) ครั้งเดียวแล้วทิ้ง วิธีการนี้จะเรียกว่า one-time pads ซึ่งเป็น algorithm ที่แข็งแรงที่สุด สมบูรณ์ที่สุด เลยครับ เล่ากันว่าโทรศัพท์ hotline ที่ใช้ระหว่างอเมริกากับอดีตสหภาพโซเวียตใช้ algorithm นี้
one-time pads ไม่ใช่ algorithm ที่ดีที่สุด เพราะการหา true random number ทำได้ยากมาก และยังต้องหาช่องทางที่ปลอดภัย (secure channel) ในการส่ง true random number ไปที่ปลายทาง รวมถึงการเก็บรักษาให้เป็นความลับที่สุด ตอนที่นำไปใช้แล้วก็ต้องทำลายทิ้ง มันเลยยุ่งยากและเสียค่าใช้จ่ายมาก
ถ้าปรับเปลี่ยน algorithm นิดหน่อย คือแทนที่จะใช้ true random number ก็ใช้ pseudo-random number แทน แล้วใช้ seed เป็น key ก็จะได้ stream cipher ที่แข็งแรงพอสมควร และเขียนโปรแกรมได้ง่าย code ไม่ซับซ้อน เอาไว้มีเวลาจะเอาตัวอย่างมาให้ดู
พวก cryptography นี่แหละ ไม่ว่าจะเป็น encrypt/decrypt, message digest, secure random generator, etc. จะใช้ XOR กันมากหน่อย
ใครมีเรื่องการใช้ XOR แบบอื่น มาเล่าสู่กันฟังบ้างนะครับ
Create Date : 26 กันยายน 2551 | | |
Last Update : 26 กันยายน 2551 22:01:42 น. |
Counter : 11599 Pageviews. |
| |
|
|
|
|
ภาษาไหนจะครองโลก
หลายคนคงเคยเห็นหรือเคยได้ยินคำพูดประมาณว่า
ภาษานี้ กำลังจะตาย ภาษานั้น จะครองโลก คนจะหันมาใช้ บลาบลาบลา ตัวนั้นตัวนี้ กันหมด
คำพูดหรือข้อความ ข้างต้น ออกจะตื่นตูมเกินเหตุไปหน่อย โดยเฉพาะเรื่องของภาษาคอมพิวเตอร์
ภาษาคอมพิวเตอร์ทุกภาษา มันมีทั้งข้อดีและข้อเสีย ไม่ใช่มีแต่ข้อดี แล้วไม่มีข้อเสีย หรือมีแต่ข้อเสีย ไม่มีข้อดีเลย (คงไม่ได้เกิด)
ภาษาใหม่ที่เกิดขึ้น ก็นำเอาแนวคิด ข้อดีของภาษาที่มีอยู่ บวกกับแนวคิดใหม่ๆ มาสร้างเป็นภาษาใหม่ พอเวลาเปลี่ยนไป เทคโนโลยีเปลี่ยน ของที่เคยคิดว่าดีแล้ว เหมาะสมแล้ว ก็อาจจะไม่ใช่ซะแล้ว เลยเกิด idea ใหม่ มาสร้างเป็นภาษาใหม่ขึ้นอีก ถ้าดูประวัติศาสตร์ของภาษาคอมพิวเตอร์ //www.levenez.com/lang/ จะเห็นได้ว่าภาษาส่วนใหญ่ จะมีพื้นฐานหรือแนวคิดมาจากภาษาที่มีอยู่ก่อน
การเลือกใช้ภาษาคอมพิวเตอร์
บางทีมันเป็นเรื่องความเหมาะสมครับ อย่างเวลาทำ win-app ก็ควรใช้เครื่องมือของ microsoft หรือเครื่องมือที่ออกแบบมาให้ทำงานเข้ากับ windows เป็นอย่างดี ถ้าไปใช้ java php ก็คงต้องฝืนใจกันพอดู
scripting language สำหรับคนทั่วๆไปที่ใช้ใน word หรือ excel ถ้าให้มาเขียนแบบ OOP ก็คงไม่มีใครใช้
search engine ขนาดใหญ่จะให้เขียนด้วย java หรือ .net ก็คงวิ่งไม่ไหว
แต่ละประเภทของ application ก็อาจจะเหมาะกับภาษาหรือเครื่องมือแต่ละอย่าง อาจมีที่มันเทาๆ คือทำได้หลายภาษาหลายเครื่องมือ ก็แล้วแต่ความถนัดหรือคุ้นเคยของผู้พัฒนา คือเหมาะสมกับผู้พัฒนา
บางทีก็เป็นเรื่องของการลงทุน ที่ลงทุนลงแรงกันไปมากแล้ว จะมาเปลี่ยนใหม่คงไม่ง่าย ดูตัวอย่างภาษา cobol เป็นต้น ในยุคของ internet หรือ OOP อย่างปัจจุบัน ยังมีคนเขียนภาษา cobol ยังมีความต้องการ cobol programmer อยู่เลย ไม่เชื่อลองดูใน web หางาน อย่าง jobsdb
และสุดท้าย เป็นเรื่องความรักชอบ หรือความเชื่อ เหมือนกับจะเป็นศาสนา เวลาพูดเรื่องพวกนี้ทีไร ต้องทะเลาะกันทุกที ไม่มีใครยอมใคร
การเปลี่ยนภาษา คงไม่ใช่ง่ายๆ ภาษาที่มีคนใช้พอสมควร แม้เวลาจะผ่านมานาน อย่างภาษา cobol มันก็ไม่หายไปซะทีเดียว ยังมีคนใช้อยู่ ภาษาเกิดใหม่ที่จะทำให้ programmer ส่วนใหญ่พร้อมใจกันหันมาใช้ คงเป็นไปได้ยาก เพราะ application มันมีหลากหลายประเภทนั่นเอง
แล้วภาษาอะไรดีที่สุด
ก็คงไม่มีภาษาไหนดีที่สุด ขึ้นอยู่กับปัจจัยหลายอย่าง ตามที่ได้บอกไป แต่ถ้าจะดูแนวโน้ม หรือ trend ของภาษา คงดูได้หลายวิธี
วิธีแรกดูจากจำนวนหนังสือที่มีขาย ถ้าหนังสือสำหรับภาษาไหนมีมาก ก็น่าจะมีคนใช้ภาษานั้นมาก แต่ก็อาจมีคนแย้งว่า ภาษายากเกินไป หรือเป็นภาษาสำหรับคนทั่วๆไป เลยต้องมีหนังสือออกมาเยอะ
วิธีต่อมา ดูจากคำค้นของ google ครับ idea ก็ประมาณว่าการค้นข้อมูลของภาษาไหนมาก ก็น่าจะมีคนใช้ภาษานั้นมากไปด้วย ลองไปที่ url นี้ //google.com/trends แล้วพิมพ์ชื่อภาษาที่ต้องการเปรียบเทียบคั่นด้วย ,
วิธีสุดท้ายเป็นเรื่องของตลาดแรงงานครับ ถ้าอยากรู้ว่าตลาดต้องการ programmer ภาษาไหนมากน้อยอย่างไร ก็ดูได้จาก url นี้ //www.indeed.com/jobtrends ข้างล่างเป็น job trends ของ java, c, c#, c++, php, cobol, vb, .net
ตกลงภาษาไหนจะครองโลกกันนี่
Create Date : 17 กันยายน 2551 | | |
Last Update : 18 กันยายน 2551 9:44:27 น. |
Counter : 988 Pageviews. |
| |
|
|
|
|
Text File กับ File Transfer
หลายวันก่อน น้องที่ทำงานมาเรียกให้ไปดูปัญหาที่เจอ บอกว่านั่งงมมาเป็นชั่วโมงแล้ว ปัญหามันมั่วๆ เลยให้ผมช่วยไปดูให้หน่อย ผมขอให้น้องทำให้ดูโดยเริ่มทำตั้งแต่ต้นใหม่ เค้าก็เริ่มจากใช้โปรแกรม winscp ทำการ copy file ไปที่ server โดย drag & drop ไปทั้ง directory เลย ผมบอกให้เค้าเปลี่ยนเป็น copy ทีละ file และให้ระบุด้วยว่า file ไหนเป็น text ปรากฏว่าปัญหาที่งมมาเป็นชั่วโมงก็หายไป ผมเลยลองถามน้องคนอื่นด้วยว่า text file คืออะไร ต่างจาก binary file ยังไง ก็ได้คำตอบประมาณว่า text file คือ file ที่อ่านรู้เรื่อง ส่วน binary file คือ file ที่อ่านไม่รู้เรื่อง บางคนบอกดูที่ extension ถ้าเป็น text file จะลงท้ายด้วย .txt .htm .html .log .c .h .cpp .bat
จริงๆแล้ว text file คือ file ที่มีโครงสร้างการจัดเก็บข้อมูล เป็นบรรทัดๆ โดยแต่ละบรรทัดจะมีตัวปิดบรรทัด (end of line) และเมื่อจบ file อาจมีตัวปิด file (end of file) ปิดท้ายด้วยก็ได้ ส่วน binary file ก็คือ file ที่ไม่ใช่ text file
end of line กับ end of file ใน text file มันจะไม่เหมือนกันในแต่ละ OS Unix, Linux, Mac OS X (ซึ่งเป็น Free BSD) ใช้ LF (0x0A) เป็น end of line DOS, Windows, OS/2, CP/M, Symbian ใช้ CRLF (0x0D+0x0A) เป็น end of line Apple กับ Mac รุ่นเก่าใช้ CR (0x0D) เป็น end of line ส่วน end of file เท่าที่ทราบจะมีเฉพาะ DOS โดยใช้ ^Z (0x1A) และจะใส่หรือไม่ใส่ก็ได้
ในเมื่อมีความไม่เหมือนกันในแต่ละ OS เวลาทำ file transfer ก็เลยต้องมีการ convert ให้ถูกต้องในแต่ละ OS ด้วย โปรแกรมอย่าง winscp มี feature ช่วยจำว่า extension หรือ file pattern ไหนเป็น text file ทำให้เกิดความสะดวกในการทำงาน กดส่งอย่างเดียวเลย แต่ก็ไม่แน่เสมอไป ตัวอย่างเช่น .dat อาจเป็น video file ซึ่งเป็น binary file หรือเป็น file ข้อมูลซึ่งเป็น text file ธรรมดา ขึ้นอยู่ว่าเราเก็บอะไรอยู่
นอกจากเรื่องน้องที่ทำงานแล้ว หลายปีก่อนผมเคยเห็นบริษัทเอกชนขนาดใหญ่รายหนึ่ง ใช้ software สำหรับช่วยในการติดตั้ง (install) ซึ่งจะทำการ transfer ตัว setup ที่ใช้ในการ install ออกไปยัง pc ทั่วประเทศ ใช้เวลาหลายวันในการ transfer แต่ละครั้งเพราะต้องทำตอนเลิกงานหรือตอนกลางคืน software ตัวนี้เขียนขึ้นมาให้ใช้ได้กับหลาย Platform/OS เลยต้องระบุว่า file แต่ละ file เป็น text หรือ binary แล้วคนทำ file transfer ทำผิดโดยระบุว่า setup.exe เป็น text file เสียเวลา transfer ไปหลายวันค่อยรู้ว่า install ไม่ได้ ต้องมาเริ่ม transfer กันใหม่
อย่าลืม เวลาทำ file transfer ต้องระบุว่าเป็น text หรือ binary ให้ถูกต้องนะครับ
Create Date : 09 สิงหาคม 2551 | | |
Last Update : 5 กันยายน 2551 16:35:36 น. |
Counter : 3120 Pageviews. |
| |
|
|
|
|
| |
|
|