วันศุกร์ที่ 15 มีนาคม พ.ศ. 2562

The Olarn Project's พลังและความตั้งใจ ในมุมของผม


ครั้งแรกที่ได้ฟัง demo เพลงนี้น่าจะเป็นช่วงปี 1992-1993 ที่บ้านพี่โอ้ ช่วงนั้นเวลาไปเล่นดนตรีกลางคืน หรือวันที่ไม่ติดอะไร ผมจะไปนั่งเล่นที่บ้านพี่โอ้เป็นประจำ สนิทกับคนในหมู่บ้านพี่โอ้หลายคน

เท่าที่จำได้ เพลงที่ได้ฟังในวันนั้น เป็น demo กลอง chord และ solo line ของพี่โอ้ เท่านั้น พอได้ยิน ผมก็บอกพี่โอ้ไปว่า "พี่...ผมขอ Solo เพลงนี้นะ" พี่โอ้ใจดีตอบว่า แต่งไว้ให้ป้อ solo keyboard เพลงนี้อยู่แล้ว...

ปี 1994 ผมย้ายกลับไปอยู่บ้านที่โคราช พร้อมกับการมาของโอกาสที่ได้ไปทำงานที่ Microsoft Redmond  USA เพื่อพัฒนา Software Office 95 Thai Edition โดยรับผิดชอบ Microsoft Word 95 Thai Edition ในช่วงที่เดินทางไป เป็นช่วงปี 1995

ธันวาคม ปี 95 โครงการ Standard edition ของ Microsoft Office 95 Thai Edition เสร็จสมบูรณ์ ผมเดินทางกลับมาพักผ่อนที่ไทย สิ่งที่ไม่คาดคิดก็เกิดขึ้น

พี่โอ้โทรมาตามไปอัดเสียง เพลงที่สัญญากันไว้ว่าจะให้เล่น!!!

ผมรึีบขับรถไปหาที่ห้องอัดเสียงพี่ติ (กิตติ กาญจนสถิตย์ กีต้าร์ปืน) ตลาดแฮปปี้แลนด์ พร้อมกับ Keyboard ที่หยิบยืมน้องมา เพราะตอนนั้นไม่มี keyboard ที่ใช้ประจำตัวเลย

ที่ยืมมาได้เป็น KORG i3 lead sound พอไหว ก็ใช้ factory preset นั่นแหละอัดเสียงตรงๆ เลย

จากที่ทำงานกับ The Olarn Project มาวิธีการบันทึกเสียง ก็ไม่ยากอะไร เสียบสาย Output จาก Keyboard เข้า Input ที่ Patchpay แล้วเล่นเลย แค่นั้น :)

อัดเสียงวันแรก เล่นอยู่ชั่วโมงกว่า เฉพาะท่อน Solo พี่โอ้เดินมากระซิบว่า กลับไปซ้อมสักอาทิตย์นึงดีกว่า แล้วอยากให้ออกแบบมาให้ดีก่อนค่อยมาอัดอีกครั้ง

ตอนแต่ง Solo เพลงนี้ผมเอาทุกอย่างที่มีติดตัว มัดรวมกันมาเป็น pack เลย คือโดยปกติเป็นคนที่ชอบเล่น Harmonic Minor รวมถึง Aeolion,  Phrygian mode เป็นทุนเดิม ก็อาศัยความเคยชินของหูนี่แหละแต่ง โดยรวมเอา Technique ที่พอมีมาผสมกัน ทั้ง Arpeggio, Guitar tapping, bending portamento, note trilling เป็นต้น

Solo ชุดนี้เล่นครอบคุมทั้ง 5 Octaves มือซ้ายใช้ทั้ง Bender และช่วยเสริมมือขวา มันเลยยุ่งๆ หน่อย แต่ก็เป็นไปตามธรรมชาติ

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

ในส่วน part keyboard อื่นๆ ในอัลบัม ลิชิตดวงดาว Ruba Mosan เป็นคนบันทึกเสียงทั้งหมด เราเจอกันและรู้จักกันครั้งแรกที่ห้องอัดเสียง พี่ติ นั่นเอง

ส่วนการแสดงสดเพลง พลังและความตั้งใจ ผมเคยเล่นกับพี่โอ้ครั้งเดียว ช่วงปลายปี 1996 เป็นการเล่นสดออกอากาศให้กับสถานี Pirate Rock แถวเลียบด่วนรามอินทรา ถ้าจำไม่ผิด

Line up วันนั้นเท่าที่จำได้มี พี่โอ้, หนิง Bass, พี่เอกมันต์ กลอง

ผ่านไป 23 ปี ผมกำลังจะได้กลับมาเล่นเพลงนี้อีกครั้งกับ The Olarn Project X Fire concert วันที่ 20 เมษายน 2019

ติดตามรายละเอียดได้ที่ Heavy Organizer


