ไต้หวันกับเกาหลีใต้

ในโอกาสครบรอบวันสำคัญก่อนจะถึงเที่ยงคืน ผมอยากจะเขียนอะไรสักหน่อยแต่มองออกไปไกล ๆ ตัวบ้าง ในที่ที่ผมไม่เคยไปและไม่รู้จักเท่าไหร่ ไต้หวัน และเกาหลีใต้, ผมคิดว่าเป็นประเทศที่น่าสนใจเพราะมีเศรษฐกิจ ศิลปวิทยาการที่ก้าวหน้า เช่น F4, เปาบุ้นจิ้น, ตำนานรักดอกเหมย, แด(แท?)จังกึม, Full house ภาคแรก, SNSD

หลายท่านอาจจะบอกว่าญี่ปุ่น สิงคโปร์ ก็มีเศรษฐกิจ ศิลปวิทยาการที่ก้าวหน้าเช่นกัน ซึ่งก็จริง แต่ผมคิดว่าไต้หวัน และเกาหลีใต้น่าสนใจกว่าเรื่องการเมืองการปกครอง เท่าที่ผมทราบญี่ปุ่น สิงคโปร์ ถึงแม้จะมีการเลือกตั้ง แต่ปกครองโดยพรรคเดียวมาตลอด[1] ทำให้รู้สึกเหมือนว่าระบอบประชาธิปไตยยังไม่ได้ใช้เต็มที่ เพราะประชาชนก็ไม่ได้มีอำนาจต่อรองจากการกดดันผ่านการเลือกตั้งมากสักเท่าไหร่ ทำให้ผมคิดว่าพวกนี้ไม่น่าสนใจเท่าไต้หวันและเกาหลีใต้

ต่างจากเกาหลีใต้ที่ตั้งแต่ปี 1997 (ขอบคุณข้อมูลจาก LordBright) ก็มีพรรคหน้าใหม่ได้รับเลือกมาปกครองประเทศบ้าง ในปี 2000, 2004 ในไต้หวันก็มีรัฐบาลพรรคอื่นที่ไม่ใช่ก๊กมินตั๋งขึ้นมา ทำให้เห็นว่าพรรคต่างมีโอกาสได้เป็นรัฐบาลจากการเลือกตั้งแล้วได้เสียงข้างมากแต่แรกเลย แบบนี้ผมมองว่าก้าวหน้ากว่า ประชาชนมีอำนาจต่อรองรัฐบาลมากกว่า

อาจจะเป็นไปได้ว่าประชาธิปไตยก็ใช้ได้กับคนเอเชียเหมือนกันแต่ใช้ได้จริง ๆ หรือเปล่า มีอะไรซับซ้อนกว่านั้นไหมผมก็ไม่ทราบ และเหตุให้ไต้หวันและเกาหลีใต้ต่างออกไปจากประเทศอื่น ๆ ก็ยังเป็นที่สงสัยสำหรับผม

[1] ญี่ปุ่นมีรัฐบาลที่ไม่ใช้ LDP ด้วย แต่อยู่ไม่ครบสมัย ขอบคุณปริญญา

ชาตินิยม

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

เป็นผู้มี จิตคิดปองร้าย คือ มีความดำริในใจอันชั่วร้ายว่า ขอสัตว์เหล่านี้จงถูกฆ่า จงถูกทำลาย จงขาดสูญ จงพินาศ หรืออย่าได้เป็นแล้ว

(มีข้ออื่นอีก)

บุคคลผู้ประกอบด้วย ธรรม ๑๐ ประการนี้แล เป็นผู้ถูกทอดทิ้งไว้ในนรก เหมือนสิ่งของที่เขานำมาทอดทิ้งไว้

http://etipitaka.com/read/thai/24/259/

Native Unicode sub-string support

ผมมองว่าสำหรับ Natural language processing ภาคปฏิบัติ การหา sub-string จาก Unicode string นี่มันสำคัญมากเลย

เอาเข้าจริงแทบทุกภาษา (programming language) ก็น่าจะใช้ Unicode ได้หมด ขึ้นอยู่กับว่าออกแรงมากออกแรงน้อยเท่านั้นเอง ถ้าทำง่าย ๆ ก็ดี

ในบทความไม่วิชาการนี้อยากจะลองใช้ substring กับ native string ของแต่ละภาษาเลยว่าจะทำงานได้อย่างที่ต้องการไหม อย่างเช่นว่า “abc”[0:1] ก็ควรจะได้ตัว a ออกมา แต่พอเป็น latin alphabet พวก a b c มันง่ายไป ภาษาส่วนมากก็ใช้ได้หมดถ้าเป็น “กขค”[0:1] ยากขึ้นมาหน่อย แต่เดี๋ยวนี้ก็เรียกว่าง่ายแล้ว

