วันเสาร์, ธันวาคม 19, 2552

เทคนิคการดูพื้นที่ในแต่ละ Folder ของ Linux

วันนี้ Server ที่ทำงานอยู่มีปัญหา Hard disk เต็ม เลยได้โอกาสลองหาวิธีการจัดการดู ถ้าปัญหานี้เกิดบน Mac คงใช้โปรแกรม OmniDisksWeeper ในการตรวจสอบ แต่บน Linux ไม่รู้ใช้ตัวไหนดี เลยลองคำสั่ง classic ดู

$ du / -h | grep "[0-9]G"

du -h คือให้แสดงขนาดของ Folder ออกมาทั้งหมด โดยแสดงขนาดเป็นหน่วยที่คน (h=human) อ่านออก
grep "[0-9]G" คือให้หยิบมาเฉพาะบรรทัดที่มี ตัวเลขตามด้วยอักษร G

ผลที่ได้จะออกมาประมาณนี้

3.8G /var/lib/mysql
6.0G /var/lib
8.7G /var
3.5G /opt/nginx/logs
3.6G /opt/nginx

พอลอง search เพิ่มเติม ก็พบว่ามันสามารถ sort ได้ด้วย

$ du -h | grep "[0-9]G" | sort -n -r > du.txt 
$ du -h | grep "[0-9]G" | sort -n -r | less

ใครอยากดูแบบละเอียดก็เปลี่ยน G เป็น M แทนนะครับ

วันอังคาร, ตุลาคม 27, 2552

กำหนดขนาดไฟล์ upload ใน nginx

ให้เพิ่มบรรทัด client_max_body_size ไปใน http ครับ

http {
    include conf/mime.types;
    default_type application/octet-stream;
    ....
    client_max_body_size 10m;
    ....
}

ในตัวอย่างใส่ไว้ 10MB แต่หลายเว็บบอกว่าไม่ถึงครับ ถ้าสนใจการคำนวนแนะนำให้อ่านบนเว็บ nginx:client_max_body_size อีกที

นอกจาก client_max_body_size แล้วยังมีค่าอื่นๆให้ set ได้อีก เช่น

  ## Size Limits
  client_body_buffer_size     128K;
  client_header_buffer_size   128K;
  client_max_body_size         10M;
  large_client_header_buffers 1 1k;
ให้ลองอ่านใน คู่มือนะครับ

ที่มา: calomel.org

วันพฤหัสบดี, ตุลาคม 22, 2552

ไม่ให้ terminator กระพริบ

หลังจากลง xubuntu บนเครื่องก็เจอปัญหากับ terminal ว่ามันจะกระพริบทุกครั้งที่เราทำอะไรผิดเล็กๆ น้อยๆ เช่นกด Backspace เกิน ซึ่งผมกดบ่อยมากๆ ค้นไปค้นมา พบว่ามันเรียก "visual bell"

การแก้กับ gnome-terminal ไม่ยากนัก เข้าไปแก้ที่

$ vi ~/.gconf/apps/gnome-terminal/profiles/Default/%gconf.xml

แก้บรรทัดที่เขียนว่า

<entry name="silent_bell" mtime="1256205563" type="bool" value="true"/>

ให้ value เป็น ture ก็เรียบร้อย เปิดขึ้นมาใหม่ มันก็เลิกกระพริบแล้ว

ปกติเจ้า terminator จะตาม gnome-terminal แต่คราวนี้มันไม่ยอมตาม เลยต้องหาทาง config เข้าไปตรงๆ โดยสร้าง folder "terminator" ไว้ใน ~/.config แล้วสร้างไฟล์ config ไว้ในนั้น
~/.config/terminator/config

ใส่บรรทัดนี้ลงไป
visible_bell = False

หลังจาก save เมื่อเราเปิด terminator ขึ้นมาใหม่ มันก็จะไม่กระพริบแล้วครับ

วันพุธ, ตุลาคม 21, 2552

compile ffmpeg 0.5 สำหรับ ubuntu 9.04

เนื่องจาก ffmpeg ตัวล่าสุดไม่มี vhook ซะแล้ว ทำให้ต้องดั้นด้นไปเอา ffmpeg ตัวเก่ามา compile เอง วิธีการก็มีดังนี้

ขั้นแรกต้องชี้ source list ไปที่ midibuntu ก่อน เนื่องจาก package ที่ต้องการมีหลายตัวที่ไม่สามารถมาอยู่ใน ubuntu ได้ เนื่องจากข้อกำหนดของ ubuntu ที่ไม่รับ library ที่ไม่ opensource ดังนั้นเราเลยต้องไปเอามาจาก midibuntu แทน

$ sudo wget http://www.medibuntu.org/sources.list.d/hardy.list \ 
--output-document=/etc/apt/sources.list.d/medibuntu.list
$ sudo apt-get update && sudo apt-get install medibuntu-keyring && sudo apt-get update

ติดตั้ง libamr
$ sudo apt-get install libamrnb-dev libamrwb-dev

ติดตั้ง libnut
$ svn co svn://svn.mplayerhq.hu/nut/src/trunk/ nut
$ cd nut
$ make
$ sudo make install
ติดตั้ง libimlib2
$ sudo apt-get install libimlib2-dev libimlib2

ติดตั้งอื่นๆ
$ sudo apt-get install libfaac-dev libfaad-dev libschroedinger-dev libtheora-dev libvorbis-dev libxv-dev libxvmc-dev

ติดตั้ง mp3 library
$ sudo apt-get install libmp3lame-dev

ใครที่ใช้ ubuntu 8.04 ให้สั่ง sudo apt-get install liblame-dev แทน ใหม่กว่านั้นใช้คำสั่งข้างบนได้

compile ffmpeg
$ wget http://ffmpeg.org/releases/ffmpeg-0.5.tar.bz2
$ bunzip2 ffmpeg-0.5.tar.bz2
$ tar -xvf ffmpeg-0.5.tar
$ cd ffmpeg-0.5
$ ./configure --prefix=/usr/local --enable-gpl --enable-nonfree  \
--enable-postproc  --enable-avfilter-lavf --enable-pthreads \
--enable-x11grab --enable-bzlib --enable-libamr-nb \ 
--enable-libamr-wb --enable-libdc1394 --enable-libfaac \ 
--enable-libfaad --enable-libfaadbin --enable-libgsm \
--enable-libmp3lame --enable-libnut --enable-libschroedinger \
--enable-libtheora --enable-libvorbis --enable-zlib 

ถ้ามี library x264, xvid และไม่ต้องการใช้ vhook ให้เอาคำสั่งข้างล่างมารวมตอนสั่ง configure ด้วย
--enable-libx264 --enable-libxvid  --enable-avfilter --enable-shared

$ wget http://ffmpeg.org/releases/ffmpeg-0.5.tar.bz2
$ make
$ sudo make install

กำหนด Library path
$ sudo vi /etc/profile

เพิ่มข้อความนี้ไว้ที่บรรทัดสุดท้าย
LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH
แล้วสั่ง
$ source /etc/profile
$ sudo ldconfig

เป็นอันเสร็จ ถ้าจะทดลองสามารถใช้คำสั่งแบบนี้ได้
ffmpeg -i input.wmv -vhook '/usr/lib/vhook/imlib2.so -x 0 -y 0 \
-i watermark.png' output.avi

reference:
juliensimon
download ffmpeg

วันพฤหัสบดี, ตุลาคม 15, 2552

ติดตั้ง rails บน Ubuntu 9.10 Karmic Koala

ปัญหาของการติดตั้งคือหลังจากที่

$ sudo apt-get install ruby rubygems
$ gem install rails

เราจะยังไม่สามารถเรียก rails ได้ เพราะใน $PATH ไม่ได้ชี้ไปที่ /var/lib/gems/1.8/bin
ดูได้จากคำสั่ง

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

จะเห็นว่าไม่มี path ที่ชี้ไปยัง bin ของ gems วิธีการแก้คือใส่บรรทัดต่อไปนี้ไว้ในไฟล์ ~/.bashrc

export PATH="$PATH":/var/lib/gems/1.8/bin

จากนั้นทดลองเปิด terminal ขึ้นมาใหม่ หรือสั่ง source ~/.bashrc หรือ source /etc/profile ถ้าแก้ path ใน profile

เท่านี้ก็สามารถเรียกใช้ rails ได้แล้วครับ


เสริม 1
ถ้าต้องการให้ user คนอื่นใช้ด้วย (ยกเว้น root) ให้กำหนด path ไว้ที่ไฟล์ /etc/profile
และถ้าต้องการให้ root เห็นให้ลองอ่าน Troubleshooters.com

เสริม2
ตอนที่ติดตั้ง ruby ควรสั่งครบชุดแบบนี้ครับ

$ sudo apt-get install ruby ruby-dev irb libopenssl-ruby rubygems

หนังสือสองเล่มจากงานสัปดาห์หนังสือแห่งชาติ



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

ก่อนออกจากร้านโดนคนขายขู่ว่า "จะไม่มีให้ซื้อนะครับ" ... ไอ้เราก็กลัว... แต่สุดท้ายมาคิดได้ว่าหนังสือดีๆ แบบนี้ ปีนี้ก็ขายหมดแน่ๆ ปีหน้าก็ต้องพิมพ์อีกอยู่แล้ว ด้วยความประมาทเราเลยซื้อหนังสือจาก ASK Media มาแค่เล่มเดียว

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

วันจันทร์, ตุลาคม 05, 2552

หรือว่าเทคโนโลยีฝั่ง server จะไม่ hot ซะแล้ว

วันก่อนมีน้องคนนึงทัก "พี่ rails มันไม่ hot แล้วหรือเปล่า?" เราก็มาคิด... แล้วอะไรมัน Hot ล่ะ Grail, Java, PHP, Perl, Python แต่ละตัวอยู่กันนิ่งๆ พัฒนาไปเรื่อยๆ ตามกระแส plugin ต่างๆ ก็พัฒนาไปตามๆ กัน เรียกว่า Hot ก็คงไม่เหมาะ

แล้วอะไรที่ Hot ?

ผมพบว่าเทคโนโลยีฝั่ง Client นั้น Hot สุดๆ ความร้อนแรงของ Server ได้หายไปแล้ว ฝั่ง Client นำทีมด้วย Java Script ผลิด Library น่าทึ่งออกมามากมาย เช่น

Extjs เป็น Java Script ที่ให้ความรู้สึกด้าน Engineering เหมือนเขียน Java Swing ผมไม่ได้หมายความว่ามันช้านะ :p



Juggernaut Push technology ที่ทำให้เราไม่ต้องคอยวน loop เรียก server ทุกๆ 10 วิ สนใจเพิ่มเติมลองดูvideo demo



raphaeljs, svg web ที่ทำให้ SVG กลับมาอีกครั้งหลังจากกระแสเงียบไปนาน เนื่องจาก Adobe เลิกดัน หันไปซื้อ Macromedia แทน ตอนนี้ svgweb ทำให้ ie สามารถเปิด svg ได้ และ rapheljs ก็ทำให้เราเขียน svg ง่ายขึ้น จากแต่ก่อนที่ต้อง แกะ DOM เอาเอง



cappuccino ทำให้เรารู้สึกเหมือนเขียน cocoa + objective-c บน browser ได้ แถมมีโปรแกรมหน้าตา interface builter มาให้อีกต่างหาก ทั้งหมดจะ ใช้ java script เป็นตัว run เราเรียกมันว่า objective-j ไม่ใช่ว่ามัน compile ที่ server site นะ มัน run กันสดๆ บน browser เลย ผมงี้อึ้งไปเลย แล้วยิ่งอึ่งไปอีกตอนดู demo เร็วมั๊กๆ



sproutcore ตัวนี้ไม่ hardcore เท่า cappuccino แต่ก็ได้แรงบรรดาลใจมากจาก cocoa เหมือนกัน เชียนให้ client site มี MVC เป็นของตัวเอง แทบจะเปลียนโลก java script เลยทีเดียว



ล่าสุดโครงการที่พัฒนาขึ้นในบริษัทมี code กว่า 50% ไปอยู่ที่ฝั่ง client ครับ เขียนด้วย javascript ซะเพียบ code ฝั่ง server เน้นทำ model แล้วส่ง json ไปให้ browser

นอกจากพวกนี้ ฝั่ง client ยังมีของดีออกมาเรื่อยๆ แทบไม่เว้นแต่ละวัน ยังดีที่เมื่อก่อนทำ SVG+Javascript มาเลยพอจะเข้าใจแรงบรรดาลใจของพวกนี้มาบ้าง ถ้าวันนี้น้องคนนั้นมาถามอีกครั้งผมคงตอบว่า "มันผ่านช่วง Hot ไปแล้ว เลือกของให้เหมาะกับงานดีกว่า" ของสนุกกำลังมา พวกที่อยู่บน server ทำให้มันเสร็จเร็วๆ แล้วมาเล่นเอาใจ user กันดีกว่า

วันศุกร์, ตุลาคม 02, 2552

ให้ Quick look แสดงข้อมูลที่อยู่ใน folder

หลายครั้งเวลาใช้ quick look ไปเจอ folder ผมจะรู้สึกว่า "มันจะ Zoom รูป Folder มาทำไม!!" วันนี้ไปเจอข้อมูลใน TUAW ว่าเราสามารถให้ Quick look มันแสดงข้อมูลที่อยู่ใน folder ได้ด้วย !!

หน้าตาประมาณนี้


ที่บอกว่าประมาณนี้ เพราะว่าของจริงมันมี animation ด้วย ดูแล้วเท่มาก ถ้าเป็นของ Win7 ไม่ต้อง Quick look ก็เห็นใส้ข้างในเลย Zoom ออกมาดูได้ ดีกันคนละแบบ

