แสดงบทความที่มีป้ายกำกับ Public แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ Public แสดงบทความทั้งหมด

วันศุกร์ที่ 26 กันยายน พ.ศ. 2551

เสวนา พรบ.ว่าด้วยการกระทำความผิดเกี่ยวกับคอมพิวเตอร์

เมื่อวานนี้ (25 กันยายน 2551) ในงานมหกรรมซอฟต์แวร์โอเพนซอร์สแห่งชาติครั้งที่ 8 ซึ่งจัดพร้อมกับงานประชุมวิชาการประจำปีของเนคเทค 2008 ผมได้ทำหน้าที่เป็นพิธีกรดำเนินรายการเสวนา พรบ.ว่าด้วยการกระทำความผิดเกี่ยวกับคอมพิวเตอร์ และ Central Log Server ซึ่งมีแขกรับเชิญ 3 ท่านคือ ร.ต.ท.ดรัณ จาดเจริญ สว.กลุ่มงานตรวจสอบฯ ศูนย์ตรวจสอบและวิเคราะห์การกระทำความผิดทางเทคโนโลยี สำนักงานตำรวจแห่งชาติ คุณสถาพร สอนเสนา จากกลุ่มงานนิติกร สำนักงานปลัดกระทรวงเทคโนโลยีสารสนเทศและการสื่อสาร และคุณสว่างพงศ์ หมวดเพชร จากบริษัทไอทีเบเกอรี่ เป็นหนึ่งในผู้ที่ได้พัฒนาผลิตภัณฑ์และจัดอบรมการทำ Central Log Server ด้วยตนเอง

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

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

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

  • อะไรบ้างที่จะถูกใช้เป็นหลักฐานในการเอาผิด - 1.เนื้อหา เช่นภาพที่อัพโหลดขึ้นเว็บ ข้อความที่โพสต์ 2. ข้อมูลการจราจรทางคอมพิวเตอร์ 3. การระบุตัวตน เช่น ณ เวลาดังกล่าว ใครเป็นผู้ใช้คอมพิวเตอร์ที่เป็นหมายเลขไอพีดังกล่าว ซึ่งการเก็บเวลาที่แม่นยำตรงกัน จะช่วยให้ระบุตัวตนได้ถูกต้อง

  • IT Policy - ในองค์กรต้องกำหนด IT Policy ให้ชัดเจนเพื่อให้ผู้ปฏิบัติงานมีความระมัดระวังการใช้คอมพิวเตอร์ที่ปลอดภัยขึ้น เช่นการใช้งานคอมพิวเตอร์ที่มีการใช้ร่วมกัน เมื่อใช้เสร็จต้องล็อกเอาท์ทุกครั้ง เพื่อป้องกันคนอื่นสวมรอยใช้งานในชื่อเรา เป็นต้น

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

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

  • แล้วจะทราบได้อย่างไรว่าผลิตภัณฑ์ฯ ดังกล่าว ทำงานได้ถูกต้องจริง - ให้อ้างอิงจาก พรบ.และประกาศที่เกี่ยวข้อง ว่าคุณสมบัติของผลิตภัณฑ์เป็นไปตาม พรบ.และประกาศหรือไม่ (ผู้ขายต้องรับรองผลิตภัณฑ์ตัวเอง ว่างั้นเถอะ)

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

  • การทำให้ข้อมูลการจราจรทางคอมพิวเตอร์เชื่อถือได้ ทำอย่างไร - ใน พรบ. ไม่ได้กำหนดว่าทำอย่างไร ขึ้นอยู่กับเทคนิคและความเหมาะสม เช่นการแยก Server กับ Central Log ออกจากกัน การ sign key ใน archive ของ log หรือแม้แต่เก็บ log ตามปกติแต่มีขั้นตอนระเบียบวิธีปฏิบัติที่เชื่อถือได้ว่าไม่มีการดัดแปลงแก้ไข

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

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

  • ร้านอินเทอร์เน็ตคาเฟ่ ควรจัดเก็บข้อมูลอย่างไร - 1. จัดเก็บข้อมูลจราจรทางคอมพิวเตอร์ตามปกติ (คือยังไงก็ต้องมี gateway ที่เก็บ log อยู่ดี) 2. ผู้ใช้บริการต้องแสดงบัตรให้เจ้าหน้าที่ลงบันทึกหมายเลขบัตร และบันทึกเวลาใช้งาน เครื่องที่ใช้ทุกครั้ง ชาวต่างชาติก็ต้องแสดงพาสปอร์ต

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

  • ประเด็น Free Wi-Fi - 1. Free Wi-Fi ควรมีการออกรหัสให้ผู้ใช้ที่มีการลงทะเบียนด้วยหมายเลขบัตรฯ เท่านั้น มิฉะนั้นจะเป็นแหล่งเอื้อให้กระทำความผิดได้ 2. ระวัง Free Wi-Fi ปลอม ที่แอบเปิดให้บริการเพื่อดักจับ ID และรหัสผ่าน โดยเฉพาะที่ตั้งชื่อเลียนแบบ Wi-Fi อื่น ๆ แถว ๆ นั้น


ฝากให้รับฟังไว้ครับ เพราะหลายประเด็นไม่ได้ระบุชัดเจนใน พรบ. ซึ่งอาจจะมีแนวทางปฏิบัติเปลี่ยนไปในอนาคตก็ได้

วันพุธที่ 2 กรกฎาคม พ.ศ. 2551

Installing Debian Etch with 256MB USB Memory Stick

มีครั้งหนึ่งผมได้รับโจทย์ให้ติดตั้ง server โดยที่ server ที่จะซื้อใหม่นั้นไม่มี cd-rom มาด้วย เข้าใจว่าเป็นเหตุผลด้านราคา ซึ่งในทางปฏิบัติก็คิดว่า server ทุกตัว คงได้ใช้ cd-rom เฉพาะตอนติดตั้ง และตอนอัพเกรด หรือแก้ไขปัญหาต่าง ๆ เท่านั้น นอกนั้นก็ไม่ได้ใช้เลย จึงไม่จำเป็นแล้วที่ server จะมี cd-rom ทีนี้ปัญหาจึงเป็นว่า จะติดตั้ง Debian โดยไม่ใช้ cd-rom ได้อย่างไร คิดแบบเร็ว ๆ ก็คือใช้ USB memory stick ไงล่ะ

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

  1. แน่นอนต้องมี USB memory stick ก่อน ส่วนความจุนั้น ขึ้นอยู่กับว่าเราอยากใส่ระบบติดตั้งแบบไหน ผมกะว่าจะติดตั้งแค่แบบ netinst ซึ่งตัว iso มันแค่ 150 MB เอง ดังนั้น USB memory stick ตัวเก่า ๆ 256MB ของผม น่าจะได้ใช้ประโยชน์ก็คราวนี้แหละ และก็ถ้ามีข้อมูลที่ต้องการใช้อยู่ ก็คัดลอกออกจาก USB memory stick เสียให้เรียบร้อย จากนั้นก็ลองเช็คนิดนึงว่า USB memory stick ของเราเสียบที่ช่อง usb แล้วจะเห็นเป็น device อะไร ปกติจะเห็นเป็น /dev/sda แต่หลัง ๆ ก็ไม่แน่ เพราะถ้าฮาร์ดดิสก์ใช้ SCSI (คงน้อย) หรือ S-ATA มันจะใช้ sda ไปแล้ว ซึ่งคงจะเห็น USB เป็น sdb หรือ sdc หรืออื่น ๆ แทน ดังนั้น ในขั้นตอนต่อ ๆ ไปผมจะใช้ /dev/sdX แทนนะครับ ให้เปลี่ยน X เป็นตัวที่ถูกต้องต่อไป

  2. แบ่งพาร์ทิชันใหม่ เนื่องจากเดิมนั้น เจ้า USB memory stick ของผมเป็นแบบ partitionless คือไม่มีการแบ่งพาร์ทิชัน แล้วใช้ทั้งตัวเป็นที่เก็บข้อมูลเลย เวลาใช้บนลินุกซ์ก็จะเมานท์ /dev/sdX มาใช้เลย ไม่ได้เป็น sdX1
    โดยการแบ่งจะใช้คำสั่ง dd เพื่อล้าง sector แรกก่อน และใช้ fdisk เพื่อสร้างพาร์ทิชัน โดย
    # dd if=/dev/zero of=/dev/sdX bs=512 count=1
    # fdisk /dev/sdX

    กด n (สร้าง partition)
    กด p (เลือก primary partition)
    กด 1 (เลือก partition ที่ 1)
    กด enter เฉย ๆ เพื่อเริ่มจาก cylinder แรก
    กด enter เฉย ๆ เพื่อสิ้นสุดที่ cylinder สุดท้าย
    กด a เพื่อกำหนดให้ partition บูตได้
    กด 1 กำหนดให้บูตจาก partition 1
    กด w เพื่อบันทึกและออกจาก fdisk

  3. สร้าง file system
    # mkdosfs /dev/sdX1

    คำสั่ง mkdosfs ถ้าไม่มี ให้ติดตั้ง dosfstools ก่อนโดย apt-get install dosfstools (ปกติคิดว่ามีอยู่แล้วนะ)

  4. ติดตั้ง syslinux สำหรับทำหน้าที่เป็น boot loader
    # apt-get install mtools syslinux
    # syslinux /dev/sdX1
  5. เมานท์ USB memory stick ไปที่ตำแหน่งชั่วคราวซักที่หนึ่งก่อน
    # mkdir /mnt/tmp
    # mount /dev/sdX1 /mnt/tmp

    จะเห็นแฟ้ม ldlinux.sys อยู่ในนี้แล้ว ไม่ต้องลบหรือทำอะไรกับมันนะครับ ตัวนี้เป็นส่วนหนึ่งของ boot loader

  6. ดาวน์โหลดไฟล์ vmlinuz และ initrd.gz จาก http://mirror.in.th/debian/dists/Debian4.0r3/main/installer-amd64/current/images/hd-media/ ไปเก็บใน /mnt/tmp (รุ่นอื่น ๆ ก็เลือกเอาตามความเหมาะสมนะครับ ณ ปัจจุบันรุ่นที่ stable คือ 4.0r3 และผมก็เลือกติดตั้งเป็นแบบ 64bit ซึ่ง processor ของ server ใหม่ ๆ ในปัจจุบันก็สนับสนุนหมดแล้ว ยกเว้นจะเก่า ๆ จริง ๆ ก็ใช้ i386 แทน)

  7. สร้างแฟ้ม syslinux.cfg ใน /mnt/tmp โดยมีเนื้อหาดังนี้
    default vmlinuz
    append initrd=initrd.gz
  8. ดาวน์โหลดไฟล์ ISO image ตัวติดตั้ง debian จาก http://mirror.in.th/debian_iso/4.0_r3/amd64/iso-cd/ ผมเลือกแบบ netinst ด้วยเหตุผลเรื่องขนาด ดังนั้นจึงเลือกไฟล์ debian-40r3-amd64-netinst.iso แล้วนำไปใส่ไว้ที่ /mnt/tmp เช่นกัน ถ้า USB memory stick ใหญ่กว่านี้เป็น 1GB ก็ดาวน์โหลดแผ่นติดตั้งแผ่นแรกมาลงก็ได้ หรือถ้าน้อยกว่านี้ เช่น 64MB ก็เลือกแบบ businesscard ก็ได้

  9. unmount แล้วนำไปทดลองบูตดูได้เลย
    # umount /mnt/tmp

