Sennheiser CX200

เพิ่งถอยหูฟังมาใหม่ คราวนี้เป็น Sennheiser รุ่น CX200 หน้าตาประมาณในรูป หลังจาก Sony MDR-EX71 ที่ใช้มา 3-4 ปี อยู่ดีๆ ก็เสียงหายไปข้างนึงซะงั้น -_-a

Sennheiser CX200

ตัวนี้ซื้อมาจากร้าน มั่นคง Gadget สาขาพันธุ์ทิพย์ งามวงศ์วาน ตามคำแนะนำของ @sakanozo พบว่าพนักงานบริการดีมาก ให้คำแนะนำดี โดยดูตามงบประมาณที่เรามี (ของผมตั้งไว้สองพัน) ที่สำคัญคือลองได้ โชคดีที่ยังไม่ได้ตัดสินใจซื้อที่ร้าน Sony (เล็ง MDR-EX76 ไว้) เนื่องด้วยดูราคาแล้วค่อนข้างโหด และไม่ได้ลองด้วย มาเจอที่นี่ถูกใจทั้งราคาและเสียง :)

ตอนนี้อยู่ในช่วง burn-in 100 ชม. หวังว่าเมื่อครบแล้ว เสียงที่ได้จะเหมือนตอนลองที่ร้าน (ชอบเสียงเบสหนักๆ สะใจดี :P)

ปล. ตัวที่ลองคือ Sennheiser CX200, CX300 และ AKG รุ่นอะไรซักอย่าง

I can’t open docx

เป็นเรื่องน่าเบื่อทุกครั้งเวลาที่มีคนส่งไฟล์งานมาให้เป็นไฟล์ .docx, .xlsx, .pptx เพราะคนที่ไม่มี MS Office เวอร์ชันใหม่ๆ ก็จะเปิดไม่ได้ และไม่ใช่ทุกคนจะมีเงินซื้อ Office เวอร์ชันใหม่ ดังนั้นเวลาที่มีคนในออฟฟิซส่งงานมาให้เป็นไฟล์เหล่านี้ ก็อีเมลตอบกลับไปเลยว่า ให้ส่งมาใหม่เป็น format อื่น วิธีตั้ง auto ใน Mail.app ก็ไม่ยากอะไร

ก็ไปเปิด Mail.app > Preference > Rules แล้วเลือกสร้าง Rule ใหม่เข้าไปตามรูป

ตั้งค่าใน Rules ตามนี้

จากนั้นก็เขียน Reply message ตามต้องการ

พยายามเขียนให้สุภาพเข้าไว้

พยายามเขียนให้สุภาพเข้าไว้

ต่อไปนี้ ใครส่งไฟล์เหล่านี้มา ตัว Mail.app ก็จะตอบกลับไปอัตโนมัติ บอกให้ส่งมาใหม่

หนีเที่ยว 19-22 พฤศจิ 09


วันเสียตังค์ของอี๊จุ๊บ


Using Drush on Windows with Cygwin

What is Drush?

หนึ่งในเครื่องมือที่ขาดไม่ได้เวลาทำงานกับ Drupal ก็คือ Drush ที่ทำให้ทำงานหลายๆ อย่างได้ด้วยการใช้ command line หลักๆ ก็เช่น ดาวน์โหลดและติดตั้งโมดูล/ธีม, เคลียร์ cache, รัน update.php, รัน cron, ดูค่าในตาราง variables ฯลฯ

Why Drush?

ความสามารถของ Drush ที่ใช้บ่อยที่สุดก็น่าจะเป็นตอนติดตั้งโมดูล/ธีม นี่แหละ รันคำสั่งบรรทัดเดียว มันจะดาวน์โหลดแพ็กเกจและแตกไฟล์ให้เสร็จเรียบร้อย สมมติเราต้องการติดตั้งโมดูลซัก 5-6 ตัว ขั้นตอนปกติที่จะต้องทำก็คือ

  • ไปที่ drupal.org
  • ค้นหาโมดูลที่ต้องการ (ถ้าจะให้เร็วกว่านั้น แนะนำให้ค้นหาโมดูลด้วย Firefox quick search)
  • ดาวน์โหลดแพ็กเกจติดตั้งของแต่ละโมดูล
  • แตกแพ็กเกจไปไว้ในไดเร็กทอรี sites/all/modules
  • ไปที่ http://example.com/admin/build/modules
  • คลิกเลือกโมดูลที่ต้องการเปิดใช้งาน
  • กดปุ่ม Save configuration

ในขณะที่ Drush สามารถทำได้โดยพิมพ์คำสั่งแค่ 3 บรรทัด

$ cd /cygdrive/d/www/my_drupal_site
$ drush dl admin admin_menu devel markdown cck views
$ drush en admin admin_menu devel markdown cck views