วันศุกร์ที่ 15 กันยายน พ.ศ. 2560

คิดถึง พี่ต้า พิเศษ สังข์สุวรรณ

กลางดึกคืนวันอาทิตย์คืนหนึ่งในปี 2535 คืนนั้นเป็นอีกคืนที่ผมเล่นดนตรีประจำกับวง The Olarn Project ที่ The Rock Pub ร้านดั้งเดิม เชิงสะพานหัวช้าง
แม้ว่าเพลงที่เล่นประจำทุกคืนจะเป็นเพลงเดิมๆ จากชุด กุมภาพันธ์ 2528 กับชุดหูเหล็กที่พี่โอ้เลือกมา 12-14 เพลง แต่ความพิเศษของคือนั้นหาใช่เพลงแต่คือการมาของคนที่ชื่อ "พิเศษ" ต่างหาก
พี่ต้า "พิเศษ สังข์สุวรรณ" มานั่งอยู่หน้าร้านพร้อมกับ พี่ป้อม อัสนี โชติกุล และอีกหลายคนที่ผมจำไม่ได้ โดยทุกคนตั้งใจมงสังสรรกับพี่โอ้ โอฬาร นั่นเอง
ความผิดพลาดที่น่าจะเป็นความ "พิเศษ" ถัดมาของคืนๆ นั้นก็คือ พี่โอ้ลืมเอากระเป๋า Effect กีต้าร์ มาจากบ้านต้องโทรไปให้เพื่อนบ้านในหมู่บ้านพี่โอ้เอา Effect ที่บรรจุในกระเป๋าเจมส์บอนที่ออกแบบ "พิเศษ" โดยพี่โอ้เองมาให้ที่ The RockPub กลางดึก
และนั่นจึงเป็นโอกาส "พิเศษ" ให้ผมได้แสดงดนตรีที่ผมเตรียมมาส่วนตัวกับ "กุ๋งกิ๋ง" มือกลองที่ตอนนั้นอาศัยอยู่ที่บ้านผมได้โชว์สิ่งที่เราซ้อมระหว่างที่เราอาศัยอยู่ด้วยกัน
ข้อดีของการอยู่บ้านเดียวกันอย่างหนึ่งคือ ได้มีโอกาสซ้อม คุย แลกเปลี่ยนทัศนะระหว่างกัน รู้แนวทางการเล่นของกันและกัน
ย้อนกลับไปเมื่อปี 2531-2532 ผมเคยไปขออาศัยอพาร์ทเม้นที่พี่ต้าเช่าไว้ แถวราชเทวี หลายเดือน ได้มีโอกาสช่วยพี่ต้าทำเพลงบ้าง ไปเป็นเพื่อนพี่ต้าตามที่ต่างๆ ได้พบได้เจอเพื่อนสนิทพี่ต้า เช่น พี่ป้อม ดนู ฮันตระกูล และที่ "พิเศษ" สุดๆ สำหรับผมก็คือ การได้มีส่วนกับภาพยนต์เรื่อง "คนเลี้ยงช้าง" ทั้งเข้าร่วมฉากเปิด ที่ท่านมุ้ยตั้งใจเอาพวก back stage มาเข้าฉาก ซึ่งในฉากนั้นมี พี่แอ็ด คาราบาว พี่เอก สรพงษ์ พี่ต้า และท่านอื่นๆ โดยเน้น พี่อิท อิทธิสุนธร วิชัยลักษณ์ เป็นแกนกลางในการเล่าเรื่องหลักของ Scene
และแน่นอนว่า ได้มีโอกาสทำ เพลงประกอบภาพยนต์เรื่องนี้ด้วย ตอนนั้น ท่านมุ้ยจะเรียกขึ้นไปรับ Brief ว่า scene นี้อารมณ์จะเป็นยังไง ความยาวแค่ไหน แล้วพี่ต้าจะสั่ง ผมก็จะทำ ทำแล้วก็อัดลงเทป 1/4 นิ้ว วิ่งขึ้นไปให้ท่านมุ้ยที่กำลังตัดหนังอยู่ด้านบน วิ่งขึ้นวิ่งลงจนคุ้นเคยกับห้องอัดรามอินทรา เลยทีเดียว
หลังจาก RockPub ปิดให้บริการในคืนนั้น ผมได้คุยกับพี่ต้าต่อช่วงหนึ่ง พี่ต้าเล่าว่า พี่ต้าเพิ่งจะ mix down เพลงประกอบภาพยนต์เรื่อง มือปืน2 ของท่านมุ้ย โดยระหว่างทางก็ได้เอาเทปต้นฉบับเปิดในรถ Isuzu spacecaย มังกรทองรุ่นแรกที่ผมใช้อยู่ ให้ฟัง
ใช่แล้ว...นี่มันแนวทางพี่ต้าเลย พี่ต้าเล่าว่า มีปู (Black Head) ร้องด้วยเพลงนึงนะ ตอนนั้นปูยังไม่ได้เริ่มทำ Album กับ ยูเรเนี่ยมเลย น่าจะเป็นช่วงหลังจากที่ วง Blue Planet แยกย้ายสลายตัวกันไป
หลังจากคืนนั้นไม่นาน พี่ต้าก็มาหาผมที่ RockPub อีกครั้ง พี่ต้าบอกว่า "เห้ย...ป้อ... พี่ไปอยู่กับป้อนะ" "ครับพี่" ง่ายๆ แค่นี้ แล้วพี่ต้าก็ย้ายมาอยู่กับผมที่บ้าน ที่ตอนนั้น กิ๋ง ย้ายออกไปแล้ว เราใช้ชีวิตด้วยกันอีกพักหนึ่ง พี่ต้าก็ย้ายไปอยู่ที่อื่นต่อไป

