Introduction to CouchDB with Pylons no comments
สารภาพว่าก่อนหน้านี้ผมไม่เคยคิดที่จะมอง CouchDB อยู่ในสายตาเลยแม้แต่น้อย อาจจะเรียกว่าเป็นคนสาย RDBMS เต็มขั้นจนไม่เห็นความจำเป็นที่จะต้องเปลี่ยนไปใช้ฐานข้อมูลที่สร้างขึ้นด้วยแนวคิดอื่น แต่หลังจากอ่านที่มีคนอธิบายความสามารถของ CouchDB ใน Reddit ทำให้เกิดความสนใจขึ้นมาเล็กน้อยทำให้เริ่มลองศึกษาแนวคิดการทำงานของมัน
คอนเซปของ CouchDB ก็คือไม่มีการใช้ schema เป็นเบื้องหลังฐานข้อมูล และไม่มีคอนเซปที่เรียกว่าตาราง แต่ละแถวในฐานข้อมูลถูกเรียกว่า “document” และแยกออกจากกันชัดเจน โดยไม่จำเป็นต้องมีรูปแบบตายตัว สิ่งที่ได้มาจากการทำแบบนี้คือความยืดหยุ่นของข้อมูลในฐานข้อมูลหนึ่งๆ
ตัวอย่างง่ายๆ ที่สามารถนำคอนเซป document ของ CouchDB ไปใช้ได้คือ node ของ Drupal ที่สามารถเป็นได้หลายอย่าง ในกรณีของการใช้ RDBMS คุณต้องมานั่งปวดหัวกับ schema ของตารางที่จะยุ่งวุ่นวายขึ้นตามความหลากหลายของข้อมูลใน node แต่สำหรับการใช้งาน CouchDB แล้ว มันก็เป็นเพียงแค่ document หนึ่งๆ เท่านั้น
Thai Font in Ubuntu no comments
วันนี้ได้มีโอกาสลง Linux อีกรอบหนึ่งหลังจากผ่านไปหลายเดือนจากคราวที่แล้ว ถือโอกาสลงเสร็จใหม่ๆ จัดการกับฟอนท์ให้เรียบร้อย เพราะส่วนตัวแล้วไม่ชอบภาษาไทยที่ใช้เป็นมาตรฐานของ Linux เอามากๆ และในขณะเดียวกันก็ไม่ชอบภาษาอังกฤษที่ใช้ใน Lomaputta เลยแม้แต่นิดเดีย ด้วยเหตุนั้นเลยคิดว่าคงเป็นการดีถ้าหากเอาฟอนท์สองตัวนี้มารวมกันได้…
หลังจากลองขุดคุ้ยใน /etc/fonts/conf.d/ อยู่ซักพักหนึ่ง ก็พบว่าฟอนท์ชื่อ “serif” และ “sans-serif” นั้น จริงๆ แล้วเป็นเพียงแค่ alias ของฟอนท์หลายๆ ตัว ซึ่งถูกตั้งไว้ในไฟล์หลายๆ ไฟล์ และฟอนท์ Bitstream Vera DejaVu ที่เป็นมาตรฐานนั้นถูกเซ็ทไว้ที่ไฟล์ 60-latin.conf เลยคิดว่าถ้าหากเซ็ทให้ Lomaputta เป็น preferred ก่อนหน้านั้นล่ะ?
จัดการสร้างไฟล์ 40-ttf-thai.conf แล้วโยนลงไปใน /etc/fonts/conf.d/ หน้าตาแบบนี้
<?xml version="1.0"?> <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> <fontconfig> <alias> <family>serif</family> <prefer><family>Lomaputta</family></prefer> </alias> <alias> <family>sans-serif</family> <prefer><family>Lomaputta</family></prefer> </alias> <alias> <family>monospace</family> <prefer><family>TlwgMono</family></prefer> </alias> </fontconfig>
ผลปรากฎเป็นไปตามที่คาด ทั้งฟอนท์ “serif” และ “sans-serif” ต่างก็ใช้ glyph ภาษาไทยจาก Lomaputta ในขณะเดียวกันก็ใช้ภาษาอังกฤษจาก Bitstream Vera DejaVu เท่านี้ก็รู้สึกใช้ Ubuntu ได้อย่างสบายตาขึ้นเยอะ
PostgreSQL Dirty Database Backup no comments
พยายามหาสคริตป์สำหรับแบคอัพฐานข้อมูล PostgreSQL อยู่ซักพักนึง แต่หาตัวที่ทำอย่างที่ต้องการไม่ได้ซะที เลยคิดว่าเขียนเองแบบสกปรกๆ ใช้ไปก่อนดีกว่า เลยได้ออกมาหน้าตาแบบนี้ (เซ็ทรหัสผ่านในไฟล์ ~/.pgpass และ chmod 600 เอา)
#!/usr/bin/env bash # Set user information inside ~/.pgpass and chmod 600 it. # Configurations DATABASE="dbname" USERNAME="username" SAVE_PATH="/backup" DAYS=7 # Generate datetime for file naming DATE_FILE=`date '+%Y-%m-%d-%H-%M-%S'` DB_FILENAME="$DATABASE-$DATE_FILE.dump" DB_FILEPATH="$SAVE_PATH/$DB_FILENAME" SAVE_FILE="$SAVE_PATH/$DATABASE-$DATE_FILE.tar.bz2" # Run /usr/local/bin/pg_dump -U $USERNAME --no-owner $DATABASE > $DB_FILEPATH cd $SAVE_PATH /usr/bin/tar -cjf $SAVE_FILE $DB_FILENAME /bin/rm $DB_FILEPATH # Clean older files /usr/bin/find $SAVE_PATH/* -mtime +$DAYS -name '*.tar.bz2' -exec rm {} \;
คิดว่าบรรทัดสุดท้ายคงใช้เป็น /usr/bin/find $SAVE_PATH/* -mtime +$DAYS -name '*.tar.bz2' -delete ไปเลยจะน่าปลอดภัยขึ้น แต่ตอนนี้ไม่อยากแก้อะไรที่มันทำงานได้อยู่แล้ว ดังนั้นปล่อยมันเป็นงี้ไปก่อนดีกว่า…
ไฟล์ที่ออกมาจะหน้าตาเป็น dbname-2008-12-18-17-30-00.tar.bz2 และจะเก็บไว้เพียงของ 7 วันสุดท้าย ผมตั้ง cron ให้มันรันทุกๆ 6 ชั่วโมง และ rsync ไปยังเซิฟเวอร์สำรองเอา น่าจะสบายใจได้พอสมควร
Quinn 1 comment

ไม่มีอะไรครับ แค่รู้สึกภูมิใจที่เอาชนะคุณ RH ได้แล้ว :P (ถึงขั้นรอวันนึงให้ stat มันขึ้นเลยนะเออ!)
สำหรับคนที่ไม่เข้าใจว่ามันคืออะไร มันคือเกม Tetris บน Mac OS X ในชื่อเกม Quinn ครับ สามารถดาวน์โหลดมาเล่นได้ฟรี และมันก็สูบเวลาผมไปแล้วมหาศาลมาก!
Portfile Patchfile Patching 3 comments
ช่วงนี้กำลังนั่งเล่นกับ Apache CouchDB สำหรับใช้ในโปรเจคถัดไป อ่านวิธีการทำงานของมันแล้วรู้สึกค่อนข้างชอบพอสมควร ถึงแม้ในขณะนี้มันยัง “ไม่สมบูรณ์” และ “ไม่มีการ optimize ใดๆ” แต่การใช้งานโดยทั่วไปน่าจะเรียกได้ว่าเร็วพอควร แต่เอนทรี่นี้ไม่ได้มาสาธยาย CouchDB …
ปัญหามันมีอยู่ว่า หลังจากลง CouchDB ผ่านทาง MacPorts เรียบร้อยแล้ว ก็พบว่าไม่สามารถเข้าไปยัง Futon ที่เป็น Web Interface สำหรับดูแลข้อมูลในฐานข้อมูลได้ ก็เลยลองโพสถามใน couchdb-user ดู แล้วก็ได้คำตอบว่าเป็นเพราะบั๊กตัวหนึ่งของ Erlang (ภาษาที่ CouchDB ใช้เขียน)
บั๊กตัวนี้มีอยู่ว่า (เดาเอา เขียน Erlang ไม่เป็น) คำสั่ง calendar:localtime_to_universaltime จะไปเรียก mktime() โดยมีค่า is_dst เป็น True ซึ่งพออยู่ในเขตที่ไม่มี DST แล้ว mktime() จะคืนค่าออกมาเป็น -1 ทำให้ calendar:local_time_to_universal_time_dst ที่รับค่าจาก localtime_to_universaltime อีกต่อ จะได้ {{1969, 12, 31}, {23, 59, 59}} ไป ซึ่งเป็นเวลาก่อน Epoch บน Mac OS X และ UNIX-like อื่นๆ 1 วินาที และแน่นอนว่ามันต้อง error
วิธีการแก้ก็เพียงแค่ใช้ แพทช์ ที่ Paul Guyot โพสไว้ตอนแจ้งบั๊ก นำมาแพทช์เข้ากับซอร์สของ Erlang และคอมไพล์ใหม่ … อ๊ะ แล้วถ้าหากไม่อยากจะคอมไพล์ใหม่เอง แต่อยากใช้ MacPorts เหมือนเดิมล่ะ จะทำยังไง?
ต้องขอขอบคุณที่ MacPorts นั้นใช้การแพทช์ซอร์สเป็นปกติอยู่แล้ว ดังนั้นเราสามารถเพิ่มแพทช์นี้เข้าไปในรายการนั้นได้ผ่านทางไฟล์ Portfile ซึ่งปกติจะอยู่ใน /opt/local/var/macports/sources/rsync.macports.org/release/ports/ (สำหรับ Erlang ต้องเข้าไปใน lang/erlang อีกต่อ) โดยการย้ายไฟล์แพทช์ที่โหลดมาไปไว้ใน files/ และแก้ไข Portfile เพิ่มชื่อไฟล์ที่ย้ายมาลงไปยังบรรทัด patchfiles
หลังจากแก้ไข Portfile เรียบร้อยแล้ว ก็แค่สั่งลง Erlang ใหม่ เมื่อเปิด CouchDB ขึ้นมาอีกรอบ ก็จะไม่มีปัญหาในการเข้าไปยัง Futon แล้ว แต่ตอนนี้สงสัยว่าแพทช์นี้มีมาตั้งแต่ R12B-4 แล้วตอนนี้มันออก R12B-5 มาแล้ว มันจะได้ commit เร็วๆ นี้หรือเปล่า?