เรื่องที่อยากเขียน ... เรื่องที่พยายามเขียน ...
Group Blog
 
All blogs
 

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 เป็น

     A  B XOR
    000
    011
    101
    110

    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



    java, c, c#, c++, php, cobol, vb, .net Job Trends graph



    ตกลงภาษาไหนจะครองโลกกันนี่




     

    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.  

    1  2  

    zkaru
    Location :
    กรุงเทพฯ Thailand

    [Profile ทั้งหมด]

    ฝากข้อความหลังไมค์
    Rss Feed
    Smember
    ผู้ติดตามบล็อก : 2 คน [?]




    เรื่องที่อยากเขียน ... เรื่องที่พยายามเขียน ...
    Friends' blogs
    [Add zkaru's blog to your web]
    Links
     

     Pantip.com | PantipMarket.com | Pantown.com | © 2004 BlogGang.com allrights reserved.