วันเสาร์ที่ 7 มิถุนายน พ.ศ. 2551

Google Treasure Hunt 2008 Question 4 (prime)

ตอนจบของการล่าสมบัติ คือการหาจำนวนเฉพาะที่น้อยที่สุดที่เป็นผลรวมของจำนวนเฉพาะที่ต่อเนื่องกันตามจำนวนที่ระบุเท่ากัน โดยของผมได้ 15, 31, 127, 515 จำนวน จะบอกว่าเห็นแว๊บแรก มองเห็นว่ามันคือ 2^4-1, 2^5-1, 2^7-1, 2^9+3 ทำให้อดคิดไม่ได้ว่ามันเกี่ยวอะไรกันหรือเปล่า จริง ๆ ไม่ได้เกี่ยวอะไร (มั๊ง)

แต่ข้อนี้ผมทำได้ช้ามาก ๆ เพราะตอนแรกอ่านโจทย์ไม่ละเอียดเอง ไม่ทันสังเกตว่ามันต้องการแค่จำนวนเฉพาะที่ต่อเนื่องกัน ผมนึกว่าจำนวนเฉพาะใด ๆ ก็ได้มาบวกกัน ทำให้โจทย์ยากขึ้นเยอะมาก ซึ่งจริง ๆ เขียนโค้ดจนได้โค้ดที่พร้อมรันแล้ว ซึ่งประเมินแล้วว่ารันนานแน่ ๆ เพราะซับซ้อนมาก ขนาด list ที่ใช้ก็ใหญ่มาก ต้องเก็บข้อมูลเป็น bit เพื่อลดขนาดข้อมูลกันเลยทีเดียว อัพโหลดโค้ด และ text file ที่เก็บจำนวนเฉพาะที่คำนวณไว้แล้ว 6 แสนตัวไปไว้เครื่อง server Linux 64bit ram 8GB รันไปได้หน่อยนึง กะว่าคงต้องรอสักอาทิตย์จึงจะเห็นผล จนแว๊บเห็นคุณ @macroart tweet บอกว่าเขียนบล็อกเรื่องนี้ไปแล้ว เลยเข้าไปอ่านดูถึงรู้ว่าพลาดไปแล้ว

สรุปว่าเขียนใหม่ครับ เหลือโค้ดไว้ใช้เฉพาะตัวโหลด prime ใน file มาเป็น list ที่เหลือเขียนใหม่เลย ลองแบบยังไม่อ่านแนวทางของคุณ @macroart แต่สุดท้ายได้แนวคิดคล้าย ๆ กัน คือผมมองเป็นบล็อก เหมือนรถไฟ 4 ขบวนค่อยวิ่งออกจากต้นทาง โดยตอนแรกหาผลรวมเท่าจำนวนที่ระบุของแต่ละขบวนก่อน แล้วค่อย ๆ ขยับรถไฟไปทีละหน่อย โดยลบเลขตัวน้อยท้ายขบวนออก บวกด้วยตัวถัดไปที่อยู่หัวขบวน ค่อย ๆ เทียบค่าทีละคู่ ดังนั้นคู่ที่ 1 กับ 2 จะเริ่มวิ่งก่อน จนกว่าจะได้ผลรวมเท่ากัน ค่อยเทียบกับขบวนที่ 3 และเมื่อทั้ง 3 ขบวนมีผลรวมเท่ากัน ค่อยไปเทียบกับขบวนที่ 4 จนกว่าจะเท่ากันหมด

รอบแรกมีบั๊กนิดหน่อย เพราะการอ้างตำแหน่ง list หัวขบวนผิด พอแก้แล้วก็รันไม่กี่วินาทีก็ได้คำตอบ ช้ากว่าของ @macroart เพราะรถไฟของแกมีการเร่งเครื่องได้ด้วยถ้าผลรวมต่างกันมาก ๆ ตรงนี้ไม่ได้คิด

ผลลัพธ์ที่ได้คือ

ANSWER = 7448179
[41266, 21229, 5870, 1441] [7448179, 7448179, 7448179, 7448179]
0 : 496459 496471 496477 496481 496487 496493 496499 496511 496549 496579 496583 496609 496631 496669 496681
1 : 240073 240089 240101 240109 240113 240131 240139 240151 240169 240173 240197 240203 240209 240257 240259 240263 240271 240283 240287 240319 240341 240347 240349 240353 240371 240379 240421 240433 240437 240473 240479
2 : 57973 57977 57991 58013 58027 58031 58043 58049 58057 58061 58067 58073 58099 58109 58111 58129 58147 58151 58153 58169 58171 58189 58193 58199 58207 58211 58217 58229 58231 58237 58243 58271 58309 58313 58321 58337 58363 58367 58369 58379 58391 58393 58403 58411 58417 58427 58439 58441 58451 58453 58477 58481 58511 58537 58543 58549 58567 58573 58579 58601 58603 58613 58631 58657 58661 58679 58687 58693 58699 58711 58727 58733 58741 58757 58763 58771 58787 58789 58831 58889 58897 58901 58907 58909 58913 58921 58937 58943 58963 58967 58979 58991 58997 59009 59011 59021 59023 59029 59051 59053 59063 59069 59077 59083 59093 59107 59113 59119 59123 59141 59149 59159 59167 59183 59197 59207 59209 59219 59221 59233 59239 59243 59263 59273 59281 59333 59341
3 : 12041 12043 12049 12071 12073 12097 12101 12107 12109 12113 12119 12143 12149 12157 12161 12163 12197 12203 12211 12227 12239 12241 12251 12253 12263 12269 12277 12281 12289 12301 12323 12329 12343 12347 12373 12377 12379 12391 12401 12409 12413 12421 12433 12437 12451 12457 12473 12479 12487 12491 12497 12503 12511 12517 12527 12539 12541 12547 12553 12569 12577 12583 12589 12601 12611 12613 12619 12637 12641 12647 12653 12659 12671 12689 12697 12703 12713 12721 12739 12743 12757 12763 12781 12791 12799 12809 12821 12823 12829 12841 12853 12889 12893 12899 12907 12911 12917 12919 12923 12941 12953 12959 12967 12973 12979 12983 13001 13003 13007 13009 13033 13037 13043 13049 13063 13093 13099 13103 13109 13121 13127 13147 13151 13159 13163 13171 13177 13183 13187 13217 13219 13229 13241 13249 13259 13267 13291 13297 13309 13313 13327 13331 13337 13339 13367 13381 13397 13399 13411 13417 13421 13441 13451 13457 13463 13469 13477 13487 13499 13513 13523 13537 13553 13567 13577 13591 13597 13613 13619 13627 13633 13649 13669 13679 13681 13687 13691 13693 13697 13709 13711 13721 13723 13729 13751 13757 13759 13763 13781 13789 13799 13807 13829 13831 13841 13859 13873 13877 13879 13883 13901 13903 13907 13913 13921 13931 13933 13963 13967 13997 13999 14009 14011 14029 14033 14051 14057 14071 14081 14083 14087 14107 14143 14149 14153 14159 14173 14177 14197 14207 14221 14243 14249 14251 14281 14293 14303 14321 14323 14327 14341 14347 14369 14387 14389 14401 14407 14411 14419 14423 14431 14437 14447 14449 14461 14479 14489 14503 14519 14533 14537 14543 14549 14551 14557 14561 14563 14591 14593 14621 14627 14629 14633 14639 14653 14657 14669 14683 14699 14713 14717 14723 14731 14737 14741 14747 14753 14759 14767 14771 14779 14783 14797 14813 14821 14827 14831 14843 14851 14867 14869 14879 14887 14891 14897 14923 14929 14939 14947 14951 14957 14969 14983 15013 15017 15031 15053 15061 15073 15077 15083 15091 15101 15107 15121 15131 15137 15139 15149 15161 15173 15187 15193 15199 15217 15227 15233 15241 15259 15263 15269 15271 15277 15287 15289 15299 15307 15313 15319 15329 15331 15349 15359 15361 15373 15377 15383 15391 15401 15413 15427 15439 15443 15451 15461 15467 15473 15493 15497 15511 15527 15541 15551 15559 15569 15581 15583 15601 15607 15619 15629 15641 15643 15647 15649 15661 15667 15671 15679 15683 15727 15731 15733 15737 15739 15749 15761 15767 15773 15787 15791 15797 15803 15809 15817 15823 15859 15877 15881 15887 15889 15901 15907 15913 15919 15923 15937 15959 15971 15973 15991 16001 16007 16033 16057 16061 16063 16067 16069 16073 16087 16091 16097 16103 16111 16127 16139 16141 16183 16187 16189 16193 16217 16223 16229 16231 16249 16253 16267 16273 16301 16319 16333 16339 16349 16361 16363 16369 16381 16411 16417 16421 16427 16433 16447 16451 16453 16477 16481 16487 16493 16519 16529 16547 16553 16561 16567 16573 16603 16607 16619 16631 16633 16649 16651 16657 16661 16673 16691 16693 16699 16703 16729 16741 16747 16759 16763 16787 16811 16823 16829 16831 16843 16871 16879 16883 16889 16901 16903 16921 16927 16931 16937 16943 16963
done.

real 0m21.637s
user 0m16.273s
sys 0m0.328s


7448179 คือจำนวนเฉพาะที่เล็กที่สุด ที่เป็นผลบวกของจำนวนเฉพาะที่ต่อเนื่องกันจำนวน 15, 31, 127 และ 515 จำนวน

ยังไม่เฉลยโค้ดนะครับ ขออุบไว้ก่อน เดี๋ยวไม่สนุก

สรุปว่าได้คำตอบครบทั้ง 4 ข้อแล้ว นอนหลับสนิทซักที เก็บภาพนี้ไว้เป็นที่ระลึก

google-treasurehunt-result

วันศุกร์ที่ 6 มิถุนายน พ.ศ. 2551

Pipe for My Comments on Blognone

