ใช้ nvcc และ cuda ครั้งแรกในชีวิต

ทดลองบนเครื่อง Lenovo Ideapad 310 (Model 80SL) ใช้ Nvidia Geforce 920MX ใช้ xubuntu 16.04 เป็นตัวที่ไม่แรงเลย แต่ก็กะว่าเอาไว้เล่นอย่างเดียว ถ้าต้องใช้หนักจริง ๆ คงหา Desktop หรือเครื่องที่เป็น Rack มาใช้แทน

หลังจากที่ติดตั้งตามนีั http://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html ภาพรวมแล้วง่ายครับ แต่ขั้นตอนเยอะหน่อย

ก็ลอง make โปรแกรมดูมันก็ไปเรียก nvcc

Screenshot_2017-02-20_22-56-13.png

ลองรันโปรแกรมคูณ matrix

Screenshot_2017-02-20_23-23-35.png

ขั้นต่อไปจะลอง torch.ch ไว้ blog หน้า

สิ่งที่ชอบที่สุดเวลาเขียน Kotlin

สิ่งที่ชอบ Kotlin มันไม่ต่างจาก Java มาก แต่ว่าก็มีการปรับปรุงส่วนที่อยากให้ปรับปรุงสุด ๆ

อย่างเช่นตัวอย่างนี้โปรแกรมที่เขียนด้วย Java ด้านล่างสิ่งที่เบื่อที่สุดคือ toArray ที่เขียนยาว ๆ งง ๆ

String[] prefixes = Arrays.stream((new String[]{"ABCD", "XYZ"}))
                .map(text -> text.substring(2))
                .toArray(size -> new String[size]);

พอเปลี่ยนเป็น Kotlin หน้าตามันก็ยังพอจะคล้าย ๆ แนว ๆ เดิมอยู่แต่ .toTypeArray() มันดูเรียบง่ายกว่า .toArray(size -> new String[size]) มาก

val prefixes: Array = arrayOf("ABCD", "XYZ")
        .map {it.substring(2)}
        .toTypedArray();

ตอนนี้รู้สึกว่ามันอยู่ระหว่าง Scala กับ Java ยกเว้นเรื่อง check null ?

Servo issue #12193 “Servo displays upper level Thai character in wrong place” was fixed

Servo issue #12193 “Servo displays upper level Thai character in wrong place”, which is the first Servo issue that I made a pull request, was fixed by this commit. Thank @jdm @pcwalton etc.

Now Servo can display Thai text:

servo_bug1

I’m very happy to see these commits in the master branch of Servo:

servo_bug2

However, there are still some issues to be reported when I opened a Wikipedia page. There are some boxes, which are supposed to be Thai characters.

servo_bug3.png

ลอง Remix OS

ทุกวันนี้ผมเห็นว่ารอบ ๆ ตัว Android กินตลาดโทรศัพท์มือถือและ tablet ไปเยอะแล้ว เลยสนใจว่า Desktop มันจะใช้ได้หรือเปล่า ก็เลยไปเจอ remix os

ผมลองติดตั้งบนเครื่องที่เดิมใช้ Windows อยู่ก็พบว่าง่ายมาก ๆ

App ก็มีเพียบเลย ดู Netflix ได้ แต่ไม่แน่ว่า Chill หรือเปล่า

screenshot_20170131-120715

ใช้ MS Word ก็ได้ แต่มันก็ขึ้นอย่างที่เห็นอะครับจะแก้ต้องซื้อ Office 365

screenshot_20170131-120832

ใช้เว็บแน่นอนได้อยู่แล้ว อันนี้ผมลองลง Firefox Aurora สำหรับ Android ดู

screenshot_20170131-121220

ใช้ Terminal ก็ยังได้อีกมี apt-get เรียบร้อย ผ่าน Termux นั่นเอง

screenshot_20170131-121540

แต่ผมติดปัญหาใหญ่อยู่ 2 อย่างคือ hardware keyboard ใช้ภาษาไทยไม่ได้ termux ตัวอักษรเล็กมาก ซึ่งทั้งสองอย่างอาจจะมีท่าแก้แต่ผมทำไม่เป็น

รวมแล้วผมว่า Remix OS มาทรงดีมากนะครับ อาจจะเป็นอนาคตของคนที่มี notebook เก่า ๆ หรือซื้อ notebook ใหม่ที่ราคาไม่แพงมา ลองอย่างอื่นแล้วมันอืด ๆ และอยากได้ app ที่เคยลงบนมือถือ