ระหว่างที่เราอยู่ด้วยกัน เรามีโอกาสได้ร่วมงานกันบ้าง เช่น งานโฆษณาบะหมี่สำเร็จรูป ไวไว ประโยค "ก็แค่เส้นบางๆ ระหว่างทางสองเรา" และงานใหญ่ๆ อย่างละครเวทีเรื่อง นรสิงห์ อวตาร ของศิษเก่ามหาวิทยาลัย ศิลปกร ที่เวทีใหญ่ โรงละครแห่งชาติ
มีอยู่วันหนึ่งพี่ต้าเดินมาบอกว่า "เห้ยป้อ...ไปซื้อ Mixer กัน" หมายถึงอุปกรณ์ผสมเสียงนะครับ ไม่ใช่ โซดาน้ำแข็ง แล้วเราก็จบกันที่ Fostex 8 tracks ที่ Music Concept World Trade Center ที่ยังไม่ได้เปลี่ยนชื่อเป็น Central World
พี่ต้าบอกว่า พอดีว่า "ก็แค่เส้นบางๆ ระหว่างทางสองเรา" มันดัง Agency เลยให้เงิน "พิเศษ" มาสองหมื่น เราเลยได้ Mixer มาใช้กัน :)
ตอนพี่ต้าย้ายออกจากบ้านผมไปนั้น ผมได้ยก Ensoniq ESP16 + Expansion RAM pack + SCSI interface + expansion output และ Diskettes sound bank ร้อยกว่าแผ่นให้พี่ต้าไปด้วย
ใคจะเชื่อว่า ภาพยนต์เรื่อง มือปืนสอง สาละวิน มีพี่ต้าเล่นด้วย และเป็นบทที่มีเสน่ห์มาก และเมื่อเห็นโฆษณาการนำเอาภาพยนต์เรื่อง มือปืนสอง สาละวิน กลับมา remaster และฉายอีกครั้ง ก็อดที่จะคิดถึงผู้ชาย ร่างใหญ่ ผิ้วคล้ำ ผมหยิก อารมณ์ดี คนนี้ไม่ได้

วันอังคารที่ 29 กันยายน พ.ศ. 2558

ใช้ C Preprocessor กับ Golang !!!! จะบร้า.....หรอ...

ก็พอจะเข้าใจนะครับว่า Code Go ต้องดูและเข้าใจง่าย แต่พอมีความสามารถในการ Cross compile ที่สามารถ compile ข้าม  ARCH ได้นี่ ผมก็เริ่มต้องการ Preprocessor อย่างแรง...

ไปไล่ดู ก็เห็นคนขอกันเยอะไปหมด อาจอยู่ในคิว features แหละ ไม่ได้ตามต่อ แต่ต้องการใช้ตอนนี้ นี่สิ...

Code บน OSX แล้ว Compile ไปทำงานบน Pi2 ด้วย

$ env GOOS=linux GOARCH=arm GOARM=7 go build BlinkBlink

จากนั้น

$ sshpass -p 'raspberry' scp Blink pi@192.168.1.50:~/

สะดวกสบาย... จริงๆ

แต่ปัญหาคือ อยากให้มันทำงานบน OSX ด้วยไง เลยอยาก #ifdef เอา code IO บางส่วนออก

Golang ทำไม่ได้!!!

อ้าว......

ไม่เป็นไรครับ คิดไม่ออก ใช้ C Preprocessor เลย....
https://gcc.gnu.org/onlinedocs/cpp/Invocation.html

ผม code แบบนี้ครับ

package main

import (
"fmt"
#ifdef RPI2
"github.com/stianeikeland/go-rpio"
#endif
"os"
"time"
)

#ifdef RPI2
var (
// Use mcu pin 17, corresponds to physical pin 11  on the pi
pin1 = rpio.Pin(17)
pin2 = rpio.Pin(18)
)
#endif

func main() {
#ifdef RPI2
        InitPIIO()
#else
        fmt.Println("Ignore hardware initialize")
#endif
}