วิธีการเปิดความสามารถนี้นี้ก็ง่ายๆ ครับ ให้เข้าไปที่ terminal.app แล้วพิมพ์คำว่า

$ defaults write com.apple.Finder QLEnableXRayFolders 1

จากนั้นกด ctrl+alt+esc แล้วเลือก finder > relunch

หรือจะสั้งแบบนี้ที่ terminal ก็ได้

$ killall Finder && open /System/Library/CoreServices/Finder.app

หรือใครสบายใจที่จะหา process id ก่อน แล้วค่อย kill จาก process id ก็ใช้คำสั่งนี้

$ ps -caux | grep Finder
$ kill && open /System/Library/CoreServices/Finder.app

ทั้งสามแบบให้ผลเหมือนกันครับ หลัง Finer กลับมาก็ทดลองเปิดหน้า Finder แล้วใช้ Quick look กับ Folder ดูครับ

ผมเดาว่าที่ Snow Leopard และ Leopard ไม่ยอมเปิดความสามารถนี้เป็น default น่าจะเพราะมันเร็วไม่พอ ตอนผมกดมันจะหน่วงๆ อาจจะเพราะมันต้องทำ Quick look กับหลายๆ ไฟล์ข้างในก่อน หรือไม่ก็เพราะเค้ายังทำได้ไม่เนียบพอก็เลยปิดไว้ก่อน ก็ต้องรอดูต่อไปครับ

ที่มา: TAUW

วันพฤหัสบดี, กรกฎาคม 16, 2552

ตัดช่องว่างให้เหลือช่องเดียว

เวลาผู้ใช้กรอกฟอร์มมาให้เรา มันคาดหวังได้ยากว่าเค้าจะกรอกให้เราแบบสมบูรณ์ บ่อยครั้งที่เค้าใส่ช่องว่างมาให้เราด้วย ถ้าเราไม่ตรวจสอบดีๆ การเก็บข้อมูล หรือออกรายงาน ของเราจะผิดไป ตอนแรกว่าจะเขียนโปรแกรมมาตัดช่องว่างออก แต่กลายเป็นว่า Ruby มีให้อยู่แล้ว

ถ้าเรามี string แบบนี้
name1 = " นาย สมชาย     วาทุวงศ์"
name2 = "นางสาว    สุขสม อาภา"
ให้สั่ง
name1.squeeze(" ").strip
=> "นาย สมชาย วาทุวงศ์"
name2.squeeze(" ").strip
=> "นางสาว สุขสม อาภา"
เราจะได้ string ที่ตัดช่องว่างออกไปเรียบร้อย

คำสั่ง squeeze(" ") จะย่อ " " ทุกตัวให้เหลือตัวเดียว
ส่วนคำสั่ง strip จะตัดช่องว่าง \n \t \r ที่อยู่ด้านหน้าและด้านหลังออกให้ ไม่ลบตรงกลางนะ

วันพุธ, กรกฎาคม 15, 2552

Like ใน google reader

เมื่อกี้นี้มีปุ่ม like โผล่ขึ้นมาใน google reader



หลังจากทดลองก็พบว่ามันคือการบอกทุกคนบนโลก (ที่ใช้ google reader) ว่าเราชอบ link นี้

แว๊บแรกนึกว่ามันซ้ำซ้อนกับอันอื่นหรือเปล่า เพราะในใจนึกว่า share กับ star มันก็ซ้อนๆ กันอยู่ อันที่เรา star ไว้ก็มักจะอยาก share ด้วย แต่

star มันใช้ของเราคนเดียว
share ก็เอาให้เพื่อนๆ
like เอาไว้บอกทั้งโลก

เมื่อก่อนกด star ทีไรต้องกด share ด้วยทุกที ตอนนี้ภาระของผมต้องเพิ่มจากสองปุ่มเป็น สามปุ่ม ก็มันไม่เหมือนกันนินา :'( ทำไงได้

ตอนนี้พฤติกรรมเริมเปลี่ยน ผมเริมพิจารณาว่าจะกดปุ่มไหนบ้าง แทนที่จะกด start+share เสมอ

ทำเว็บแบบขยาย: เพิ่มความเร็วในการอ่านไฟล์

บริการบนเว็บส่วนมากอ่านไฟล์กันกระจุยกระจายอยู่แล้ว โดยเฉพาะที่บริษัทผมทำด้าน data-ware house เก็บไฟล์ multimedia แค่อ่าน thumbnail หน้านึงอย่างน้อยๆ ก็ 20 ไฟล์ แถมใน server มีไฟล์เป็นล้าน แค่หาไฟล์อย่างเดียวยังไม่ทันอ่าน server ก็เริ่มเหนื่อย

ก่อน ext3 บน kernel 2.6 เวลา server หาไฟล์ใน folder มันต้องไล่หาตั้งแต่ไฟล์แรกไปจนถึงไฟล์ที่ต้องการ ถ้าใน folder นั้นมีซัก 10,000 ไฟล์ server ก็ต้องทำ string match กัน 10,000 ครั้งก่อนจะเริ่มอ่านไฟล์ ถ้าในกรณีบริษัทผมต้องหาไฟล์ 20 ไฟล์ ก็ต้องทำ string match กัน 200,000 ครั้งต่อการเปิดเว็บ 1 หน้า

ตอนนี้ดีหน่อยเพราะเรามี ext3 บน kernel 2.6+ แถมมี ext4 อีกต่างหาก ตัวใหม่ๆ จะเก็บไฟล์เป็น hash เวลาเรียกไฟล์มันจะไปหาใน hash แล้ววิ่งตรงๆ ไปหาไฟล์เลยไม่ต้องเสียเวลาอ่านชื่อกันทีละไฟล์

ใครที่อยู่บนสถาปัตยกรรม เก่าๆ ก็ต้องลดจำนวนไฟล์ใน folder เอานะครับ

ธรรมชาติอีกหนึ่งอย่างที่น่าสนใจคือ เวลาที่ UNIX มันอ่านไฟล์มันไม่ได้อ่านอย่างเดียวครับ มันจะเขียนด้วย สิ่งที่เขียนคือ "เวลา" ที่เราไปยุ่งกันไฟล์ เพื่อบันทึกว่าแต่ละไฟล์ถูกอ่านหรือเขียนไปล่าสุดตอนไหน เราเรียก "เวลา" นี้ว่า "atime" หรือ access time

แน่นอนว่าการเขียนเปลืองพลังงานมากกว่าการอ่านหลายเท่าตัว ถ้าเป็นไฟล์ใหญ่ๆ ก็พอให้อภัยได้ แต่ถ้าเป็นไฟล์เล็กๆ การเขียนนิดเดียวบางทีใช้เวลามากกว่าการอ่าน ยิ่งเป็น web ด้วยเรามีไฟล์เล็กๆ จำนวนมากเช่น thumbnail, css, java script, favorite icon เป็นต้น ถ้า web server หรือ framework ทำงานไม่ดี ไฟล์พวกนี้ต้องอ่านกันทุกครั้งที่ผู้ใช้เปิด browser ทีเดียว

ทางแก้คือตอนที่เรา mount ไฟล์ให้เรา set noatime เอาไว้

noatime: Do not update inode access times on this file system (e.g, for faster access on the news spool to speed up news servers).

การจะ set notime ทำได้ 3 แบบครับ

1. แบบแรกคือทำกันตั้งแต่ตอน install



เลือกตรง mount option ที่ set เป็น default



เลือกที่ noatime ไว้ส่วน relatime จะเลือกไว้ก็ได้ครับ linus บอกไว้ว่า
The “relatime” thing that David mentioned might well be very useful, but it’s probably even less used than “noatime” is. And sadly, I don’t really see that changing (unless we were to actually change the defaults inside the kernel).
2. แบบที่สองคือใส่ตอนที่เราสั่ง mount ครับ
mount -o remount,noatime /
แบบนี้ก็ง่ายดีแต่ถ้า restart เครื่องก็ต้องสั่งกันใหม่ 3. แบบที่สามคือแก้ไฟล์ fstab แบบนี้น่าจะเหมาะกับ web server มากที่สุด ถ้าเรามี fstab แบบนี้
# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
/dev/sda1       /               ext2    errors=remount-ro 0       1
/dev/sda5       none            swap    sw              0       0
/dev/scd0       /media/cdrom0   udf,iso9660 user,noauto     0       0

ให้เราเติม noatime หรือ relatime ไว้ที่ column options ครับ จะใส่ทั้งสองตัวหรือแค่ตัวเดียวก็ได้

# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
/dev/sda1       /               ext2    noatime,relatime,errors=remount-ro 0       1
/dev/sda5       none            swap    sw              0       0
/dev/scd0       /media/cdrom0   udf,iso9660 user,noauto     0       0
เสร็จแล้ว restart เครื่องซักทีนึง แล้วลองสั่ง cat /proc/mounts เพื่อดูว่ามัน mount ให้เราถูกต้องหรือเปล่า
# cat /proc/mounts
rootfs / rootfs rw 0 0
none /sys sysfs rw,nosuid,nodev,noexec 0 0
none /proc proc rw,nosuid,nodev,noexec 0 0
udev /dev tmpfs rw,size=10240k,mode=755 0 0
/dev/sda1 / ext2 rw,noatime,relatime,errors=remount-ro 0 0
tmpfs /lib/init/rw tmpfs rw,nosuid,mode=755 0 0
usbfs /proc/bus/usb usbfs rw,nosuid,nodev,noexec 0 0
tmpfs /dev/shm tmpfs rw,nosuid,nodev 0 0
devpts /dev/pts devpts rw,nosuid,noexec,gid=5,mode=620 0 0

เท่านี้ server ก็ไม่ต้องเสียเวลาเขียนไฟล์แล้วครับ โดยเฉพาะเวลา mount ไปที่ Raid ยิ่งประหยัดได้หลายขุมเลย

ยกเว้นต้องการใช้ atime จริงๆ ก็ควรจะเปิดไว้นะครับ ยิ่งสำหรับเครื่องทั่วไปถ้าเราปิดโปรแกรม mail อาจใช้การไม่ได้เพราะมันมี function เทียบวันเวลาในการอ่านไฟล์เก็บไว้กับ atime เราอาจจะเลือกปิดเป็นบาง partition ตามการ mount ของเราก็ได้

อยากรู้เพิ่มเติมก็สั่ง man mount เอานะครับ

Social network แบบสามัคคีสุดๆ

video นี้ก็แหวกแนวน่าดู



แสดงความสามัคคีแบบสุดๆ ดูแล้วแต่ละคนน่าจะอยู่ใกล้ๆ กัน แต่ถ้าอยู่ไกลกันแบบข้ามประเทศคงเท่น่าดู เอาไว้รนรงค์ลดโลกร้อนแบบ :D

จริงๆ แค่ทั่วไทยก็สุดๆ แล้ว

วันพฤหัสบดี, กรกฎาคม 09, 2552

iPhone Jumbo

ใครอยากได้ iPhone mini ก็ช่างเค้า ผมอยากได้ iPhone Jumbo



หน้าตาแบบนี้ละที่อยากได้ เอาไว้ทำงานแบบไม่ต้องมีโต๊ะ
เช่น ในร้านกาแฟ บนรถไฟฟ้า บนรถเท๊กซี่ หรือตอนเดินไปเดินมา

จริงๆ แม้แต่อยู่บนโต๊ะทำงาน ถ้าเขียนลงไปบนจอได้เลย
แบบนั้นน่าจะได้อารมณ์ก่วาเขียนที่นึง แล้วไปโผลอีกที

"Where you write is where you get"

วันอังคาร, กรกฎาคม 07, 2552

เริ่มเขียนหนังสือ ruby

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

หลังจากเขียนมาได้ประมาณ 33 หน้าก็เริ่มมองหาเครื่องมือในการเขียน เพราะเขียนบน TextEdit.app เริ่มไม่ไหว ดูเหมือน TextEdit.app จะไม่ค่อยถูกกับภาษาไทย ไม่รู้ว่าเป็นเพราะการ render ภาษาไทย หรือเพราะการตัดคำ พอมีภาษาไทยเกิน 8 หน้ามันจะเริ่มช้ามากๆ พอมีถึง 33 หน้ามันเริ่มหยุดนานจนรอไม่ไหว

หันมาใช้ Editor ตัวอื่นอย่าง TextMate ปรากฏว่าอาการช้าหายไป แต่กลายเป็นมันไม่ยอมตัดคำภาษาไทยแทน ทำให้จำเลยตกเป็นของระบบตัดคำภาษาไทยบน Mac

พอเอา BBEdit มาลองก็ได้ผลเหมือน TextMate ครับ

หันมาใช้ไม้ตายอย่างโปรแกรม Page ในชุด iWork ก็พบปัญหาเดียวกันครับ แม้ว่าจะทำงานได้เร็วกว่า TextEdit มากมาย แต่ก็มีความหน่วงเกิดขึ้นบ้าง พอพิมพ์แล้วต้องรอสักเสี้ยววินาทีตัวอักษรจึงจะปรากฎออกมา แต่ระบบตกแต่งทำออกมาได้เยี่ยมมาก ได้ความรู้สึกเหมือนใช้ Latex แบบ WYSIWYG แถมสวยอีกต่างหาก พอมาชั่งน้ำหนักกับความหน่วงแล้วไม่ไหวครับ ตอนเขียนหนังสือต้องการความพริ้วระดับสุดยอด มากกว่าความงาม

