ท่าดัก null ของ Kotlin กับ Rust

อ่านโพสของท่าน Neutron Soutmun แล้วนึกขึ้นได้ว่าท่า unwrap ของ Rust กับ !! ของ Kotlin น่าจะคล้าย ๆ กันคือ programmer มั่นใจว่ามันจะไม่เป็น None/null แต่หลายครั้งมันก็เป็น

ส่วนอีกท่าหนึ่งที่เทียบกันได้ น่าจะเป็น match ของ Rust กับ when ของ Kotlin

ท่า(ที่อาจจะแปลก)ใน Kotlin

ผมไปเปิดดู code ตัวเองที่ github


wordCount = source!!.wordCount + 1

น่าจะพอเดาได้ว่าจุดที่แปลกคือ !!

เวลาเขียน Java เหตุเจ๋งส่วนมากคือ null exception น่าจะทำให้ปกติแล้ว Kotlin โดยปริยายจะค่าตัวแปรจะเป็น null ไม่ได้ แต่ถ้าจะเป็น null ต้องระบุไว้เลยด้วยเครื่องหมาย ?

ในกรณีนี้ source มี type เป็น Link? ซึ่งเป็น null ได้เวลาใช้ Kotlin อาจจะอยากให้ programmer check ก่อนว่าถ้าเป็น null แล้วจะเกิดอะไรขึ้น หรือถ้าไม่ check ก็ใส่ !! ไป เป็นการบอกว่า programmer มั่นใจว่า case นี้จะไม่เป็น null

การใช้ !! ปกติก็ไม่ควรทำครับ มันก็เท่ากับว่าเหมือนกลับไปใช้แบบ Java ไว้ถ้ามีเวลาเดี๋ยวผมจะเปลี่ยน !! ไปใช้ when แทน

ผมว่าการจัดการ null แบบนี้เป็นเรื่องที่ดีน่าจะช่วยให้โปรแกรมเจ๊งยากขึ้น แต่ว่าถ้าเอา Kotlin ไปให้เรียนเป็นภาษาแรกผมว่าไม่เหมาะ

ลองชาเขียวไทย

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

update1: ลองถ้วยใหม่

yet_another_cup_of_green_tea_IMGP2217.JPG

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 ผมกำลังจัดหามาลองอยู่ครับ ช่วงนี้ยังไม่สะดวก