#ifdef RPI2
func InitPIIO() {
        fmt.Println("InitPIIO")
}
#endif

แล้วตั้งชื่อ main.go.p เรียก C Preprocessor

$ cpp -P main.go.p main.go

จะได้ main.go แบบนี้

package main

import (
            "fmt"



                    "os"
                        "time"
       )









func main() {



                        fmt.Println("Ignore hardware initialize")

}

C Preprocessor จะเอา code ใน #ifdef RPI2 ออกไป

ทีนี้พอจะ Build ไปทำงานบน RPI2 เราก็

$ cpp -DRPI2 -P main.go.p main.go

จะได้ main.go แบบนี้

package main

import (
            "fmt"

                "github.com/stianeikeland/go-rpio"

                    "os"
                        "time"
       )


var (
            // Use mcu pin 17, corresponds to physical pin 11  on the pi
            pin1 = rpio.Pin(17)
                pin2 = rpio.Pin(18)
    )


func main() {

            InitPIIO()



}


func InitPIIO() {
            fmt.Println("InitPIIO")
}

ไม่ง้อ Native Golang Preprocessor (ตอนนี้) แล้วเว๊ย.......


วันพุธที่ 16 กันยายน พ.ศ. 2558

Build Erlang 18.0 บน OSX 10.10

Build จาก source ซึ่งปกติมันก็ไม่ยากอะไร แค่ download source จาก Erlang.org แล้ว untar จากนั้นก็เข้าโหมดปกติ คือ

$ ./configure
$ make

แต่ปัญหาคือ เจอ 4 บรรทัดนี่

crypto         : No usable OpenSSL found
odbc           : ODBC library - header check failed
ssh            : No usable OpenSSL found
ssl            : No usable OpenSSL found

ODBC ไม่สนอยู่แล้ว กะใช้อย่างอื่น แต่ OpenSSL นี่สิ ผมก็

$ brew install openssl

ไปแล้วนะ ทำไม configure หาไม่เจอ

เอาใหม่ ลอง configure แบบละเอียดดู ได้แบบนี้

./configure --disable-hipe --enable-smp-support --enable-threads --enable-kernel-poll --enable-darwin-64bit

แต่ก็ยังมีปัญหา OpenSSL ติดมาอีก

ไล่ไปไล่มาพบว่า brew install OpenSSL มีปัญหา symlink ต้อง

$ brew link --force openssl

แล้วเรียก configure แบบด้านบนอีกรอบ ทีนี้เหลือแค่

odbc           : ODBC library - header check failed

เรียบร้อย

$ make

ต่อไป....

วันอังคารที่ 26 สิงหาคม พ.ศ. 2557

Build Micro Python ไปใช้บน STM32F4

KickStarter โครงการแรกที่ผมจ่ายเงินซื้อผลิตภัณฑ์ แล้วมีความสุขมาก คือ MicroPython เป็นการพัฒนา Micro Processor board เล็กๆ น่ารักๆ ให้มีความสามารถของภาษา Python Embed ลงไปใน CPU ARM Cortex-M4 ซึ่งเห็นครั้งแรกผมไม่รอช้าที่จะ "เข้าคิว" เพื่อรอสั่งซื้อมาเป็นเจ้าของ เมื่อของพร้อม...

แล้ววันที่ของพร้อมก็มาถึง ผมสั่ง Micro Python ไปหนึ่งชุด พร้อม LCD Skin และ AMP Skin โดยทั้งสอง Skin เป็น expansion board ประกบเข้ากับ Micro Python board ให้มีความสามารถของการแสดงผล  LCD และ ภาคเสียง

ผ่านไปเจ็ดวัน ของก็อยู่ในมือ ส่งตรงจาก Cambridge UK โดยจ่าหน้าซองด้วยลายมือคนออกแบบเองเลย Damien George

หลังจากต่อสาย USB แล้วลองเล่นไปได้ สิบห้านาทีก็หลงรัก บอร์ด นี้เข้าจับใจ ความจริงตัวบอร์ดก็น่ารักดีครับ แต่ที่น่าสนใจกว่าตัวบอร์ดคือ การนำเอา Python มา compile เข้ากับ ARM Cortex-M ทำให้สามารถเขียน Python ได้ทันที่เมื่อเปิดเครื่อง เหมือนกับ ใช้ Apple Soft Basic เลย

เรื่อง MicroPython บอร์ดนี่คุยกันสามหน้าเจ็ดหน้าคงไม่จบ ไว้ค่อยว่ากัน ประเด็นบทความนี้อยู่ที่ Spec CPU ARM Cortex-M4 ตัวนี้คือตัวเดียวกับ development board STM32F4 ซึ่งผมก็มีอยู่บอร์ดนึง อีกทั้ง MicroPython ก็เป็น opensource project เลยเข้าไปดูใน source tree พบว่า นอกจาก George จะได้สร้าง build script (folder) สำหรับ Windows, Unix (สามารถ build และเขียน micro python บน Winodws, Linux และ OSX ได้) ยังสร้างสำหรับ stmhal (STM Hardware Abstraction Layer) ก็แน่นอน เพราะ MicroPython boad สนับสนุน CPU STM นี่นะ

