Oct 29, 2013

ทำไมเชียงใหม่ถึงเจริญกว่าลำปาง

สัปดาห์ก่อนนั่งย่างเนื้อกับ @pruet @TonsTweetings แล้วเกิดคำถามขึ้นมาว่า ทำไมเมืองเชียงใหม่ถึงได้เจริญกว่าลำปางมาก ทั้งๆ ที่ลำปางนั้นอยู่ในจุดยุทธศาสตร์ที่ดีกว่า

ได้ยินคำตอบก็ทำเอาอึ้งอยู่ 2 อย่าง
  1. อึ้งอย่างแรกคือเชียงใหม่เพิ่งจะมาเจริญกว่าลำปางอย่างเห็นได้ชัดเมื่อไม่ถึงครึ่งศตวรรษนี้เอง ... การศึกษาท้องถิ่นสอนอะไรตรูมาเนี่ย นอกจากเรื่องสุโขทัย กรุงศรีฯ กรุงเทพฯ ตามบังคับกระทรวงแล้ว ก็เล่าแต่เรื่องของจังหวัดตัวเองท่าเดียว ละเลยจังหวัดเพื่อนบ้านไปซะงั้น

    ยอมรับโดยสัตย์จริงว่า เคยคิดว่าเชียงใหม่เป็นอย่างนี้ได้ เพราะเจ้าดารารัศมี (เมื่อร้อยกว่าปีก่อน) เลยนะเนี่ย

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

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

  2. อึ้งอย่างที่สองคือเหตุผลที่ทำให้เชียงใหม่เจริญจนถึงจุดนี้ได้ เพราะตอนนั้นลำปางถูกรัฐบาลส่วนกลางวางไว้ให้เป็นจุดยุทธศาสตร์ภาคเหนือ เลยได้เป็นคนเลือกก่อนว่าจะเอาความเจริญจากสถานีโทรทัศน์หรือมหาวิทยาลัยไปตั้งในจังหวัดตัวเอง แล้วลำปางเลือกสถานีโทรทัศน์ช่อง 8 (2503) ทำให้เชียงใหม่ได้มหาวิทยาลัย (2507) มาแทน

    ผลพวงจากการที่เชียงใหม่ได้มหาวิทยาลัยมาแบบส้มหล่น ทำให้ความเจริญต่างๆ ค่อยๆ คืบคลานตามมาทีหลัง ไม่ว่าจะเป็นสนามบินนานาชาติ (2513) มหาวิทยาลัยพายัพ (2517) เซ็นทรัลกาดสวนแก้ว (2535) โรบินสันแอร์พอร์ต (2539) แบงก์ชาติ (2540) ... และท้ายที่สุด สถานีโทรทัศน์ช่อง 11 (2543)

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

    นั่งนึกไปนึกมาก็อดคิดไม่ได้ว่า ถ้าตอนนั้นเชียงใหม่ได้เป็นคนเลือกก่อนบ้างหละ? จะเป็นฝ่ายเลือกมหาวิทยาลัย (อย่าลืมว่าตอนนั้นเชียงใหม่ก็มีมหาวิทยาลัยแม่โจ้ (2477) อยู่ก่อนแล้ว) หรือเลือกสถานีโทรทัศน์แบบที่ลำปางทำนะ

ทิ้งท้ายหัวข้อสนทนาด้วยเรื่องที่น่าสนใจว่า ต่อไปนี้มหาวิทยาลัยเชียงใหม่ไม่ได้มีแต่มหาวิทยาลัยแม่ฟ้าหลวงให้กลัวซะแล้ว เพราะมหาวิทยาลัยพะเยากำลังมาแรงเลยทีเดียว

edit: แก้ไขเป็นมหาวิทยาลัยพะเยาตามความเห็นของ @pruet

Oct 27, 2013

ทำ Debian Package ขึ้น Launchpad PPA

การทำ software package นั้นก็เปรียบเสมือนพ่อค้าคนกลาง หลักการทั่วๆ ไปคือ
  1. สืบเสาะว่าในตลาด (package source) ตอนนี้ สินค้าชนิดไหนที่ลูกค้า (user) ต้องการแต่ยังไม่มี (หรือมีแต่ก็ยังไม่ดีพอ)
  2. ตระเวณหาผู้ผลิตสินค้า (upstream) ชนิดนั้นๆ เจรจาต่อรองราคาซื้อสินค้า (app) มาตุนไว้
  3. ปรับแต่งสินค้า (config) ให้เหมาะกับลูกค้า แล้วบรรจุหีบห่อ (packaging) ส่งขายหน้าร้านของตัวเอง (PPA)
