An incomplete Khmer-Thai character map

An incomplete Khmer-Thai character map in Lisp


((ក . ก) (ខ . ข) (គ . ค) (ឃ . ฆ) (ង . ง)
(ច . จ) (ឆ . ฉ) (ជ . ช) (ឈ . ฌ) (ញ . ญ)
(ដ . ฎ) (ឋ . ฐ) (ឌ . ฑ) (ឍ . ฒ) (ណ . ณ)
(ត . ต) (ថ . ถ) (ទ . ท) (ធ . ธ) (ន . น)
(ប . บ) (ផ . ผ) (ព . พ) (ភ . ภ) (ម . ม)

(យ . ย) (រ . ร) (ល . ล) (វ . ว) (ឝ . ศ)
(ឞ . ษ) (ស . ส) (ហ . ห) (ឡ . ฬ) (អ . อ)

(ា . า) (ិ . ิ) (ី . ี) (ឹ . ึ) (ឺ . ื)
(ុ . ุ) (ូ . ู) (ួ . ัว) (ើ . -เออ-) (ឿ . -เอือ-)
(ៀ . -เอีย-) (េ . เ) (ែ . แ) (ៃ . ไ) (ោ . โ)
(ៅ . -เอา-) (ុំ . -อม-) (ំ . ํ) (ាំ . ำ) (ះ . ะ))

 

 Reference
https://th.wikipedia.org/wiki/%E0%B8%AD%E0%B8%B1%E0%B8%81%E0%B8%A9%E0%B8%A3%E0%B9%80%E0%B8%82%E0%B8%A1%E0%B8%A3

ลองเล่น WebVR บน Firefox Nightly for Android

พอดีมีอุปกรณ์เสริมที่เอาไว้ยัดมือถือเข้าไปแล้วเล่น VR ได้ที่พี่ต้น Sukrit บริจาคมาให้ และใช้ Firefox Nightly for Android อยู่แล้วก็เลยอยากจะลองสักหน่อย โดยการเข้าไปเปิดเว็บนี้ https://mozvr.com/webvr-demos/demos/sechelt/?mode=vr มันก็แบ่งเป็น 2 จอให้เลยครับ ผมก็จับมือถือยัดเข้าไปในอุปกรณ์เสริม (แว่น ?)

แล้วก็ลองครอบหัวเล่นดูก็พบว่ามันก็พอเล่นได้ แต่ยังไม่ได้ลองอะไรมากไปกว่านี้ ขั้นตอนต่อไปว่าจะลองเขียนเว็บ 3 มิติเองดูโดยใช้ A-Frame

Installing CLD2 on Ubuntu 16.04 for apertium-apy

This didn’t work.

 

From http://blog.xanda.org/2014/04/02/installing-compact-language-detection-2-cld2-on-ubuntu/ I wrote a script for Ubuntu 16.04


sudo apt-get install libcld2-dev

git clone https://github.com/veer66/chromium-compact-language-detector.git
pushd chromium-compact-language-detector
python3 setup.py build
sudo python3 setup_full.py build
python3 setup.py install
sudo python3 setup_full.py install
popd

Emacs + Common Lisp

พอลง sbcl และลง Quicklisp ไปแล้ว ทีนี้จะลองใช้กับ Emacs ดูครับ วิธีติดตั้ง Emacs ก็ทำแบบนี้เลยคำบน Debian/Ubuntu


sudo apt-get install emacs24

แต่ว่าที่ผมใช้เองลงจาก source code เพราะมันใหม่กว่า ส่วน Windows น่าจะลงจากที่ zip ที่ http://ftp.gnu.org/gnu/emacs/windows/ ได้เลย

.emacs อันนี้ที่ใส่ไว้ใน home ครับ เพื่อความสะดวกสามารถ copy & paste ไปใช้ได้เลยครับ


(require 'package)
(setq package-archives '(("elpa" . "https://elpa.gnu.org/packages/")
("melpa-stable" . "https://stable.melpa.org/packages/")))
(package-initialize)<

(setq inferior-lisp-program "/usr/bin/sbcl")

ที่เหลือก็ดูจาก video ได้เลยครับ

เปิดไฟล์ใช้ control x control f
ค้นหาใช้ control s
จะพิมพ์คำสั่งใช้ alt x
ออกจาก Emacs ใช้ control x control c

ครับ

Quicklisp