เมื่อจำเลยของเราคือ ระบบตัดคำบน Mac ประกอบกับคุณ @roofimon บอกว่าใช้ MS Word ในการเขียนหนังสือ php (แม้ว่าจะเพราะสำนักพิมพ์บังคับก็ตาม) ผมเลยเริ่มเลี่ยงไปใช้โปรแกรมอื่นที่คาดว่ามีระบบตัดคำภาษาไทยเป็นของตัวเอง

เริ่มจาก Open Office for mac พบว่าช้ามากๆ ตั้งแต่ตัวอักษรแรกที่พิมพ์เลยครับ สงสัย Ram ของผมจะไม่พอ (2G) ไม่รู้ต้องทำอย่างไรให้มันทำงานได้เร็ว ยังไม่ทันได้ลองเอา Neo Office (Open Office version mac native) มาลง ก็เปลี่ยนไปทดลองอย่างอื่นต่อ



หันมาใช้ MS Office for Mac กลายเป็นว่า feature สำคัญได้หายไปจาก MS Office for Mac ซะแล้ว นั่นคือเราไม่สามารถแยก latin font กับ Complex script ให้ใช้ font คนละตัวได้ ดังนั้นเวลาเราเขียนตัวอักษรภาษาอังกฤษ จะใหญ่ๆ ผิดปกติ ครั้นจะเลี้ยงไปใช้ font Tonburi มันก็ไม่มีให้เลือกซะงั้น แถมไม่ยอมตัดคำภาษาไทยให้อีกต่างหาก เป็นอันปิดโครงการไปโดยสมบูรณ์



สุดท้ายผมหันมาใช้แนวทางที่ยุ่งยากนิดหน่อย แต่มั่นใจได้มากกว่า นั่นก็คือ "MS Word for Windows" นั่นเอง พอคิดได้ก็ลง Parallels ลง Windows ลง MS Office copy งานจาก TextEdit มาใส่ ปรับแต่ง Style ให้เหลือแค่ Code, Chapter, Sub Chapter และ Normal เสร็จ

MS Word สร้างความประทับใจได้เหลือเชื่อครับ การทำงานที่มีจำนวนหน้ามากกว่า 100 หน้าไม่พบปัญหาความหน่วงเลยสักนิด การตัดคำก็ทำได้ยอดเยี่ยม แถม parallels ก็เข้ากับ Mac ได้ดีทำงาน MS Word ดูธรรมชาติดีบน OS X

สรุปว่าเครื่องมือที่ดีที่สุดในการเขียนหนังสือของผมคือ MS Word for Windows ที่ทำงานบน Parallels ครับ

วันอังคาร, มิถุนายน 30, 2552

RIP MJ.

MJ transcended color, time, space, his music and talent was universal. The inspiration from your will never die.

วันอาทิตย์, มิถุนายน 28, 2552

คำสั่งบน unix ที่ผมใช้

อ่าน blog ของคุณ sothorn แล้วเกิดอยากรู้เหมือนกันว่าเราใช้คำสั่งอะไรบ้าง พอตามเข้าไปดูก็พบดังนี้ครับ
  1. top ใช้บ่อยสุด ถ้าบน mac ต้องใช้ top -o cpu มันถึงจะเรียงตาม cpu ให้ ถ้าบน linux ใช้ top เฉยๆ มันก็เรียงให้เลย ลองกด shift-A ดู มันเรียงให้ครบเลยเท่ดี
  2. ps -aux ใช้ดู process ผมมักใช้คู่กับ grep แบบนี้ "ps -aux | grep mong" เอาไว้ดูว่า web server ของเรายังอยู่หรือเปล่า
คำสั่งที่ต่อไปจะใช้
  1. w ใช้ดูว่าใคร login เข้ามาและกำลังใช้โปรแกรมอะไร
  2. uptime ใช้ดูว่าเครื่องเปิดไว้นานแค่ไหน เราจะได้ไม่ต้องถาม admin ว่า restart เครื่องไปหรือเปล่า (จริงๆ คำสั่ง top ก็บอก uptime นะ)
  3. iptraf ใช้ดู network ทั่วไป

ตัว monitor ที่อยากได้มากๆ คือ process ไหนกิน network ไปกี่ KB เพราะตอนนี้เวลา network ช้าจับมือใครดมไม่ได้เลย :'( ส่วนใหญ่มันดันทำเป็น background process ซะด้วย

วันอังคาร, พฤษภาคม 26, 2552

ใช้ MS Access บน Rails โดยไม่มี ODBC

วันนี้มาเจอปัญหาว่าต้อง export ข้อมูลส่วนหนึ่งเข้า MS Access แต่ server เราดันเป็น Linux เลยไม่มี ODBC ให้ใช้ง่ายๆ หลังจากตามหาวิธีอยู่นานสุดท้ายก็เจอ activembd เป็น ruby ที่เรียกใช้ library ของ mdb-tools การใช้งานก็ง่ายมาก เพราะเสียบกับ Active record ไปเรียบร้อยแล้ว
require 'rubygems'
require 'active_mdb'

class User < user =" User.find_first" id =""> 1
puts user.name
puts user.description
แต่สุดท้ายผมก็ใช้ activemdb ไม่ได้ :'( เพราะเจ้า database ที่จะไปใช้ดันไม่มี primary key .... แค่เห็นก็ตกใจไม่น่าเชื่อว่าจะออกแบบ database โดยไม่มี primary key เลยสัก table เดียว ผมเลยเปลียนแผนไปใช้ mdbtools เพียวๆ เรียกผ่าน system เอา ใครอยากเอา activemdb ไปใช้ต้องลง mdbtools ก่อนนะครับ sudo apt-get install mdbtools sudo gem install activemdb หวังว่าจะไม่มีใครบนโลกต้องลำบากแบบผมนะครับ reference:

ใครใช้ไฟล์นี้วะ

ตอนจะลบไฟล์ทิ้งแต่ดันมีเจอ error ว่า "ลบไม่ได้ เพราะมีโปรแกรมบางตัวใช้งานอยู่" ครั้นจะฝึนลบก็กลัวอะไรจะพัง ถ้าจะไม่ลบมันก็ค้างคาใจยิ่งนัก จนทำให้เกิดคำถามแรงๆ แบบหัวข้อของบทนี้

วันนี้เจอผู้ช่วยแล้วครับ

$ lsof

คำสั่งนี้จะแสดงไฟล์ทั้งหมดที่ถูกใช้งานอยู่ออกมาพร้อมแสดง process ที่ใช้งานมันอยู่ แถมยังมี id กำกับพร้อมให้เรา kill ได้ทันที ถ้าส่งสัยไฟล์ไหนก็สั่ง

$ lsof | grep filename

โปรแกรม lsof จะแสดงผลออกมาประมาณนี้
dropbox 3646 apirak mem REG 8,3 6556 9396629
/home/apirak/.dropbox-dist/_dbus_glib_bindings.so

สนใจเพิ่มเติมก็สั่ง $ man lsof เอาละกันนะครับ ;)

วันพฤหัสบดี, พฤษภาคม 21, 2552

หนึ่งภาพแทนพันคำ

เมื่อวานนี้ตอนไปดูหนังเหลือบไปเห็น poster เรื่องนี้เข้า

 

ทำให้เราเข้าใจว่า "ใจตรงกัน" มันเป็นแบบนี้นี่เอง อิอิ

วันพุธ, พฤษภาคม 20, 2552

ติดตั้ง google gadgets บน ubuntu 9.04

เสียเวลา compile เองอยู่นานมาก สุดท้ายหาเจอว่ามันอยู่ใน repository ซะแล้ว การติดตั้งจะต้องติดตั้ง google desktop ก่อน ซึ่งผมไม่แน่ใจว่ามีใน repository แล้วหรือเปล่า เพราะว่า download มาลงเอง

http://desktop.google.com/linux/

ส่วน google gadget สามารถลงผ่านคำสั่ง apt-get ได้

sudo apt-get install google-gadgets-gtk

สำหรับ widget ต้องรอสักพักมันถึงจะ update เสร็จ ถ้าเรียกเลยจะเห็นแค่ 4 ตัว

ความตั้งใจที่ผมลง google-gadget เพราะอยากได้ gtalk แต่ดันไม่มีบน linux ซะงั้น
ที่ประสบความสำเร็จกว่าความคาดหมายคือมันมี twitter client มาให้ครับ

วันจันทร์, พฤษภาคม 18, 2552

Utility that save my time and my mind

ก่อนหน้านี้ตอนลง ubuntu ผมจำเป็นต้องใช้ ruby version 1.8.6 ทำให้ไม่สามารถใช้ applet sshmenu ได้ มาวันนี้ลง ubuntu ใหม่ พร้อมแยก ruby ตัวที่เป็นงาน กับตัวที่ใช้ทั่วไปออกจากกัน ทำให้ได้ application ตัวนี้กลับมา ต่อไปนี้ก็ไม่ต้องพิมพ์ ssh command ทุกครั้งแล้วละครับ แต่ขอบันทึกไว้หน่อยว่า package ที่ต้องเอามาลงคือ sshmenu และ sshmenu-gnome เพราะถ้าลงแค่ตัวเดียว มันจะไม่ใส่ใน applet ของ panel ให้เราครับ ต้องลงทั้งสองตัวเลย หลังจากลงแล้วก็ให้สั่ง killall gnome-panel เพื่อ reset รายการ applet ใน panel แล้วก็ click ขวาเลือก add sshmenu ได้เลยครับ

วันพุธ, พฤษภาคม 13, 2552

ติดตั้ง ruby สองตัวบน ubuntu เครื่องเดียว

เริ่มต้นจากติดตั้ง default ruby ลงบนเครื่องก่อน ด้วยคำสั่ง
$ sudo apt-get install ruby irb ri rdoc libruby-extras rubygems ruby1.8-dev
จากนั้น Download ruby ที่ต้องการมาไว้ในซัก folder นึ่ง
$ cd /tmp
$ wget -c ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.6.tar.gz
$ tar -xvzf ruby-1.8.6.tar.gz
$ cd ruby-1.8.6
จัดการ untar ให้เรียบร้อยแล้วสั่ง .comfigure พร้อมกำหนด folder ที่ควรจะเป็นให้ ruby ตั้วใหม่
$ ./configure --prefix=/opt/ruby-1.8.6
$ make
$ sudo make install
เวลาเรียกใช้ก็ต้องใส่กันเต็มยศครับ
$ ruby -version
ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
$ /opt/ruby-1.8.6/bin/ruby --version
ruby 1.8.6 (2007-03-13 patchlevel 0) [i686-linux]
ถ้าต้องการทำอย่างอื่นด้วย เช่นทำให้สลับ Version ได้ง่ายๆ ก็ลองอ่านใน reference นะครับ

reference: blog.michaelgreenly.com


ปรับปรุง: ผมใช้ ubuntu 9.04 ต้องลง zlib ก่อน ถึงจะใช้ได้ครับ (sudo apt-get install zlib1g-dev)

ปรับปรุง 2: เวลาต้องการ install rails ให้ใช้คำสั่ง sudo /opt/ruby-1.8.6/bin/gem install -v=2.0.2 rails นะครับ

ปรับปรุง 3: วิธีอื่นก็มีที่นี่ STOW

กว่าจะเป็น "ปูม"

ดูหนังเรื่อง Star trek แล้วเจอเค้าแปลคำว่า log ว่า "ปูม"

สำหรับในหนังอาจจะแปลง่ายหน่อย เพราะในการเดินเรือเค้าใช้คำว่า "ปูม" อยู่แล้ว แต่ใน Software ไม่ได้แปลง่ายแบบนั้น บังเอิญผมตามอ่าน mailling list ของ thai-l10n อยู่พอดี

เหตุการณ์เริ่มจากคุณ Theppitak เสนอขึ้นมาว่า

คำว่า "log" ปัจจุบัน ossglossary กำหนดคำแปลว่า "บันทึกปฏิบัติการ"
แต่มีคำเสนอว่า "ล็อก" และเร็ว ๆ นี้ bact' ใช้คำว่า "ปูม"

อันที่จริง คำว่า "ปูม" ก็คิดว่าน่าสนใจมานานแล้วเหมือนกัน เพียงแต่ถ้า
เปลี่ยนมาใช้ จะต้องตามแก้อีกเยอะมาก ก็เลยชะลอไว้

คิดว่าควรใช้คำไหนดีครับ?

จากนั้นคุณ akom สนับสนุนคำว่า "ล๊อก" และเสนอให้ใช้เป็น "ปูมหลัง"

คุณ mk บอกว่าเคยใช้ "บันทึกการทำงาน" แต่ก็สนับสนุน "ปูม"

คุณ Isara เสนอว่า "บันทึกปฏิบัติการ หรือปูมปฏิบัติการ" น่าจะเหมาะกว่า "ปูมหลัง"

คุณ Arthit เริ่มวิเคราะห์ว่า

log นาม - "ปูม"
log กริยา - "บันทึกลงปูม" ไหม ?

อ. Thawatchat วิเคราะห์ต่อว่าจะไม่ใช้คำนี้เลยดีหรือเปล่า

ในความคิดผม ถ้าแปล The error messages will be logged.
อาจจะไม่แปลตรงๆ แต่แปลให้สื่อได้อย่างเช่น
"ระบบจะบันทึกข้อความแจ้งความผิดพลาดเหล่านี้ไว้" ครับ

อีกประเด็นหนึ่งในเรื่องการแปลนั้น passive voice เราควรแปลให้เป็น
active voice ทั้งหมดไหมครับ เนื่องจากภาษาไทยโดยพื้นฐานไม่มี
passive voice ใช่ไหมครับ

คุณ Mk ว่า ยังไงก็น่าจะมี เช่น View log เป็นต้น