อีกอย่าง ราคา MicroPython Board อยู่ที่ 29 ปอนด์ หรือประมาณ 1,500 บาท ในขณะที่ STM32F4-Disc อยู่ที่ 700 บาท (รุ่นไม่มีจอ touch screen)

เลยเกิดแรงบันดาลใจให้ลอง build micropython มาใช้บน STM32F4-Discovery ของตัวเองบ้าง โดยผมเริ่มจาก

เตรียม ARM Cross-Compiler
ผม build และทำงานต่อไปนี้ทั้งหมดบน UbuntuGnome 14.04 LTS นะครับ โดยติดตั้ง ARM cross-compiler ดังนี้

$ sudo apt-get install gcc-arm-none-eabi

จากนั้น clone micropython

$ git clone https://github.com/micropython/micropython.git

cd เข้าไปใน micropython/stmhal และเริ่ม build

$ make BOARD=STM32F4DISC

เครื่องที่ติดตั้ง UbuntuGnome ของผมเป็น Macbook white 2008 ใช้เวลา compile นาทีเดียวเองครับ :)

จากนั้นเราจะได้ file firmware.elf ใน folder stm/build-STM32F4DISC

ง่ายมาก แต่จะ download firmware.elf ยังไงล่ะ!!!

เตียมเครื่องมือสำหรับการ download firmware
สิ่งแรกที่ต้องการเลยคือ GDB สำหรับ ARM ให้ติดตั้ง package ดามนี้

$ sudo apt-get install -d gdb-arm-none-eabi

เครื่องผมมี gdb ติดตั้งอยู่แล้วเลยโดน reject ต้อง force install ด้วย

$ sudo dpkg -i --force-overwrite /var/cache/apt/archives/gdb-arm-none-eabi_7.6.50.20131218-0ubuntu1+1_amd64.deb

จากนั้นต้องใช้ tools สำหรับ upload เข้า STM board ผมใช้ project ใน github ชื่อ stlink clone มาแล้ว จัดการ build ได้เลยครับ

$ ./autogen.sh
$ ./configure
$ make
$ sudo make install

ส่วนเครื่องผมไม่ได้ลง autoreconf เลยต้องติดตั้ง

$ sudo apt-get install dh-autoreconf

พอตอนทำ configure พบว่าไม่มี libusb ก็ต้องติดตั้ง

$ sudo apt-get install libusb-1.0.0-dev

น่าจะครบกระบวนความในการ  compile stlink

มา download firmware กัน...
เชื่อมต่อบอร์ด STM32F4-Discovery ผ่าน USB (เป็นสาย Mini-B นะครับ อย่าต่อ OTG บน board STM32 จะมี USB สอง port หัวท้าย) เรียก

$ st-link

โปรแกรมจะรอ connection จาก GDB ให้เราเข้าไปที่ micropython/stmhal จากนั้น เปิด terminal ใหม่ขึ้นมาอีกหนึ่งจอ แล้วเรียก

$ arm-none-eabi-gdb build-STM32F4DISC/firmware.elf

พอเข้า CLI ของ GDB ก็ให้กำหนด target ตามนี้ครับ

(gdb) target extended localhost:4242

แล้ว สร้าง flash firmware ด้วย

(gdb) load

LED จะกระพริบอย่างสวยงามในระหว่างที่ firmware กำลัง flash เมื่อ LED ดับ ก็ terminate GDB แล้วดึงสาย USB ออกจากนั้นต่อสาย USB เข้าเครื่องใหม่ เราจะเห็น boot.py และ main.py แล้ว

เราสามารถ interactive กับ board ได้ด้วย REPL เหมือน Apple soft BASIC ด้วยวิธีดังนี้ครับ

$ sudo screen /dev/ttyACM0 

หลังจากต่อสาย USB แล้ว

เราจะพบว่า Micro Controller ไม่ใช่เรื่องยากอีกต่อไป ตอนผมได้ STM32F4-Disc มาครั้งแรก แล้วควานหา IDE หา compiler มาเขียนงานเล็กๆ ง่ายๆ นี่มันช่างวุ่นวาย ยุ่งยากเหมือลเกิน (ตอนหลังมาใช้ EWARM) แถมต้องจบที่ Assembly กับ C เท่านั้นอีก

MicroPython ก็แล้ว หรือเราจะลอง MicroLUA กันมั่งดีแมะ :p

ชอให้สนุกกับ micopython ครับ 

วันพฤหัสบดีที่ 10 กรกฎาคม พ.ศ. 2557

[เขียนเมื่อ] วันเกิด MS Internet Explorer [ครบ 15 ปี]