ผม subscribe เอา comment feed ของ Blognone ไว้ใน google reader ซึ่งเยอะจัด ส่วนใหญ่ไม่ค่อยได้ใช้ประโยชน์อะไร มาวันนี้นึกสนุก อยากเก็บ comment ต่าง ๆ ของตัวเองที่ตอบไว้ใน Blognone ทั้งหมดไว้ใน Google reader เลยขอลองสักหน่อย

ปัญหาคือ comment ของ Blognone มีเยอะมาก และแน่นอนว่าไม่ได้แยก user ไว้ให้ เราต้องมา filter เอง พอพูดถึงการ filter feed ก็เลยนึกถึง Yahoo pipes ซึ่งเคยลองเล่นมาบ้างแล้ว สนุกดี ครั้งนี้คงจะเป็นครั้งแรกที่จะเอามาใช้ให้เกิดประโยชน์จริงจังซักที ใช้เวลาไม่นานนักก็สร้าง pipes ขึ้นตามรูป

yahoo-pipe-my-bn-comments

อันแรก เป็น source ชนิด feed แล้วมาผ่าน filter เพื่อเลือกเฉพาะที่มี item.dc:creator เป็นตามที่เราระบุใน text input เท่านั้นเอง ก็เรียบร้อย จัดการ save แล้ว publish จากนั้นมาดูวิธีใช้งานกัน

วิธีแรก ดูผ่านหน้าเพจปกติของ Yahoo! pipes โดยเข้าไปที่ http://pipes.yahoo.com/pipes/pipe.info?_id=f8b3f41bdc451c216630a6c503d61fb5 แล้วกรอก blognone login name แล้วกด "Run Pipe" หรือจะใส่ &name=username ต่อท้าย url เข้าไปเลยก็ได้ แต่จากที่ลองดูพบว่า มันจะได้เฉพาะ comment ท้าย ๆ มาทำ filter ซึ่งบางครั้ง comment ของเรามันตกไปแล้ว

วิธีที่ดีกว่าคือเรียกเป็น feed เพื่อไป เก็บและอ่านใน Google reader โดย subcribe ไปที่ http://pipes.yahoo.com/pipes/pipe.run?_id=f8b3f41bdc451c216630a6c503d61fb5&_render=rss&name=username อย่าลืมเปลี่ยนตรง username เป็นชื่อ login ใน blognone ของคุณเอง

อ๊ะ หรือใครใช้ twitter จะใช้ twitterfeed ส่งเข้าไปใน twitter time line ของคุณก็ได้นะ

ใช้แล้วได้ผลอย่างไรบอกเล่ากันด้วยครับ

วันอังคารที่ 3 มิถุนายน พ.ศ. 2551

What Punctuation Mark Are You?



You Are a Colon



You are very orderly and fact driven.

You aren't concerned much with theories or dreams... only what's true or untrue.



You are brilliant and incredibly learned. Anything you know is well researched.

You like to make lists and sort through things step by step. You aren't subject to whim or emotions.



Your friends see you as a constant source of knowledge and advice.

(But they are a little sick of you being right all of the time!)



You excel in: Leadership positions



You get along best with: The Semi-Colon

วันศุกร์ที่ 30 พฤษภาคม พ.ศ. 2551

Optimizing Treasurehunt's Question 1 (robot)

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

a=2000
b=2000

if b>a:
a, b = b, a
d=[]
for i in range(a):
d[i:]=[[]]
if i>=b:
x = b
else:
x = i
for j in range(x+1):
if (i == 0) and (j == 0):
d[i][j:] = [0]
elif (i == 0) or (j == 0):
d[i][j:] = [1]
elif i == j:
d[i][j:] = [d[i][j-1]*2]
else:
d[i][j:] = [d[i][j-1] + d[i-1][j]]
if i>0:
d[i-1]=[]

print d[a-1][b-1]


ผลการรัน โดยใช้ time จับเวลา
415828425864924998634542842325676808706232957586556725463361909680781449739748170
786476583991009842613588566821101566552449812050519515271426829403308897930154848
139000401217874574325171349240478804805012554662232593418186105627855887297242750
191258293109799452562416018445296661723328582808673234975864811354576092306731674
226129026615041968499816993517068588780940662630054770440825519413455865220243087
597454080782838938422451159980693138755678460019308423353936671267937407109197183
261946634690754460222691463521097187455850580048349711806796515481309363032514472
631419167126959879296426641287728281408263950661584874428072352076560611103304329
056994774368533971570942013663930927771345889508878174490486498112868394435125871
368770117617083125252317200772612121394477978635381281677951466408518108004063757
181565789433577065739615351320655283808516684687687348436814782925229015434783262
936635458985024720378317210338353260437300968307371995465273889042991687076670199
592582593447226951517354719649532201876810233809966157181452417833096317816478439
040563226541144136090250318325435743209975329838676879857054480550574759550296644
05427578211111064192312240045083183062752759630345186798202023360000

real 0m6.381s
user 0m5.024s
sys 0m0.076s


ลองแก้ขนาดเป็น 4000x4000 คำตอบยาวมากไม่โพสต์แล้วกัน แต่จับเวลาได้

real	0m59.338s
user 0m27.342s
sys 0m0.148s


ทั้งหมดรันบนแล็ปท็อป AMD Turion64 2.2GHz (1 core), RAM 1GB

Google Treasure Hunt

เล่นมั่ง ๆ

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

เข้าเว็บ http://treasurehunt.appspot.com/ ปุ๊บคราวนี้ได้ข้อ 3 (network) เลย ลองอันนี้ก่อนละกัน พบว่าง่ายมาก ๆ สำหรับคนที่เข้าใจเรื่อง routing table ของระบบเน็ตเวิร์คแบบ TCP/IP หลักการคือดูว่าจากต้นทางจะไปหาปลายทางต้องเดินผ่าน node ไหนบ้าง เช่นผมเริ่มจาก G ต้องไป A ก็ดูว่า ip ของ A คืออะไร แล้วดูในตารางว่า แถว G มี route ไปหา A ไหม ซึ่งดูได้จากคอลัมน์ของ routing 3 คอลัมน์แรก ถ้ามีก็ให้ไป ip นั้นเลย ถ้าไม่มี ให้ไป default route คือคอลัมน์สุดท้าย เช่นของผมไม่มีใน 3 คอลัมน์แรก ก็ให้ดู ip ในคอลัมน์สุดท้ายซึ่งบอกให้ไป ip หนึ่ง ดูในตารางพบว่าเป็นของ H ก็จดในกระดาษว่า GH แล้วก็ทำเช่นเดียวกันไปเรื่อย ๆ สุดท้ายก็พบว่าเส้นทางเดินคือ GHIJKCOLMBA ก็คือคำตอบที่ต้องส่งไป คำถามนี้ใช้เวลา 2-3 นาทีก็เสร็จ ถูกในครั้งแรกเลยด้วย

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

ตารางขนาด 1x1 หุ่นยนต์อยู่ที่ตำแหน่งเดียวกับปลายทาง คำตอบ = 0
ตารางขนาด 1x2 คำตอบ = 1
ตารางขนาด 1xn คำตอบ = 1
ตารางขนาด nx1 คำตอบ = 1 เช่นกัน

ตารางขนาด 2x2 คำตอบ = 2
ตารางขนาด 2x3, 3x2 คำตอบ = 3
ตารางขนาด 3x3 คำตอบ = 6

ไล่ต่อไปอีกหน่อย ก็เริ่มจับทางได้ว่า จำนวนวิธีการเดินของตารางขนาด mxn ก็คือ จำนวนวิธีการเดินของตารางขนาด (m-1) x n + จำนวนวิธีการเดินของตารางขนาด m x (n-1)

เขียนให้สวย ๆ ก็ได้ว่า f(m,n) = f(m-1,n) + f(m,n-1) แบบนี้มัน recursive ชัด ๆ ว่าแล้วก็จับ python มาเขียนโค้ด ได้ว่า

def r(a,b):
if (a == 1) and (b == 1):
return 0
elif (a == 1) or (b == 1):
return 1
else:
return r(a-1,b)+r(a,b-1)

m, n = 4, 5
print r(m,n)


ลองค่า m และ n น้อย ๆ ดูแล้วถูกต้องดี อืมม ไม่เลว ๆ แต่พอใส่ค่าจริง ๆ ลงไป คือ 43, 49 ปรากฏว่าเงียบไปนานมาก ดูท่าไม่ดีละ ลองลดลงเหลือ 20, 20 ก็ยังนาน เฮ่ย ไม่ธรรมดาแฮะ แสดงว่าจำนวนทางเดินมันเยอะมาก ทำ recursive ไม่ไหวแล้ว เปลี่ยนมาเป็น array ละกัน

a=43
b=49

d=[]
for i in range(a):
d[i:]=[[]]
for j in range(b):
if (i == 0) and (j == 0):
d[i][j:] = [0]
elif (i == 0) or (j == 0):
d[i][j:] = [1]
else:
d[i][j:] = [d[i][j-1] + d[i-1][j]]

print d[a-1][b-1]


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

คำถามข้อที่ 2 ให้ดาวน์โหลดไฟล์ .zip มาไฟล์หนึ่ง พร้อมโจทย์

Unzip the archive, then process the resulting files to obtain a numeric result. You'll be taking the sum of lines from files matching a certain description, and multiplying those sums together to obtain a final result. Note that files have many different extensions, like '.pdf' and '.js', but all are plain text files containing a small number of lines of text.

Sum of line 4 for all files with path or name containing stu and ending in .pdf
Sum of line 4 for all files with path or name containing zzz and ending in .js
Hint: If the requested line does not exist, do not increment the sum.

Multiply all the above sums together and enter the product below.
(Note: Answer must be an exact, decimal representation of the number.)


โอว แบบนี้ต้องเขียนโปรแกรมเท่านั้น และหนทางหาคำตอบที่ดีที่สุดคือ shell programming ครับพี่น้อง ไม่ยากเลย แต่ครั้งแรกตีโจทย์ผิด อ่านไม่ดีเอง คือคิดว่าชื่อแฟ้มมี stu และนามสกุล .pdf เท่านั้น ที่จริงแล้วในชื่อ path ก็ได้ รอบแรกผิดแค่ตรงนี้เอง

มีอีกจุดที่ต้องระวังคือ โจทย์ให้เอาบรรทัดที่ 4 มา แต่ถ้าจำนวนบรรทัดมีไม่ถึง ก็ไม่ต้องเพิ่มค่า sum ดีที่โจทย์เตือนไว้ เพราะไม่อย่างนั้น ถ้าใช้แค่ head + tail จะได้บรรทัดสุดท้ายมาเสมอ โดยอาจจะไม่ใช่บรรทัดที่ 4 ก็ได้ ผลคือได้ shell script หน้าตาอย่างนี้มา