ผมว่าการคิดหลายคนเป็นเรื่องดีมากๆ เพราะทำให้มีคนช่วยมองจากหลายมุม ลดความผิดพลาดได้มากทีเดียว


คุณหมวยมองอีกมุมว่าให้คิดเผื่อคำว่า traffic log ด้วย

อ. ธวัชชัย แปลให้ฟังว่า
view log = ดูปูม
traffic log = ปูมการจราจร

คุณเก่งเสนออะไรเท่ๆ ว่า แล้วพวก logger จะเป็น "ผู้บันทึกปูม" ไหมครับ?

จากนั้นก็คุยกับอีกหลาย mail ก่อนที่คุณเทพจะมาสรุปว่า

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

สรุปว่าใช้ "ปูม" นะครับ?

กว่าจะได้คำว่า "ปูม" ต้องคุยกันถึง 16 Mail ซึ่งถือว่าไม่มากนะครับถ้าเทียบกับ Minimize, Maximize อันนั้นคุยกันยาวมาก ถ้าต่อไปเราใช้คำว่าปูมใน Linux แล้วทำให้ลูกหลานเรารู้จักคำว่าปูม ก็ต้องขอบใจทีมนี้ด้วยครับ เพราะอย่างผมก็พึ่งรู้จักคำว่าปูมเอาตอนนี้เอง

ทีมงานแปล คุณเท่จริงๆ :)

วันจันทร์, พฤษภาคม 11, 2552

ชอบมากครับ ขอบอก

บางทีความรักก็เกิดขึ้นแบบคาดไม่ถึง



ผู้ชายมักกลัวจนทำให้เสียเรื่องอยู่บ่อยๆ หลังจากเรื่องเสียก็หาข้อแก้ตัวโทษโน่น โทษนี่ สุดท้ายก็โทษผู้หญิง

วันจันทร์, พฤษภาคม 04, 2552

Mac not represent me

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



การแสดงออกมีได้หลายอย่าง การที่คนแสดงออกโดยการเขียนความรู้ขึ้น blog ก็อย่างหนึ่ง การแสดงออกโดยการแต่งตัวหรือถือสิ่งของก็เป็นการแลกเปลี่ยนอย่างหนึ่ง



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



ผมสนับสนุนให้มองที่ผลงานครับ



ดังนั้นหากคอมพิวเตอร์พัง ผมจะเสียดาย content ในเครื่องมากกว่าตัวเครื่อง หลายคนคงคิดเหมือนกัน...

วันพฤหัสบดี, เมษายน 23, 2552

ใช้ "Cut to dashboard" เป็นครั้งแรก



ผมชอบ idea "Cut to dashboard" นะ เพราะมันช่วยให้เราไม่ต้องพิมพ์ url หรือเปิด browser ทุกครั้งที่ต้องการหาข้อมูล แถมยังช่วยย่นระยะเวลาในการพัฒนา dashboard ด้วย เช่นอยากได้ slide show ของ album ตัวเอง ก็สามารถเปิด picasa แล้วตัดส่วน slideshow มาใส่ใน dashboard ได้เลย

แต่จนแล้วจนรอด ก็ไม่ได้ใช้ซักที จนเริ่มสงสัยว่าจริงๆ แล้วมันมาถูกเวลาหรือเปล่า... วันนี้ได้ใช้แล้วครับ

จาก post ที่ผ่านมาเรื่อง Stencils ของ Omnigraffle ผมเข้าไปดู Download, Rating บ่อยมาก... สนุกกับการติดตามผลงาน :) ตอนมี Stencils อันเดียวก็ไม่เป็นไร พอมีสองอันเริ่มเหนื่อย แต่ก็อยากดู ตอนนี้เลยปิ้ง idea ว่าเรามี "Cut to dash board นี่หว่า

ว่าแล้วก็เอามาตัดเลยครับ ได้ผลดังนี้



ได้ใช้ของที่มีอยู่ให้คุ้มค่ามันมีความสุขจริงๆ :)

ปล. บน dashboard ของผม นอกจากตัว "Cut to dashboard" แล้ว ก็ยังมี "Stickies" "Calculator" และ "Currency Converter" ครับ

วันพุธ, เมษายน 22, 2552

ผู้ใช้ไม่รู้ Requirement

สิ่งที่ต้องเตือนตัวเองอยู่เสมอคือ "ผู้ใช้ไม่รู้ Requirement" แม้ว่าเราจะพูดว่า "ไปเก็บ Requirement" แต่จริงๆ แล้วสิ่งที่เราไปเก็บคือ "Need" ผู้ใช้อาจจะพร่ำอะไรออกมามากมาย อยากได้แบบโน้น อยากได้แบบนี้ แต่เราต้องดึง need ออกมาจากสิ่งเหล่านั้นให้ได้

ดูจาก product ในรูป



ถ้าให้เก็บ Requirement จากผู้ใช้ตรงๆ น่าจะได้ว่า
  • ช้อนใหญ่ๆ พอดีคำ
  • วางไว้ข้างๆ จานแล้วไม่หล่นง่าย เด็กๆ ชอบวิ่งไปวิ่งมา
  • ควรเก็บง่ายนะ ส่วนมากจะเป็นเด็กๆ ใช้เลยต้องแข็งแรง ไม่หักง่าย
  • ถ้าไม่หนักก็ดี
  • เอาแบบน่ารักๆ เก๋ๆ นะ

ถ้าดึง Need ออกมา น่าจะเหลือแค่
  • ต้องใช้ตักเค๊กกินได้
  • เด็กต้องใช้ได้

ต่อจากนั้นเราก็มาสร้าง Requirement ของเราเองเพื่อตอบโจทย์ของ Need โดยไม่ต้องสนใจ Requirement ของผู้ใช้... หลายคนคงสงสัยว่าไม่ต้องไปสนใจเลยหรอ ขอย้ำอีกครั้งว่า ใช่!!!

ถ้าอะไรที่เรากลับไปมองแล้วว่ามันสำคัญ ให้ดึงมาใส่ใน Need แล้วค่อยคิด Requirement ใหม่ เช่น ตอนนี้มี Need 2 ข้อ ถ้าผู้ใช้หรือทีมงานท้วงว่า "น้ำหนักสำคัญ" แสดงว่า น้ำหนักก็เป็น Need ให้ดึงน้ำหนักลงมา พร้อมใส่ตัวชี้วัด เช่น "น้ำหนักไม่เกิน 200g"

แม้ว่าเรื่องน้ำหนักจะอยู่ในข้อ "เด็กต้องใช้ได้" แต่ถ้ามันเป็น Need เราจะไม่เอามาใส่ในข้อ "เด็กต้องใช้ได้" ไม่งั้นเราเองจำสับสนว่าอะไรเป็น need กันแน่

ลองใช้โจทย์ข้อนี้สร้าง Requirement ขึ้นมา (น่าจะได้เกือบ 20 ข้อ โดยเฉพาะข้อ 2) แล้วจะพบว่า "ผู้ใช้ไม่มีทางรู้ Requirement" แน่นอน

ที่มาของรูป: swiss-miss.com

หาว่า process อะไรใช้ port อยู่

วันนี้ Start web server แล้วเจอว่ามีคนจอง port 8006 อยู่ พยายาม ps, top ไม่สำเร็จซักตัว มี netstat -atun ใกล้เคียงที่สุดแต่มันก็ไม่บอกว่า process อะไรที่ใช้ port นั้นๆ อยู่
สุดท้ายได้คำสั่ง

fuser -n tcp 8001

มันจะบอกเสร็จเลยว่าใช้ process id อะไรที่ใช้อยู่ พร้อมให้เรา kill ได้เลย

ถ้ายังหาไม่เจออีกต้องลอง
sudo fuser -n tcp 8001

เพราะบางทีคนที่จอง port ไว้อาจจะไม่ใช่ user เราก็ได้
ที่ดีมากๆ คือทั้งบน mac และ linux มีคำสั่งนี้ให้ใช้ทั้งคู่ครับ

วันจันทร์, เมษายน 20, 2552

Web Sketch Interface

วันก่อนต้องออกแบบ Application เลยทำ Sketch ของ Application ขึ้นมา OS X Sketch Interface มาวันนี้ต้องออกแบบเว็บก็มีผลออกมาแบบนี้ครับ



ผมเอาไปไว้ที่ Graffletopia.com นะครับ สนใจเข้าไป Download ได้เลย

เริ่มรู้สึกว่าเดี๋ยวนี้เวลาทำอะไรต้องทำให้ตัวเอง เอาไปใช้อีกได้ง่ายๆ ไม่พยายามมักง่ายทำแบบให้เสร็จๆ ไปเป็นครั้งๆ (ถึงแม้ว่ามันจะเย้ายวนเพียงใดก็ตาม) ถ้าใครได้ใช้แล้วอยากได้ component อะไรเพิ่มเติมก็บอกได้นะครับ นึกไม่ค่อยออก อยากใช้ค่อยทำเพิ่มลงไป :)

วันอังคาร, เมษายน 07, 2552

ใส่สีให้ terminal

เรื่องสีใน terminal นี่เขียนไว้ตั้งแต่ตอน Panther แล้ว ตอนนั้นยังทำยากอยู่ถึงขั้นต้องลงโปรแกรมเสริม มาใน Leopard ทำง่ายขึ้นมาก ต้องจดเอาไว้ก่อน

เปิดไฟล์
  vi ~/.bash_profile

เพิ่มสองบรรทัดนี้ลงไป
 export CLICOLOR=1
 export LSCOLORS=ExFxCxDxBxegedabagacad
จากนั้นลองเปิด terminal ใหม่ เวลา ls ก็จะมีสีแล้ว
ถึงตอนแรกจะบอกว่าใส่สีให้ terminal แต่จริงๆ แค่ใส่สีให้ ls เท่านั้นเอง ขั้นต่อไปต้องใส่สีให้ vi
ที่มา Mac Tip.org

วันพฤหัสบดี, เมษายน 02, 2552

ปิดเปิดไฟบน web page

เป็นแนวคิดที่เท่มากๆ ก่อนหน้านี้ผมมีปัญหาว่า การแสดงวีดีโอจะสวยต้องให้ Back ground เป็นสีดำ เหมือนที่โรงหนังต้องมืด แต่ถ้าทำให้เว็บเป็นสีดำ ก็จะไม่เหมาะกับการอ่าน text เพราะตัวหนังสือขาวที่อยู่บนพื้นสีดำ จะอ่านยาก ดังนั้นเว็บอย่าง youtube ที่มี content เยอะๆ จึงต้องเป็นสีขาว



แต่เว็บนี้เป็นเว็บภาพ วีดีโอนะต้องเป็นสีเข้มสิ คิดได้ดังนั้น youtube เลยทำปุ่มปิดไฟซะเลย



เมื่อต้องการให้เว็บดำก็ปิดไฟซะ ตรงไป ตรงมาดี



แต่ให้ปิดไฟทุกครั้งที่ดูก็ไม่ไหวนะ ถึงอย่างนั้นก็เป็น idea ที่เอาไปใช้ได้อีกหลายงานดีเดียว

วันอังคาร, มีนาคม 24, 2552

เตรียมพร้อมสำหรับ Netbean 6.7

ปัญหาอันดับหนึ่งคือ short cut ใน netbean พอเราเปลี่ยนมาใช้ Profile Eclipse จะทำให้พวก command หรือ ctrl มันสลับไปเป็นของ windows หมด ทำให้ไม่คุ้นมือ สิ่งที่พอทำได้คือต้องไป map เอาเอง


จดเอาไว้กันลืมว่าต้อง map อะไรบ้าง

Edit
1. Go to Line [Meta+L]

Other
1. Extend Selection to Beginning of Line [Shift + Meta + Left]
2. Extend Selection to End of Line [Shift + Meta + Right]
3. Insertion Point to Beginning of Line [Meta+ Left]
4. Insertion Point to End of Line [Meta + Right]
5. Move Selection else Line down [Meta+Down]
6. Move Selection else Line up [Meta+Up]

System
1. Save [Meta+S]
2. Save all [Meta+Shift+S]

เท่านี้ชีวิตก็มีความสุขขึ้นอีกนิด

วันพุธ, มีนาคม 18, 2552

ความเป็น google citizen ของผม

ต่อไปการสังกัด Google, Yahoo, Microsoft หรือ Apple อาจจะรุนแรงกว่าการเป็นประชาชนของประเทศก็ได้ เพราะโลก online สำคัญขึ้นทุกวันๆ ไปอยู่ต่างประเทศยังไปได้ แต่ mail หายนี่แย่เลย (อดีตของผม หมดกัน)

identity ของเราในประเทศนี้คือบัตรประชาชน ส่วน identity ของตัวเราเองอาจเป็นการที่แม่ค้าปากซอยจำชื่อเราได้ มาในโลก online ก็มีเหมือนกัน เช่น Hi5, OpenID, หรือ Blog ของตัวเราเอง