พบว่าตัวเองเคยเขียนเล่าเรื่องราวต่างๆ ของ Internet Explorer เมื่อปี 2010 (4 ปีที่แล้ว) ใน facebook ซึ่งเป็นเรื่องราวที่ผมมีส่วนเกี่ยวข้อง มุมมองส่วนตัว เลยเอา copy มาไว้ใน Blog เผื่อเพื่อนๆ อยากอ่าน (สนุกๆ)

  ผมจำได้ว่า เขียนบทความเป็นเรื่องเป็นราวลงแมกกาซีนรายเดือน ครั้งล่าสุดประมาณปี 2002 ได้ เป็นหนังสือ Windows Magazine ในเครือ AR เป็นบทความที่เกี่ยวกับ Mobile devices ที่ห่างหายและเลิกไปก้เพราะ บก. บริหารที่ติดต่อให้ผมไปเขียนบทความย้ายค่าย ไปอยู่ค่ายอื่น เลยไม่ได้ติดต่อกัน อีกอย่างตอนเขียนบทความนั้นเป็นช่วงที่กำลังพัฒนา ปลาดาวออฟฟิศ ด้วยเวลามีไม่มากนัก ทำให้เวลาจะส่งบทความ จะเขียนบนกระดาษสีน้ำตาลใหม้ (เผากันเลยทีเดียว) เช่นส่งวันจันทร์ คืนวันอาทิตย์เที่ยงคืนก็จะเริ่มเขียน แหะๆ  

พอดีวันนี้เปิดเวป blognone.com เจอข่าวครบรอบวันเกิด 15 ปี ของ Internet Explorer ทำให้รำลึกถึงวันวานกับ IE ที่ไม่ได้เป็นเพียงแค่ผู้ใช้ แต่ได้มีโอกาสเป็นส่วนหนึ่งของทีมพัฒนาด้วย โดยได้มีโอกาสพัฒนาในส่วนการแสดงผลภาษาไทย ทำให้อยากเล่าอยากเขียนอะไรเกี่ยวกับ IE ทิ้งไว้เผื่อใครจะสนใจ หรือเก็บเอาไว้อ่านส่วนตัวต่อไป ก็ไม่เลวนัก และคิดว่าคงไม่เขียนเป็นบทความแบบสมัยเขียนลง Windows Magazine เพราะนั่นน่ะ เขาให้หน้าละ 300 บาท เดือนนึงต้องลากสักสามสี่หน้า จะได้เงินกินขนมสักพันบาท  

ตอนที่ได้รับมอบหมายให้ทำ Internet Explorer เป็นภาษาไทยนั้น เป็นช่วงที่ Microsoft ของ Windows 95 Thai Edition SR1 (Service Released 1) ถ้าจำชื่อไม่ผิด รายละเอียด SR1 ทุกอย่างเหมือนของ US Edition แต่เพิ่มเติมในส่วนที่เกี่ยวข้องกับภาษาไทยเข้าไป เท่าที่จำได้มีดังต่อไปนี้   ปัญหา Fonts ทั้งหลายของไทย ตอน Windows 3.x ออกนั้น เรามี Fonts UPC ใช้ แต่พอ Windows 95 Thai Edition ออกมานั้น Fonts UPC ชุดเดิมยังมีอยู่ แต่ปัญหาก็คือ ชื่อดันเปลี่ยนจาก UPC ไปเป็น New ทำให้เอกสารไม่ compatible ก็แก้ปัญหา font substitute ให้กับ SR1  