ln1=4
st1="stu"
ext1=".pdf"

ln2=4
st2="zzz"
ext2=".js"

repeat(){
n=1
while [ ${n} -le ${1} ]; do
n=$(($n+1))
echo 0
done
}

s=0
for a in `find . | grep ${st1} | grep ${ext1}$`; do
s=$((`repeat ${ln1} | cat ${a} - | head -n ${ln1} | tail -n 1`+${s}))
done

t=0
for a in `find . | grep ${st2} | grep ${ext2}$`; do
t=$((`repeat ${ln2} | cat ${a} - | head -n ${ln2} | tail -n 1`+${t}))
done

echo "s= ${s}"
echo "t= ${t}"
echo "s*t= $((${s}*${t}))"


ซึ่งผมได้คำตอบคือ 2683982036 ส่งไปในครั้งที่สองก็ถูกต้องเรียบร้อยดี

รออาทิตย์หน้าจะมีคำถามใหม่มาอีก แต่ไม่รู้วันไหน เห็นว่าตอบถูกหมดเป็นคนแรกมีรางวัลให้ ทำอย่างไรจะได้เป็นคนแรกล่ะนี่ เอาน่าเผื่อมีรางวัลปลอบใจเป็น invite ให้ลองใช้ google app engine ก็คงจะดี

วันอังคารที่ 13 พฤษภาคม พ.ศ. 2551

Thai Font Tuning in Hardy 1

ใน Ubuntu Hardy (8.04) มีฟอนต์ไทยใหม่มาให้ใช้ 3 ตัว คือ Waree, Umpush และ Sawasdee โดยเฉพาะ Waree นั้นถูกกำหนดให้เป็นฟอนต์ปริยายแทน Loma แล้ว ดังนั้นเมื่อติดตั้งครั้งแรกจะเป็นหน้าตาฟอนต์แปลกไปไม่คุ้นตา ก็ด้วยเหตุนี้นี่เอง

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

1-default

ดูกันใกล้ ๆ

1-default-1 1-default-2

นี่คือปัญหาที่เราจะพบเมื่อติดตั้ง Hardy สังเกตว่าตัวอักษรขนาดเล็ก หัวจะหายบ้าง รูตรงหัวตันบ้าง รูปทรงผิดเพี้ยนค่อนข้างมาก ส่วนตัวอักษรที่ใหญ่ขึ้นกลับมีปัญหาที่แปลกไปอีกแบบคือเส้นที่บาง ๆ จะหายไป สังเกตตรงประโยคตัวอย่าง

ปัญหานี้เกิดจาก โดยปกติแล้ว Hardy จะกำหนดให้ใช้ font hinting แบบ native คือเป็น hint ที่ฝังมากับฟอนต์เลย เช่นฟอนต์ Bitstream Vera ซึ่งจะแสดงได้สวยงาม คมชัดไม่เบลอในทุกขนาดตัวอักษร ส่วนฟอนต์ที่ไม่มี hint จะยังคงแสดงเบลอ ๆ เหมือนเดิม แต่ฟอนต์ Waree นั้นมี hint อยู่ด้วย แต่อย่างที่ทราบการดีว่าการทำ hint ให้สมบูรณ์นั้นยากมาก ฟอนต์ Waree จึงแสดงออกมาดีที่สุดได้แบบที่เห็น

ทางแก้แบบง่ายคือ ลดระดับของ hint ลงเหลือแค่ระดับ slight หรือ "นิดหน่อย" โดยเลือกเมนู "ระบบ" --> "ปรับแต่งพื้นโต๊ะ" --> "รูปโฉม" แล้วเลือกแท็บ "แบบอักษร" แล้วคลิกปุ่ม "รายละเอียด..." จากนั้นตั้งค่า Hinting เป็น "นิดหน่อย" ตามภาพ

2-font-render-details

ผลคือ

3-screen2

3-screen2-1 3-screen2-2

การตั้งระดับ Hint เป็น slight จะทำให้การเรนเดอร์ฟอนต์เน้นที่รูปทรงของฟอนต์มากกว่าความคมชัด ทำให้เห็นได้อย่างชัดเจนว่ารูปทรงของฟอนต์ถูกต้องสวยงาม แต่ก็มีความเบลอมากเช่นกัน และยังทำให้ฟอนต์ภาษาอังกฤษเบลอไปด้วย

สำหรับท่านที่พอใจกับการตั้งฟอนต์แบบนี้ก็หยุดได้เลยครับ แต่สำหรับผมแล้ว ผมต้องการมากกว่านั้น ผมอยากให้ตัวอักษรภาษาอังกฤษชัดเท่าที่มันจะชัดได้ ในขณะที่ภาษาไทยก็ไม่เพี้ยนถึงขั้นเส้นหาย หัวหาย

ทางออกคือ libfreetype ในปัจจุบันมี autohint ซึ่งเป็นวิธีการเรนเดอร์ฟอนต์โดยไม่ต้องพึ่ง hint ที่มาในตัวฟอนต์เอง แต่จะสร้าง hint อัตโนมัติ ซึ่งตัวหลัง ๆ นี่มันทำได้ดีมาก ๆ แต่เราจะใช้ autohint เฉพาะกับฟอนต์ที่เราต้องการ ในที่นี้คือฟอนต์ภาษาไทยเท่านั้น ฟอนต์ที่มี native hint ดี ๆ อย่าง Bitstream Vera เราจะไม่แตะ จะใช้ native hint เหมือนเดิม

ขั้นแรก สร้างแฟ้ม .fonts.conf ไว้ที่ home ของท่านเองโดยให้มีเนื้อหาดังนี้

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<match target="font">
<test name="family">
<string>Loma</string>
<string>Garuda</string>
<string>Norasi</string>
<string>Kinari</string>
<string>Purisa</string>
<string>TlwgMono</string>
<string>TlwgTypewriter</string>
<string>Waree</string>
<string>Umpush</string>
<string>Sawasdee</string>
</test>
<edit name="autohint" mode="assign"><bool>true</bool></edit>
</match>
</fontconfig>


จากนั้นให้ล็อกเอาท์ออกจากระบบ แล้วล็อกอินเข้ามาใหม่ แล้วตั้งค่าฟอนต์ให้เป็นตามภาพนี้

4-font-render-details-full

ผลลัพธ์สุดท้าย

5-screen3

5-screen3-1 5-screen3-2

จะเห็นว่าตัวอักษรภาษาอังกฤษมีความคมชัดเป็นปกติ ส่วนตัวไทยนั้นมีหัวหาง เส้นต่าง ๆ ครบถ้วน อ่านได้ชัดเจนดี มีเพี้ยนบ้างแต่น้อยมาก ๆ

เป็นอย่างไรครับ เห็นความงามของฟอนต์ Waree หรือยัง

วันเสาร์ที่ 26 เมษายน พ.ศ. 2551

เรื่องควรรู้ก่อนลง/อัพเกรดเป็น Hardy Heron

เมื่อวาน Ubuntu 8.04 Hardy Heron ออกอย่างเป็นทางการช่วงเย็น ๆ ในประเทศไทย ซึ่งอันที่จริง ผมก็ได้เอามาติดตั้งใช้งานจริง ตั้งแต่ออกเบต้าแล้ว และอัพเกรดมาเรื่อย ๆ

มีสิ่งที่คาดหวังไว้จำนวนหนึ่งกับ Hardy แต่ยังพบว่ายังไม่พร้อม อันเนื่องจาก Ubuntu กำหนดการออกรุ่นไว้ตามเวลาเป๊ะ ๆ ต่างจาก Debian ที่ออกเมื่อพร้อม จึงเป็นเรื่องปกติที่ Ubuntu รุ่น release อาจจะไม่ได้ทำงานได้ตามที่คาดหวังเสมอไป จึงขอเอาประสบการณ์ที่พบมาเล่าให้ฟัง
  1. Firefox รุ่นนี้ตั้งธงว่าจะใช้ Firefox 3.0 แต่ก็มีความล่าช้าที่โครงการ Mozilla เองซึ่งในที่สุดแล้วก็เสร็จไม่ทันแน่แล้ว ล่าสุด Firefox 3.0 กำหนดออกประมาณ มิ.ย. 51 ใน Hardy ตั้งใจจะใส่รุ่น 3.0pre แต่ก็ไม่ทัน ดังนั้นรุ่นที่ติดตั้งไปพร้อม Hardy คือ 3.0b5 ซึ่ง บอกตามตรงว่ายังไม่เสถียรพอ ใช้งานปกติ ยังมี crash ให้เห็นเป็นพัก ๆ วันละ 3-5 ครั้ง บางวันต้องถอยไปใช้ firefox-2 แทน แต่ก็อึดอัดกับข้อจำกัดบางอย่าง
    ทางออกทาง Hardy จะอัพเกรด Firefox ให้เรื่อย ๆ จนกระทั่งเป็น 3.0 ตัวเต็ม และอัพเกรด minor release ไปเรื่อย ๆ แต่นั่นก็ใช้เวลา อย่างเร็วก็รอรุ่น 3.0pre ซึ่งคงดีกว่านี้พอสมควร แต่ถ้าไม่ไหวจริง ๆ ก็ให้ติดตั้ง firefox-2 ใช้งานไปก่อนได้ ซึ่งเสถียรดีมาก ๆ
  2. Network Manager 0.6.6 ผมเจอปัญหาอันหนึ่งคือ ถ้าต่อเน็ตด้วย ppp ผ่านโทรศัพท์มือถือที่มี EDGE ไม่ว่าจะหมุนเองด้วยคำสั่ง pppd หรือผ่าน network manager applet สถานะของ network จะยังแสดงเป็น offline อยู่ ซึ่งคุณสมบัติหนึ่งของ network manager คือมันใช้ dbus ในการสื่อสารกับโปรแกรมอื่น ๆ ได้ ปัญหาคือ Firefox 3.0 ดันฉลาดเกิน ขอเช็คสถานะเน็ตเวิร์คกับ network manager ผ่านทาง dbus ทุกครั้งที่เปิดโปรแกรม ถ้าเน็ตเวิร์คไม่พร้อม มันจะปรับไปโหมด offline ให้อัตโนมัติ ทีนี้พอใช้ ppp ต่อเน็ต ก็ต้องคอยยกเลิก offline ทุกครั้งไป
    ปัญหานี้ Firefox ไม่รับว่าเป็นบั๊ก แต่โยนไปที่ network manager แทน ซึ่งการขยายขอบเขตการจัดการเน็ตเวิร์คไปถึง ppp นั้น จะอยู่ในแผนของรุ่น 0.7 ซึ่งก็ออกล่าช้าเช่นกัน คนพัฒนาอยู่ Red Hat ซึ่งจะออกมาให้ใช้ทัน Fedora 9 แต่กลับไม่ทันใช้ใน Hardy
    ทางออก มีวิธีเลี่ยงปัญหา โดยยกเลิกการ roaming การใช้ Lan แบบสาย แล้วตั้งให้ใช้ Lan แบบ manual ด้วย dhcp จะทำให้ network manager ไม่มีสถานะ offline อีกต่อไป (ผมใช้วิธีนี้อยู่) ส่วน network manager 0.7 จะไม่ถูกอัพเดทใน Hardy แต่คนดูแลแพกเกจรับรองว่า เมื่อรุ่น 0.7 ออก จะเตรียมไว้ให้ใช้ใน backports
  3. F-Spot ถูกใช้เป็นโปรแกรมหลักสำหรับจัดการรูปภาพในเครื่อง f-spot มีคุณสมบัติเด่น ๆ เรื่องการอัพโหลดรูปภาพไปยังบริการเก็บภาพบนอินเทอร์เน็ตหลายตัวเช่น flickr, picasaweb, gallery และอื่น ๆ อีก จำไม่ได้ละ ในด้านการใช้งานนั้น ดูจงใจให้เหมือน iPhotos ของ Mac ซึ่งก็ทำได้ดีทีเดียว แต่ปัญหาคือยังขาดคุณสมบัติอื่น ๆ ที่เคยมีใน gthumb ที่เป็นตัวหลักใน Ubuntu รุ่นก่อน ๆ เช่นการบราวซ์ดูภาพในโฟลเดอร์ที่ยังดูอืด ๆ แถมมันไม่เรียงลำดับมาให้ และเลือกให้เรียงไม่ได้ด้วย ทำให้เกือบจะไร้ประโยชน์ไปเลยทีเดียว ไม่มีการ prefetch ภาพต่อไปไว้ล่วงหน้า ทำให้ตอนดูภาพต่อไปต้องรอมันประมวลผลสักแป๊บนึงก่อน
    ทางออก ติดตั้งโปรแกรมตัวเก่งอย่าง gthumb หรือ gqview เถอะครับ สำหรับคนที่ชอบจัดภาพไว้ใน directory ด้วยตัวเองอย่างผม แล้วจะพบว่ามันสะดวกขึ้นเยอะเลย โดยส่วนตัวชอบ gqview มากกว่า เพราะเล็กและเร็วดี