ตอนนี้เริ่มแยกไม่ออกว่าสิ่งไหนเป็นสิ่งที่บอกตัวตนของเราได้มากกว่ากัน แต่ตอนนี้ผมเอา online identity ไปฝากไว้กับ Google มากมายทีเดียวครับเริ่มตั้งแต่

  • Mail: ผมใช้ gmail กับงานสำคัญที่ต้องอยู่กันยาวๆ
  • Second Mail: ผมใช้ google app จด apirak@apirak.com เอาไว้ ใช้งานทั่วไป แต่ไม่ใช้ถาวรเพราะ domain อาจจะหายได้ ถ้าผมไม่สามารถต่ออายุ ได้เป็นเวลานาน (เช่น โดนลักพาตัวหายไปสองปี หรือง่ายกว่านั้นคือลืม)
  • Docs: ความรู้ส่วนใหญ่เก็บ online ไว้ที่นี่ ไม่ต้องกลัวเครื่องพัง
  • Address book: ตอนนี้เก็บไว้กับ google หมดแล้ว มือถือหายก็ไม่กลัว
  • Calendar: วันเกิดแฟน วันพบกันครั้งแรก หรือวันสำคัญต่างๆ ก็ย้อนอดีตไปหาได้ตลอด
  • Blog: ผมไม่ทำ drupal, wordpress เองแล้วครับ พบว่าทำเองมี over head มากเกินไป ตอนนี้ apirak.com ย้ายมาอยู่กับ blogger ของ google ไปแล้ว
  • Blog 2: Blog อื่นๆ ก็มาอยู่กับ blogger หมด
  • Photo: ตอนนี้ใช้ Picasaweb อยู่ แต่ด้วยมีรูปไว้ 30G ตัว Picasa คงรับไม่ไหว รูป 5 ดาว เก็บไว้กับ Picasa หมด
  • IM: ใช้ GTalk บ่อยกว่า MSN ซะแล้ว
  • Feed: ตอนนี้ใช้ google reader หมดใจ ไม่เหลือให้ safari หรือ feed reader อื่นๆ แล้ว
  • Mailing list: ย้ายมาจาก Yahoo group มาอยู่ Google จนตอนนี้มี Group ของเพื่อนๆ เกือบ 10 กลุ่มแล้ว

แบบไม่เต็มตัว

  • Movie: ผมฝากให้บน youtube นะเฉพาะอันที่ต้องการใส่ใน blog นอกนั้นก็ยังเก็บไว้กับเครื่องตัวเอง
  • Notebook: เค้าปิดไปแล้ว ทำให้เกิดความสยองขึ้นมากมาย การจะย้าย content ไปไว้ที่ google docs ก็เหนื่อยอยู่
  • Map: สถานที่สำคัญ ผมจดไว้ในนี้ครับ โดยเฉพาะที่เที่ยวที่เคยไป หรือร้านอาหารอร่อยๆ
  • Visitor Statistic: ตัวชี้วัดความเป็นที่รู้จัก อันนี้อยู่บน Google Analytics ทุก blog
  • Feed Statistic: ก็ใช้ Feed burner ครับ กลายเป็นของ Google เหมือนกัน

ลองเขียนออกมาแล้วเยอะกว่าที่คิดเฮะ ถ้า AIG จะล้มละลายคงต้องให้ US ช่วยอุ่ม แต่ถ้า Google จะลม ทั้งโลกคงต้องช่วยอุ้มเลยละครับ

วันเสาร์, มีนาคม 14, 2552

Feedburner กลายเป็นของ Google ไปซะแล้ว

หลังจากย้ายบ้านมาที่ blogger วันนี้มาจัดการเรื่อง feed บน feedburner พอ login มันก็บอกว่าต่อไปให้ใช้ google account แทน แล้วพาเราเข้าไปที่

http://feedburner.google.com

ไม่รู้แบบนี้แปลว่า google ซื้อ feedburner ไปแล้วหรือเปล่า แต่ทำแบบนี้น่าสนใจทีเดียวเพราะช่วยให้ระบบโฆษณาสมบูรณ์แบบมากขึ้น คนทำ web ก็ไม่ต้องมาจัดการ โฆษณาผ่าน feed ด้วยตนเอง เพราะทำออกมาให้ดีได้ยาก

วันศุกร์, มีนาคม 13, 2552

ruby แปลงตัวเลข เป็นตัวหนังสือ

ตอยอดงานของคุณ MRTIGER จาก
http://admincmd.blogspot.com/2007/08/php-convert-digit-to-thai-word.html
เอามาแปลงเป็น ruby ได้ผลออกมาแบบนี้
def convert(number)
  txtnum1 = ['ศูนย์','หนึ่ง','สอง','สาม','สี่','ห้า','หก','เจ็ด','แปด','เก้า','สิบ']
  txtnum2 = ['','สิบ','ร้อย','พัน','หมื่น','แสน','ล้าน']
  number.gsub!(",","") 
  number.gsub!(" ","")
  number.gsub!("บาท","")
  numbers = number.split(".")
  
  if(numbers.length>2) 
    return "มีเครื่องหมาย '.' มากกว่า 1 ตัว" 
  end

  strlen = numbers.first.length
  convert = ""

  0.upto(strlen-1) do |i|
    n = numbers.first[i].chr.to_i
    if (n.chr != "0") 
      if ( i == (strlen-1) and n == 1)
        convert = convert + "เอ็ด"
      elsif ( i == (strlen-2) and n == 2)
        convert = convert + "ยี่"
      elsif ( i == (strlen-2) and n == 1)
        convert = convert + ""
      else
        puts "n = #{n.chr.to_i}"
        convert = convert + txtnum1[n]
      end
      convert = convert + txtnum2[strlen-i-1] 
    end 
  end

  convert = convert + "บาท" 
  if(numbers[1]=="0" or numbers[1]=="00" or numbers[1]=="")
    convert = convert + "ถ้วน"
  else 
    strlen = numbers[1].length
    0.upto(strlen-1) do |i|
      n = numbers.last[i].chr.to_i 
      if(n!=0)
        if(i==(strlen-1) and n==1)
          convert = convert + 'เอ็ด'
        elsif(i==(strlen-2) and n==2)
          convert = convert + 'ยี่'
        elsif(i==(strlen-2) and n==1)
          convert = convert + ''
        else
          convert = convert + txtnum1[n] 
        end
        convert = convert + txtnum2[strlen-i-1] 
      end
    end 
    convert = convert + 'สตางค์' 
  end
  return convert
end

x = convert('5,121.10 บาท')
puts x

โปรแกรมสามารถ Refractor ได้อีก 2 ตลบ อันแรกคือ loop แทนที่จะวนด้วยตัวเลข ก็ใช้ string.each ได้เลย อีกอันคือโปรแกรมนี้ทำส่วนจำนวนเต็มกับทศนิยม คล้ายกันมาก น่าจะแยกออกมาเป็น function ได้

วันอังคาร, มีนาคม 10, 2552

Rails podcast in Thai

ลองทำ pod cast ของ rails ดู เห็นมีหลายคนบ่นๆ ว่า rails podcast บน internet เป็น rails 1.2 มันเอามาใช้ไม่ได้กับ 2.0 ก็เลยลองทำของ 2.0 ดู ทำมาสองตัวคือ การเขียน blog ด้วย rails กับการเขียน blog แล้วมี comment ด้วย จริงๆ อยากจะเอาตัวที่เป็น blog ขึ้นมาก่อน แต่ดัน upload ตัวที่เป็น blog + comment เสร็จซะแล้ว ไว้จะเอาอีกตัวขึ้นวันพรุ่งนี้นะครับ

download

customize text_field

ได้แรงบรรดาลใจมาจาก blog ของ PunNeng หน้านี้ พยายามเอามาใช้กับ project ที่ทำงานอยู่แต่ทำยังไงก็ไม่ work ซะที สงสัยเพราะว่าใช้ rails คนละ version กัน ดูใน ruby trac เค้าบอกว่าจะปรับ attribute ของ form_for ใหม่ แต่ตอนนั้นดูแบบคร่าวๆ เพราะไม่รู้ว่าต้องแก้ตรงนี้

สุดท้ายมั่วไปมั่วมาได้ resolution ว่าให้สร้าง file doo_form_helper.rb ไว้ที่ app/helper แบบนี้

module DooFormHelper 
  def doo_form_for(record_or_name_or_array, *args, &proc) 
    form_for(record_or_name_or_array, *(args << {:builder => DooFormFor}), &proc) 
  end 

  class DooFormFor < ActionView::Helpers::FormBuilder 
    def text_field(method, options = {}) 
      @template.content_tag('p', label(method) + "" + super) 
    end 
  end 
end
จากนั้นที่ _form.html.erb ก็ใช้ doo_form_for แทน ผมลองบน rails 2.0.2 ครับ ไม่รู้ว่า 2.1 จะสามารถใส่ :builder ลงใน form_for เลยได้หรือเปล่า ประมาณนี้ แต่ผมชอบแบบใช้ doo_form_for มากกว่า ดูลึกลับดี ปล. ที่ใช้คำว่า doo ไม่ได้มีความหมายพิเศษครับ แต่เพราะ project ที่ทำงานชื่อว่า dooExpert เลยใช้คำว่า doo นำหน้าน่ะครับ

Rails podcast in Thai ตอน 1

Blog ก่อนหน้านี้ทำให้เข้าใจโครงสร้างของ MVC ชัดเจนมากขึ้น แต่สำหรับ video อันนี้จะเห็นเรื่อง Convention over Configuration ได้มากกว่า



download

ใช้ Number คำนวนเงินกู้

เมื่อก่อนตอนใช้เจ้า Number โปรแกรมสุดจ๊าบในชุด iWork คิดว่านี่ล่ะจะมาแทน MS Excel สิ่งทีประทับใจมากๆ คือการที่หนึ่ง Sheets สามารถมีได้หลายตาราง ทำให้เรามีอิสระมากขึ้นในการจัดหน้า แต่แล้วก็บรรลุว่า สิ่งที่สำคัญในโลกธุรกิจไม่ใช่ความสามารถของ Application แต่เป็น Compatibility ถ้าทำตารางขึ้นมาแล้วส่งไปให้คนอื่นดูไม่ได้ บางครั้งก็ถึงขั้นไร้ความหมาย แต่กับงานส่วนตัวนี่อีกเรื่องนึงครับ :) ผมพึ่งพบว่า Number มีต้นแบบสำหรับคำนวนเงินกู้ด้วย เหมาะกับผมซึ่งกำลังหาตังสร้างบ้านพอดีเลย

หน้าจอต้นแบบมีไว้ให้เราเปรียบเทียบลักษณะการกู้สามประเภท อย่างที่ผมลองทำ ผมกำหนดให้จำนวนเงิน และดอกเบี้ยเท่ากัน แต่ระยะเวลาผ่อนไม่เท่ากัน


ถ้าผมผ่อน 15 ปีจะจ่ายแค่เดือนละ 11,862 บาท แต่ทำให้ผมต้องจ่ายค่าดอกเบี้ยเป็น 635,143 บาท แทนที่จะจ่ายแค่ 280,873 บาท ถ้าเลือกผ่อน 7 ปี ถ้ามาดู sheet ที่สองจะเห็นว่าเดือนแรกผมผ่อน 11,862 บาทเป็นค่าดอกเบี้ยไปซะ 6,250 บาท คิดแล้วเศร้า ถ้าใครอยากลองให้เปิดโปรแกรม Number แล้วกด new

เลือก Loan Comparison อีกตัวอย่างที่เท่ไม่แพ้กัน คือ Mortgage เอาไว้คำนวนตอนซื้อบ้านหรือรถได้เป็นอย่างดี มีระบบเงินดาวให้ แถมมีคำนวนด้วยว่าจะเอาไปหักภาษีต่อปี ได้กี่บาท

พอลองใช้แล้วเริ่มติดใจ เรื่องการทำหลายตารางในหน้าเดียว ตอนกลับไปใช้ excel คงอึดอัดน่าดู

ถ้าคำนวนตามนี้จะเอาไปหักภาษีได้ปีละ 9,268 บาท :)

Love graph

มีบทความหนึ่งเขียนว่า

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

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

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

บทความนี้เอามาจากคนอื่น แต่พอเอามาวิเคราะห์ ผมพบว่าสมการความรักของบทความนี้มันมาเพียงครึ่งเดียวเท่านั้น เลยเอามาคิดต่อบน OmniGraffle
download ตัวเต็ม

จริงๆ บทความนี้เขียนใน blog ส่วนตัวของ Bank กับ Kaew แฟนสุดน่ารัก ต้งแต่ปี 2007 แต่เห็นว่าน่าสนใจเลยเอามาลงไว้ที่นี่ด้วย แต่การวิเคราะห์ยังไม่จบแค่นี้ เดี๋ยวเอามา post ต่อ

Open Office 3.0

อ่าน review Open Office 3.0 แล้วตื่นเต้นครับ ดูความก้าวหน้าแล้วน่าสนใจทีเดียว ทั้งด้านความสวยงาม ความคิดสร้างสรรค์ และการเก็บรายละเอียด ต่างจาก version ผ่านๆ มาที่ถึงแม้จะดูสร้างสรรค์แต่ขาดการเก็บรายละเอียดทำให้ความสร้างสรรค์นั้นดูด้อยค่าลงไป ความประทับใจด้านความสวยงามเริ่มจากการปรับปรุง theme ของโปรแกรม Calc