โฆษณาเสร็จแล้ว มาเข้าเรื่องตามหัวข้อบล็อกกันดีกว่า

Why Cygwin?

สิ่งที่น่าเศร้าใจสำหรับผู้ใช้วินโดวส์ก็คือ พวกเครื่องมือแบบ command line ส่วนใหญ่ จะออกแบบมาเพื่อให้ใช้กับระบบปฏิบัติการตระกูล *nix (ลินุกซ์, Mac, ฯลฯ) เป็นหลัก แต่สาวกไมโครซอฟต์ก็ยังมีไม้ตายคือ Cygwin ที่ช่วยให้สามารถใช้ environment แบบ *nix บนวินโดวส์ได้ สำหรับผมที่ลง Cygwin เป็นโปรแกรมมาตรฐานในเครื่องอยู่แล้ว (เอาไว้โหลด manga :P) การใช้ Drush บน Cygwin ก็ดูจะเป็นทางเลือกที่สมเหตุสมผลที่สุด

จริงๆ Drush มีเวอร์ชันที่ทำงานบน Command Prompt ของวินโดวส์ด้วย (ดููในแพ็กเกจจะมีไฟล์ drush.bat) แต่ไม่เคยลองใช้เหมือนกัน ไม่แน่ใจว่าต้องเซ็ตอะไรยุ่งยากหรือเปล่า ถ้าใครเคยลองช่วยเพิ่มเติมข้อมูลด้วยก็ดีครับ

Installing PHP on Cygwin

ก่อนอื่นก็ต้องติดตั้ง Cygwin แบบมีแพ็กเกจจาก Cygwin Ports โดยแพ็กเกจที่จำเป็นต้องลงคือ

  • Utils/ncurses (สำหรับคำสั่ง tput)
  • Shell/mintty (เชลล์สำหรับ Cygwin ที่ดีกว่า Command Prompt)
  • PHP/php (PHP core)
  • PHP/php-mbstring (mbstring extension)
  • PHP/php-mysqli (mysqli extension)
  • PHP/php-session (session extension)
  • PHP/php-json (json extension)

สำหรับแพ็กเกจ PHP จะอยู่ใน Cygwin Ports ถ้าติดตั้ง Cygwin แบบปกติจะไม่มีให้เลือก นอกจากนี้อาจเลือกลงแพ็กเกจเพิ่มเติมตามความต้องการใช้งาน เช่น vim, openssh, git, subversion, inetutils, wget ฯลฯ เรียกได้ว่าเปิดหน้าต่าง mintty ขึ้นมาก็มีลินุกซ์ไว้ใช้งานแล้ว

Installing Drush

การติดตั้ง Drush ทำได้ง่ายๆ โดยดาวน์โหลดแพ็กเกจจากหน้าโปรเจกต์ของ Drush แล้วแตกไฟล์ไว้ที่ไหนก็ได้ ไม่จำเป็นต้องอยู่ในไดเร็กทอรีเดียวกับ Drupal (และจริงๆ มันก็ไม่ควรอยู่) แนะนำให้โหลดตัว official release เพราะตัว development version มีการเรียกฟังก์ชันที่มีเฉพาะใน Drupal 7 ด้วย

ด้วยพลังของ Cygwin (จริงๆ คือพลังของ tools บน *nix :P) เราสามารถติดตั้ง Drush ด้วยคำสั่งเพียงบรรทัดเดียว โดยไปที่ไดเร็กทอรีที่จะติดตั้ง Drush แล้วพิมพ์คำสั่ง (สมมติว่าต้องการติดตั้งในไดรว์ D:)

$ cd /cygdrive/d
$ wget -q -O - http://ftp.drupal.org/files/projects/drush-All-Versions-2.1.tar.gz | tar xzf -

รอสักครู่ จะได้ไดเร็กทอรี drush พร้อมใช้งานในทันที จากนั้นเพื่อความสะดวกก็สร้างลิงก์ไปหาไฟล์ drush ไว้ใน PATH ของ Cygwin (เพื่อให้เรียกใช้งานได้จากทุกไดเร็กทอรี) เช่น

$ ln -s /cygdrive/d/drush/drush /usr/local/bin/drush

Modifying Drush

ถ้าใช้วิธีแบบของผม จะต้องแก้ไขไฟล์ของ Drush เล็กน้อย เพราะโค้ดของ Drush บางส่วนเขียนขึ้นเพื่อให้ทำงานกับ PHP บนวินโดวส์ได้ และจะแปลง path เป็น drive:\path\to\file แทนที่จะเป็น /path/to/file ตามระบบไฟล์ของ *nix แต่ตอนนี้เราใช้ PHP บน Cygwin จึงไม่จำเป็นต้องแปลง path กลับไปกลับมาอีก ไฟล์ที่ต้องแก้มี 2 ไฟล์คือ