ผมก็เลยมาลองกับตัวอักษรนี่แทน 𨭎 เป็นกลุ่ม non-bmp หรือรหัส Unicode มีค่ามากกว่า 0xFFFF นั่นเอง

  1. ภาษาแรกเลย Python 3 นอกจากจะเขียนง่ายแล้วก็จัดการเรื่องนี้ได้เลยทำงานถูกต้องทุกประการ
    print("𨭎"[0:1])
    
  2. Ruby ก็ใช้ได้เนียน ๆ
    puts "𨭎"[0..1]
    
  3. JavaScript เจ๊ง … จริง JS นี่ใช้ภาษาไทยก็ได้ แต่เจอ non-bmp เจ๊ง
    console.log('𨭎'.substring(0,1));
    
  4. Lua เจ๊งชนิดที่ว่าภาษาไทยก็ไม่ได้

    print(string.sub("𨭎", 1, 1));

  5. PHP เจ๊งชนิดที่ว่าภาษาไทยก็ไม่ได้
    echo substr("𨭎",0,1);
    

ลองกลุ่ม duck type มาเยอะแล้ว ลองพวก static type บ้าง

  1. Rust น้องใหม่มาแรง เจ๊ง ภาษาไทยก็ไม่รอดเหมือนกัน แต่ดีหน่อยที่ว่าโปรแกรมหยุดทำงาน แล้วมี error message บอกว่า ไม่หั่นที่ byte แรกไม่ได้

    println!("{}", &("𨭎"[0..1]));

  2. Java เจ้าตลาด เจ๊ง
    System.out.println("𨭎".substring(0,1));
    
  3. Go ขี้เกียจเขียนครับ เคยลองไปหลายครั้งแล้วเจ๊งกระทั่งกับภาษาไทย แต่มีท่าแก้คือแปลงเป็น rune ก่อน
  4. C# บน Mono บน Fedora 21 เจ๊งเหมือน Java

    Console.WriteLine("𨭎".Substring(0,1));

  5. Free Pascal เจ๊ง
    Writeln(Copy('𨭎',1,1));
    
  6. Ada ใช้ Gnat บน Fedora 21 เจ๊ง

    procedure Main is
    Str : constant String := "𨭎";
    begin
    Put_Line (Str (1..1));
    end Main;

    แทบจะเรียกได้ว่า static type นี่แทบไม่มีอะไรใช้ได้เลย

  7. OCaml ขี้เกียจลองดูจาก spec แล้วควรจะเจ๊งแบบ Go
  8. Haskell ใช้ได้ เป็นภาษาแบบ static type ภาษาเดียวที่ไม่ต้องออกแรงมา

    putStrLn (take 1 "𨭎")

พิจารณามา 13 ภาษา ภาษาหา Unicode sub-string ได้สะดวก ๆ ก็คือ Python 3 ส่วน Python 2.7.x ไม่ได้นะ, Ruby 2 หรือ 1.9 ก็ได้มั้ง และถ้าต้องการ static type ก็มี Haskell ตัวเดียว ที่เป็น pure functional ด้วยอาจจะปรับตัวยากหน่อย

ภาษาอื่น ๆ ก็มีท่าแก้ เช่น PHP ใช้ mb_strsub และกำหนด internal encoding เป็น UTF-8; Rust ก็มีหลายท่าแต่ API มันยังไม่ stable หลัก ๆ คือแปลงเป็น Chars ก่อน; Go ก็แปลงเป็น []rune

ความคิดเห็นของผมก็คือถ้าไม่เน้นว่าโปรแกรมต้องทำงานเร็วมาก ก็ใช้ Python 3 ครับ แต่ถ้าต้องการเร็วจัด ๆ อันนี้คิดหนักแล้ว :-P

ขอบคุณ @plutonix (aka น้าธนา) ที่เอาเรื่อง codepoint กับ ES6 ให้อ่าน ผมถีงสำเนียกได้ว่า ภาษาที่ internal encoding เป็น UTF-16 มันมีกรณีที่เจ๊งแบบนี้

Windows ก็ไม่ได้แพงขนาดนั้น

  1. กรณีที่ซื้อเครื่องใหม่ notebook ตัวเล็กของ HP ขายพ่วง Windows 8.1 มาด้วย ในราคา 9420 บาท ราคาขนาดนี้ซื้อ Chromebook หรือว่า Notebook ที่ลง GNU/Linux เช่น Linpus หรือ Ubuntu มาด้วยยังยากเลย ที่ tohome
  2. กรณีมีเครื่องอยู่แล้ว ซื้อ Windows มาเพิ่มก็เพียง 2920 บาท ที่ advice

ผมมี Windows แท้อยู่ 2 ชุด แต่ว่าส่วนมากแล้วไม่ค่อยได้ใช้ ใน 365 วันผมใช้ Fedora (GNU/Linux) เสีย 340 เห็นจะได้เพราะรู้สึกว่าใช้ง่ายกว่ามาก ๆ