วันพฤหัสบดี, กรกฎาคม 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 ครับ