เทียบความเร็วโปรแกรมตัดคำแบบ multicore

อันนี้เป็นผลงานของคุณ @iporsut ล้วน ๆ ครับ ผม pull มาจับเวลาอย่างเดียว จากที่เทียบความเร็วเวลาตัดคำวันก่อน เป็นแบบที่ใช้ core เดียว ความเร็วเฉลี่ยแบบสุดของรุ่นที่ใช้ Rust คือ 3.284 วินาทีครับ

ผมเอามาทดสอบตัวคำไฟล์ข้อความขนาด 20 MB เหมือนเดิมและ ใช้เครื่อง core i3 ตัวเดิม

รุ่นที่ใช้ Go กระจายงานไปตาม goroutine และส่งผลลัพธ์ผ่าน channel เวลาได้ตามนี้

real 0m1.964s
user 0m7.056s
sys 0m0.152s

real 0m2.063s
user 0m7.464s
sys 0m0.136s

real 0m2.015s
user 0m7.208s
sys 0m0.108s

เวลาเฉลี่ยที่โปรแกรมรันก็คือ 2.014 วินาที

ส่วนอีกรุ่นหนึ่งใช้ Rust ครับ ใช้ channel ด้วย และ share instance ของ wordcut สำหรับแต่ละ thread โดยหุ้มด้วย Arc

real	0m1.526s
user	0m5.504s
sys	0m0.184s

real	0m1.530s
user	0m5.580s
sys	0m0.136s

real	0m1.521s
user	0m5.500s
sys	0m0.224s

เวลาเฉลี่ยคือ 1.525 วินาที

Moz L10N + Rust Meetup 2017-01-28

  1. Teerapat Taechaiya told us about Mozilla direction these days, overview about L10N, resources etc. And he also carried a lot stickers for us.
  2. We discussed about our centralized page for collecting translation resources.
  3. We discussed about how to promote our Facebook page.
  4. We translated Mozilla.org via Pontoon together
  5. I talked about my motivation to provide user interface in Thai and the survey about whether Thai Internet users understand English technical terms
  6. @iporsut showed that writing TCPServer in Rust is obvious and intuitive. He also remarked that Rust thread is native one, unlike Go routine.
  7. @awkwin explained how to make a http redirection in Rust with Tokio, which is much faster than using Nginx. He also explained how Tokio works.
  8. We talked about move semantics, lifetimes, traits and generics in Rust
  9. I showed a benchmark on Thai word tokenizer, which I made together with @iporsut. The version written in Rust has been the fastest one. @iporsut told us that Rust verison is faster than Go version because of its fast hash map from standard library.

Thank all participants for sacrificing your precious holiday especially Chinese new year for contributing Thai localization on free software and advancement of Rust programming in Thai community.

Thank Hubba Thailand, for the a brilliant venue for co-working and drink water.

ความคิดสะเปะสะปะของผมเกี่ยวกับภาษา Julia

ผมลองเขียน Julia ไปนิดนึงแน่นอนว่าเป็นโปรแกรมตัดคำ ซึ่งก็ไม่น่าจะตรงทางของ Julia เท่าไหร่ ไม่มีทำอะไรกับ vector matrix เลย แต่ก็มีสิ่งที่พบดังต่อไปนี้

index ของ Array เริ่มที่ 1 เหมือน Pascal และ Lua

เป็นภาษา dynamic ที่ระบุ type ได้ละเอียดมากประมาณว่าระบุแบบนี้ได้ Array{Tuple{Int, String, Char},1} สังเกตว่ามี 1 ด้วย คือบอกว่าเป็น Array 1 มิติ

อีกอย่างหนึ่งที่ไม่คิดว่าจะเจอในภาษา dynamic ถ้า type ที่ประกาศเป็น null (nothing) ได้ต้องใส่ Nullable ด้วยเช่น Nullable{Array{Tuple{Int, String, Char},1}}

มีคล้าย Generic ของ Java ด้วยแต่ใน Julia เรียก Parametric Composite Types ไม่แน่ใจว่าต่างกันแค่ไหน แต่ประกาศแบบนี้ได้ ตามคู่มือ

type Point{T}
   x::T
   y::T