หน้าที่ของคนออก software package จึงไม่ใช่การเขียน code สำหรับ software ตัวนั้นๆ ซักเท่าไหร่ แต่เป็นการ config และทดสอบ dependency ให้ทำงานได้บนระบบนั้นซะมากกว่า

อย่างไรก็ตาม บางครั้ง software ที่ต้องการทำ package ก็ไม่มี upstream เพราะอาจจะผูกติดกับ platform นั้นๆ (native package) อย่างเช่น theme หรือโปรแกรมเฉพาะสำหรับ platform

บังเอิญว่าอยากทำ theme package พอดี แต่ tutorial ที่เจอดันสอนแต่แบบที่ต้องพึ่ง upstream (และเน้นหนักด้าน config) แถมยังเอา bzr มาปนซะเยอะ (แน่นอนว่าผมพยายามใช้แต่ git ถ้าเป็นไปได้) สุดท้ายเลยไล่โหลด code ชาวบ้านมาดูถึงทำเป็น

วิธีการทำ native package สำหรับ Debian โดยคร่าวๆ ก็คือ
mkdir proj-package/proj-0.9.0
cd proj-package/proj-0.9.0
dh_make --native
หมายเหตุว่าตอนนี้จำเป็นที่จะต้องห้อยเลข version ไว้ที่ชื่อ directory ด้วย ส่วน proj-package จะมีหรือไม่มีก็ได้ แต่พอเราทำ package แล้วไฟล์ต่างๆ จะมาอยู่ทำระดับเดียวกันกับ proj-0.9.0 ดังนั้นถ้าไม่อยากให้ไฟล์อื่นๆ ปนกันมั่วก็สร้างไว้ด้วย

พอสั่งคำสั่งสุดท้ายเสร็จก็ตอบคำถามอีก 1-2 ข้อ จะมี directory ชื่อ debian โผล่มา ถึงตอนนี้ถ้าอยากแก้ proj-0.9.0 เอา version ออกให้เหลือแค่ proj หรือกระทั่งเปลี่ยนเป็นชื่อใดๆ ก็ทำได้เลย

เรียบร้อยแล้วเข้าไปแก้ไฟล์ต่างๆ ใน debian ดังนี้
  • ลบทุกไฟล์ที่ลงท้ายด้วย .ex, .EX
  • ลบไฟล์ที่เกี่ยวกับ README และ directory source
  • แก้ไฟล์ copyright เพิ่มชื่อเจ้าของผลงานการทำ package ลงไป
  • แก้ไฟล์ control เพิ่มรายละเอียด อันนี้ยากหน่อย แนะนำให้ดูตัวอย่าง package ที่คล้ายๆ กันแล้วลอกมา

แก้เสร็จแล้วลอง build package ดู โดยกลับไปอยู่ที่ระดับเดียวกับ directory debian แล้วสั่ง
debuild -us -uc
จะได้ไฟล์ proj_0.9.0.deb (Debian installer ที่สามารถ double click เพื่อติดตั้งได้) ที่ระดับ directory proj-0.9.0 (กลับออกไป 1 ระดับ)