drush/drush: (คอมเมนต์บรรทัดที่ตรวจสอบว่าเป็น Cygwin ออก)

# Build the path to drush.php.
SCRIPT_PATH=$(dirname $SELF_PATH)/drush.php
# [[ $(uname -a) == CYGWIN* ]] && SCRIPT_PATH=$(cygpath -w -a -- "$SCRIPT_PATH")

drush/includes/environment.inc: เอาบรรทัดที่ตรวจสอบว่าเป็น Cygwin ออกเช่นกัน

function _drush_convert_path($path) {
  $path = str_replace('\\','/', $path);
  // $path = preg_replace('/^\/cygdrive\/([A-Za-z])(.*)$/', '\1:\2', $path);
 
  return $path;
}

Installing Drupal

ทำการติดตั้ง Drupal ตามปกติ หรือถ้าติดตั้งไว้แล้วก็ข้ามไปได้เลย ตรงนี้คิดว่าน่าจะทำเป็นกันอยู่แล้ว ถ้ายังไม่เคย แนะนำให้ลองอ่าน การติดตั้ง Drupal ภายใน 1 นาที! ครับ ถึงตรงนี้ถ้าคันไม้คันมืออยากลองใช้ Drush ก็เริ่มได้เลย โดยไปที่ไดเร็กทอรีที่จะติดตั้ง Drupal แล้วพิมพ์คำสั่ง (สมมติต้องการติดตั้งไว้ใน D:\www)

$ cd /cygdrive/d/www
$ drush dl drupal

รอสักพัก ก็จะได้ไดเร็กทอรี drupal-6.14 (หรือเวอร์ชันล่าสุด) มาเพื่อทำการติดตั้งต่อไป

Editing settings.php

เป็นกรรมอีกอย่างของคนใช้วินโดวส์ ที่ MySQL บนวินโดวส์นั้นไม่ค่อยจะลงรอยกับ Cygwin สักเท่าไร โดยเวลารัน Drush บางครั้งมันจะฟ้องว่าหาไฟล์ mysql.sock ไม่เจอ แต่วิธีแก้ไม่ยาก แค่เปิดไฟล์ settings.php ของ Drupal แล้วเปลี่ยน localhost ใน $db_url เป็น 127.0.0.1 แทน ตามนี้

$db_url = 'mysql://username:password@127.0.0.1/databasename';

Let’s Drush!

ถ้าติดตั้ง Drupal เสร็จเรียบร้อยก็ถึงเวลาใช้งาน Drush อย่างเต็มรูปแบบ ก่อนเริ่มใช้งานให้ไปที่ไดเร็กทอรีที่ติดตั้ง Drupal แล้วลองเรียก

$ drush status

ถ้าทุกอย่างปกติ ควรจะมีข้อความขึ้นมาประมาณนี้

PHP configuration :
  Drupal Root       : /cygdrive/d/www/drupal-6.14
  Drupal version    : 6.14
  Site Path         : sites/default
  Site URI          : http://default
  Database Driver   : mysqli
  Database Hostname : 127.0.0.1
  Database Username : username
  Database Name     : databasename
  Database Password : password
  Database          : Connected
  Drupal Bootstrap  : Successful
  Drupal User       : Anonymous

สำหรับวิธีการใช้งาน แนะนำให้อ่าน documentation หรือพิมพ์คำสั่ง drush เฉยๆ มันจะแสดงรายการคำสั่งทั้งหมดออกมา ถ้าต้องการดูรายละเอียดของแต่ละคำสั่ง ก็พิมพ์ --help เพิ่ม เช่น

$ drush dl --help

A Quick (and Dirty) Password Field for Drupal Webform

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

เรื่องมีอยู่ว่า ฟอร์มที่ผมต้องการสร้างนั้นจะต้องมีฟิลด์สำหรับใส่รหัสผ่านด้วย แต่ใน component ของ Webform ไม่มีฟิลด์ password มาให้ ลองค้นไปค้นมาก็พบว่ามันเป็น issue ค้างปีมาตั้งแต่ 2007!!!

จริงๆ การสร้าง component แบบ password เองนั้นก็ไม่ยาก แค่ copy ไฟล์ textfield.inc มา เปลี่ยนชื่อเป็น password.inc แล้วแก้ชื่อฟังก์ชันข้างในจาก *_textfield เป็น *_password ก็เรียบร้อย (คนอื่นเค้าก็ทำกันแบบนี้)

แต่ปกติฟอร์มสำหรับกรอกรหัสผ่านที่ดี ควรจะมีช่อง confirm password ด้วย ซึ่งถ้าทำด้วยวิธีการข้างบน เวลาสร้าง Webform จะต้องสร้างฟิลด์รหัสผ่าน 2 อัน แล้วไปใส่โค้ดเพิ่มในช่อง Additional validation ของ Webform เพื่อให้มันเช็คว่ารหัสผ่านที่ใส่ทั้งสองครั้งตรงกัน สำหรับโค้ดที่ใช้ก็ประมาณนี้