วันพฤหัสบดีที่ 17 เมษายน พ.ศ. 2551

Suspend/Hibernate with ATI proprietary driver on Ubuntu Gutsy/Hardy

แล็ปท็อปที่ใช้อยู่นี้ ใช้ชิปแสดงผลเป็น ATI Radeon Xpress 200M ตอนที่ใช้ Ubuntu 7.04 (Feisty) นั้น สามารถ suspend/hibernate ได้ทันทีโดยไม่ต้องตั้งค่าอะไรเพิ่มเติม น่าประทับใจมาก แต่ไปเสียตรงเรื่อง driver ของ wireless ที่ผมใช้นั้นยังไม่เก่ง ตอนนั้นต้องหันไปพึ่ง wifi-radar แทน NetworkManager (บล็อกเก่า) พออัพเกรดมาเป็น 7.10 (Gutsy) ปัญหาเรื่อง wireless + NetworkManager หมดไป แต่มาตายเอาตรง suspend/hibernate กลับไม่ทำงาน คือจริง ๆ แล้วมัน suspend/hibernate ได้ แต่พอเรียกกลับมาก มันค้างไปเลย หน้าจอดำสนิท ต้องปิดแล้วเปิดใหม่เท่านั้น

ตอนแรกไม่รู้วิธีแก้ เลยต้องปิดฟังก์ชันการ supend และ hibernate ไป และต้องปิดเครื่องทุกครั้งที่ไม่ได้ใช้งาน ซึ่งไม่สะดวกเอามาก ๆ

เมื่อราว ๆ 15 ก.พ. 51 เลยลองหาวิธีแก้ดูซักตั้ง มั่ว ๆ ดูใน /etc/default/acpi-support แล้วสำเร็จ แต่ยังไม่ชัดเจนนักว่าเพราะคอนฟิกบรรทัดไหนแน่ หรือรวม ๆ กัน

คราวนี้มาติดตั้ง 8.04 (Hardy) ก็พบปัญหาเดิมอีก วันนี้เลยมาลองค้นหาข้อมูลในเน็ตดูอีกที พบอันนี้เข้า http://wiki.cchtml.com/index.php/Ubuntu_Gutsy_Installation_Guide#Suspend.2FHibernation_work_with_7.12 ตรง ๆ เลย ทำตามแล้วได้ทันที สรุปว่าให้แก้แฟ้ม /etc/default/acpi-support ดังนี้

SAVE_VBE_STATE=false
POST_VIDEO=false

ซึ่งเดิมมันเป็น true ทั้งคู่ แล้ว reboot เครื่อง หรือ sudo /etc/init.d/acpi-support restart ต่อไปก็ใช้ได้เลย

สำหรับผู้ที่ใช้ Gutsy ต้องติดตั้ง radeontool เพิ่มด้วยนะครับ ส่วนใน Hardy นั้นติดตั้งมาพร้อมแล้ว


วันอาทิตย์ที่ 13 เมษายน พ.ศ. 2551

My History

kamthorn@atec:~$ history|awk '{a[$2]++} END{for(i in a){printf "%5d\t%s\n",a[i],i}}'|sort -rn|head
122 ls
70 cd
59 sudo
21 ps
19 ssh
13 wget
13 find
13 aptitude
12 pppd
11 dpkg


เอามั่ง ตาม pphetra

วันอังคารที่ 25 มีนาคม พ.ศ. 2551

Ubuntu 8.04 จะเตือนเมื่อพบ virus ใน usbdrive

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

วิธีที่ผมใช้แก้ปัญหาการถูกกล่าวหาว่าเป็นพาหะคือ format usbdrive ใหม่เป็น ext3 ซะ ไม่ต้องใช้กับเครื่องที่เป็นวินโดวส์ จบ เหลือตัวเก่า 256M ไว้เป็น vfat ซึ่งก็ต้องคอยเช็คบ่อย ๆ ว่ามีไฟล์ autorun.inf โผล่มาหรือเปล่า

วันนี้เอาไดรฟ์ 256M ตัวที่ว่านี่ไปเสียบเครื่องที่เป็น Ubuntu 8.04 มันก็มีข้อความขึ้นเตือนทำนองว่าไดรฟ์เรามี autorun.inf ที่จะไปรันโปรแกรมบางตัวขึ้นมาทำงาน ซึ่งอาจจะเป็นไวรัสหรือโทรจันได้ เลยแปลกใจว่า 1) เอ่อ ไปติดมาตอนไหนอีกแล้วนี่ และ 2) เฮ่ย เดี๋ยวนี้ Nautilus มันเจ๋งแฮะ เตือนแบบนี้ได้ด้วย นั่นแปลว่า ต่อไปนี้ผู้ใช้ลินุกซ์ก็จะไม่ถูกกล่าวหาว่าเป็นพาหะนำไวรัสคอมพิวเตอร์อีกต่อไป

trojan-detected-1.png

ข้อความที่แสดงเมื่อพบแฟ้มผิดปกติ จริง ๆ linux มันไม่รัน autorun.inf อยู่แล้วนิ (หรือรัน?) แต่ก็ดีแล้วเพราะจะได้รู้ว่ามีไวรัส

virus files

แฟ้มแปลกปลอมที่โผล่มา ตัวนี้เจอบ่อย สงสัยติดมาจากร้านที่ไปอัดรูป

trojan-detected-2.png

ตอน browse ก็ยังมีเตือนตรงส่วนบนแบบนี้ด้วย

ปล. ณ ตอนนี้ผมยังไม่ได้ดูว่าฟีเจอร์นี้ใช่ฟีเจอร์หนึ่งที่จะมาพร้อมกับ Gnome 2.22 หรือเปล่านะครับ

วันพฤหัสบดีที่ 20 มีนาคม พ.ศ. 2551

Installing Ubuntu 8.04 20080318.1 (hardy)

ขณะที่กำลังเขียนนี้ กำลังติดตั้ง Ubuntu 8.04 20080318.1 อยู่ครับ โดยติดตั้งลงอีกพาร์ทิชัน แต่ติดตั้งตัว 32bit ไปก่อน ไว้ออกตัวจริง ค่อยอัปเกรด 7.04 64bit เป็นตัวเต็มแล้วกัน ระหว่างรอเลยมานั่ง blog ที่เครื่องคนอื่นไปพลาง

พาร์ทิชันที่ติดตั้งนั้น เดิมเป็นพาร์ทิชันวินโดวส์ XP 64bit รุ่นทดลอง ขอไลเซนส์ได้จาก Microsoft ครับ ดาวน์โหลดฟรี ใช้ได้ประมาณ 4 เดือนมั๊ง ตอนนั้นเอามาลงเพราะพึ่งได้โน๊ตบุ๊คตัวนี้มาใหม่ ๆ เป็น AMD64 เลยบ้าหาอะไรที่เป็น 64bit มาลง ทั้ง Windowx XP x64 และ Ubuntu for amd64 ซึ่งจริง ๆ ก็ไม่ค่อยได้บูตเข้ามาใช้เท่าไหร่ พอไม่ค่อยได้บูตเข้าวินโดวส์ทำให้ทุกครั้งที่เข้า จะน่าเบื่อมาก เพราะมันจะต้องมีอะไรมาอัปเดตเยอะแยะไปหมดสิน่า ทั้งข้อมูลไวรัส ทั้งอัปเดตจากไมโครซอฟท์เอง สุดท้ายก็ปล่อยให้ไลเซนส์หมดอายุไป ทิ้งพาร์ทิชันขนาด 30G ไว้ไม่ได้ใช้งานมาตั้งนาน

