การแยก Identity, Value และ State ออกจากกันของ Clojure มีประโยชน์อย่างไร

refs vars atom agent

Tap

จากคำถามของน้องบอสวันนี้ (โพสเต็มๆ อยู่ที่นี่ครับ)

เมื่อกี้พยายามอธิบายเรื่อง atom กับการ decouple identity กับ value ออกจากกัน ว่ามันมีประโยชน์ยังไง แต่รู้สึกว่ายังไม่เข้าใจประโยชน์ของมันจริงๆ ทุกคนมองยังไงกันครับ?

ด้านล่างนี้เป็นความพยายามในการอธิบายคำถามนี้ของผมครับ

ผมคิดว่าประโยชน์ของการแยก identity กับ value คือทำให้คนที่ observe value ของ identity แต่ละช่วงเวลายังเห็นภาพที่ถูกต้องของช่วงเวลาที่ตัวเองสนใจอยู่เสมอ

มาคุยเรื่องคำศัพท์กันก่อน เผื่อคนที่เพิ่งเคยได้ยิน

สิ่งๆหนึ่ง มีการเปลี่ยนแปลงคุณลักษณะ ไปตามเวลา
สิ่งหนึ่ง คือ identity
คุณลักษณะ คือ value
คุณลักษณะ ณ ช่วงเวลาหนึ่ง คือ state
เช่น ปีที่แล้วนาย ก. สูง 164 หนัก 61 ตอนนี้นาย ก. สูง 165 หนัก 60

  • identity คือ นาย ก.
  • value ขอมองว่ามี 2 value ก่อนคือ สูง 164 หนัก 61 และสูง 165 หนัก 60
  • state ถ้าเรามองที่เวลาปัจจุบัน คือ สูง 165 หนัก 60

Atom คือ state นั่นเอง มันใช้ว่าบอกว่า ณ เวลาปัจจุบัน identity มีค่าเป็นเท่าไหร่

ถามว่าประโยชน์คืออะไร ก็ต้องมาคุยว่าปกติที่เราไม่แยกสิ่งเหล่านี้เราทำกันอย่างไร

  1. เราก็จะมีที่ๆ นึงเก็บค่าปัจจุบันของนาย ก. ซึ่งจะโดนเขียนทับไปเรื่อยๆ ไม่มีการเก็บของเก่า อยากเก็บก็ต้องจัดการเอง มันอาจจะไม่ยากนักถ้ามีแค่ 2 ค่าแบบส่วนสูงและน้ำหนักในตัวอย่าง แต่ถ้าสิ่งที่เราสนใจนั้นมีชั้นความซับซ้อนสูงหละ เช่น เรามองภาพของประชากรทั้งโลกที่ประกอบด้วย ประชากรแต่ละประเทศ ประชาชนแต่ละเมือง ซ้อนกันไปเรื่อยๆ เราจะทำการเก็บของเก่าอย่างไร
  2. ถ้ามีการประมวลผลใดๆ กำลังทำงานอยู่ ณ เวลาที่ค่าของนาย ก. กำลังจะเปลี่ยน การประมวลผลนั้นอาจจะทำงานผิดพลาดได้
    ตัวอย่างความผิดพลาด เช่น เราบังเอิญไปคำนวณ BMI ของนาย ก. ตอนจังหวะมันจะเปลี่ยนค่าพอดี
    เช่น ตอนที่นาย ก. สูง 164 หนัก 61 คำนวณ BMI ได้ 22.68 แต่ขณะที่กำลังจะคืนค่ากลับไป นาย ก. ดันเปลี่ยนไปสูง 165 หนัก 60 พอดีซึ่งแปลว่าการประมวลผลครั้งน้ันผิดพลาดวิธีการป้องกันไม่ให้การประมวลผลใดผิดพลาดที่เค้าทำกันมามีความซับซ้อน เช่น locking ด้วยเทคนิคต่างๆ ซึ่งจากความซับซ้อนของมันอาจจะก่อให้เกิดความผิดพลาดในด้านอื่นได้อีก และมันยังทำให้ยากต่อการทำความเข้าใจระบบของเราด้วย เช่น ลองคิดดูว่าถ้าเราคำนวณ BMI…

View original post 13 more words

ท่าเก็บตังค่าใช้ API

คิดว่าสมมุติว่าจะขาย API แต่ไม่ทำ platform เองไปใช้ของคนอื่นเขาคิดราคาอย่างไร ก็หามาได้ประมาณนี้

สรุปแล้วประมาณเดือนละ 100 USD มี agigee ที่คิดตามการใช้งานได้ มันมีท่านอะไรที่ดีกว่านี้เปล่าครับ ?

มาเล่น Clojure กัน

สำหรับผม Clojure มันคือ Lisp บน Java Virtual Machine (JVM), node.js และบน Web browser เช่น Chrome Firefox

ผมจะข้ามเรื่องปรัชญา ประวัติศาสตร์ เบื้องหลังของ Lisp และ Clojure ไปก่อนนะครับ

คนส่วนมาจะเรียนเขียนโปรแกรมมาประมาณ print “Hello World” หรือ System.out.println(“Hello world”); หรือ Writeln(‘Hello World’); หรือ puts “Hello World” หรือ echo “Hello World” ส่วน Clojure จะเขียนแบบนี้

(println "Hello World")

นั่นล่ะครับก็แค่ใส่วงเล็บเข้าไปข้างหน้าข้างหลัง 😛 ไม่ได้มีอะไรยากเลยสักนิด

ที่นี้ถ้าเราจะเขียนโปรแกรมบวกเลขส่วนมากก็น่าจะเขียนแบบนี้ add(10,20) ไม่ก็ add 10,20 ส่วนถ้าเป็น Clojure ก็น่าจะเดาได้ว่าจะต้องเขียน (add 10 20) ข้อสังเกตอีกอย่างคือไม่ต้องใส่ comma (,) ไม่ต้องใส่ semi colon (;) ตอนจบคำสั่ง ไม่ต้องย่อหน้าให้ตรงกัน ก็เพราะมันมีวงเล็บอยู่แล้ว ทีนี้เราลองเปลี่ยน add เป็นเครื่องหมายบวก (+) ก็จะได้โปรแกรมแบบนี้

(+ 10 20)

โปรแกรมแบบ 10 + 20 + 30 ก็จะกลายเป็น

(+ 10 20 30)

สบายมากครับพิมพ์เครื่องหมายบวกครั้งเดียว ^_^

ลองเขียนพิมพ์เล่นดูใน http://www.tryclj.com/

screenshot_2017-02-22_21-07-30

อันนี้เอามาจากมิตรสหายร่วมกลุ่ม Clojure in Thai ใบ Facebook อีกที http://clojurescriptkoans.com เป็นเรียนผ่านแบบฝึกหัด

ใช้ 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.