ส่วนอื่นๆ ก็เป็นการ enable features ที่แนบมากับ SR1 ซึ่งก็คือ Internet Explorer 2.0 จริงๆ การมี IE ในตอนนั้น BillG (Bill Gates : aka billg@microsoft.com NOTE: ตอนอยู่ Microsoft Bill เคยส่งอีเมล์มาหา 2 ครั้ง (ตื่นเต้นๆ) "แต่" เป็นอีเมล์ที่ส่งมาขอบริจากเงินทำบุญ แล้วก็ส่งให้กับทุกคนใน Campus -_-' ) ไม่เคยเห็นด้วยเลย โดย Bill ให้เหตุผลว่า "Internet น่ะไม่มีทางประสบความสำเร็จหรอก แล้วที่มีนักวิเคราะห์ออกมาบอกว่า ในอนาคตโฆษณาตามหน้าแมกกาซีนจะมี Web Site URL ติดที่ทุกๆ หน้าโฆษณาน่ะเหลวไหล อนาคตมันต้อง MSN สิ" (ตอนนั้น Microsoft เปิดบริการ Online ของตัวเองชื่อ Microsoft Network เป็น Private Network โดยหมุน Modem เข้า service ของ Mcirosoft เอง เหมือนๆ กับ บริการ Compuserve ที่มี server อยู่ที่ Ohio) เราคงไม่ต้องบอกว่า Bill เป็นนักพยากรณ์ที่มีความสามารถขนาดไหน (เนอะ)  

พอ SR1 ออก ความจำเป็นของ IE ต่อการเป็นอยู่ของ Windows OS เริ่มมีมากขึ้น แน่นอนว่าตอนนั้น การแสดงผลภาษาไทยบน Web Browser ยังทำไม่ได้สมบูรณ์เลยนักตัวเดียว (ตอนนั้นใช้ Mozilla บน Windows 95)   มีนักพัฒนาไทยบางคนพยายามที่จะ hack ให้ Web Browser สามารถตัดคำภาษาไทย ด้วยวิธีการ Hook API ของ Windows Socket โดย API ใหม่ที่เขียนขึ้นจะเข้าไป replace API หลัก เท่าที่จำได้คือ function recv (TPC) แล้ว Monitor data stream ตัดคำแล้วแทรก <WBR> ระหว่างคำไทย ให้   ก็ว่ากันไป ในระดับหนึ่ง แต่ในเวลานั้น วิธีการนี้ถือว่า Advances ที่สุดแล้ว แต่ก็เป็นการ Work around ปัญหาเท่านั้น ให้ดียังไง ก็สู้การพัฒนาที่ตัวโปรแกรมตรงๆ ไม่ได้

IE 2.0 ไทย จำได้ว่า code name ของ IE 2.0 คือ "Ohare"  
Ohare เป็นชื่อสนามบินนานาชาติที่ Chicago และถ้ายังจำกันได้ Chicago เป็น code name ของ Windows 95 นอกจากนั้น ยังมี code name ของ project ย่อยๆ อีกหลาย projects ที่ใช้ code name ล้อกับ Chicago เช่น Rich Edit ซึ่งเป็น Windows extended native control ก็มี code name ว่า Caponeซึ่งเป็นชื่อของเจ้าพ่อ ขาใหญ่ Al Capone แห่ง Chicago นั่นเอง

   ตัว source code จำไม่ได้ ก็กว่าสิบปีแล้วที่ทำ ตอนนั้นทำกับ นนท์ (Weerapan Wilairat) ตอนนี้นนท์อยู่ทีม Windows Mobile น่าจะเป็นคนทำ UI Phone 7 กับทำ Kin (มั๊ง... ไม่ยอมบอกเล๊ย)ส่วนตัว IE มีอะไรบ้าง เดี๋ยวเล่าให้ฟัง เอาที่จำได้นะครับ พอดีเหมือสามสี่ปีที่แล้วเก็บบ้าน เจอ source code เก่าๆ (Hard copy print out) เก็บๆ ไว้บ้าง แต่ใช้อะไรไม่ได้แล้ว เพราะเป็นแค่บางส่วน เท่านั้น (น่าจะ 1 ใน 100 ของทั้งหมด)

ส่วน comment บนหัว source code นั้นส่วนมากจะ comment ตามนี้

/*Enhanced NCSA Mosaic from Spyglass
   "Guitar"

   Copyright 1994 Spyglass, Inc.All Rights Reserved

   Author(s):
   ชื่อนักพัฒนาที่รับผิดชอบ source file นั้นๆ โดยมี address (at)spyglass . com กันทุกคน
*/

   ใช่แล้ว Microsoft ซื้อ source code มาจกา Spyglass ไม่แน่ใจว่า Take Over Spyglass มาเลยรึเปล่า ช่วงนั้น MS นิยม Take Over มากเพราะมันสามารถพัมนาผลิตภัณฑ์แบบก้าวกระโดดได้ เช่น FrontPage Microsoft ก็ซื้อมา รู้สึกจะซื้อมาทั้งบริษัท แต่ปัญหาของ FontPage ช่วงแรกๆ คือ เวลา Edit HTML file แล้วชอบเพิ่มสิ่งที่พึงปรารถนาเช่น Tag แปลกๆ และที่สำคัญที่สุดคือเมื่อ save แล้ว HTML pattern เก่าที่ถูกเขียนไว้จะถูก FrontPage แก้มั่วไปหมด คนทำเวปจะหงุดหงิดกับ FrontPage มาก ถ้า HTML ไฟล์นั้นถูกพัฒนาด้วยมือมาก่อน แล้วนำมาแก้ด้วย FontPage  

   ช่วงนั้น HTML Editor ที่เป็นแบบ Visual ที่ได้รับความนิยมที่สุดคือ DreamWeaver ของ MacroMedia (ตอนนั้น ตอนนี้กลายเป็น Adobe ไปแล้ว) ด้วยเหตุผลง่ายๆ คือทำสิ่งตรงกันข้ามกับ FrontPage ที่กล่าวไว้ข้างต้น นั่นเอง   

   ตอนทำ IE 2.0 Thai Edition ใช้เวลาในการพัฒนาทั้งสิ้น 1 เดือน ทดสอบอีกกว่า 2 เดือน ทีมทดสอบคือทีมการตลาด และ PSS ของ Microsoft Thailand

สุดท้ายHappy Birthday MS-IE

Banner ยอดนิยม ใช้ promote IE ในช่วงแรกๆ

Flying windows ใน source เดี๋ยวนี้พัฒนาไปเยอะมาก ตอน 3.0 ทำเป็น e หมุนเป็นรูปโลก สวยมากๆ

หน้าตา Mosaic โดย Spyglass


วันอังคารที่ 8 กรกฎาคม พ.ศ. 2557

Upgrade LUA skill ด้วยการเขียน C module

มา upgrade LUA skill กัน ด้วยการเขียน LUA ไปเรียก module ที่เขียนด้วย C



ส่วนจะควรจะเรียกใช้ หรือเขียนอะไรด้วย LUA เขียนอะลัวด้วยไร ค่อยไปหาคำตอบกันเอง เช่น มีเพื่อนผมกลุ่มนึง เขียน Socket library เป็น Core module แล้ว Binding เขากับ LUA จากนั้นก็ใช้ LUA เขียน Server ทั้งตัว ก็มี

จาก Document พบว่า LUA ใช้ lua_State ในการส่งผ่าน parameters จาก LUA script ไปยัง C module ("Shared Object", file.so)  โดยมีรูปแบบมาตรฐานเริ่มต้นดังนี้

#include <lua.h> 
#include <lauxlib.h>

#include <lualib.h> 

int luaopen_cprime(lua_State *L){
   return 0;
}

ผมตั้งชื่อ library ตัวนี้ว่า cprime โดยวางแผนว่า ในนั้นจะมี function ง่ายๆ ในการตรวจสอบว่า ตัวเลขที่ส่งเข้ามาเป็น Prime Number หรือไม่ 

จากนั้นก็เพิ่ม function isprime สำหรับการตรวจสอบ Prime Number เข้าไป

static int isprime(lua_State *L) {
   int number = lua_tointeger(L, -1);
   for (int i = 2; i < number; i++) {
      if (number % i == 0 && i != number) {
         lua_pushnumber(L, 0);
         return 1;
      }
  }
  lua_pushnumber(L, 1);
  return 1;
}

อย่างที่ได้บอกไปแล้วว่า LUA ใช้ lua_State เป็น structure ในการส่งผ่าน parameters ระหว่าง LUA และ external module รวมถึงภายใน external module เอง 

ถ้าดูจาก function isprime ด้านบน lua_State จะเป็นทำหน้าที่ส่งผ่าน parameters ของ function isprime ทั้งหมด กรณีนี้ ผมส่ง integer เข้ามาตัวเดียว ซึ่งเราจะทำการดึง integer ที่ส่งผ่านเข้ามาใน isprime ด้วย lua_tointeger(L, -1);

lua_Integer lua_tointeger (lua_State *L, int index);

จากนั้นก็ตรวจสอบดูว่า ค่าที่ส่งเข้ามานั้นเป็น Prime Number หรือไม่ ถ้าใช่ เราก็ทำการ push 1 เข้าไปใน lua_State ด้วย lua_pushnumber(L, 0);

void lua_pushnumber (lua_State *L, lua_Number n);

ถ้าไม่ใช่ก็ push 0 เข้าไปแทน

แต่ก่อนจะใช้ isprime ได้ต้องทำการ register method isprime ให้ LUA รู้จักก่อนโดยการเรียก  (เราอาจเปลี่ยนชื่อ isprime เป็นอย่างอื่นก็ได้ ด้วยการแก้ที่ paraemters ที่สอง เช่น "fprime" เป็นต้น)

lua_register(L,"isprime",isprime); 

ใน luaopen_cprime(...); ซึ่งหน้าตาของ cprime.c จะเป็นแบบนี้

#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>

static int isprime(lua_State *L) {
  int number = lua_tointeger(L, -1);
  for (int i = 2; i < number; i++) {
    if (number % i == 0 && i != number) {
      lua_pushnumber(L, 0);
      return 1;
    }
  }
  lua_pushnumber(L, 1);
  return 1;
}

int luaopen_cprime(lua_State *L){
  lua_register(L,"isprime", isprime);
  return 0;
}

จากนั้น compile 

$ gcc -Wall -shared -fPIC -o cprime.so -I/usr/include/lua5.1 -llua5.1 cprime.c

(อย่าลืมติดตั้ง Lua5.1 ก่อนนะจ๊ะ)

แล้วเราก็มาสร้าง prime.lua file เพื่อเรียกใช้ isprime ของเรา หน้าตาจะเป็นแบบนี้ครับ

#!/usr/bin/lua

require("cprime")
print(isprime(13))
print(isprime(12))

แล้วเรียก

$ lua prime.lua
1
0

ประมาณนี้...ครับ :-)