ตอนแรกไม่ได้คิดว่าจะเอามาลงเร็วขนาดนี้ แต่วันนี้เจอปัญหาใน Ubuntu ตัวเดิม เหมือนจะมีโปรแกรมบางตัว หรืออาจจะ kernel เอง ที่ถือครองหน่วยความจำเยอะเกินไป แบบบูตมาปุ๊บ RAM หายไป 700 กว่าเม็ก ซึ่งปกติมันจะใช้ประมาณ 300MB เมื่อบูตเสร็จ (แรม 1GB ครับ) แล้ว swap ก็จะทำงานตลอด ทำอะไรไม่ได้นอกจากบูตใหม่ อาการนี้จะเป็นบ่อย ถ้าปล่อยให้ notebook เข้าสู่ sleep mode อีกประการคือรู้สึกว่า Ubuntu 7.10 มันช้ากว่ารุ่นก่อน ๆ นี้อย่างเห็นได้ชัด ไม่ได้คิดไปเอง แต่ MrChoke ก็รู้สึกแบบเดียวกัน วันนี้ MrChoke ลง Debian (Lenny) บอกว่าเร็วกว่าเห็น ๆ (ชักติดใจละสิ) ประการสุดท้ายคือ Ubuntu รุ่นนี้ใกล้เป็นเบต้าแล้ว คิดว่าน่าจะเสถียรพอ อย่างน้อยเอามาใช้งานจริง เพื่อช่วยกันหาบั๊กก่อนจะออกตัวเต็ม

ตอนนี้ติดตั้งใกล้เสร็จแล้ว ไว้ลองเล่นแล้วคงมีอะไรมาเล่าเพิ่มเติมครับ

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

Google Reader Shared Items + ReadBurner

เมื่อวานอ่าน feed เจอว่า Alexander Marktl ผู้พัฒนาเว็บไซต์ readburner.com ประกาศยุติเว็บไซต์แล้ว ทั้ง ๆ ที่เพิ่งเปิดมาได้เพียง 2 เดือน เสียดายมาก ๆ เห็นว่า Marktl ไม่สามารถเจียดเวลามาดูแลได้ เนื่องจากเป็นเพียงงานที่ทำในเวลาว่าง ที่จริง ตอนที่รู้จัก ReadBurner ครั้งแรก (ผ่าน lifehacker.com) ก็ตั้งใจว่าจะเขียนถึงสักครั้งหนึ่ง เนื่องจากเป็นไอเดียใหม่ที่เจ๋งมาก ก็ขอใช้โอกาสนี้กล่าวถึงละกัน

ราว ๆ ปลายปี 2550 Google Reader มีฟีเจอร์ใหม่ ให้ผู้ใช้สามารถ share feed item กันได้ คือชอบ feed item ไหน อยากให้เพื่อนรู้ด้วย ก็คลิก share ได้เลย เพื่อน ๆ ใน gtalk ของเรา ที่ใช้ Google Reader เหมือนกัน ก็จะเห็น item ที่เพื่อนคนอื่น share ไว้ แบบนี้

Google Reader Shared Items

ผลคือการอ่าน feed สนุกขึ้นมาก เพราะอย่างที่รู้ ๆ กันว่า feed วันนึง ๆ มี item เยอะมาก และบางอันที่น่าสนใจเราดันไม่ได้ subscribe ไว้อีก แต่เพื่อน ๆ เราอาจจะมี ก็ได้มา share ให้เราอ่านด้วย feed item ที่ถูก share ผมก็จะอ่านก่อน เพราะถ้าเขา share มาแปลว่ามันน่าสนใจจริง ๆ ก็ทำให้ประหยัดเวลาไปได้พอสมควร ส่วนคนที่ไม่ได้ add เป็นเพื่อนไว้ ถ้าเค้ามี shared item url ก็สามารถเอามา subscribe ไว้อ่านได้

เช่นของผมเข้าไปดูได้ที่ http://www.google.com/reader/shared/06070222257138471631 หรือถ้าต้องการสมัคร feed ไว้อ่านใน Google Reader ก็มีลิงก์ให้ในหน้านี้

การอ่าน feed บน Google Reader เลยกลายเป็น Social Network อีกแบบ

ReadBurner จับเอาฟีเจอร์การ share ของ Google Reader มาเล่น โดยเสนอให้ผู้ใช้ Google Reader เอา share url มาใส่ในเว็บ โดยไม่ต้องสมัครสมาชิก จากนั้น ReadBurner จะคอยตรวจสอบดูว่า feed ไหนที่เป็นที่นิยมในแต่ละวัน หรือสัปดาห์ โดยดูจากจำนวนการ share เท่านั้น ไม่ต้องโหวตแบบ digg ซึ่งเป็นลูกเล่นที่เจ๋งมาก ผู้ใช้แค่อ่าน feed และ share อันที่ตัวเองชอบ เท่านั้นก็เป็นการโหวต feed ยอดนิยมได้ทันทีโดยอัตโนมัติ ซึ่งแนวคิดแบบ FeedBurner ก็ถูกลอกเลียนอย่างรวดเร็ว เช่น Shared Reader หรือ RSSMeme แต่ในความคิดของผม คิดว่าไม่มีอันไหนสู้ ReadBurner ต้นตำรับได้

หลังจากประกาศยุติ ReadBurner แล้ว Marktl ก็แนะนำว่าถ้าชอบไอเดียของ ReadBurner ก็ให้ลองเปลี่ยนไปใช้ RSSMeme (developed by Benjamin Golub) ซึ่งเป็น clone ของ ReadBurner ที่เขาคิดว่าดีที่สุด ซึ่งผมก็ได้ไปลองดูแล้ว ถือว่า ok ละ แต่อันนี้มาแปลกหน่อย คือนอกจากจะไม่มีการสมัครสมาชิกเหมือนกับ ReadBurner แล้ว ก็ยังไม่มีช่องให้เพิ่ม feed ด้วย แต่ค้นดูแล้วปรากฎว่ามัน add shared items ของผมไว้เรียบร้อยแล้ว ไม่รู้มาได้ไงเหมือนกัน อาจจะเพราะเคยเพิ่มไว้ใน ReadBurner มาก่อน ประเด็นการไม่ให้เพิ่ม feed นี้ก็เคยคิดเหมือนกันว่า กรณี ReadBurner ให้ใครก็ได้ เพิ่ม feed เข้าไปในระบบได้เอง อาจจะทำให้เกิดการสร้าง account ใน google reader หลอก ๆ มาปั่นคะแนนความนิยมก็ได้ ในกรณีของ RSSMeme ถ้าไม่พบชื่อตัวเองในระบบ ก็ให้เมลไปแจ้งเขาได้ โดยส่ง shared items url ไป

ส่วนโดเมน readburner.com และเทคโนโลยีที่ Marktl คิดค้นพัฒนาขึ้นเค้าก็ประกาศขายแล้วครับ คงรอดูกันต่อไปว่า จะมีใครซื้อทั้งสองอย่างนี้ไปดำเนินการต่อหรือเปล่า ขอให้มีเถอะ ถ้าหายไปเฉย ๆ นี่เสียดายมาก

วันอาทิตย์ที่ 24 กุมภาพันธ์ พ.ศ. 2551

เย! ใช้ Compiz ได้แล้ว

เรื่องมันมีอยู่ว่า แล็ปท็อปที่ใช้อยู่ประจำนี้ ใช้ชิปกราฟิกของ ATI รุ่น Radeon Xpress 200M ซึ่งเดิมไม่สามารถใช้ compiz ได้เพราะไดรเวอร์ ไม่ว่าจะเป็นตัวที่เป็นโอเพนซอร์ส หรือ restricted ไม่สามารถใช้ AIGLX ได้ ต่อมาเมื่อ ATI ออกไดรเวอร์ใหม่ที่สนับสนุน AIGLX แล้ว แต่ผมกลับไม่สามารถรัน compiz ได้อยู่ดี ทีแรกเข้าใจว่าไดรเวอร์อาจจะไม่สมบูรณ์ โดยเฉพาะกับชิปรุ่นนี้ ซึ่งถือว่าเป็นรุ่นล่าง ๆ เลยทีเดียว เมื่อหาใน google พบว่ามีบางคนพบปัญหาแบบเดียวกัน error คล้าย ๆ กันโดยไม่รู้สาเหตุ แต่ที่น่าแปลกคือ เป็นส่วนน้อยมาก ๆ

วันนี้มานึก ๆ ทบทวนดูอีกที Ubuntu 7.10 ที่ใช้อยู่ทุกวันนี้ มันถูกอัพเกรดมาจากรุ่น 6.10 ซึ่งเป็นรุ่นที่ติดตั้งเป็นครั้งแรกสำหรับเครื่องนี้ จากนั้นไม่เคยติดตั้งใหม่เลย มีแต่ dist-upgrade มาตลอด เช่นจาก 6.10 มาเป็น 7.04 แล้วก็เป็น 7.10 โดยไม่เคยอัพเกรดใหญ่ผ่าน update-manager เลยสักครั้ง ซึ่งความต่างคือ การอัพเกรดด้วย aptitude dist-upgrade นั้นมีความเป็นไปได้ ที่จะติดตั้งแพกเกจสำคัญสำหรับรุ่นใหม่นั้นไม่ครบ ว่าแล้วก็ aptitude search compiz พบว่า เราติดตั้งไปเฉพาะ compiz-core ตัวเดียวเอง???

ลองติดตั้งส่วนอื่น ๆ เพิ่มสิ โดยสั่ง aptitude install compiz compiz-fusion-plugins-extra compiz-gnome compizconfig-settings-manager จากนั้นก็ลองรัน compiz --replace ดู อ้าวเฮ้ย ใช้ได้แล้ว

screenshot

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

วันจันทร์ที่ 28 มกราคม พ.ศ. 2551

BarCamp Bangkok Winter 2008

รายงานมั่ง

ก่อนอื่น ภาพที่ผมถ่ายอยู่ที่นี่ Flickr

งานนี้ก็ตั้งใจไปสังเกตการณ์ + ถ่ายรูป แหมครั้งแรกในประเทศไทยพลาดได้ไง และก็กะไปฟังเนื้อหาต่าง ๆ ด้วย ซึ่งก็เกินคาด เพราะเรื่องน่าสนใจเยอะมาก ๆ เล่นเอาลืมถ่ายรูปไปหลาย shot

จริง ๆ เตรียมไปพูดด้วย แต่ไปสายเอง แต่ไม่เป็นไร เพราะดูเนื้อหาคนอื่น ๆ แล้ว แปะหัวข้อไปก็คงอกหักเหมือนหลาย ๆ คน คราวนี้รู้ละ คราวหน้าต้องเตรียมหัวข้อดี ๆ สงสัยต้องโปรโมทล่วงหน้าด้วย :-P

xIMG_6137.JPG

เนื่องจากไปสาย ถึงตอน 10.30 เพราะรถติดเอามาก ตั้งแต่รังสิต ยันแยกรัชวิภา

xIMG_6140.JPG

ลงชื่อแล้วโหวตได้ 3 หัวข้อก็หมดเวลาโหวตแล้ว

xIMG_6141.JPG

คนเยอะมาก ๆ

xIMG_6142.JPG

เลือกหัวข้อไม่ถูก

xIMG_6144.JPG

เข้าฟัง lightning talk (พรีเซนต์แบบสายฟ้าแลบ) เริ่มรู้สึกเหมือนโดนหมัดแย๊บ มึนนิด ๆ