สีที่ bar ด้้านข้างสวยขึ้นอย่างชัดเจน แม้ว่าจะอ่านตัวเลขได้ยากขึ้น แต่ก็น่าใช้กว่าเดิมมาก ส่วนสีที่ใช้สำหรับ hi-light ตัวตารางดีขึ้นอย่างไม่มีที่ดิ ตอนนี้ช่องที่ถูกเลือกจะถูกทับด้วยสีฟ้าจางๆ มองทลุไปถึงพื้นหลัง ทำให้ตารางยังคงความหมายต่างๆ ด้วยสีได้ แม้เวลาที่ถูก hi-light ก็ตาม ความประทับใจในด้านความคิดสร้างสรรค์ต้องยกให้โปรแกรม Impress ผมชอบหน้าจอ second screen มาก เมื่อก่อนใช้โปรแกรม keynote เวลา present จะให้หน้าจอบน present กับหน้าจอบนเครื่องไม่เหมือนกัน เพื่อใช้ดู note หรือดูหน้าจอต่อไป เวลาพูดจะช่วยให้ลื่นไหลมากขึ้น ตอนที่เห็นว่า MS Office บน mac สามารถทำได้เหมือนกันก็ดีใจครับ ทำออกมีลูกเล่นหลายอย่าง แต่ติดตรงที่ทำออกมาไม่สวยเลย :( ของ OO3.0 น่าจะคาดหวังได้มากกว่า



แสดงหน้าจอปัจจุบันใหญ่กว่าหน้าจอต่อไป เพราะวิธีนาทีที่เราพูด เราน่าจะสนใจตัวปัจจุบันมากกว่า (หวังว่าจะปรับแต่งเองได้ เพราะ slide บางประเภทหน้าถัดไปก็สำคัญกว่า) แต่ก็ 80/20 Rule ครับ



Note ใหญ่สะใจดีครับ ตัว default ของ keynote หน้า note มันอันนิดเดียวเอง อ่านไม่ถนัด กลายเป็นว่าตอน present จริงไม่สามารถอ่านได้เลย



หน้านี้ชอบที่สุด ผมว่าทุกคนที่เคย persent จะมีปัญหาว่า ตอนถามคำถามหลังการ present เราต้องเลือก slide ที่ผ่านไปแล้วกลับมาพูด และเราก็ต้องออกจากหน้า present มาเลือก slide ก่อน ทำให้ดูไม่ดีเท่าไหร โดยเฉพาะคนที่มี desktop รกๆ หรือมี wallpaper แบบส่วนตั๋วส่วนตัว บน Keynote และ MS Office ตัวใหม่ก็มี feature ในการเลือก slide โดยไม่ต้องออกจากหน้าจอ present ครับ แต่ไม่มีใครเอามาเรียงเป็น thumbnail แบบ OO3.0 เลย แบบนี้สิถึงจะใช้งานได้จริงๆ สำหรับชาว Mac อยากบอกว่า OO3.0 จะใช้ native display แล้วครับ แม่ต้องพึ่ง X11 อีกแล้ว



ก็หวังว่าเมื่อออกตัวจริง มันจะเร็วปรูดปราดไปเลย นะครับ ที่มา hehe2.net

Emac บน Mac

พยายามจะใช้ gEdit บน mac เพื่อให้ที่ทำงานกับที่บ้านใช้ editor ตัวเดียวกัน แต่ดันต้องใช้ผ่าน dawin port เลยไม่ใช้มันละ วันนี้ก่อนกลับบ้านคุยกับเพื่อนที่ทำงาน (เพื่อนชื่อ sid) เข้าบอกว่าเรียน emacs แล้วคุ้ม เพราะ IDE ส่วนใหญ่ต้องรองรับ short cut ของ emacs ทั้งนั้น คิดว่าได้เวลาทดลองใช้ emacs ซะที (ผมสาวก vi) อันดับแรกผมพยายามจะใช้ Aquamacs เพราะคิดว่ามันมี toolbar กับ menu มาด้วยน่าจะช่วยให้เห็นคำสั่งได้ง่ายขึ้น



ติดว่ามันใช้เวลา download ตั้งชั่วโมง 52.5 MB เลย download ทั้งไว้แล้วหันมาใช้ emac ที่มีมาบนเครื่องแล้วแทนไปก่อน เริ่มต้นด้วย การเปิด terminal แล้วพิมพ์

$ emacs
ที่หน้าแรกเค้าบอกว่าให้กด C-h t = Ctrl+h แล้วตามด้วย t มันจะพาเราเข้าสู่ tutorial บทเรียนแรกบอกว่า control key มีอยู่ 2 อันคือ C- กับ M- คาดว่าบน linux ตัว M คงใช้ปุ่ม alt แต่บน mac เป็นปุ่ม esc ครับ บทเรียนแรกคำสั่ง C-x C-c เป็นคำสั่งออกจาก emacs ครับ ให้กด Ctrl+x ตามด้วย Ctrl+c



ลงมาด้านลางจะเจอคำสั่ง C-v = ไปหน้าถัดไป M-v = ไปหน้าก่อนหน้า C-l = ทำให้ บรรทัดที่ cursor อยู่ มาอยู่ตรงกลางจอ terminal Basic cursor C-p = บรรทัดก่อน C-n = บรรทัดต่อไป C-b = อักษรก่อน C-f = อักษรต่อมา ลองทำแบบนี้ดูครับ ให้กด C-p เลื่อนบรรทัดลงมาเรื่อยๆ จนเจอบรรทัดที่สนใจให้กด C-l บรรทัดที่เราสนใจจะมาอยู่กลางจอทันที อันนี้ใช้แล้วรู้สึกโดน M-b = คำก่อนหน้า M-f = คำถัดไป

ปัญหาของการใช้ esc+f คือมันกด esc ค้างไว้ไม่ได้ :'( C-a = ไปอักษรตัวแรกของบรรทัด C-e = ไปอักษรตัวสุดท้ายของบรรทัด พี่หนึ่งเคยบอกว่า bash shell ใช้คำสั่งแบบเดียวกับ emac แสดงว่ามันใช้ Ctrl+a กับ Ctrl+e ได้เหมือนกัน C-x + u = undo C-) เลือน cursor ไปทางขวาจนพอใจ C-w = ลบตัวอักษรตั้งแต่ ที่กด C+ จะถึง C-w C-x s = เอาไว้ save buffer C-x C-s = save C-x C-f = เปิดไฟล์ C-x C-s = Save ไฟล์ C-x s = Save some buffers C-x C-b = List buffers C-x b = Switch buffer C-x 1 = Delete all but one window
วันนี้ได้คร่าวๆ ละ พรุ่งนี้พอ aquaemac เสร็จเดี๋ยวมาลองกันอีก

ปล1. มาถึงตอนนี้ผมรัก vi มากขึ้นเป็นกองเลยครับ :)
ปล2. ใครอยากเห็นการใช้ emac develop rails ขั้นเทพ ลองดู video นี้ครับ

Best way to query

การหาข้อมูลจำนวนมากช่างยากเสียจริงๆ วันนี้ผมเจอข้อมูลขนาด 9X0,000 Record เลยสับสนว่าควรออกแบบ query และ table แบบไหนดี ตอนนี้มีทางเลือกสำหรับ table อยู่สามแบบ


ข้อมูลจริงในตาราง foo จะมีขนาดประมาณ 9 แสน record ส่วนตาราง bars มีขนาดใหญ่กว่า foo สามเท่า ผมคิด query ได้ 5 แบบ รวมการ query ร่วมกับ ferret ด้วย
SELECT * from foos WHERE foos.id in ( 
  SELECT distince foos_bars.id 
  FROM foos_bars WHERE foos_bars.bar_id in [2,5,3]) 
แบบแรกใช้ sub query จาก table ตามหลักกระทรวงศึกษาธิการ
SELECT * from foos 
  JOIN foos_bars on foos.id = foos_bars.foo_id 
  WHERE foos_bars.id in [2,5,3] GROUP BY foos.id 
แบบที่สองก็ตรงตามหลัก แต่มันน่าจะช้ามากเมื่อเจอคำสั่ง
Group by SELECT * from foos 
  WHERE (bar LIKE '% ข %') 
  AND (bar LIKE '% จ %') 
  AND (bar LIKE '% ค %') 
แบบที่สาม ผมจะลองรวมสาม table มาเป็นอันเดียวแล้วค่อย query ลดการ join table และ group by
SELECT * from foos 
  WHERE (bar LIKE '%[2]%') 
  AND (bar LIKE '%[5]%') 
  AND (bar LIKE '%[3]%') 
แบบที่สี่ ผมทำคล้ายแบบที่สามแต่มีความเชื่อว่าตัวเลขจะเร็วกว่าตัวอักษร
ids = FoosBarsText.bar_search("ก","จ","ค") select * from foos_bars_text where bar in ids
สุดท้ายผมกะจะลองใช้ ferret มาร่วมในการ query ด้วย ถ้าจะเขียน model ของ FoosBarsText น่าจะเขียนประมาณนี้
include Ferret::Search 

class FoosBarsText < ActiveRecord::Base 

acts_as_ferret :fields=> ['bar'] 