end

และตอนเอาไปใช้ก็สามารถใส่ Point{Float64} Point{Int} อะไรแบบนี้ได้

พอเห็น type พวกนี้แล้วน่าจะพูดได้ว่าประกาศ type ได้ละเอียดกว่า Go ที่เป็นภาษาแบบ static type อีกถ้าไม่รวม pointer

ใช้ substring รู้สึกไม่ค่อยสะดวก สิ่งเคยเขียนใน Ruby ประมาณ text[s…e] พอมาแปลงเป็น Julia ก็จะกลายเป็น text[chr2ind(text, s):chr2ind(text, e)] รู้สึกวุ่นและมีโอกาสพลาดเพิ่มขึ้นเยอะ

ความเร็วของโปรแกรมตัดคำที่อุตส่าใช้ Just-in-time compilation ก็ดูเร็วสำหรับภาษา dynamic แต่ก็ยังห่างชั้นจากกลุ่มนำมาก

OOP ใน Julia เน้นไปที่ polymorphism ถ้าดูผิว ๆ ก็จะเหมือนเรียก function ธรรมดา เช่น build(10,5), build(30.4,10.5), build(12,3.4), build(Point(10.2, 2.4) พวกนี้สามารถไปเรียกคนละ method กันได้หมดเลยถาม type ที่ระบุไว้ตอนประกาศ method; นอกจากนั้น method จะเขียน build(10, 5) อะไรแบบนี้ถูกแล้ว ไม่มีมาเขียน 5.build(10) เหมือนในภาษา OOP ส่วนมาก เพราะว่ามันมาแล้ว multiple dispatching คล้าย ๆ CLOS ใน Common Lisp คือ type ของทุก argument มีส่วนเลือก method หมดเลย อาจจะเป็นข้อดีทางอ้อม ๆ คือมันเป็นระเบียบดี ไม่มีแบบจะ len(x) ดีหรือ x.len() ดี

แต่ type ที่ว่ามาเยอะแยะจะไม่ใส่เลยก็ได้

ถ้าโอกาสหน้าเขียนพวก vector matrix หรือคำนวณตัวเลขเยอะ ๆ จะกลับมาลอง Julia อีกที

Go และ Java เดี๋ยวนี้

ผมดู benchmark แบบเน้น CPU มา และ benchmark ของ Web framework ก็เห็นว่าความเร็วไม่ได้ทิ้งกัน บางที Java เร็วกว่าด้วยซ้ำทั้ง ๆ ที่ไม่ได้ build เป็น native code แต่แรกเหมือน Go  แม้กระทั่งโปรแกรมตัดคำเขียน Kotlin เองที่รันบน JVM เหมือน Java พอ optimize พอกันแล้วความเร็วไม่ได้ต่างจาก Go เท่าไหร่  โดยสรุปแล้วทำให้ข้ออ้างว่า Go แปลเป็น machine code แล้วจะทำงานเร็วเป็นการทั่วไปใช้กับ Java ไม่ได้

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

ประเด็นเรื่อง composition over inheritance ที่เป็นอีกจุดขายของ Go ใน Java 8 ก็เหมือนจะพยายามแก้ลำด้วย interface ที่มี default method ได้จนเกือบ ๆ จะเป็น trait แต่ยังไม่เป็น นี่มันทำให้ Java ใช้ท่า composition ผ่าน interface แบบนี้ได้

Channel เดี๋ยวนี้ในภาษาอื่น ๆ ก็มันจะมีสิ่งทดแทนที่ใช้งานได้คล้าย ๆ กัน

แต่ Go ก็ยังมีข้อดีกว่า Java ที่ผมประจักษ์ได้ คือ:

  1. compile ไวมาก ๆ
  2. โปรแกรม start ไวมาก กรณีนี้ Java ก็พยายามสู้เหมือนกันใน Java 9 แต่ผมเดาว่าคงยังสู้ Go ไม่ได้
  3. ไม่ต้องใช้ IDE ที่ซับซ้อนก็ได้ ที่ผ่านมาผมใช้ Emacs หรือ vscode ก็รู้สึกพอแล้ว

หมายเหตุ: น่าจะมีข้อดีอื่น ๆ ของ Go อีกที่ผมไม่ได้ศึกษา เช่น การใช้หน่วยความจำ GC ที่ latency น้อย