xIMG_6145.JPG

แล้วก็ขึ้นไปดูข้างบน ตอนแรกฟังเรื่อง command line เบา ๆ สบาย ๆ ได้ trick มาอันสองอัน จริง ๆ ใช้ command line ประจำอยู่แล้ว เป็นแฟน bash อยู่ครับ

SSH

ฟังได้แป๊บนึง ก็ย้ายไปฟัง SSH ไม่ค่อยเครียด เพราะอันนี้ก็ใช้ประจำเหมือนกัน โดยเฉพาะ -D นี่ใช้บ่อย ไว้ใช้เข้า youtube อยู่พักนึง เสียดายสองหัวข้อนี้น่าจะอยู่ห้องเดียวกัน ไม่น่าทับเวลากันเลย

Twitter xIMG_6151.JPG

ต่อด้วย twitter ของคุณสุกรี สงสัยอยู่เหมือนกันว่าเบื้องหลังของ twitter นั้นทำได้อย่างไร เนื้อหาเบา ๆ มีสาระ สลับเสียงฮา งานนี้คาดว่าได้ผู้ใช้ twitter เพิ่มอีกหลายคน

Web Accessibility xIMG_6156.JPG xIMG_6157.JPG

ย้ายมาต่อ session ข้าง ๆ เรื่อง Web Accessibility โดยคุณปกป้อง เนื้อหาเข้มข้นจริงจังขึ้น มีคนแลกเปลี่ยนความคิดเห็นกันหลากหลายดี งานนี้ เว็บไซต์ภาครัฐ รับไปเต็ม ๆ

xIMG_6158.JPG

อ้าว พี่โดมก็มา มาสายซะ อดพูดอีกคน พี่โบกมือภาพเบลอเลยอ่ะ มาเห็นทีหลัง โทษทีครับ

Lunch Time

lunch session

หลังอาหารเที่ยง ฟัง Drupal + CCK + View อ้าว ลืมถ่ายรูป ฟังเพลิน

Ubuntu 8.04 preview

ต่อด้วย Ubuntu 8.04 preview โดยน้องจาก ubuntuclub พอดีเลย ยังไม่ได้ตามว่ารุ่นหน้ามีอะไรใหม่ แต่คิดว่ารอมันออกก่อนแล้วกัน ช่วงนี้ไม่มีเวลาเล่น ใช้ 7.10 ต่อไป

AV Development Life Cycle 10 steps to be "that guy"

ลงมาข้างล่าง เฮ่ย ทำไมคนเยอะงี้ อ้าวเรื่อง AV Development Life Cycle งานนี้ฮากัน 90% สาระ 10% (มากกว่าที่คาด) มีการเก็บคุณสุกรีไว้เดี่ยวมุกปิดท้ายด้วย มีประเด็นให้คิดต่อกันหลายอย่างเหมือนกัน คิดว่างานนี้มีภาคต่อแน่

xIMG_6173.JPG

กลับขึ้นมาข้างบน ห้องนี้เรื่องอะไรหว่า? ไม่ได้ฟัง

xIMG_6175.JPG xIMG_6176.JPG xIMG_6178.JPG

Tsung มีคนสนใจเยอะ ไม่แน่ใจเพราะเนื้อหา หรือคนบรรยาย :-P

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

สรุป เป็นงานที่มีลักษณะพิเศษ คนเข้าร่วมคือคนจัดงาน เป็นวิทยากรด้วย (ถ้ามีคนโหวตให้) จัดกันง่าย ๆ ไม่ต้องเตรียมมาก จริง ๆ staffs เหนื่อยเยอะ คนมาแค่เตรียมเรื่องมาพูด ถ้าจะพูดนะ แล้วมาเลย อยากพูดไทยก็พูด พูดอังกฤษได้ก็ยิ่งดี ตอนแรกยังกลัวว่าจะไม่มีคนเสนอตัวมากนัก แต่ผิดคาด เตรียมกันมาพูดเยอะมาก อกหักไปหลายคน แต่ก็ไม่เป็นไร ได้มาร่วมก็ดีใจแล้ว

ได้รู้จักคนอีกหลายคน จำไม่ค่อยเก่งแฮะ ยังไงงานหน้าเจอกันอีกก็ทักกันได้ เป็นงานที่รวม geek ในไทยไว้เยอะสุดแล้วมั๊ง

สิ่งที่ได้เรียนรู้ สำหรับงานครั้งหน้า

  1. อยากพูด ต้องเตรียมเนื้อหาที่น่าสนใจ หัวข้อชัดเจน

  2. ห้องหมายเลข 4 นี่ ครั้งหน้าขอเผื่อไว้อีกนะครับ :-D

  3. อย่ามาสาย

  4. อย่าลืมถ่ายรูป schedule ของแต่ละห้องมาด้วย (คราวนี้ลืมสนิท)

  5. รูปบน flickr มีคนคลิกเข้าไปดูภาพที่ถ่ายหลาย ๆ คน เช่นคนฟัง เยอะมาก พบว่าเป็นเพราะหลายคนอยากรู้ว่าจะมีรูปตัวเองในนั้นหรือไม่ (เอ่อ ผมก็หาเหมือนกัน เจอ 3-4 ภาพละ :-D) ดังนั้นอย่าถ่ายแต่ผู้บรรยาย หมั่นถ่ายผู้ฟัง หรือกิจกรรมอื่น ๆ รอบ ๆ ด้วย มีคนรอชมภาพพวกนั้นอยู่

  6. อยากได้ EF-S 17-55mm f/2.8 IS USM อิ ๆ (ฝันป๊าย อย่างมากก็ Tamron 18-50mm f/2.8 ละมัง)

  7. อย่าลืมดูว่ามีของแจกอะไรบ้าง หยิบติดไม้ติดมือกลับมาบ้างก็ดี (ครั้งนี้ลืมง่ะ เสียดาย)

  8. อย่าลืมถ่ายพวก symbol ต่าง ๆ ของงานด้วย เช่นป้าย เสื้อ ของที่ระลึก สาว ๆ ด้วย (ลืมสนิทอีก)

วันพฤหัสบดีที่ 13 กันยายน พ.ศ. 2550

drupal+debian กับปัญหาตาราง sessions โตขึ้นเรื่อยๆ

ที่เว็บไซต์ opentle.org ใช้ drupal กับ community ขนาดใหญ่พอสมควร ส่วน OS เปลี่ยนจากเดิมใช้ FreeBSD 6.2 มาเป็น debian 4.0 (etch) ได้สัก 9 เดือนเศษละ มีข้อสังเกตว่า ตั้งแต่เปลี่ยนเป็น debian ตาราง sessions ใหญ่ขึ้นเรื่อยๆ จนเป็นนับล้านเรคอร์ดในเวลาไม่กี่เดือน ทั้งๆ ที่ session.gc_maxlifetime ก็ตั้งไว้ราวๆ 24 วัน ต้องคอยล้างทิ้งเป็นระยะๆ ทีแรกนึกไม่ออกว่าเกิดจากอะไร ดูที่เว็บไซต์อื่นๆ ก็มีทั้งเป็นบ้าง ไม่เป็นบ้าง แต่ส่วนใหญ่ไม่รู้ว่ามีปัญหานี้ เพราะ session มีน้อย จนไม่รู้สึกอะไร ขณะที่ opentle นั้น แค่เดือนเดียวก็เห็นได้ชัดว่าตารางมันใหญ่ขึ้น

เดิมที่ไล่แกะดูการทำงานของตารางนี้คือ ปกติ php จะจัดการ session ด้วยตัวเอง ซึ่งจะสร้างเป็นแฟ้ม session ไว้ใน /var/lib/php5/ แต่ใน drupal จะจัดการ session ด้วยฐานข้อมูล คือเก็บลงตาราง sessions แล้วเขียน function มา handle ซึ่งดูรายละเอียดฟังก์ชันเหล่านี้ได้จาก includes/session.inc และกำหนดให้ใช้ฟังก์ชันเหล่านี้ในการจัดการ session ใน includes/bootstrap.inc ซึ่งก็ดูปกติดี โดยเฉพาะตรงฟังก์ชัน sess_gc() ซึ่งมีไว้เคลียร์ session ที่อายุเกิน maxlifetime ทิ้ง โดยการลบ record ทิ้งด้วยเงื่อนไข ก็ดูเรียบร้อยดี

วันนี้อยากเคลียร์ปัญหานี้ให้จบเลยแกะดูการทำงานต่อ เริ่มจากตรวจล็อกของ mysql พบว่า ไม่เคยมีคำสั่ง "DELETE FROM sessions ...." ถูกรันเลย แปลว่า sess_gc() ไม่เคยถูกเรียกใช้จาก php เลย คำถามจึงมีอยู่ว่า เมื่อไหร่ที่ php จะเรียกใช้ sess_gc() ทำให้ต้องย้อนไปแกะดูใหม่

เปิดดู php.ini อีกครั้ง (ก่อนนี้ก็เคยแกะดูแล้ว แต่ไม่พบอะไรผิดปกติ) คราวนี้เน้นไปที่เรื่อง gc ก็พบตรงนี้เข้า

; Define the probability that the 'garbage collection' process is started
; on every session initialization.
; The probability is calculated by using gc_probability/gc_divisor,
; e.g. 1/100 means there is a 1% chance that the GC process starts
; on each request.

; This is disabled in the Debian packages, due to the strict permissions
; on /var/lib/php5. Instead of setting this here, see the cronjob at
; /etc/cron.d/php5, which uses the session.gc_maxlifetime setting below
;session.gc_probability = 0
session.gc_divisor = 100

นั่นคือ ปกติ session.gc_probability = 1 จะทำให้ทุกครั้งที่ php ทำงาน จะมีโอกาส 1/100 ที่ gc ทำงาน หรือพอจะตีความว่า รัน php 100 ครั้ง gc จะถูกเรียก 1 ครั้งก็พอได้ แต่ใน debian ไม่ใช่อย่างนั้น debian จะ comment ค่านี้ไว้ ทำให้มีค่าเป็น 0 เสมอ gc จะไม่ถูกเรียกใช้งาน แต่จะมี cron สำหรับลบ session ที่หมดอายุแทน เหตุผลก็อธิบายไว้ใน comment แล้ว

ตรงนี้แหละคือปัญหา เพราะนั่นเท่ากับว่า sess_gc() ที่ drupal เตรียมไว้ให้ php เรียกใช้ จะไม่ถูกเรียกใช้เลย นั่นคือสาเหตุที่ opentle.org มีปัญหาดังกล่าว

การแก้ปัญหา