<?php
if ($form_values['submitted_tree']['login_information']['password'] != $form_values['submitted_tree']['login_information']['confirm_password']) {
  form_set_error('submitted][login_information][password', t('The specified passwords do not match.'));
}
?>

login_information เป็นชื่อ fieldset ส่วนชื่อฟิลด์จริงๆ คือ password และ confirm_password

วิธีที่ว่ามานี้สำหรับผมขอเรียกว่าวิธี slow and dirty เพราะมันทำให้ชีวิตยุ่งยากขึ้น ถ้ามีการเปลี่ยนชื่อ fieldset หรือชื่อฟิลด์รหัสผ่าน ก็ต้องกลับมาแก้โค้ด validation ทุกครั้ง แต่ก็ใช้งานได้ดีถ้าไม่คิดอะไรมาก

ส่วนวิธี quick and dirty ที่ตั้งใจจะเขียนจริงๆ นั้น พบโดยบังเอิญตอนพยายามแกะ user.module ว่ามันมี form component เฉพาะสำหรับฟิลด์รหัสผ่านให้ด้วย (นึกถึงตอนสร้าง user ใหม่ หรือตอน register user) ซึ่งฟิลด์รหัสผ่านนี้มันจะมาเป็นคู่ และมีระบบ validation มาให้เรียบร้อย แค่กำหนดชนิดของ form component เป็น

'#type' => 'password_confirm'

หลักการเอามาใช้ใน Webform ก็คล้ายๆ กับวิธี slow and dirty คือ copy ไฟล์ textfield.inc มาเป็นต้นแบบ แล้วแก้ไขโค้ดเพื่อกำหนดชนิดของ form component นอกจากนั้นก็แก้ไขโดยคอมเมนต์ตัวเลือกในส่วน default value กับ disabled ออก เพราะคงไม่มีใครกำหนด default value ให้ฟิลด์รหัสผ่านอยู่แล้ว

สรุปง่ายๆ ว่า download ไฟล์ข้างล่างนี้ไปใส่ในไดเร็กทอรี webform/components โดยตั้งชื่อไฟล์เป็น password.inc ก็จะได้ฟิลด์แบบ password พร้อมระบบ confirm และ validation โผล่ขึ้นมาให้เลือกใช้งานตอนสร้าง Webform ครับ

ลมหายใจ the musical

วันนี้ไปดู ลมหายใจ the musical มา ตอนแรกนึกว่าจะไม่ไปดูแล้วละตอนเห็นนักแสดงนำ แต่ว่าไปๆมาๆก้อไปก้อด่ะ (หาเรื่องเสียตังค์) โดยรวมก้อโอค่ะ นิโคลเสียงดีกว่าที่คิดเยอะเลย (สมกับที่ไปเรียนมาเพิ่ม) ตอนแรกที่ได้สูจิบัตรมาเค้ามีลิสของเพลงที่อยู่ในเรื่องมาให้ 20 เพลง ก็ต้องมานั่งเดาเอาเองว่าเค้าจะร้อยเรื่องกันยังไง ใครจะร้องเพลงไหน นั่งๆฟังไปก็รู้สึกว่าเค้าพยายามเอาเพลงมาเป็นเนื้อเรื่อง หรือเอาเนื้อเรื่องมาผูกกับเพลงมากเกินไปรึป่าวนะ… ก็ชอบอยู่ 3 ฉากนะ… อันแรกคือตอนนิโคลร้อง โปรดเถอะ ไอเดียการตัดเพลงเยี่ยมจริงๆ… อันที่สองก็ต้องสามสาวมาร้องเพลง รักเธอทั้งหมดของหัวใจ (T__T เพลงโปรด พี่บอยเป็นคนแต่งเหรอเนี่ย)… สุดท้ายก็อันที่พี่อ๊อฟร้องเพลง ที่ฉันรู้ มันเหมาะกับเนื้อเรื่องมากๆเลย ไม่คิดว่าจำทำออกมาแนวนี้…
 
        "อยากจะขอสักอย่าง อยากจะขอร้องสักอย่าง
         อยากจะขอ ให้เหลือหนทางให้ฉันยังเดินได้อยู่
         โปรดอย่าถามกันเลย อย่าเพิ่งถามฉันเลย เรื่องราวของเราทั้งคู่
         ไม่อยากจะพูดจะบอก ไม่มีเหตุผลจะตอบ
         ฉันเองยังไม่เคยคาดคิด ไม่เคยรู้
         เขาไม่รักฉันแล้ว ที่ฉันรู้"…. ที่ฉันรู้, Boyd