แต่ว่า package ตอนนี้มันยังเป็น package เปล่าๆ ไม่มีอะไร ถ้าต้องการระบุว่า package นี้จะติดตั้งไฟล์ไปที่ใดบ้าง ก็เอาไฟล์นั้นๆ ไปไว้ในระดับเดียวกันกับ debian เช่น
proj-0.9.0
├── bin
│   ├── goodbye.sh      # install => /usr/bin/goodbye.sh
│   └── hello.sh        # install => /usr/bin/hello.sh
├── conf
│   └── greeting.conf   # install => /etc/greeting.conf
└── debian
แล้วก็เขียนไฟล์ debian/install เช่นนี้
bin/* /usr/bin/
conf/* /etc/
หมายเหตุว่าไฟล์พวกนี้จะไปทับไฟล์ของ package อื่นๆ ไม่ได้ (ต้องเพิ่ม Conflict/Replace ใน debian/control -- จะยังไม่พูดถึงตอนนี้) อันที่จริง มันไม่ควรจะไปทับไฟล์ใดเลย เพราะตอน remove ไฟล์พวกนี้จะหายไปอัตโนมัติ ไม่ใช่ revert กลับไปเป็นของเดิม

ส่วน action ต่างๆ ที่จะทำตอนก่อนหรือหลังการ install / remove (เช่น install เสร็จแล้วก็ auto config เล็กน้อย) ก็เขียนเป็น shell script ใส่ preinst, postinst, prerm, postrm ไว้ใน directory debian นั่นแหละ

เมื่อ test build ที่เครื่อง local จนมั่นใจแล้ว ก็แก้ไฟล์ debian/changelog เปลี่ยน unstable เป็น codename ของระบบที่ใช้อยู่ (ดูได้ที่ /etc/lsb-release) และแก้ข้อมูลอื่นๆ ตามสมควร

เรียบร้อยแล้วกลับมาอยู่ที่ระดับเดียวกับ proj-0.9.0 แล้วสั่ง
tar -zcvf proj_0.9.0.orig.tar.gz proj-0.9.0/

cd proj-0.9.0
debuild -S -k$PGPKey

cd ..
dput ppa:user/repo proj_0.9.0_source.changes
เพื่ออัพ package นี้ขึ้น PPA ที่ Launcpad ต่อไป (รอมัน build ประมาณครึ่งชั่วโมง)

ทีนี้ ถ้าเพื่อนเราที่ใช้ Debian/Ubuntu รุ่นที่เรา build package ตัวนี้ไว้ อยากจะ install package นี้ ก็บอกเพื่อนว่าทำแค่
add-apt-repository ppa:user/repo
apt-get update
apt-get install proj
เท่ปะล่า :P

Oct 15, 2013

Taskbar 2 ข้าง

ผมชอบแนวคิดของ Unity พอสมควร คือในเมื่อพื้นที่แนวตั้งมันเหลือน้อย แล้วทำไมเราไม่ย้ายพวก taskbar ต่างๆ ไปไว้ด้านข้างซะหละ? (รักษาพื้นที่แนวตั้งให้ได้มากที่สุด) แต่ที่รับไม่ค่อยได้คือมันเล่นบังคับให้อยู่แค่ด้านซ้ายอย่างเดียวเลย (เผด็จการ) แถมขนาดที่ใหญ่เวอร์ของมันก็ทำให้หน้าจอดูไม่สมดุลอีก

ทางออกง่ายๆ คือทำให้ taskbar มีทั้ง 2 ข้างซะ ข้างนึงอาจจะเป็น taskbar (โปรแกรมที่เรียกบ่อย / โปรแกรมที่เปิดอยู่) แล้วอีกข้างเป็น status bar (วันที่, เวลา, ภาษา, ไวไฟ ฯลฯ) ก็ดูดีไม่ใช่น้อย

ผมลอง XFCE แล้วพบว่า build-in taskbar ก็พอใช้ได้ (ลูกเล่นน้อยกว่า Unity) แต่ที่รับไม่ค่อยได้คือ status bar มันกากๆ ยังไงไม่รู้ ปัญหาที่เจอคือถ้าวาด icon พวกไวไฟ, แบตฯ ใหญ่ๆ แล้วภาพแตก แต่ถ้าวาดรูปเล็กไปก็ไม่มีพื้นที่พอให้แสดงเวลาอีก

เล่นไปเล่นมาก็เพิ่งนึกได้ว่า ไอ้ status bar เนี่ยไม่จำเป็นต้องเอาไว้ด้านข้างก็ได้ ยังไงซะถ้าเปิด app เต็มจอ ก็โดน menu bar แย่งพื้นที่อยู่ดี ซึ่งตรงนี้ Unity มันเอา status bar ไปรวมกับ menu bar ให้อยู่แล้ว ปล่อยไว้อย่างนั้นแหละ

ตอนนี้เลยเล่นท่าง่าย ซ่อน taskbar ของ Unity ไว้ซะ แล้วใช้ Docky ทั้งสองข้างแทน ได้ผลออกมาดังนี้


ใช้ไปใช้มาแล้วพบว่ายังติดปัญหาอยู่เล็กน้อย เช่น
  1. ก็ยังตั้งค่าให้กด icon เพื่อเรียก Unity Dash ไม่ได้ ต้องกดปุ่ม super อย่างเดียว (ปัญหาเดิมเหมือนตอนซ่อน taskbar แล้วใช้ Docky ข้างล่าง)
  2. ถ้าใช้โปรแกรมแบบเต็มหน้าจอ จะเลื่อนเมาส์ไปลาก scrollbar ต้องใช้สมาธิเพิ่มขึ้นมากๆ ไม่งั้นจะไปโดน taskbar ด้านขวามือแทน (แล้วมันก็จะขยายมาบังอีก) ซึ่งแก้ได้ด้วยการไม่เปิดโปรแกรมเต็มหน้าจอบ่อยๆ + ใช้ keyboard แทนในหลายๆ กรณี (home, ctrl+down, mouse wheel)
  3. ตัวหนังสือ default ของ Ubuntu มันไซส์ใหญ่ไปหน่อย เปิด 2 terminal ข้างๆ กันแล้วไม่ได้จอละ 80 ตัวอักษรแล้ว
  4. ใช้ Touchpad / TrackPoint จิ้มเรียกโปรแกรมจะไม่ค่อยรู้สึกแปลก (เพราะมันใช้ได้ทั้ง 2 มือ) แต่ถ้าใช้เมาส์มือขวาจะรู้สึกว่ามันจิ้ม taskbar ด้านซ้ายยากมาก ... อันนี้คงคิดไปเอง :P

แต่โดยรวมก็ถือว่า happy กว่าเก่าเยอะ

Oct 1, 2013

ฝากหน้าเว็บขำๆ กับ Google App Engine

ช่วงนี้เล่น JavaScript / CoffeeScript / CSS บ่อย พอโปรแกรมเริ่มซับซ้อนขึ้น ครั้นจะแสดงตัวอย่างด้วย code เพียวๆ ให้นั่งนึกตามคงไม่ไหว เลยต้องหาที่ฝากไฟล์แบบแสดงเป็นหน้าเว็บซักหน่อย จะได้ demo เจ้าตัว mock up นี้อย่างสะดวกราบรื่น ไม่ต้องเปิดเครื่องตัวเองโชว์หรือให้คนอื่นเข้ามาทาง ip address

ทางออกที่สวยงามที่สุดสำหรับผมคือ Google App Engine ครับ เพราะนอกจากจะได้ URL ที่สั้นและสะอาดแล้ว ยังสามารถพัฒนา controller เบื้องหลังต่ออย่างเนียนๆ ในอนาคตได้อีก

วิธีการก็ไม่ยุ่งยากครับ โหลด App Engine SDK (ผมใช้แบบ command line) มาพร้อมสร้าง application ใหม่ เรียบร้อยแล้วไปยัง directory ที่เก็บ file เว็บของเรา (.html, .css, .js, .jpg ฯลฯ) สร้าง directory ใหม่ชื่อว่า static แล้วย้าย file ทุกอันไปไว้ใน directory ใหม่นี้ ถ้าทำถูกต้องโครงสร้าง directory จะออกมาประมาณนี้ครับ

.
└── static
    ├── beautiful.css
    ├── img/
    ├── index.html
    ├── jquery.min.js
    └── logic.js

หลังจากนั้น สร้างไฟล์ app.yaml แล้วเขียนข้อมูลดังนี้

application: application-name
version: 0-alpha
api_version: 1

runtime: php
threadsafe: true

handlers:
- url: /
  static_files: static/index.html
  upload: static/

- url: /(.*)
  static_files: static/\1
  upload: static/(.*)

อย่าลืมเปลี่ยนบรรทัดแรกให้เป็นชื่อ application ตามที่สมัครไว้กับ App Engine ด้วยนะครับ

ถึงตอนนี้ ถ้าใช้ command line เพียงสั่ง appcfg.py update . ก็เรียบร้อย ส่วน GUI ให้สั่ง import application เพื่อเลือก directory นี้เข้ามา แล้วกด deploy ครับ



อย่างไรก็ตาม วิธีนี้ฝากได้แต่ไฟล์ static เท่านั้น ถ้าเป็นไฟล์ script ที่ทำงานฝั่ง server (เช่น .php) มันจะไม่แปลเป็น .html ให้ครับ ระวังว่าจะเผลออัพไฟล์ source code ที่มีข้อมูลที่ไม่อยากให้ใครเห็นนะครับ

ถ้าอยากให้ server แปล .php ก็เอาไฟล์ .php ทั้งหลายออกจาก directory static มาไว้ที่ directory หลัก แล้วเพิ่ม handlers นี้ไว้ก่อนอันสุดท้ายครับ

- url: /(.*)\.php
  script: \1.php

ทั้งนี้ database ของ App Engine นั้นไม่ใช่ MySQL นะครับ ถ้าจะติดต่อ database ด้วยอาจต้องศึกษาเพิ่มนิดหน่อยแล้วหละ ;)

ก็น่าจะเป็นทางเลือกที่น่าสนใจไม่น้อย ตั้งแต่คนที่แค่มองหา host ขำๆ ไว้ฝากหน้าเว็บส่งงาน mock up ไม่กี่ครั้ง ไปจนถึงเหล่าผู้พัฒนา prototype ทั้งหลายที่อาจต้องขยาย project ในอนาคตเลย