การแก้ไฟล์ php.ini ไม่ใช่ทางออกที่ดี ควรแก้ใน drupal ในไฟล์ sites/default/settings.php แทน โดยเพิ่ม

ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 100);

เข้าไป เท่านี้ก็เรียบร้อย ทิ้งไว้สักพัก session ก็ถูกจัดการได้ถูกต้องตามปกติแล้ว

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

ลอง minefield 3.0a8pre บน Fedora 7.90

ตั้งแต่มีข่าวว่า minefield 3.0a8pre สนับสนุนการตัดคำบนแพลตฟอร์มต่าง ได้แก่ Linux, Windows และ Macintosh เลยอยากลองบน Fedora บ้าง เพราะตอนนี้กำลังรำคาญเวลาเปิดเว็บภาษาไทย แล้วบน Fedora ยังไม่ตัดคำ

วิธีติดตั้ง

$ su -
# cd /opt
# wget http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/latest-trunk/firefox-3.0a8pre.en-US.linux-i686.tar.bz2
# tar xjvf firefox-3.0a8pre.en-US.linux-i686.tar.bz2
# rm firefox-3.0a8pre.en-US.linux-i686.tar.bz2


สร้าง icon บน panel โดย

  1. คลิกขวาตรง panel ที่ต้องการวางไอคอน แล้วเลือก "Add to Panel ..."

  2. เลือก "Custom Application Launcher" แล้วกด "Add"

  3. จะปรากฎ dialog นี้ ให้กรอกข้อมูลต่างๆ ลงไปตามตัวอย่าง
    Firefox Launcher Dialog

  4. สำหรับ icon ปกติมันจะใส่โดยอัตโนมัติเป็น icon ของ firefox สามารถเปลี่ยนเป็น icon ของ minefield ได้โดยคลิกที่ปุ่ม icon แล้วบราวซ์ไปที่ /opt/firefox/icons จากนั้นก็เลือก mozicon128.png จะได้ icon ดังภาพ

  5. กดปุ่ม Close เป็นอันเสร็จ



เวลาจะใช้ ให้ปิด firefox เดิม ทั้งหมดก่อน แล้วค่อยคลิก icon ใหม่นี้ มิฉะนั้นมันจะเปิดเพจใหม่ของ firefox เก่า ถ้าอยากเปิดคู่กันได้ ให้เพิ่ม -no-remote ต่อท้ายในช่อง Command หรือจะเรียกด้วย command line ก็สั่ง
$ /opt/firefox/firefox -no-remote


ผลการทำงานคือ สามารถตัดคำได้จริงๆ แถมยังแก้ปัญหาเรื่อง justify สำหรับ CTL ไปแล้วด้วย ดังตัวอย่าง
Thai Justify

หรือจะทดสอบที่หน้านี้ก็ได้ http://kamthorn.org/test/justify

นอกจากนี้ ยังสามารถเลือกติดตั้ง Swiftfox Trunk หรือ Swiftweasel Trunk ก็ได้ สองตัวนี้ก็คือ firefox เวอร์ชันคอมไพล์ใหม่ ให้ optimize กับ CPU รุ่นต่างๆ นั่นเอง

ข้อเท็จจริงเกี่ยวกับการใช้ UPS

เมื่อกลางปี 47 ซื้อ UPS มาตัวนึง เพราะตอนนั้นที่บ้านมีปัญหาไฟฟ้าดับบ่อย เห็นมีขายที่ IT City ลดราคา ตัวละไม่ถึง 2,000 บาทมั้ง 750 VA ก็คิดว่าเยอะละ ใช้ได้ราวเกือบ 2 ปี ถึงรู้ว่า batt. เสื่อม ก็ซื้อเฉพาะ batt. มาเปลี่ยนเลือกขนาดเท่ากัน 12V เท่ากัน แต่เพิ่มจาก 7.2AHr เป็น 9AHr เผื่อจะอยู่ได้นานขึ้น ก็ใช้มาได้ซักปีนึงแหละ ไม่รู้แบตเสื่อมไปตอนไหน ไฟดับปุ๊บ ก็ดับเลย

ตอนนั้นเรียกว่าซื้อแบบไม่รู้อะไรเลย มารู้ทีหลังว่า มันมีเรื่อง power factor ด้วย พวก UPS ถูกๆ จะมีค่า power factor แค่ 0.4-0.5 เอง แบบดีหน่อย จะเป็น 0.6 มากกว่านี้จะไม่ค่อยมีแล้ว ค่า power factor ส่วนมากจะไม่ได้บอกไว้ แต่ถ้าเป็นร้านไอทีใหญ่ๆ ก็สามารถถามพนักงานขายได้ หรือดูง่ายๆ ก็ดูว่า (watt. ที่จ่ายได้จริง/VA) เป็นเท่าไหร่ เช่นบางตัว 750 VA แต่จ่ายไฟได้แค่ 300 watt. ก็แสดงว่ามี power factor = 300/750 = 0.4 นั่นแหละครับ UPS ที่ผมใช้

ถ้าผมเข้าใจไม่ผิด power factor ก็มีผลคือ ทำให้เปลืองไฟฟ้ามากขึ้น ถ้ามี power factor ต่ำๆ เช่น ถ้า power factor = 0.4 ก็แสดงว่า เมื่อต่อ ups จะทำให้กินไฟมากขึ้นกว่าเดิม 2.5 เท่า?!?

อีกเรื่องคือ อย่าไปซื้อแบบ noname เลย ของผมซื้อที่ IT City แต่พอแบตตัวแรกเสื่อม ไปถามซื้อแบตที่ IT City เค้าบอกไม่รู้จักยี่ห้อนี้ (อ้าว?) คือตอนหลังเค้าเน้นขายพวกยี่ห้อไปเลย เช่น PCM, Leonics เลยบอกว่าสงสัยจะเปลี่ยนไม่ได้ แล้วเชียร์ให้ซื้อใหม่ ตัวละเกือบ 3,000 แต่เราไม่โง่ (จริงๆ คือจน) เลยไปหาซื้อแบตที่ณัฐพงษ์ 512 บาทแทน อีกอย่างคือ ups แบบ noname โดยเฉพาะที่ประกอบมาจากจีน มักจะมี power factor ต่ำ ประมาณ 0.4 ทั้งนั้น อย่าเห็นแก่ของถูก ที่ถูกลงพันเดียว แต่ต้องจ่ายค่าไฟเพิ่มขึ้นเดือนละหลายร้อย ปีหนึ่งก็หลายพัน

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

เมื่อวานไปเดินเซียร์ (อีกแล้ว) ต้องตัดสินใจว่าจะเปลี่ยนแบตใหม่ หรือซื้อ UPS ใหม่ดี ราคาเปลี่ยนแบตตอนนี้อยู่ที่ ประมาณ 5xx บาท แต่นึกถึงค่าไฟแล้วเลยเดินไปดู UPS ใหม่ดีกว่า มีจัดรายการลดราคาอยู่ ของ PCM 525 VA จ่ายไฟได้จริง 315 watt. ค่า power factor = 0.6 ราคา 2,990 บาท ตัวนี้น่าสนใจ มีบอกสถานะต่างๆ ครบดี ถ้าอีกรุ่น ลดไฟ + ตัวเลขบอกสถานะลง ก็เหลือ 2,7xx บาท ไม่เลวๆ

แต่มานึกถึงความจำเป็นในการใช้ UPS แล้ว ก็มาคิดได้ว่า คงไม่ค่อยจำเป็นแล้วละ เพราะที่หอพักปัจจุบัน ไม่ค่อยมีปัญหาไฟดับ และอีกอย่าง ไม่ค่อยได้ใช้งานมันมากเหมือนก่อนนี้แล้ว ส่วนใหญ่ใช้แลปท็อปมากกว่า เลยตัวสินใจว่า ไม่ซื้อดีกว่า ไม่ใช้แล้ว ต่อตรงๆ ไปเลย แล้วเดี๋ยวปรับ file system ให้มันปลอดภัยมากขึ้นอีก (เอ ใส่ option sync เลยจะดีไหมหว่า อิๆ)

ก็แล้วแต่ความเหมาะสมของแต่ละคนละครับ ถ้าเป็น server แน่นอน มันจำเป็น สำหรับบางเครื่องที่ใช้กับงานที่ต้องการความ stable สูงๆ ก็จงใช้ เพียงแต่ขอให้เลือกตัวที่มี power factor สูงๆ ครับ (0.6 ขึ้นไป) ถ้าใช้ที่บ้าน แค่ไว้เล่นเกม เล่นเน็ต ไม่มีงานซีเรียสอะไรมาก หรือให้ห้องแล็บนักศึกษา ก็อย่าไปติดให้เสียค่าไฟเล่นเลยครับ

วันจันทร์ที่ 27 สิงหาคม พ.ศ. 2550

ตามหา Virtual Host Control Panel แบบ Open Source

ช่วงนี้ ยามว่างๆ จะตามหา control panel เจ๋งๆ อยู่ ก็พวก panel สำหรับให้บริการเว็บโฮสติ้งแบบ virtual host นั่นแหละ ทำนองเดียวกับพวก cPanel แต่เน้นที่เป็น open source และใช้บน debian gnu/linux (โดยเฉพาะ etch) ได้ และต้องใช้กับโฮสต์ที่บริการ PHP5 ได้ด้วย

เคยลอง gnupanel ไปทีนึง ไม่ค่อยประทับใจ โดยเฉพาะโค้ดแกะยากมาก ตั้งชื่อไฟล์เป็นภาษา spain อ่านไม่เข้าใจ comment ก็ภาษา spain อีก สุดท้ายก็เลิกใช้ เปลี่ยนไปใช้ ispconfig ก็ดูดีนะ แต่ยังไม่ถูกใจผู้ใช้ บอกว่าใช้ยากไป ไม่เหมือน panel อื่นๆ

หลายคนแนะนำ VHCS เข้าไปดูเว็บเค้าละ แต่ห่วงว่าจะใช้กับ PHP5 ได้หรือไม่ และอีกอย่างที่ห่วงคือ ซอฟต์แวร์ตัวนี้ไม่มีอัพเดทมาปีครึ่งแล้ว ไม่แน่ใจว่าอนาคตยังดีอยู่หรือไม่ และก็พึ่งไปพบตัวที่เป็น fork ของ VHCS อีก 2 ตัว คือ VHCP และ ISPCP แต่ยังไม่ออกตัวจริงทั้งคู่ แล้วก็อื่นๆ ก็มี WEB-CP กับ SysCP ตัวหลังนี่หน้าตาธรรมดา แต่มีคนใช้เยอะดีเหมือนกัน ดูค่อนข้าง stable ดี

เดี๋ยวขอไปลองให้หมดก่อน ค่อยมาตัดสินใจอีกที