เวลาเขียนโปรแกรมเพิ่มความสะดวกเรามักจะเอาก้อนของโปรแกรมที่คนอื่นเขียนไว้แล้วมาใช้จะเรียกว่า library หรือ package หรืออะไรก็ตาม ถ้าเคยเขียน JavaScript มาก็อาจจะเคยได้ใช้ npm หรือเขียน Ruby ก็ใช้ gem แบบนี้ เป็นต้น ของ Common Lisp ก็มีคือ Quicklisp นั่นเอง หลังจาก<a href="https://veer66.wordpress.com/2017/04/30/common-lisp-begin/"ลง sbcl แล้วก็

วิธีติดตั้ง Quicklisp คือ download ไฟล์มาแบบนี้


curl -O https://beta.quicklisp.org/quicklisp.lisp

พอได้ quicklisp.lisp มาก็สั่ง


sbcl --load quicklisp.lisp

เพื่อเรียกใช้งาน จะใช้ rlwrap ด้วยก็ได้ครับ

sbcl-load

จากนั้นก็สั่ง


(quicklisp-quickstart:install)

quicklisp

พอ install เสร็จแล้วจริง ๆ ก็ใช้ quicklisp ได้เลย แต่เพื่อที่ว่าไม่ต้องมาเรียก quicklisp ตอนเปิด sbcl ทุกครั้งก็เลยได้ต้องสั่ง


(ql:add-to-init-file)

ด้วยมันจะมี preview ขึ้นมาว่าแก้ไฟล์ .sbclrc ถ้าไม่มีอะไรผิดปกติก็กด enter ไปครับ

จากนั้นก็ลองติดตั้ง package ดูโดยสั่ง


(ql:quickload 'drakma)

ข้างบนคือลองติดตั้ง drakma ดู พอสั่งแบบนี้เสร็จแล้วก็จะใช้งาน drakma ได้เลย เช่น


(drakma:http-request "http://wikipedia.org") ;; ลองใช้ drakma เปิด wikipedia.org ดู

drakma.png

ก็จะได้ผลออกมาประมาณข้างบน

เพื่อลองว่า quicklisp มันใช้ได้จริง ลองออกจาก sbcl ด้วย


(quit)

หรือว่ากด control d ก็ได้แล้วก็เข้า sbcl ใหม่ แล้วก็ลองสั่ง


(ql:quickload 'drakma)
(drakma:http-request "http://wikipedia.org")

ถ้าใช้ได้เหมือนเดิมก็เสร็จแล้วครับ

เริ่มต้นใช้ Common Lisp

เกิดอยากจะเขียนขึ้นมาแม้จะเข้าใจว่าไม่น่าจะมีคนอ่าน เดี๋ยวนี้เขามักพูดกันว่าให้เลือกสิ่งที่มัน mature แน่นอน Common Lisp เกิดมาปี 1984 มาตรฐานล่าสุดออกปี 1994 น่าจะ mature มาก ๆ ภาษาแทบจะไม่มีอะไรเปลี่ยนเลย

เริ่มจากวิธิติดตั้งเลยสำหรับผู้ใช้ Debian/Ubuntu ก็สั่งแบบนี้ที่ shell เลย


sudo apt-get install sbcl rlwrap

แถม rlwrap มาด้วยหน่อยจะได้ใช้ REPL ง่าย ๆ ครับ

แต่ถ้าใช้ FreeBSD ก็สั่งแบบนี้ครับ


sudo pkg install sbcl rlwrap

พอติดตั้งเสร็จแล้วก็เรียกใช้งานได้ได้เลยโดยสั่งแบบนี้ที่ shell


rlwrap sbcl

มันก็จะขึ้นแบบนี้มา:

sbcl

เราก็จะพิมพ์อะไรเล่นได้เช่น


(+ 10 20)

มันก็จะแสดงผลออกมา

sbcl2.png

เขียน Lisp ก็นึกเสียว่าย้ายวงเล็บมาอยู่ข้างหน้าครับ เช่น (10 + 20) ก็เขียน (+ 10 20) แทน จะว่าไปลำกับแบบนี้ก็ไม่แปลกนะครับสำหรับ programming language เวลาเขียน assembly ก็เรียงแบบนี้เหมือนกัน เช่น ADD A, R7 แบบนี้นะครับ คำสั่งอยู่หน้าตลอดทุกคำสั่งไม่มีย้ายไปย้ายมา

ป.ล. สำหรับ Windows 10 ผมกำลังจัดหามาลองอยู่ครับ ช่วงนี้ยังไม่สะดวก

การแยก 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 ที่คิดตามการใช้งานได้ มันมีท่านอะไรที่ดีกว่านี้เปล่าครับ ?