def FoosBarsText.bar_search(search_inputs) 
  bq = Ferret::Search::BooleanQuery.new 
  search_inputs.each do |search_input| 
    bq.add_query(Ferret::Search::TermQuery.new(:bar, search_input) 
  end 
  filter = Ferret::Search::QueryFilter.new(bq) 
  @vobjects = Item.find_by_contents(search_text,
    :filter => filter, :sort => ["section", "sale_category"])  
  redirect_to :results 
  end 
end
สุดท้ายไม่รู้ว่าแบบไหนจะเร็วที่สุด ไว้ถ้าได้ทดลองจะนำมาเล่าให้ฟังนะครับ

Simple many to many

ช่วงนี้พยายามหาข้อมูลของ MySQL บังเอิญไปเจอสอง SQL นี้เข้า ในบทความเค้าบอกว่าผลลัพธ์ต่างกันอย่างไร

SELECT x.aid, x.bid, b.bdesc 
  FROM x LEFT JOIN b ON (b.bid = x.bid) 
  WHERE (x.aid = ‘whatever’)
A similar result may also be achieved using the following:
SELECT x.aid, x.bid, b.bdesc 
  FROM x, b 
  WHERE (x.aid = ‘whatever’) AND (b.bid = x.bid) 
The difference between these two SQL queries will only become apparent if an occurrence of table ‘B’ is missing for an occurrence of table ‘X’. With the first query all columns selected from table ‘B’ will be returned as empty. With the second query the effect will be that the occurrence of ‘X’ will be dropped from the selection.

ลองแปลดู ประมาณว่าถ้า table b ไม่เข้ากับเงื่อนไข * query แรกจะแสดง b.b_desc เป็นช่องว่าง แต่ * query ที่สองจะไม่แสดงทั้ง record ไปเลย

ที่มา tonymarston

เรียก controller method จากหน้า view

ปกติแล้วเราจะเรียก method ของ controller จากหน้า view ไม่ได้ วันนี้ได้ดู rails cast ถึงได้รู้ว่าถ้าใช้ method helper_method จะทำให้เราเรียก method นั้นจาก view ได้ เช่น เราสร้าง method foo แล้วบอกให้ method นี้เป็น helper_method

#blogs_controller.rb
...
def foo
  "bar"
end
...
helper_method :foo
จากนั้นทดลองเรียกใช้ในหน้า view

#index.html.erb


ตอนเรียกที่หน้า browser จะมีคำว่า bar ขึ้นมา แต่ถ้าไม่ใช้ helper_method มันจะขึ้น undefined local variable or method `foo' for # เพราะ rails หา method foo ไม่เจอ

ให้งานกับบ้านเป็นทีมเดียวกัน

ที่ทำงานผมใช้ Ubuntu พอกลับมาที่บ้านก็ใช้ Leopard ค่อนข้างลำบากมากๆ กับการสลับหัวให้ใช้ short cut ได้ถูกต้อง จริงๆ แค่แป้นสลับภาษาไทยกับกับ อังกฤษมันต่างกัน ก็สับสนแย่แล้ว ดังนั้นถ้าทำให้ development environment บน mac กับบน linux เหมือนกัน คงเป็นสวรรค์เลยทีเดียว เริ่มต้นครั้งแรกกับ Aptana ครับ Eclipse + Web + Rails สุดยอดแล้ว ก่อนหน้านี้หนีมันไปนานเพราะความไม่เสถียร crash เป็นระยะๆ แต่ตัวล่าสุดนี่ใช้ได้ทีเดียว ความพยายามต่อมาคือการเปลี่ยน Themes จากสีขาวเป็นสีเทา... มันก็พอทำได้ครับ แต่พิการสุดๆ เลยตัดสินใจวาง Aptana ไว้ก่อน เรื่อง themes นี่สำคัญกับผมมากๆ ครับ อันดับต่อมาคือ Netbean ติดตั้งง่าย ใช้งานสะดวก ปรับ themes ได้แทบจะสมบูรณ์ ติดว่า themes สำเร็จรูปที่ให้มา มันทำให้เสีย feature สำคัญของ IDE เช่นตอนที่ curser เราอยู่บนคำสั่งไหน คำสั่งเหมือนกันจะ hi-light ขึ้นมา พยายามหาที่แก้อยู่แต่หาไม่เจอ แต่นั่นไม่ใช่ปัญหาใหญ่เท่าการที่ NetBean บน mac มันหน้าตาเหมือนของเล่นเอามากๆ กลับมาเรื่องหน้าตาอีกครั้ง... ถัดมาคือ gEdit ไม่นึกเลยว่ามันสามารถใส่ plugin จนคล้าย textmate ได้ขนาดนั้น themes ที่ download มาพอปรับหน่อยก็ใช้ได้เลย แถม render text ได้สวยมากๆ ทั้ง Aptana และ Netbean เทียบไม่ติด แม้ว่ามันจะไม่มีความสามารถแบบที่ Aptana หรือ Netbean มี แต่ได้ความเร็วมาทดแทน ปิดๆ เปิดๆ สบายใจ จะติดตอนนี้ก็คือ macro ของมันทำได้แย่มากๆ ไม่ทำเสียดีกว่า พอได้ลองมาซักพักเริ่มชอบมากขึ้นเรื่อยๆ พวก macro แย่ๆ พอปรับให้เข้าทางก็เริ่มทำงานง่ายๆ ได้มากขึ้น ไม่รู้จะทำได้ถึงไหน หลังจากเริ่มสนุกกับ gEdit ขั้นตอนต่อมาคือเอามันมาลงบน mac ให้ได้ ทางเลือกก็มีไม่มากนักครับ เริ่มจากการลง Macport ก่อน...

เปลี่ยน theme ให้ Netbean

วันก่อนเพื่อนที่ทำงาน (Sid) บอกวิธีการเปลี่ยน theme ของ netbean ให้เป็น original swing (Metal) แทนแบบเดิมที่เป็น



วิธีการก็ง่ายมาก บน linux ให้เปิดไฟล์ netbeans.conf ที่อยู่ของไฟล์ขึ้นอยู่กับว่าเราเอา netbean วางไว้ที่ไหน %NETBEANS_HOME%/etc/netbeans.conf จากนั้นเพิ่มข้อความ
"--laf javax.swing.plaf.metal.MetalLookAndFeel" 
ต่อท้าย
netbeans_default_options= netbeans_default_options="-J-
Dcom.sun.aas.installRoot=/Applications/NetBeans/glassfish-v2ur2 -J-
Dcom.sun.aas.installRoot=/Applications/NetBeans/glassfish-v2ur2 -J-client -J-
Xss2m -J-Xms32m -J-XX:PermSize=32m -J-XX:MaxPermSize=200m -J-Xverify:none -J-
Dapple.laf.useScreenMenuBar=true -J-Dsun.java2d.noddraw=true"


แก้ให้เป็น

netbeans_default_options="-J-Dcom.sun.aas.installRoot=/Applications/NetBeans/
glassfish-v2ur2 -J-Dcom.sun.aas.installRoot=/Applications/NetBeans/glassfish-
v2ur2 -J-client -J-Xss2m -J-Xms32m -J-XX:PermSize=32m -J-XX:MaxPermSize=200m -
J-Xverify:none -J-Dapple.laf.useScreenMenuBar=true -J-Dsun.java2d.noddraw=true
 --laf javax.swing.plaf.metal.MetalLookAndFeel"

เมื่อเปิด netbean ขึ้นมาใหม่ ส่วนตัวผมสังเกตุว่ามันทำงานเร็วขึ้นและหน้าตาดูเรียบร้อย ขอบมุมเก็บได้ครบถ้วน กว่าแบบเดิม วินาทีนี้ผมขอใช้แบบนอกคอกกับระบบปฏิบัติการไปก่อน ไว้ themes ของ GTK หรอของ OSX ทำออกมาเรียบร้อยค่อยกลับมาใหม่ สำหรับคนที่ใช้ osx ให้ click ขวาบนโปรแกรม netbean แล้วเลือก show package content จากนั้นเข้าไปที่ Netbeans 6.1.app/Contents/Resources/NetBeans/etc/netbeans.conf ตอนแก้ไฟล์ก็ทำเหมือนของ windows ครับ

Single Table Inheritance

อุตสาห์ลง mac port จนสำเร็จ ดันเจอปัญหากับ X11 ซะนี่ สุดท้ายก็ใช้ TextMate ต่อไป..
บ่นนิดหน่อยก่อนเข้าเรื่อง วันนี้ได้มีโอกาศใช้ความสามารถ Single Table Inheritance ของ Active Record ซะทีครับ หลังจากที่ใช้ก็เกิดความประทับใจสุดๆ จดต้องเอามาแชร์ให้รู้โดยทั่วกัน



จากรูป ถ้าคิดแบบซื่อๆ การสร้าง Object 3 ตัวก็ต้องมี 3 ตาราง อันแรกเก็บ Player อันที่สอง สาม เก็บ Footballer กับ Cricketer แล้ว link กลับไปที่ Player สร้างแบบนี้ Normalize สุดๆ แต่ใช้งานยากที่สุดๆ เช่นเดียวกัน ดังนั้นถ้าพิจารณาแล้ว Footballer กับ Cricketer เก็บข้อมูลไม่ต่างกันมาก น่าจะเอาสาม table มารวมเป็น table เดียวมากกว่า วิธีการงานก็ง่าย เพราะ Active Record มันเตรียมมาให้เราแล้วครับ
ขั้นแรกให้สร้าง Table Player ให้มี column ชื่อ type

create_table :players do |t|
  t.string :type t.string :name t.timestamps 
end

จากนั้นก็สร้าง model สามตัว สามไฟล์

#/app/model/player.rb 
class Player < ActiveRecord::Base 
end

#/app/model/footbller.rb 
class Footballer < Player 
end

#app/model/cricketer.rb 
class Cricketer < Player 
end
เสร็จแล้วครับ ทดสอบได้โดยเปิด ruby script/console แล้วลอง

f = Footballer.new 
f.name ="Piyapong" f.save

ในฐานข้อมูลจะแสดง type เป็น Footballer ให้อัตโนมัติ ที่นี้ลองแก้ model เพิ่มเติมอีกหน่อย

#/app/model/player.rb 
class Player < ActiveRecord::Base 
end 

#/app/model/footbller.rb 
class Footballer < Player 
  def iam 
    "Footballer" 
  end 
end

#app/model/cricketer.rb 
class Cricketer < Player 
  def iam 
    "Cricketer" 
  end 
end
ลองใส่ข้อมูลลองใน ฐานข้อมูลสัก 4-5 record ให้มี Type เป็น "Cricketer" กับ "Footballer" สลับกัน เปิด irb แล้วลอง

players = Player.find(:all) players.each do |player| 
  puts player.iam 
end 
player แต่ละคนจะรู้ว่าตัวเองเป็นอะไร โดยที่เราไม่ต้องมา if ให้เสียบรรทัด ทำให้ code แยกเป็นสัดส่วน และดูสะอาดตาเป็นยิ่งนัก

Reference: hmartinfowler

เพิ่มเติม :) ในกรณีที่เราไม่ต้องการใช้ column type ในการทำ STI เราสามารถกำหนด manual ได้ด้วยคำสั่ง

#/app/model/player.rb 
class Player < ActiveRecord::Base 
  set_inheritance_column :player_type 
end

คำสั่งนี้ยังใช้ในกรณีที่เราต้องการ column type ไปใช้ทำอย่างอื่นที่ไม่ใช่ sit ก็กำหนดให้ column นี้เป็นอย่างอื่นไปเลย

#/app/model/player.rb 
class Player < ActiveRecord::Base 
  set_inheritance_column :no_sit 
end

เปลี่ยน theme ของ code ให้ NetBeans 6.1 คล้าย textmate

ผมชอบ themes สีเทาเพราะดูแล้วสบายตา จนเดี๋ยวนี้เริ่มติด จน code ที่พึ้นหลังเป็นสีขาวนานๆ แล้วแสบตา วันนี้ได้โอกาสต้องมา set netbean ที่บ้านเลยจดวิธีเอาไว้ก่อน [![theme](/downloads/nbt_mini.png)](/downloads/nbt.png) อันดับแรก download themes จาก [huikau](http://blog.huikau.com/2008/04/28/aloha-color-theme-for-netbeans-61) หรือ download ได้โดยตรงที่ [http://pages.huikau.com/AlohaTheme.nbm.jar](http://pages.huikau.com/AlohaTheme.nbm.jar) ถ้า link เสียผมเก็บไว้อีกชุด [download](/downloads/AlohaTheme.nbm_.jar) สำหรับ leopard เมื่อ download แล้วแก้ไฟล์ name ให้เหลือแค่ AlohaTheme.nbm click ขวาบนไฟล์ แล้วเลือก Get Info หรือเลือกไฟล์แล้วกด command + i แล้วแก้ extension โดยลบ .jar ออก ![info](/downloads/info.png) การติดตั้งให้กด menu > tools > Plugins เลือก tab downloaded กดปุ่ม Add Plugins... แล้วเลือก AlohaTheme.nbm กด install แล้วทำตามขั้นตอนไปจนจบครับ กดดู preference (apple menu > Netbeans > preference) หรือ Edit > option สำหรับ linux และ windows เลือก Font & Color แก้ Profile เป็น Aloha จาก นั้นเลือก menu diff แก้สีของ Added Text -> Black, Changed Text -> Dark Grey ปัญหาต่อมาคือสีตอน select กับสีที่ auto hilight มันเป็นสีเดียวกัน ผมใช้วิธีแก้ Hilighting > Selected text ให้เป็น RGB (63, 68, 79) สำหรับเรื่อง font ถ้าใช้ platform อื่นนอกจาก macintosh ให้ download ได้จาก [http://www.gringod.com/wp-upload/MONACO.TTF](http://www.gringod.com/wp-upload/MONACO.TTF) หรือจาก [http://www.gringod.com/2006/02/24/return-of-monacottf](http://www.gringod.com/2006/02/24/return-of-monacottf) ถ้าไม่ได้เอาใน attachment ของ blog ได้ครับ font อื่นๆ เอาที่นี่ครับ (http://www.gnome.org/fonts/) ต่อจากนั้นผมจะเลือก view > show line number และ เข้าหน้า preference เอา auto popup ออก เป็นอันเสร็จพิธีในเบื้องต้นครับ

ย้าย SVN Repository

วันนี้ได้ลองย้าย SVN Repository จากที่หนึ่ง ไปไว้ใน Repository ที่มีอยู่แล้วอีกที่หนึ่ง ตอนแรกคิดว่าต้องใช้ท่ายากเพราะไม่ได้เป็นการสร้างใหม่ แต่กับง่ายกว่าที่คิด ผมเริ่มจากการ dump reposity ออกมาก่อนด้วยคำสั่ง svnadmin dump repo_path > dump_file ในกรณีของ unix เราใช้ full path ได้เต็มๆ แต่ในกรณีของ windows มันจะบอกว่าไม่รู้จัก c: ผมแก้ปัญหาแบบ OTOP ด้วยการ cd ไปยัง directory ที่เก็บ repository ก่อน จะได้ไม่ต้องระบบ full path ขั้นตอนนี้ถ้าจะประยุกต์ใช้กับการ backup svn ก็ได้ เพราะ dump_file ก็คือ repository ทั้งตัวนี่เอง สำหรับการย้ายก็แค่ copy dump_file ไปไว้ folder เดียวกับ repository ปลายทางจากนั้นสั่ง svnadmin load new_repo < dump_file เช่นเดียวกับกรณี dump ถ้าเป็น windows มันจะไม่รู้จัก c: เราก็ cd ไปอยู่ที่เดียวกับ repository ก่อน แล้วค่อยสั่งครับ แต่บน unix ใช้ full path ได้สบายเลย ในกรณีที่เราไม่ต้องการเอา repository เดิมไปไว้ที่ root ของ repository ใหม่ เราสามารถใส่ path ลงไปได้เลย เช่น svnadmin load new_repo/project/name < dump_file การ load svn จะอ่าน dump_file แล้วค่อยๆ ใส่ข้อมูลลงไปทีละ revision ถ้าเดิม new_repo มี Head revision อยู่ที่ 100 และ dump_file มี Head revision อยู่ที่ 50 หลังจาก load แล้ว Head revision จะเท่ากับ 150 โดยข้อมูลใน dump_file จะเริ่มจาก 101 ถึง 50

MVC มุมมองใหม่ 3F to 3S

หลังจากนั่งทำ Refactoring code ของตัวเอง ทำให้ได้มุมมองใหม่ๆ จากที่เคยจิตนาการว่า [MVC](http://en.wikipedia.org/wiki/Model-view-controller) คือ 3F

  • Fat Model: พยายามยัดทุกอย่างลง model เพื่อให้มันอ้วนๆ
  • Fast Controller: เมื่อทุกอย่างไปอยู่ใน model ทำให้ view เปลี่ยนได้ง่าย
  • Flexible View: ต้องทำให้ View ปรับแต่งได้เร็วที่สุด
แต่จิตนาการแบบนี้กลับทำให้ผมพลาดครั้งใหญ่ หลังจาก Refactoring แล้วผมพบว่าเราไม่ได้ต้องการให้ model มันอ้วนเฮะ ผมต้องการให้ model มันฉลาดต่างหาก มองเหมือน model เป็นลูกน้องของ controller เปลี่ยนจาก

Fat model ไปเป็น Smart Model

เวลาพิจารณาว่าอะไรควรอยู่ใน model ก็ให้จับหลักว่าลูกน้องควรรู้อะไร เพื่อให้หัวหน้าสบายที่สุด

สำหรับ Fast Controller นั้นไม่ค่อยตรงเท่าไหร เพราะ controller ไม่ค่อยเปลี่ยนบ่อยขนาดนั้น สิ่งที่ต้องการคือ ความเข้าใจง่ายและ การทำงานความถูกต้องซะมากกว่า ยิ่งสั้นยิ่งผิดยาก ไม่ควรยาวเกิน action ละ 15 บรรทัด การเป็นหัวหน้าต้องสั่งน้อยๆ ถ้าเมื่อใดสั่งมากแสดงว่าลูกน้องเราไม่ฉลาด ต้องไปเพิ่มความฉลาดให้ลูกน้อง (model) ดังนั้นต่อไปผมจะเปลี่ยนจาก

Fast Controller มาเป็น Short controller

ข้อที่ผมพลาดมากที่สุดคือ Flexible view เมื่อพิจารณาจากจุดเริ่มต้น ผมเริ่มใช้ MVC เพราะผมต้องการแยกงานเขียน code ออกจากงานด้านออกแบบ ถ้าผมพยายามทำให้ View มัน Flexible ผลที่ได้คือ มี Business logic บางส่วนมาอยู่บน view ด้วย เพื่อแก้ปัญหานี้ ต่อไปผมจะพยายามจะนิยาม view ใหม่จาก

Flexible View ไปเป็น Stupid View

ให้ความฉลาดของ view มันอยู่ที่การออกแบบไม่ได้อยู่ที่ code ของโปรแกรม ผมไม่ได้หมายความว่าให้ใช้แต่ HTML/CSS นะครับการใช้ Helper ก็เป็นตัวช่วยให้ view มันโง่ๆ ด้วย สิ่งที่ไม่ควรมีบน view คือพวกการคำนวนหรือ Businees logic เราควรเตรียมให้เรียบร้อยมาตั้งแต่ model
เมื่อคิดได้ดังนั้นจึงเปลี่ยนนิยามของ MVC จาก 3F ไปเป็น 3S แทนครับ
  • Smart Model: เป็นลูกน้องที่ทำงานอย่างฉลาด ไม่ใช่ทำทุกอย่าง
  • Short Controller: ไม่ควรเกิน 15 บรรทัด ถ้าเกินแสดงว่าลูกน้องเราโง่อยู่
  • Stupid View: ให้ความฉลาดอยู่ที่การออกแบบ ไม่ได้อยู่ที่ code

ถ้าทำ Refectoring ต่อไปน่าจะได้มุมมองใหม่ๆ เพิ่มเติมอีก ถึงตอนนั้นนิยามอาจจะเปลี่ยนไปจากนี้ก็ได้ ตื่นเต้นจริงๆ

My new X11

ก่อนหน้านี้เคยพยายามลง [gedit บน leopard](http://gedit.darwinports.com/) โดยการลงผ่าน [dawinport](http://darwinports.com/) ใช้เวลานานข้ามวันเพราะแทบจะต้อง download GNome ทั้งตัว สุดท้ายมาตายที่ X11 ของเครื่องมันเดี้ยงๆ ไม่สามารถเรียกกระทั่ง xterm ออกมาได้ โครงการเลยต้องพักไว้ก่อน วันนี้มาเจอ [XQuartz](http://xquartz.macosforge.org/trac/wiki) เลย download มาใช้แทน default X11.app หน้าตา icon แบบนี้ ![x11](/downloads/x11.png) พอเปิด GEdit หน้าตา GTK แบบไร้ Theme ดูอนาจเป็นยิ่งนัก ![x11](/downloads/gedit.png) ทุกขอบหนา 2 pixel หมด ถ้าแค่เค้าลดมาให้เหลือ 1 pixel กับใช้สี dark gray แทนสีดำ มันจะดูดีขึ้นมากเลยนะเนี่ย ภาษาไทยยังไม่รู้ว่า set ตรงไหนแต่ default ไม่สามารถพิมพ์ไทยได้ ต้องหาวิธีกันต่อไป เท่าที่อ่านดู กอปรกับมันอยู่บน macosforge.org ทำให้คาดเดาว่ามันก็คือ X11.org นี่เอง แต่อาจจะกลายพันธ์เล็กน้อย เหมือน Open Office กับ Star Office อ่านที่เค้าเขียนว่า > The Xquartz project is an open-source effort to develop a version of the X.org X Window System that runs on Mac OS X. Together with supporting libraries and applications, it forms the X11.app that Apple has shipped with OS X since version 10.5. ขั้นตอนต่อไปตามหมายกำหนดการคือการแต่ง [gedit](http://www.gnome.org/projects/gedit) ให้เหมือน [textmate](http://macromates.com/)

แปลง gedit บน leopard ให้คล้าย TextMate

ทำออกมาแล้วได้ประมาณนีครับ ![gedit](/downloads/gedit3.png) **อันดับแรก ติดตั้ง Official Plugin กันก่อนครับ** เนื่องจากเราไม่มี apt-get เหมือนบน linux เลยต้องใช้ Dawin Ports แทน cd /opt/local/bin/portslocation/dports/gedit-plugins % sudo port install gedit-plugins ใครสนใจ download มา compile เองเอาได้ที่นี้ครับ * Download ได้จาก [live.gnome.org/GeditPlugins](http://live.gnome.org/GeditPlugins) * Direct download [gedit-plugins-2.18.0.tar.gz](ftp://ftp.gnome.org/pub/gnome/sources/gedit-plugins/2.18/gedit-plugins-2.18.0.tar.gz) Plugin ที่เราต้อง enable คือ * Session Saver: you can save the status of the tabs/files opened * Snippets: use quicly the most useful piece of code * File Browser Pane: a mini file browser embedded in the editor * Code comment: a shortcut to comment your code. Many languages are supported * กด ctrl + m เพื่อ comment * กด ctrl + shift + m เพื่อ un comment **ทำตัว Snap open** เมื่อก่อนจะพยายามเปิดจากด้านข้าง พอผึก Snap open มานานๆ พอเริ่มจำได้ก็เริ่มติด นอกจากจะเร็วแล้วยังช่วยให้เราจำไฟล์ในโปรแกรมของเราได้อีกด้วย * Download ได้จาก [upperbound.net](http://www.upperbound.net/snapopen/) * Direct download [snapopen-1.1.4.tar.gz](http://www.upperbound.net/snapopen/snapopen-1.1.4.tar.gz) เมื่อ download มาแล้วให้ untar ไฟล์แล้วนำทั้ง folder และไฟล์ plugin ไปใส่ไว้ที่ ~/.gnome2/gedit/plugins จากนั้นเข้าไปเปิดใช้ plugin ที่ menu > Edit > Preferences > plugins > Snap Open วิธีใช้ให้กด ctrl + alt + o ในการใช้ Snap Open ปัญหาที่เจอคือเรากด alt ไม่ได้ครับ :( ทางแก้คือ สร้างไฟล์ .xmodmap ขึ้นมาแล้วใส่ code ข้างล่างลงไป clear Mod1 keycode 66 = Alt_L keycode 69 = Alt_R add Mod1 = Alt_L add Mod1 = Alt_R save แล้ว restart X11 เป็นอันเรียบร้อย **ติด plugin Class browser** plugin นี้สำหรับคนที่มีไฟล์ยาวโดยเฉพาะครับ * Download ได้จาก [stambouliote](http://www.stambouliote.de/projects/gedit_plugins.html) * Direct download [gedit_classbrowser-0.2.1.tar.gz](http://www.stambouliote.de/download/gedit_classbrowser-0.2.1.tar.gz) untar แล้วเอาไปไว้ที่เดิม ~/.gnome2/gedit/plugins เมื่อ enable ผ่าน menu > Edit > Preferences > plugins เป็นอันเรียบร้อย ปัญหาคือมันเปิดเป็นหน้าต่างทิ้งไว้แบบ netbean หรือ eclipse ไม่ได้ต้องคอย click อยู่เรื่อยๆ (ยังไม่รู้ short cut) ใส่ syntax highlight ของ .rhtml, .html.erv และไฟล์อื่นๆ ของ rails ด้วยสามคำสั่งครับ curl http://robzon.kapati.net/rails/rhtml.lang > rhtml.lang sudo mv rhtml.lang /opt/local/share/gtksourceview-2.0/language-specs curl http://robzon.kapati.net/rails/rails.xml > rails.xml sudo mv rails.xml /opt/local/share/mime/packages sudo update-mime-database /opt/local/share/mime สามคำสั่งนี้ไม่เหมือนของ linux ต้องเปลี่ยน /usr เป็น /opt/local/share ครับ กับ leopard ไม่ได้ลง wget มาให้ แต่มี curl มาแทน **ติดตั้ง Word Completion** * Download ได้จาก [elias.hiex.at](http://elias.hiex.at/gedit-plugins/) * Direct download [auto_completion.gedit-plugin](http://elias.hiex.at/gedit-plugins/auto_completion.gedit-plugin) * Direct download 2 [auto_completion.py](http://elias.hiex.at/gedit-plugins/auto_completion.py) ต้องเอามาทั้งสองไฟล์ครับ สำหรับไฟล์แรกตอน download มา leopard จะเติม .txt ให้ ต้องลบออกไปก่อนนะครับ untar แล้วเอาไปไว้ที่เดิม ~/.gnome2/gedit/plugins เมื่อ enable ผ่าน menu > Edit > Preferences > plugins เป็นอันเรียบร้อย **ถึงขั้นตอนสำคัญสุด การทำ themes ให้เหมือน textmate ครับ** 1. ติดตั้ง Dark scheme สามารถ Download ได้จาก [http://grigio.org](http://grigio.org/tag/darkmate), Direct download [darkmate.xml](http://grigio.org/files/darkmate.xml) การติดตั้งให้เข้าไปที่ menu > Edit > Preferences > Font & Color > "+ Add..." 2. เลือก font เป็น monaco ครับ ของ windows กับ linux ต้องไป download มา แต่ของ mac มีอยู่แล้น ส่วนของการทำ test ขอละไว้ก่อนนะครับ (มีปัญหากับ ruby-gnome2) ที่มา [grigio.org](http://grigio.org/pimp_my_gedit_was_textmate_linux) ปล. Plugin อื่นๆ ที่ผมเลือกใส่จะมี * Color Picker: เอาไว้ใช้ generate Hex code ของสีครับ * Tag list: เอาไว้ดูว่า ตัวอักษรประหลาดต้องเขียนแบบไหนใน HTML * Draw Spaces: เอาไว้เขียนรูป tab "->" และช่องว่าง "." ครับ เลือกเป็นสีเข้มๆ ซัก #313131 กำลังดี

18 ข้อที่ควรระวังในการออกแบบห้องครัว

สร้าง Homepage มาหลายหลัง วันนี้ได้สร้างบ้านจริงๆ หลังจากออกแบบโครงเสร็จก็ถึงคิวรายละเอียดภายในบ้าง เริ่มจาก M:Mouth ไปเจอในหนังสือ room มีอยู่ 20 ข้อครับ แต่ผมเอาออกมาแค่ 18 ข้อที่พอจะทำได้ในบ้าน

1. ในห้องครัวคนจะใจจดใจจ่ออยู่กับอาหารทำให้ตกใจง่าย ดังนั้นควรระวังการยืนทำครัวแบบหันหลังให้ประตู

2. ควรวางปลั๊กตู้เย็นให้ถอดง่าย ไม่ไปซ่อนอยู่หลังตู่เย็น

3. ควรมีพื้นที่เตรียมอาหารกว้าง 0.80 - 1 เมตร เผื่อวางของที่หยิบมาจากตู้เย็นด้วย ให้ตู้เย็นไว้ด้านขวา อ่างล้างจานไว้ด้านซ้าย

kitchen

4. พื้นที่เดินในครัวควรกว้าง 1.2 เมตร กันเดินชนกัน เพราะต้องเดินอยู่แล้ว

kitchen

5. ตู้เย็นไม่ควรวางใกล้เตาอบ และถ้า build in ก็ควรมีระบายอากาศด้วย

6. ก็อกน้ำควรเป็นแบบโยกเพราะปิดเปิดง่าย แม้ว่าจะใช้มือสองข้างถือหม้ออยู่ก็ตาม

7. เตาไฟไม่ควรวางใกล้หน้าต่าง เพราะจะเปลืองแก๊ส ถ้าเป็นครัวกลางแจ้งไม่ควรเอาไว้ทิศตะวันตก หรือทิศใต้เพราะลมจะพัดไฟเข้าหาตัว เข้าหน้า

8. อย่าลืมที่วาง น้ำปลา ซีอิ้ว น้ำมัน น้ำตาล และเกลือ เอาไว้ใกล้ๆ เตาไฟ อาจทำเป็นชั้นที่ไม่มีฝากั้นก็ได้

9. ไม่ควรใช้ครัวฝรั่งถ้าชอบอาหารไทย ควรแยกออกไปทำนอกบ้าน

10. อย่าใช้หินอ่อน เพราะจะเปื้อนเข้าไปถึงเนื้อในได้ง่าย

11. ความสูงของเคาน์เตอร์ไม่ควรประมาณ 85-90 cm แล้วทำขอบล่างเว้าเข้าไป 8 cm สูง 10 cm

kitchen

12. เผื่อที่ไว้สำหรับเก้าอี้ เอาไว้นั่งหรือหยิบของที่สูงๆ

13. อย่าวางแผนเก็บจานชามไว้ที่สูง นอกจากจะทำให้เราไม่ได้ใช้แล้ว ยังทำให้มีโอกาสแตกอีกด้วย

14. ครัวสวยต้องให้มีที่เก็บของด้วย

15. เตรียมที่สำหรับเครื่องกรองน้ำไว้แต่เนิ่นๆ เพราะจะทำให้สวยยาก ยิ่งมีพวกขวดไว้หลายๆ ใบด้วย

16. ระวังไม่ให้ครัวร้อน ต้องระบายอากาศให้ดี ถ้ามีพัดลมก็ดี พยายามอย่าให้พัดเข้าเตาไฟ

17. เตรียมถังขยะมีฝาไว้นอกบ้าน ใกล้ครัว กันมด หรือแมลงสาบเข้าบ้าน

18. ติดตั้งถังดักใขมัน กันท่อตัน

Quick look plugin (Zip & Tar & Tar.gz)

ไปเจอ Quicklook plugin มาตัวนึง เอาไว้ใช้เปิด zip ไฟล์ หน้าตาประมาณนี้



วิธีใช้ให้ download ไฟล์จาก xdd

direct download
Archive.qlgenerator01.zip]

Download เสร็จก็ unzip แล้ว copy "Archive.qlgenerator" ไปไว้ที่

/Library/QuickLook/
หรือเอาไว้ใช้ส่วนตัวที่
~/Library/QuickLook/

จากนั้นสั่ง re launch ตัว finder ด้วยคำสั่ง re-launch Finder.app เป็นอันเสร็จกระบวนการ install เวลาใช้ให้ click บน zip ไฟล์แล้วกด space bar อาจจะช้านิดหน่อยในการเปิดครั้งแรก แต่ก็ถือว่า ok สำหรับ Quick look ครับ

ที่มา xdd