<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0" xml:base="http://suksit.com">
<channel>
 <title>suksit dot com</title>
 <link>http://suksit.com</link>
 <description />
 <language>en</language>
<image><link>http://feeds.feedburner.com/suksit</link><url>http://feeds.feedburner.com/~fc/suksit?bg=2266AA&amp;amp;fg=ffffff&amp;amp;anim=0</url><title>FeedCount</title></image><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/suksit" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
 <title>Using Drush on Windows with Cygwin</title>
 <link>http://feedproxy.google.com/~r/suksit/~3/Mwcmqc9HE8k/using-drush-on-windows-with-cygwin</link>
 <description>&lt;h3&gt;What is Drush?&lt;/h3&gt;

&lt;p&gt;หนึ่งในเครื่องมือที่ขาดไม่ได้เวลาทำงานกับ Drupal ก็คือ &lt;a href="http://drupal.org/project/drush"&gt;Drush&lt;/a&gt; ที่ทำให้ทำงานหลายๆ อย่างได้ด้วยการใช้ command line หลักๆ ก็เช่น ดาวน์โหลดและติดตั้งโมดูล/ธีม, เคลียร์ cache, รัน update.php, รัน cron, ดูค่าในตาราง variables ฯลฯ&lt;/p&gt;

&lt;h3&gt;Why Drush?&lt;/h3&gt;

&lt;p&gt;ความสามารถของ Drush ที่ใช้บ่อยที่สุดก็น่าจะเป็นตอนติดตั้งโมดูล/ธีม นี่แหละ รันคำสั่งบรรทัดเดียว มันจะดาวน์โหลดแพ็กเกจและแตกไฟล์ให้เสร็จเรียบร้อย สมมติเราต้องการติดตั้งโมดูลซัก 5-6 ตัว ขั้นตอนปกติที่จะต้องทำก็คือ&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ไปที่ drupal.org&lt;/li&gt;
&lt;li&gt;ค้นหาโมดูลที่ต้องการ (ถ้าจะให้เร็วกว่านั้น แนะนำให้&lt;a href="http://suksit.com/node/204/search-for-drupal-modules-and-themes-with-firefox-quick-search"&gt;ค้นหาโมดูลด้วย Firefox quick search&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;ดาวน์โหลดแพ็กเกจติดตั้งของแต่ละโมดูล&lt;/li&gt;
&lt;li&gt;แตกแพ็กเกจไปไว้ในไดเร็กทอรี &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;sites/all/modules&lt;/code&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;ไปที่ &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;http://example.com/admin/build/modules&lt;/code&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;คลิกเลือกโมดูลที่ต้องการเปิดใช้งาน&lt;/li&gt;
&lt;li&gt;กดปุ่ม Save configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ในขณะที่ Drush สามารถทำได้โดยพิมพ์คำสั่งแค่ 3 บรรทัด&lt;/p&gt;

&lt;div class="geshifilter"&gt;&lt;pre class="text geshifilter-text" style="font-family:monospace;"&gt;$ 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&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;โฆษณาเสร็จแล้ว มาเข้าเรื่องตามหัวข้อบล็อกกันดีกว่า
&lt;!--break--&gt;&lt;/p&gt;

&lt;h3&gt;Why Cygwin?&lt;/h3&gt;

&lt;p&gt;สิ่งที่น่าเศร้าใจสำหรับผู้ใช้วินโดวส์ก็คือ พวกเครื่องมือแบบ command line ส่วนใหญ่ จะออกแบบมาเพื่อให้ใช้กับระบบปฏิบัติการตระกูล *nix (ลินุกซ์, Mac, ฯลฯ) เป็นหลัก แต่สาวกไมโครซอฟต์ก็ยังมีไม้ตายคือ &lt;a href="http://www.cygwin.com"&gt;Cygwin&lt;/a&gt; ที่ช่วยให้สามารถใช้ environment แบบ *nix บนวินโดวส์ได้ สำหรับผมที่ลง Cygwin เป็นโปรแกรมมาตรฐานในเครื่องอยู่แล้ว (เอาไว้&lt;a href="http://suksit.com/node/255/one-manga-downloader-on-github"&gt;โหลด manga&lt;/a&gt; :P) การใช้ Drush บน Cygwin ก็ดูจะเป็นทางเลือกที่สมเหตุสมผลที่สุด&lt;/p&gt;

&lt;p&gt;จริงๆ Drush มีเวอร์ชันที่ทำงานบน Command Prompt ของวินโดวส์ด้วย (ดููในแพ็กเกจจะมีไฟล์ drush.bat) แต่ไม่เคยลองใช้เหมือนกัน ไม่แน่ใจว่าต้องเซ็ตอะไรยุ่งยากหรือเปล่า ถ้าใครเคยลองช่วยเพิ่มเติมข้อมูลด้วยก็ดีครับ&lt;/p&gt;

&lt;h3&gt;Installing PHP on Cygwin&lt;/h3&gt;

&lt;p&gt;ก่อนอื่นก็ต้อง&lt;a href="http://suksit.com/node/261/extending-cygwins-capability-with-cygwin-ports"&gt;ติดตั้ง Cygwin แบบมีแพ็กเกจจาก Cygwin Ports&lt;/a&gt; โดยแพ็กเกจที่จำเป็นต้องลงคือ&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Utils/ncurses&lt;/strong&gt; (สำหรับคำสั่ง tput)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shell/mintty&lt;/strong&gt; (เชลล์สำหรับ Cygwin ที่ดีกว่า Command Prompt)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PHP/php&lt;/strong&gt; (PHP core)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PHP/php-mbstring&lt;/strong&gt; (mbstring extension)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PHP/php-mysqli&lt;/strong&gt; (mysqli extension)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PHP/php-session&lt;/strong&gt; (session extension)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;สำหรับแพ็กเกจ PHP จะอยู่ใน Cygwin Ports ถ้าติดตั้ง Cygwin แบบปกติจะไม่มีให้เลือก นอกจากนี้อาจเลือกลงแพ็กเกจเพิ่มเติมตามความต้องการใช้งาน เช่น vim, openssh, git, subversion, inetutils, wget ฯลฯ เรียกได้ว่าเปิดหน้าต่าง mintty ขึ้นมาก็มีลินุกซ์ไว้ใช้งานแล้ว&lt;/p&gt;

&lt;h3&gt;Installing Drush&lt;/h3&gt;

&lt;p&gt;การติดตั้ง Drush ทำได้ง่ายๆ โดยดาวน์โหลดแพ็กเกจจาก&lt;a href="http://drupal.org/project/drush"&gt;หน้าโปรเจกต์ของ Drush&lt;/a&gt; แล้วแตกไฟล์ไว้ที่ไหนก็ได้ ไม่จำเป็นต้องอยู่ในไดเร็กทอรีเดียวกับ Drupal (และจริงๆ มันก็ไม่ควรอยู่) แนะนำให้โหลดตัว official release &lt;del markdown="1"&gt;เพราะ&lt;a href="http://drupal.org/node/627238"&gt;ตัว development version มีการเรียกฟังก์ชันที่มีเฉพาะใน Drupal 7&lt;/a&gt; ด้วย&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;ด้วยพลังของ Cygwin (จริงๆ คือพลังของ tools บน *nix :P) เราสามารถติดตั้ง Drush ด้วยคำสั่งเพียงบรรทัดเดียว โดยไปที่ไดเร็กทอรีที่จะติดตั้ง Drush แล้วพิมพ์คำสั่ง (สมมติว่าต้องการติดตั้งในไดรว์ D:)&lt;/p&gt;

&lt;div class="geshifilter"&gt;&lt;pre class="bash geshifilter-bash" style="font-family:monospace;"&gt;$ &lt;span style="color: #7a0874; font-weight: bold;"&gt;cd&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;cygdrive&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;d
$ &lt;span style="color: #c20cb9; font-weight: bold;"&gt;wget&lt;/span&gt; &lt;span style="color: #660033;"&gt;-q&lt;/span&gt; &lt;span style="color: #660033;"&gt;-O&lt;/span&gt; - http:&lt;span style="color: #000000; font-weight: bold;"&gt;//&lt;/span&gt;ftp.drupal.org&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;files&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;projects&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;drush-All-Versions-2.1.tar.gz &lt;span style="color: #000000; font-weight: bold;"&gt;|&lt;/span&gt; &lt;span style="color: #c20cb9; font-weight: bold;"&gt;tar&lt;/span&gt; xzf -&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;รอสักครู่ จะได้ไดเร็กทอรี &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;drush&lt;/code&gt;&lt;/span&gt; พร้อมใช้งานในทันที จากนั้นเพื่อความสะดวกก็สร้างลิงก์ไปหาไฟล์ &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;drush&lt;/code&gt;&lt;/span&gt; ไว้ใน PATH ของ Cygwin (เพื่อให้เรียกใช้งานได้จากทุกไดเร็กทอรี) เช่น&lt;/p&gt;

&lt;div class="geshifilter"&gt;&lt;pre class="bash geshifilter-bash" style="font-family:monospace;"&gt;$ &lt;span style="color: #c20cb9; font-weight: bold;"&gt;ln&lt;/span&gt; &lt;span style="color: #660033;"&gt;-s&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;cygdrive&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;d&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;drush&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;drush &lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;usr&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;local&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;bin&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;drush&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Modifying Drush&lt;/h3&gt;

&lt;p&gt;ถ้าใช้วิธีแบบของผม จะต้องแก้ไขไฟล์ของ Drush เล็กน้อย เพราะโค้ดของ Drush บางส่วนเขียนขึ้นเพื่อให้ทำงานกับ PHP บนวินโดวส์ได้ และจะแปลง path เป็น drive:\path\to\file แทนที่จะเป็น /path/to/file ตามระบบไฟล์ของ *nix แต่ตอนนี้เราใช้ PHP บน Cygwin จึงไม่จำเป็นต้องแปลง path กลับไปกลับมาอีก ไฟล์ที่ต้องแก้มี 2 ไฟล์คือ&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;drush/drush&lt;/code&gt;&lt;/span&gt;:&lt;/strong&gt; (คอมเมนต์บรรทัดที่ตรวจสอบว่าเป็น Cygwin ออก)&lt;/p&gt;

&lt;div class="geshifilter"&gt;&lt;pre class="bash geshifilter-bash" style="font-family:monospace;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;# Build the path to drush.php.&lt;/span&gt;
&lt;span style="color: #007800;"&gt;SCRIPT_PATH&lt;/span&gt;=$&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #c20cb9; font-weight: bold;"&gt;dirname&lt;/span&gt; &lt;span style="color: #007800;"&gt;$SELF_PATH&lt;/span&gt;&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;drush.php
&lt;span style="color: #666666; font-style: italic;"&gt;# [[ $(uname -a) == CYGWIN* ]] &amp;amp;&amp;amp; SCRIPT_PATH=$(cygpath -w -a -- &amp;quot;$SCRIPT_PATH&amp;quot;)&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;&lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;drush/includes/environment.inc&lt;/code&gt;&lt;/span&gt;:&lt;/strong&gt; เอาบรรทัดที่ตรวจสอบว่าเป็น Cygwin ออกเช่นกัน&lt;/p&gt;

&lt;div class="geshifilter"&gt;&lt;pre class="php geshifilter-php" style="font-family:monospace;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; _drush_convert_path&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$path&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
  &lt;span style="color: #000088;"&gt;$path&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;a href="http://www.php.net/str_replace"&gt;&lt;span style="color: #990000;"&gt;str_replace&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'\\'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'/'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$path&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
  &lt;span style="color: #666666; font-style: italic;"&gt;// $path = preg_replace('/^\/cygdrive\/([A-Za-z])(.*)$/', '\1:\2', $path);&lt;/span&gt;
&amp;nbsp;
  &lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #000088;"&gt;$path&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Installing Drupal&lt;/h3&gt;

&lt;p&gt;ทำการติดตั้ง Drupal ตามปกติ หรือถ้าติดตั้งไว้แล้วก็ข้ามไปได้เลย ตรงนี้คิดว่าน่าจะทำเป็นกันอยู่แล้ว ถ้ายังไม่เคย แนะนำให้ลองอ่าน &lt;a href="http://drupal.in.th/node/1588"&gt;การติดตั้ง Drupal ภายใน 1 นาที!&lt;/a&gt; ครับ ถึงตรงนี้ถ้าคันไม้คันมืออยากลองใช้ Drush ก็เริ่มได้เลย โดยไปที่ไดเร็กทอรีที่จะติดตั้ง Drupal แล้วพิมพ์คำสั่ง (สมมติต้องการติดตั้งไว้ใน D:\www)&lt;/p&gt;

&lt;div class="geshifilter"&gt;&lt;pre class="bash geshifilter-bash" style="font-family:monospace;"&gt;$ &lt;span style="color: #7a0874; font-weight: bold;"&gt;cd&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;cygdrive&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;d&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;www
$ drush dl drupal&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;รอสักพัก ก็จะได้ไดเร็กทอรี &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;drupal-6.14&lt;/code&gt;&lt;/span&gt; (หรือเวอร์ชันล่าสุด) มาเพื่อทำการติดตั้งต่อไป&lt;/p&gt;

&lt;h3&gt;Editing settings.php&lt;/h3&gt;

&lt;p&gt;เป็นกรรมอีกอย่างของคนใช้วินโดวส์ ที่ MySQL บนวินโดวส์นั้นไม่ค่อยจะลงรอยกับ Cygwin สักเท่าไร โดยเวลารัน Drush บางครั้งมันจะฟ้องว่าหาไฟล์ mysql.sock ไม่เจอ แต่วิธีแก้ไม่ยาก แค่เปิดไฟล์ &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;settings.php&lt;/code&gt;&lt;/span&gt; ของ Drupal แล้วเปลี่ยน localhost ใน &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;$db_url&lt;/code&gt;&lt;/span&gt; เป็น 127.0.0.1 แทน ตามนี้&lt;/p&gt;

&lt;div class="geshifilter"&gt;&lt;pre class="php geshifilter-php" style="font-family:monospace;"&gt;&lt;span style="color: #000088;"&gt;$db_url&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;'mysql://username:password@127.0.0.1/databasename'&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Let's Drush!&lt;/h3&gt;

&lt;p&gt;ถ้าติดตั้ง Drupal เสร็จเรียบร้อยก็ถึงเวลาใช้งาน Drush อย่างเต็มรูปแบบ ก่อนเริ่มใช้งานให้ไปที่ไดเร็กทอรีที่ติดตั้ง Drupal แล้วลองเรียก&lt;/p&gt;

&lt;div class="geshifilter"&gt;&lt;pre class="text geshifilter-text" style="font-family:monospace;"&gt;$ drush status&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;ถ้าทุกอย่างปกติ ควรจะมีข้อความขึ้นมาประมาณนี้&lt;/p&gt;

&lt;div class="geshifilter"&gt;&lt;pre class="text geshifilter-text" style="font-family:monospace;"&gt;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&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;สำหรับวิธีการใช้งาน แนะนำให้อ่าน &lt;a href="http://drupal.org/node/477684"&gt;documentation&lt;/a&gt; หรือพิมพ์คำสั่ง &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;drush&lt;/code&gt;&lt;/span&gt; เฉยๆ มันจะแสดงรายการคำสั่งทั้งหมดออกมา ถ้าต้องการดูรายละเอียดของแต่ละคำสั่ง ก็พิมพ์ &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;--help&lt;/code&gt;&lt;/span&gt; เพิ่ม เช่น&lt;/p&gt;

&lt;div class="geshifilter"&gt;&lt;pre class="text geshifilter-text" style="font-family:monospace;"&gt;$ drush dl --help&lt;/pre&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/suksit?a=Mwcmqc9HE8k:rcBe9givM9Q:V-t1I-SPZMU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=V-t1I-SPZMU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/suksit?a=Mwcmqc9HE8k:rcBe9givM9Q:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/suksit?a=Mwcmqc9HE8k:rcBe9givM9Q:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/suksit?a=Mwcmqc9HE8k:rcBe9givM9Q:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/suksit/~4/Mwcmqc9HE8k" height="1" width="1"/&gt;</description>
 <comments>http://suksit.com/node/267/using-drush-on-windows-with-cygwin#comments</comments>
 <category domain="http://suksit.com/tag/cygwin">cygwin</category>
 <category domain="http://suksit.com/tag/drupal">drupal</category>
 <category domain="http://suksit.com/tag/drush">drush</category>
 <category domain="http://suksit.com/tag/module">module</category>
 <category domain="http://suksit.com/tag/tips-and-tricks">tips and tricks</category>
 <category domain="http://suksit.com/tag/windows">windows</category>
 <pubDate>Sat, 07 Nov 2009 15:12:20 +0000</pubDate>
 <dc:creator>kong</dc:creator>
 <guid isPermaLink="false">267 at http://suksit.com</guid>
<feedburner:origLink>http://suksit.com/node/267/using-drush-on-windows-with-cygwin</feedburner:origLink></item>
<item>
 <title>A Quick (and Dirty) Password Field for Drupal Webform</title>
 <link>http://feedproxy.google.com/~r/suksit/~3/AX5JgRem43I/a-quick-and-dirty-password-field-for-drupal-webform</link>
 <description>&lt;p&gt;หนึ่งในโมดูลยอดนิยมของ Drupal เห็นจะหนีไม่พ้น &lt;a href="http://drupal.org/project/webform"&gt;Webform&lt;/a&gt; ที่ใช้สร้างฟอร์มเพื่อรับข้อมูลแบบทางเดียวจากผู้ใช้ไปยังผู้ดูแลระบบ หรือเก็บข้อมูลที่ไม่ต้องการใช้ความสามารถของ node เช่น ฟอร์มสำหรับติดต่อผู้ดูแลระบบ, ฟอร์มสมัครสมาชิก, ฟอร์มแจ้งการชำระเงิน, ฯลฯ&lt;/p&gt;

&lt;p&gt;เรื่องมีอยู่ว่า ฟอร์มที่ผมต้องการสร้างนั้นจะต้องมีฟิลด์สำหรับใส่รหัสผ่านด้วย แต่ใน component ของ Webform ไม่มีฟิลด์ password มาให้ ลองค้นไปค้นมาก็พบว่ามันเป็น &lt;a href="http://drupal.org/node/133587"&gt;issue ค้างปีมาตั้งแต่ 2007&lt;/a&gt;!!!&lt;/p&gt;

&lt;p&gt;จริงๆ การสร้าง component แบบ password เองนั้นก็ไม่ยาก แค่ copy ไฟล์ textfield.inc มา เปลี่ยนชื่อเป็น password.inc แล้วแก้ชื่อฟังก์ชันข้างในจาก *_textfield เป็น *_password ก็เรียบร้อย (&lt;a href="http://drupal.org/node/130066#comment-783753"&gt;คนอื่นเค้าก็ทำกันแบบนี้&lt;/a&gt;)
&lt;!--break--&gt;
แต่ปกติฟอร์มสำหรับกรอกรหัสผ่านที่ดี ควรจะมีช่อง confirm password ด้วย ซึ่งถ้าทำด้วยวิธีการข้างบน เวลาสร้าง Webform จะต้องสร้างฟิลด์รหัสผ่าน 2 อัน แล้วไปใส่โค้ดเพิ่มในช่อง Additional validation ของ Webform เพื่อให้มันเช็คว่ารหัสผ่านที่ใส่ทั้งสองครั้งตรงกัน สำหรับโค้ดที่ใช้ก็ประมาณนี้&lt;/p&gt;

&lt;div class="geshifilter"&gt;&lt;pre class="php geshifilter-php" style="font-family:monospace;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$form_values&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'submitted_tree'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'login_information'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'password'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color: #339933;"&gt;!=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$form_values&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'submitted_tree'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'login_information'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'confirm_password'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
  form_set_error&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'submitted][login_information][password'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; t&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'The specified passwords do not match.'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;
&lt;span style="color: #000000; font-weight: bold;"&gt;?&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;login_information&lt;/code&gt;&lt;/span&gt; เป็นชื่อ fieldset ส่วนชื่อฟิลด์จริงๆ คือ &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;password&lt;/code&gt;&lt;/span&gt; และ &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;confirm_password&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;วิธีที่ว่ามานี้สำหรับผมขอเรียกว่าวิธี slow and dirty เพราะมันทำให้ชีวิตยุ่งยากขึ้น ถ้ามีการเปลี่ยนชื่อ fieldset หรือชื่อฟิลด์รหัสผ่าน ก็ต้องกลับมาแก้โค้ด validation ทุกครั้ง แต่ก็ใช้งานได้ดีถ้าไม่คิดอะไรมาก&lt;/p&gt;

&lt;p&gt;ส่วนวิธี quick and dirty ที่ตั้งใจจะเขียนจริงๆ นั้น พบโดยบังเอิญตอนพยายามแกะ &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;user.module&lt;/code&gt;&lt;/span&gt; ว่ามันมี form component เฉพาะสำหรับฟิลด์รหัสผ่านให้ด้วย (นึกถึงตอนสร้าง user ใหม่ หรือตอน register user) ซึ่งฟิลด์รหัสผ่านนี้มันจะมาเป็นคู่ และมีระบบ validation มาให้เรียบร้อย แค่กำหนดชนิดของ form component เป็น&lt;/p&gt;

&lt;div class="geshifilter"&gt;&lt;pre class="php geshifilter-php" style="font-family:monospace;"&gt;&lt;span style="color: #0000ff;"&gt;'#type'&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;'password_confirm'&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;หลักการเอามาใช้ใน Webform ก็คล้ายๆ กับวิธี slow and dirty คือ copy ไฟล์ textfield.inc มาเป็นต้นแบบ แล้วแก้ไขโค้ดเพื่อกำหนดชนิดของ form component นอกจากนั้นก็แก้ไขโดยคอมเมนต์ตัวเลือกในส่วน default value กับ disabled ออก เพราะคงไม่มีใครกำหนด default value ให้ฟิลด์รหัสผ่านอยู่แล้ว&lt;/p&gt;

&lt;p&gt;สรุปง่ายๆ ว่า download ไฟล์ข้างล่างนี้ไปใส่ในไดเร็กทอรี &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;webform/components&lt;/code&gt;&lt;/span&gt; โดยตั้งชื่อไฟล์เป็น password.inc ก็จะได้ฟิลด์แบบ password พร้อมระบบ confirm และ validation โผล่ขึ้นมาให้เลือกใช้งานตอนสร้าง Webform ครับ&lt;/p&gt;

&lt;div style="text-align:center"&gt;
&lt;iframe title ="Preview" scrolling="no" marginheight="0" marginwidth="0" frameborder="0" style="width:98px;height:115px;padding:0;background-color:#fcfcfc;" src="http://cid-c9a8999718cddf94.skydrive.live.com/embedicon.aspx/Public/password.inc"&gt;&lt;/iframe&gt;
&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/suksit?a=AX5JgRem43I:NBSponFcOp4:V-t1I-SPZMU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=V-t1I-SPZMU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/suksit?a=AX5JgRem43I:NBSponFcOp4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/suksit?a=AX5JgRem43I:NBSponFcOp4:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/suksit?a=AX5JgRem43I:NBSponFcOp4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/suksit/~4/AX5JgRem43I" height="1" width="1"/&gt;</description>
 <comments>http://suksit.com/node/266/a-quick-and-dirty-password-field-for-drupal-webform#comments</comments>
 <category domain="http://suksit.com/tag/drupal">drupal</category>
 <category domain="http://suksit.com/tag/module">module</category>
 <category domain="http://suksit.com/tag/webform">webform</category>
 <pubDate>Mon, 02 Nov 2009 09:20:56 +0000</pubDate>
 <dc:creator>kong</dc:creator>
 <guid isPermaLink="false">266 at http://suksit.com</guid>
<feedburner:origLink>http://suksit.com/node/266/a-quick-and-dirty-password-field-for-drupal-webform</feedburner:origLink></item>
<item>
 <title>Windows 7 Sticky Notes</title>
 <link>http://feedproxy.google.com/~r/suksit/~3/CyFXflS3LHE/windows-7-sticky-notes</link>
 <description>&lt;p&gt;พยายามหาโปรแกรมประเภท sticky note หรือ to-do list บนวินโดวส์ แต่ยังไม่เจอที่ถูกใจซักที เลยลองใช้ Sticky Notes ของ Windows 7 แก้ขัดไปก่อน สิ่งแรกที่พบเมื่อเริ่มใช้งานก็คือ "ทำไมเปลี่ยนฟอนต์ไม่ได้ฟระ" คือฟอนต์ภาษาอังกฤษมันก็สวยดี แต่ฟอนต์ภาษาไทยมันมาตรฐานไปหน่อย ถ้าพิมพ์สองภาษาในโน๊ตอันเดียวแล้วมันจะดูขัดๆ เลยแก้ปัญหาด้วยการพิมพ์มันเป็นภาษาอังกฤษทั้งหมดซะ -_-a&lt;/p&gt;

&lt;p&gt;ลองคลิกขวาที่โน๊ตดูก็พบว่ามีแค่ตัวเลือกให้เปลี่ยนสีกระดาษ ก็ยังดีกว่าไม่มีอะไรเลย... ก่อนจะฟันธงว่ามันห่วย เลยลอง highlight ข้อความ แล้วกด Ctrl + B ปรากฏว่ามันเปลี่ยนเป็นตัวหนาให้ อ้าวเฮ้ย! จริงๆ ก็เหมือนจะฉลาดนิ เลยลองกด shortcut สำหรับฟอร์แมตข้อความใน MS Word ดูหลายๆ ตัว ก็พบว่ามีบางอันใช้ได้กับ Sticky Notes ด้วย เท่าที่เจอคือ
&lt;!--break--&gt;&lt;/p&gt;

&lt;fieldset&gt;

&lt;legend&gt;การแก้ไขข้อความทั่วไป&lt;/legend&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ctrl + A&lt;/strong&gt; select all&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ctrl + C&lt;/strong&gt; copy (ต้องบอกมั้ยเนี่ย =.=)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ctrl + V&lt;/strong&gt; paste&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ctrl + X&lt;/strong&gt; cut&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ctrl + Z&lt;/strong&gt; undo&lt;/li&gt;
&lt;/ul&gt;

&lt;/fieldset&gt;

&lt;fieldset&gt;

&lt;legend&gt;การจัดรูปแบบข้อความ&lt;/legend&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ctrl + B&lt;/strong&gt; ตัวหนา&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ctrl + I&lt;/strong&gt; ตัวเอียง&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ctrl + U&lt;/strong&gt; ตัวขีดเส้นใต้&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ctrl + T&lt;/strong&gt; ตัวขีดเส้นคร่อม&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ctrl + E&lt;/strong&gt; จัดข้อความกึ่งกลาง&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ctrl + L&lt;/strong&gt; จัดข้อความชิดซ้าย&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ctrl + R&lt;/strong&gt; จัดข้อความชิดขวา&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ctrl + Shift + A&lt;/strong&gt; เปลี่ยนข้อความเป็นตัวพิมพ์ใหญ่ทั้งหมด&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ctrl + Shift + L&lt;/strong&gt; ทำลิสต์ ถ้ากด Ctrl + Shift ค้างไว้ แล้วกด L ไปเรื่อยๆ จะเปลี่ยนรูปแบบของลิสต์ให้ด้วย มีอยู่ประมาณ 4-5 แบบได้&lt;/li&gt;
&lt;/ul&gt;

&lt;/fieldset&gt;

&lt;fieldset&gt;

&lt;legend&gt;การควบคุมโปรแกรม&lt;/legend&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ctrl + D&lt;/strong&gt; ลบโน๊ต&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ctrl + N&lt;/strong&gt; สร้างโน๊ตใหม่&lt;/li&gt;
&lt;/ul&gt;

&lt;/fieldset&gt;

&lt;p&gt;ลอง google ดูก็เจอ shortcut เจ๋งๆ อีกหลายอัน&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ctrl + Shift + &amp;lt;&lt;/strong&gt; (เครื่องหมายน้อยกว่า) ลดขนาดฟอนต์&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ctrl + Shift + &gt;&lt;/strong&gt; (เครื่องหมายมากกว่า) เพิ่มขนาดฟอนต์&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ctrl + Scroll up&lt;/strong&gt; (เลื่อนลูกกลิ้งเมาส์ขึ้น) เพิ่มขนาดฟอนต์&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ctrl + Scroll down&lt;/strong&gt; (เลื่อนลูกกลิ้งเมาส์ลง) ลดขนาดฟอนต์&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;นอกจากนี้ถ้าเป็นการ copy/paste ข้อความจากหน้าเว็บหรือเอกสารเวิร์ด รูปแบบ formatting ของตัวอักษร พวกสี, ขนาด, และฟอนต์ จะเหมือนกับของต้นฉบับด้วย เลยได้วิธีเปลี่ยนฟอนต์แบบถึกๆ มา 1 วิธี คือพิมพ์ใส่เวิร์ดโดยใช้ฟอนต์ที่ต้องการก่อน แล้วค่อยก๊อปมาแปะใน Sticky Notes =.=&lt;/p&gt;

&lt;p&gt;สรุปคือดูแรกๆ เหมือนจะห่วย แต่จริงๆ แล้วเป็นโปรแกรมที่เกือบดี (งงมั้ย 55+) คือแทนที่จะต้องมานั่งจำ shortcut ทั้งหลาย สู้ทำทูลบาร์มาให้เลยดีกว่า (อย่าลืมตัวเลือกสำหรับเปลี่ยนฟอนต์ด้วย) ไม่จำเป็นต้องโชว์ตลอดเวลา แค่เป็นปุ่มให้คลิกเพื่อเรียกทูลบาร์ขึ้นมาอีกทีก็ได้ คือความสามารถของโปรแกรมมันรองรับอยู่แล้ว แค่ทำให้ user friendly มากขึ้นแค่นั้นเอง ได้มั้ยครับไมโครซอฟต์ (&lt;a href="http://www.blognone.com/node/13552"&gt;วันที่ 31 จะไปซื้อวินโดวส์ 7 ของแท้&lt;/a&gt;อยู่แล้วเนี่ย :P)&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/suksit?a=CyFXflS3LHE:mb6rPcKftKg:V-t1I-SPZMU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=V-t1I-SPZMU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/suksit?a=CyFXflS3LHE:mb6rPcKftKg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/suksit?a=CyFXflS3LHE:mb6rPcKftKg:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/suksit?a=CyFXflS3LHE:mb6rPcKftKg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/suksit/~4/CyFXflS3LHE" height="1" width="1"/&gt;</description>
 <comments>http://suksit.com/node/265/windows-7-sticky-notes#comments</comments>
 <category domain="http://suksit.com/tag/tips-and-tricks">tips and tricks</category>
 <category domain="http://suksit.com/tag/windows">windows</category>
 <pubDate>Mon, 26 Oct 2009 15:14:11 +0000</pubDate>
 <dc:creator>kong</dc:creator>
 <guid isPermaLink="false">265 at http://suksit.com</guid>
<feedburner:origLink>http://suksit.com/node/265/windows-7-sticky-notes</feedburner:origLink></item>
<item>
 <title>BTS Love Story</title>
 <link>http://feedproxy.google.com/~r/suksit/~3/Gir41ufbYGQ/bts-love-story</link>
 <description>&lt;p&gt;&lt;a href="http://www.rodfaifahmovie.com"&gt;&lt;img src="http://farm3.static.flickr.com/2589/4031858873_a12c13ff2a_o.jpg" alt="รถไฟฟ้า... มาหานะเธอ" title="รถไฟฟ้า... มาหานะเธอ" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;วันนี้เพิ่งไปดู "รถไฟฟ้า... มาหานะเธอ" ชื่อภาษาอังกฤษจริงๆ มันคือ &lt;strong&gt;B&lt;/strong&gt;angkok &lt;strong&gt;T&lt;/strong&gt;raffic (Love) &lt;strong&gt;S&lt;/strong&gt;tory (เข้าใจว่าพยายามจะให้ย่อเป็น BTS ให้ได้) แต่ผมว่า BTS Love Story อ่านแล้วตรงประเด็นกว่า เลยตั้งชื่อบล็อกแบบนี้แทน&lt;/p&gt;

&lt;p&gt;บอกตามตรงว่าไม่เคยคิดจะไปดูเรื่องนี้แม้แต่นิดเดียว trailer ก็ไม่เคยดู แต่หลังจากออกมาจากโรง บอกได้สั้นๆ ว่า "เสียดายแทนคนที่พลาด"&lt;/p&gt;

&lt;p&gt;สำหรับผมเรื่องนี้เป็นหนังของ GTH ที่ประทับใจที่สุดเท่าที่เคยดูมา (อันดับสองให้ Seasons Change) อาจจะ bias หน่อยๆ เพราะธีมหลักในหนังเป็นสิ่งที่คุ้นเคยอยู่แล้ว (รถไฟฟ้า BTS) เลยอาจจะทำให้อินกับหนังเป็นพิเศษ อีกอย่างคือสงสัยว่าผมจะชอบหนังสไตล์นี้แฮะ นักแสดงหน้าเดิมๆ เหมือนเป็นกิจการในครอบครัว แต่ละคนโผล่มาแล้วทำให้นึกโยงไปถึงหนังเรื่องอื่นด้วย ทำให้อยากหามาดูอีกครั้ง&lt;/p&gt;

&lt;p&gt;เรื่องนี้ก็ทำนองเดียวกับเรื่องอื่นๆ ของ GTH ที่นักแสดงขาประจำมากันครบ (ถึงบางคนจะแค่โผล่มาแว้บๆ ก็ตาม) เนื้ัอเรื่องก็พอเดาได้ตามสไตล์หนังรักโรแมนติกทั่วไป สำหรับคนชอบหนังฮาๆ รับรองว่าได้หัวเราะตั้งแต่เริ่มยันจบ หรือถ้าอยากดูฉากซึ้งๆ เรื่องนี้ก็มีหลายฉากที่ทำให้น้ำตาซึมได้ง่ายๆ&lt;/p&gt;

&lt;fieldset class="collapsible collapsed"&gt;
&lt;legend&gt;spoil หน่อยๆ:&lt;/legend&gt;
&lt;div class="fieldset-wrapper"&gt;

&lt;ul&gt;
&lt;li&gt;ไม่นึกว่าจะมีซันนี่โผล่มาด้วย แค่เห็นหน้าก็ฮาแล้ว มาดในหนังเรื่องนี้เห็นแล้วนึกถึงตอนหนึ่งในเรื่อง "เนื้อคู่ประตูถัดไป"&lt;/li&gt;
&lt;li&gt;ชอบบทของแอ๊ฟในหนัง นางเอกไทยมันต้องแบบนี้ 555+&lt;/li&gt;
&lt;li&gt;โฆษณาแฝงเยอะเหมือนกัน มีทั้ง Ray-Ban, กล้อง Lumix (ตกแล้วเจ๊ง), ร้านกาแฟอะไรซักอย่าง, ฯลฯ ที่โจ่งแจ้งสุดน่าจะเป็น "มาม่า"&lt;/li&gt;
&lt;li&gt;ดีใจฟังอาม่าพูดออก ตอนเหมยลี่ไปดูตัว :D&lt;/li&gt;
&lt;li&gt;เพลงประกอบย้อนยุคมาก ถ้าใครฟังแล้วร้องตามได้ น่าจะอายุไม่ต่ำกว่า 30 หุหุ&lt;/li&gt;
&lt;li&gt;น้องแพทแต่งหน้าแล้วความน่ารักลดลงไปเยอะ &gt;_&amp;lt;&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;/fieldset&gt;

&lt;p&gt;ดูจบแล้วเดินยิ้มออกมาจากโรง แนะนำคนอื่นให้ไปดูต่อได้แบบไม่ต้องกลัวโดนด่า ยิ่งกว่านั้นคือเพิ่งรู้ว่าดูหนังวันพุธที่ SF ลดเหลือที่นั่งละ 40 บาท!!! สุดยอดดดด xD&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/suksit?a=Gir41ufbYGQ:zuMQo0mnqG4:V-t1I-SPZMU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=V-t1I-SPZMU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/suksit?a=Gir41ufbYGQ:zuMQo0mnqG4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/suksit?a=Gir41ufbYGQ:zuMQo0mnqG4:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/suksit?a=Gir41ufbYGQ:zuMQo0mnqG4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/suksit/~4/Gir41ufbYGQ" height="1" width="1"/&gt;</description>
 <comments>http://suksit.com/node/264/bts-love-story#comments</comments>
 <category domain="http://suksit.com/tag/movie">movie</category>
 <category domain="http://suksit.com/tag/rant">rant</category>
 <pubDate>Wed, 21 Oct 2009 16:51:19 +0000</pubDate>
 <dc:creator>kong</dc:creator>
 <guid isPermaLink="false">264 at http://suksit.com</guid>
<feedburner:origLink>http://suksit.com/node/264/bts-love-story</feedburner:origLink></item>
<item>
 <title>PHPExcel</title>
 <link>http://feedproxy.google.com/~r/suksit/~3/eehr1OEhFRY/phpexcel</link>
 <description>&lt;p&gt;ช่วงสัปดาห์ที่ผ่านมา มีโจทย์ให้สร้างเว็บเพื่อเก็บข้อมูลรายงานที่ปกติจะอยู่ในรูปแบบไฟล์ Excel ก็โอเค อยากได้ก็จัดให้ วิธีการที่ใช้ก็คือสร้าง textbox เป็นร้อยไปใส่ใน &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;&amp;lt;table&amp;gt;&lt;/code&gt;&lt;/span&gt; กันดื้อๆ นี่แหละ ซึ่งก็เก็บข้อมูลได้ไม่มีปัญหาอะไร (แต่แอบด่าอยู่ในใจ ทำไมไม่ใช้พวก SharePoint อะไรไปเลยฟระ)&lt;/p&gt;

&lt;p&gt;มาเดือดร้อนตอนแสดงผล เนื่องจากต้องสามารถพรินท์ออกมาเป็นรายงานได้ด้วย ซึ่งรายงานแต่ละหน้าก็ดันหน้าตาไม่เหมือนกันอีก คิดไปคิดมาถ้าจะทำเป็น template ก็ต้องทำเกือบๆ 50 ไฟล์ =.=&lt;/p&gt;

&lt;p&gt;เลยวกกลับมาหา Excel เพราะแต่ก่อนจำได้ว่าเคยสร้างไฟล์ Excel ด้วย PHP แต่ตอนนั้นเป็นการสร้างไฟล์เปล่าๆ ขึ้นมาใหม่ แล้วใส่ข้อมูลลงไป ส่วนคราวนี้จะต่างไปเล็กน้อย เพราะต้องอ่านไฟล์ template ที่แบ่งหน้าและเซ็ต print area ไว้เรียบร้อยแล้วเข้ามาก่อน จากนั้นก็กรอกข้อมูล แล้วค่อยเซฟเป็นรายงาน&lt;/p&gt;

&lt;p&gt;google อยู่ครึ่งวันก็ไม่พบตัวเลือกเจ๋งๆ ซักที เพราะส่วนใหญ่จะเป็นไลบรารี่สำหรับสร้างไฟล์ Excel ขึ้นมาใหม่ ไม่สามารถอ่าน/เขียนไฟล์ที่มีอยู่แล้วได้ จนกระทั่งมาเจอ &lt;a href="http://phpexcel.codeplex.com"&gt;PHPExcel&lt;/a&gt; ก็พบว่า โอ้ววว ตัวนี้แหละ ใช่เลย!
&lt;!--break--&gt;
PHPExcel สามารถอ่าน/เขียนไฟล์ Excel ได้ทั้งแบบเก่าคือ Excel5 ของ MS Office 97/XP/2003 และแบบใหม่คือ OpenXML ของ MS Office 2007 โดยมีข้อแม้นิดหน่อยคือ ถ้าจะทำงานกับไฟล์ Excel 2007 ควรใช้ PHP เวอร์ชันตั้งแต่ 5.2.9 ขึ้นไป แต่ถ้าใช้กับ Excel รุ่นต่ำกว่านั้น ก็ใช้ PHP เวอร์ชัน 5.2.x ได้ทั้งหมด รายละเอียดหลักๆ ดูได้ใน &lt;a href="http://phpexcel.codeplex.com/Wiki/View.aspx?title=Requirements"&gt;Requirements&lt;/a&gt; และ &lt;a href="http://phpexcel.codeplex.com/Wiki/View.aspx?title=FAQ&amp;amp;referringTitle=Home"&gt;FAQ&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;อย่างไรก็ตาม ตัว Reader/Writer สำหรับ Excel5 จะ&lt;a href="http://phpexcel.codeplex.com/WorkItem/View.aspx?WorkItemId=10723"&gt;มีปัญหากับฟอนต์ภาษาไทย&lt;/a&gt;เล็กน้อย ในกรณีของผมคือฟอนต์ EucrosiaUPC แต่คิดว่ากับ Angsana หรือ Cordia ก็น่าจะเจอปัญหาเดียวกัน สำหรับวิธีแก้ไขก็ดูจากไฟล์ patch ในลิงก์ครับ&lt;/p&gt;

&lt;p&gt;สำหรับวิธีใช้คงไม่ต้องแนะนำ เพราะ Documentation ที่อยู่ในหน้าดาวน์โหลดเขียนไว้อย่างละเอียด มีตัวอย่างเพียบ และการ support จากผู้พัฒนาก็จัดอยู่ในขั้นดีมากสำหรับโปรเจกต์โอเพ่นซอร์สแบบนี้ (เห็นพี่แกเข้ามาตอบเกือบทุกวัน)&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/suksit?a=eehr1OEhFRY:ZXmF3F3zdqU:V-t1I-SPZMU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=V-t1I-SPZMU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/suksit?a=eehr1OEhFRY:ZXmF3F3zdqU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/suksit?a=eehr1OEhFRY:ZXmF3F3zdqU:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/suksit?a=eehr1OEhFRY:ZXmF3F3zdqU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/suksit/~4/eehr1OEhFRY" height="1" width="1"/&gt;</description>
 <comments>http://suksit.com/node/263/phpexcel#comments</comments>
 <category domain="http://suksit.com/tag/excel">excel</category>
 <category domain="http://suksit.com/tag/php">php</category>
 <category domain="http://suksit.com/tag/phpexcel">phpexcel</category>
 <category domain="http://suksit.com/tag/tips-and-tricks">tips and tricks</category>
 <pubDate>Wed, 07 Oct 2009 03:03:14 +0000</pubDate>
 <dc:creator>kong</dc:creator>
 <guid isPermaLink="false">263 at http://suksit.com</guid>
<feedburner:origLink>http://suksit.com/node/263/phpexcel</feedburner:origLink></item>
<item>
 <title>Back from Drupal Hell</title>
 <link>http://feedproxy.google.com/~r/suksit/~3/i7ztkBe43xM/back-from-drupal-hell</link>
 <description>&lt;p&gt;เพิ่งกลับจาก&lt;a href="http://twitter.com/gzix/status/4161001626"&gt;ทัวร์นรก Drupal&lt;/a&gt; กับ @&lt;a href="http://twitter.com/gzix"&gt;gzix&lt;/a&gt; (เอ่อ... จริงๆ @gzix ยังไม่กลับ เนื่องจากอยู่ในขุมลึกกว่า ผมแค่ไปเดินชม&lt;a href="http://drupal.org/project/views"&gt;วิว&lt;/a&gt;งาน&lt;a href="http://drupal.org/project/cck"&gt;ก่อสร้าง&lt;/a&gt; กับดู&lt;a href="http://drupal.org/project/calendar"&gt;ตารางเหตุการณ์&lt;/a&gt;นิดหน่อย เลยได้ออกมาก่อน :P)&lt;/p&gt;

&lt;p&gt;ไปทัวร์คราวนี้นับเป็นประสบการณ์ที่น่าประทับใจมากทีเดียวสำหรับผม ทำให้ได้รู้ว่าคนอื่นเค้าไปถึงไหนกันแล้วในโลก Drupal แถมได้เรียนรู้อะไรใหม่ๆ มาเพียบ ไม่ว่าจะเป็นระบบ workspace ออนไลน์ของ &lt;a href="http://www.assembla.com"&gt;Assembla&lt;/a&gt;, ระบบ Subversion hosting อย่าง &lt;a href="http://beanstalkapp.com"&gt;Beanstalk&lt;/a&gt; ที่ช่วยให้ทำงานร่วมกันอย่างเป็นระบบได้ ทั้งที่ไม่เคยเจอหน้ากันแม้แต่ครั้งเดียว!
&lt;!--break--&gt;
ที่สำคัญที่สุดคือทำให้ได้รู้ว่าประสบการณ์ด้าน Drupal เราอยู่ขั้นไหน จากการทัวร์ครั้งนี้พบว่าตัวเองยังอยู่ในระดับ Beginner (โคตรๆ) task บางอย่างที่จริงๆ แล้วแก้ได้ง่ายๆ ก็ดันเสียเวลางมอยู่หลายชั่วโมง หวังว่าคราวหน้าจะทำได้ดีขึ้นกว่าเดิม&lt;/p&gt;

&lt;p&gt;ทัวร์นรกคราวนี้ทำให้รู้จักโมดูลเพิ่มขึ้นอีกเยอะ และทำให้ได้รู้ว่า โปรเจกต์ Drupal จริงๆ มันใช้โมดูลร่วมร้อยตัว และ memory limit 32M ของ PHP เป็นอะไรที่น่าขำมากๆ (ผมต้องตั้ง memory limit เป็น 128M เพื่อรัน Drupal บนเครื่องตัวเอง) อย่างไรก็ตาม ข้อดีของ Drupal คือเราสามารถเอาโมดูลเกือบร้อยตัวมาทำงานร่วมกันได้โดยไม่ต้องแก้ไขโค้ดของโมดูลแม้แต่น้อย ใช้แค่การ override ในระดับธีม กับ custom module อีกนิดหน่อย ก็สร้างระบบที่สามารถรองรับผู้ใช้กว่าหมื่นคนได้แล้ว&lt;/p&gt;

&lt;p&gt;สำหรับโมดูลที่คิดว่าน่าจะมีประโยชน์มาก (แต่ยังใช้ไม่ค่อยเป็น) ประกอบด้วย&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://drupal.org/project/context"&gt;Context&lt;/a&gt; (เพิ่งเคยใช้ ตอนแรกนึกว่าใช้ยาก ปรากฏว่าจริงๆ มี UI หรูหรา คลิกๆ ก็เรียบร้อย)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://drupal.org/project/skinr"&gt;Skinr&lt;/a&gt; (อันนี้&lt;a href="http://webzer.net/node/97#comment-176"&gt;ประจักษ์ในความสามารถแล้ว&lt;/a&gt; แต่ยังไม่เคยเอามา implement โดยตรง)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://drupal.org/project/nodequeue"&gt;Nodequeue&lt;/a&gt; (ยังงงๆ อยู่ เหมือนเอามาใช้ร่วมกับ Views)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://drupal.org/project/panels"&gt;Panels&lt;/a&gt; (เคยขยาดไปทีนึงตอนที่มันเพิ่งเปลี่ยนมาใช้ &lt;a href="http://drupal.org/project/ctools"&gt;CTools&lt;/a&gt; ช่วงแรกๆ แต่ตอนนี้มัน powerful มาก สงสัยต้องลองเล่นดูอีกรอบ)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://drupal.org/project/og"&gt;Organic groups&lt;/a&gt; (รู้แค่ว่าเอาไว้จัดกลุ่มผู้ใช้)&lt;/li&gt;
&lt;li&gt;ฯลฯ (สรุปว่าเยอะ =.=)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;นอกจากนี้ก็ได้รู้จักฟังก์ชันแปลกๆ ที่ไม่เคยคิดว่าจะได้ใช้อย่าง &lt;a href="http://api.drupal.org/api/function/hook_theme_registry_alter"&gt;hook_theme_registry_alter()&lt;/a&gt;, ได้รู้จัก jQuery plugin แจ่มๆ อย่าง &lt;a href="http://colorpowered.com/colorbox"&gt;ColorBox&lt;/a&gt; รวมทั้งได้เห็นการทำงานของฟรีแลนซ์มืออาชีพอย่าง @gzix กับ @&lt;a href="http://twitter.com/john_griffin"&gt;john_griffin&lt;/a&gt; ด้วย&lt;/p&gt;

&lt;p&gt;ปล. ขอบคุณ @gzix ที่คอยเป็นพี่เลี้ยงให้ครับ หวังว่าจะมีโอกาสได้ร่วมงานกันอีก :D&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/suksit?a=i7ztkBe43xM:f50oTzYlgaM:V-t1I-SPZMU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=V-t1I-SPZMU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/suksit?a=i7ztkBe43xM:f50oTzYlgaM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/suksit?a=i7ztkBe43xM:f50oTzYlgaM:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/suksit?a=i7ztkBe43xM:f50oTzYlgaM:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/suksit/~4/i7ztkBe43xM" height="1" width="1"/&gt;</description>
 <comments>http://suksit.com/node/262/back-from-drupal-hell#comments</comments>
 <category domain="http://suksit.com/tag/drupal">drupal</category>
 <category domain="http://suksit.com/tag/rant">rant</category>
 <pubDate>Thu, 24 Sep 2009 03:10:26 +0000</pubDate>
 <dc:creator>kong</dc:creator>
 <guid isPermaLink="false">262 at http://suksit.com</guid>
<feedburner:origLink>http://suksit.com/node/262/back-from-drupal-hell</feedburner:origLink></item>
<item>
 <title>Extending Cygwin's Capability with Cygwin Ports</title>
 <link>http://feedproxy.google.com/~r/suksit/~3/nNYXmvuPsLk/extending-cygwins-capability-with-cygwin-ports</link>
 <description>&lt;p&gt;ด้วยความที่ทำยังไงก็ตัดใจจากวินโดวส์ไม่ได้ แต่ในขณะเดียวกันก็อยากใช้ความสามารถเชลล์ของลินุกซ์ใจจะขาด เลยทำให้ต้องมาพบกันครึ่งทางด้วย &lt;a href="http://www.cygwin.com"&gt;Cygwin&lt;/a&gt; ซึ่งก็ใช้งานได้ดีในระดับหนึ่ง (ใช้โหลด manga ได้ก็คุ้มแล้ว :P)&lt;/p&gt;

&lt;p&gt;อย่างไรก็ตาม ซอฟต์แวร์ที่มากับ Cygwin จะค่อนข้างเก่า หรือบางตัวก็ไม่มี ทั้งๆ ที่น่าจะมี เช่น PHP หรือ Python 3 เป็นต้น (จริงๆ โหลดมาคอมไพล์เองได้ แต่อาจต้องเหนื่อยกับการหา dependencies มาลงให้ครบ)&lt;/p&gt;

&lt;p&gt;แต่โลกโอเพ่นซอร์สยังไม่สิ้นคนดี เมื่อมีคนเล็งเห็นปัญหานี้ แล้วสร้างโครงการ &lt;a href="http://sourceware.org/cygwinports"&gt;Cygwin Ports&lt;/a&gt; ขึ้นมา วัตถุประสงค์ก็แน่นอนว่าเป็นการพอร์ตซอฟต์แวร์มาลงบน Cygwin โดยทำเป็น package ให้เลือกติดตั้งได้เหมือนกับการลง package ของ Cygwin ทั่วๆ ไป
&lt;!--break--&gt;
ถ้าอ่านวิธีติดตั้งซอฟต์แวร์จาก Cygwin Ports ในหน้าโครงการจะดูแล้วยุ่งยากพอสมควร แต่ผมพบว่าวิธีที่ผมใช้ก็สามารถติดตั้งซอฟต์แวร์จาก Cygwin Ports ได้เหมือนกัน โดยมีขั้นตอนดังนี้&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;สร้างโฟลเดอร์สำหรับเก็บไฟล์ติดตั้งของ Cygwin เช่น D:\Downloads\Cygwin&lt;/li&gt;
&lt;li&gt;ดาวน์โหลดไฟล์ &lt;a href="http://www.cygwin.com/#beta-test"&gt;setup.exe เวอร์ชันใหม่ (1.7 beta)&lt;/a&gt; มาใส่ในโฟลเดอร์ดังกล่าว&lt;/li&gt;
&lt;li&gt;สร้างชอร์ตคัตไปหาไฟล์ setup-1.7.exe แล้วแก้ไขคำสั่งที่ใช้เรียกไฟล์ โดยใส่ออพชัน -X เข้าไป (ตามรูป)&lt;/li&gt;
&lt;/ul&gt;

&lt;div style="text-align:center;"&gt;

&lt;p&gt;&lt;img src="http://farm4.static.flickr.com/3516/3889996144_8cedbf0992_o.png" alt="Creating shortcut to run setup.exe with -X option" /&gt;&lt;/p&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;ทุกครั้งที่เราต้องการติดตั้ง/ลบ package เราจะเรียกชอร์ตคัตตัวนี้แทนการรัน setup.exe ตรงๆ&lt;/li&gt;
&lt;li&gt;ดับเบิลคลิกที่ชอร์ตคัตเพื่อเริ่มการติดตั้ง Cygwin ทำการติดตั้งตามปกติ (เลือก Install from Internet ได้เลย) จนถึงตอนเลือก mirror ที่จะดาวน์โหลดไฟล์&lt;/li&gt;
&lt;li&gt;เลือก mirror หลักที่จะใช้ 1 อัน (หรือมากกว่าก็ได้) จากนั้นเพิ่ม mirror ของ Cygwin Ports เข้าไป โดยใส่ URL ตามโค้ดด้านล่างในช่อง User URL แล้วกดปุ่ม Add (เอ่อ.. URL ในรูปผิดนะครับ ต้องใช้ ftp://... ตามด้านล่าง)&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="geshifilter"&gt;&lt;pre class="text geshifilter-text" style="font-family:monospace;"&gt;ftp://sourceware.org/pub/cygwinports&lt;/pre&gt;&lt;/div&gt;

&lt;div style="text-align:center;"&gt;

&lt;p&gt;&lt;img src="http://farm3.static.flickr.com/2559/3889229287_0f91e4d4e3_o.png" alt="Adding mirror for Cygwin Ports" /&gt;&lt;/p&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;ถ้าทำถูกต้อง จะมี mirror ที่ถูกไฮไลต์อยู่สองอัน คือ mirror หลัก กับ Cygwin Ports&lt;/li&gt;
&lt;/ul&gt;

&lt;div style="text-align:center;"&gt;

&lt;p&gt;&lt;img src="http://farm3.static.flickr.com/2472/3890032908_d872435751_o.png" alt="Selected mirros" /&gt;&lt;/p&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;เมื่อกด Next จะเป็นการเรียกหน้าต่าง package listing ขึ้นมา สังเกตว่าจะมี package ของ Cygwin Ports โผล่ขึ้นมาให้เลือกด้วย ข้อดีอย่างหนึ่งของตัว &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;setup-1.7.exe&lt;/code&gt;&lt;/span&gt; คือมันมีระบบค้นหา package มาให้แล้ว (ตัว setup เวอร์ชันเก่าไม่มี)&lt;/li&gt;
&lt;/ul&gt;

&lt;div style="text-align:center;"&gt;

&lt;p&gt;&lt;img src="http://farm4.static.flickr.com/3428/3889251229_a354a6bb8e_o.png" alt="Package selection dialog contains packages from Cygwin Ports" /&gt;&lt;/p&gt;

&lt;/div&gt;

&lt;p&gt;ถึงตอนนี้ก็เลือก package ที่ต้องการ จากนั้นก็จะเป็นขั้นตอนการติดตั้งตามปกติ เท่านี้ก็สามารถใช้ซอฟต์แวร์ที่ปกติจะไม่มีใน Cygwin ได้แล้ว :)&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/suksit?a=nNYXmvuPsLk:B2W56gnu3HE:V-t1I-SPZMU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=V-t1I-SPZMU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/suksit?a=nNYXmvuPsLk:B2W56gnu3HE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/suksit?a=nNYXmvuPsLk:B2W56gnu3HE:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/suksit?a=nNYXmvuPsLk:B2W56gnu3HE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/suksit/~4/nNYXmvuPsLk" height="1" width="1"/&gt;</description>
 <comments>http://suksit.com/node/261/extending-cygwins-capability-with-cygwin-ports#comments</comments>
 <category domain="http://suksit.com/tag/cygwin">cygwin</category>
 <category domain="http://suksit.com/tag/cygwinports">cygwinports</category>
 <category domain="http://suksit.com/tag/windows">windows</category>
 <pubDate>Sat, 05 Sep 2009 15:08:38 +0000</pubDate>
 <dc:creator>kong</dc:creator>
 <guid isPermaLink="false">261 at http://suksit.com</guid>
<feedburner:origLink>http://suksit.com/node/261/extending-cygwins-capability-with-cygwin-ports</feedburner:origLink></item>
<item>
 <title>bombik.com Got Plagiarized</title>
 <link>http://feedproxy.google.com/~r/suksit/~3/0NoYUh7Etk0/bombik-com-got-plagiarized</link>
 <description>&lt;p&gt;&lt;strong&gt;อัพเดต: (2009-09-02 9.00am)&lt;/strong&gt;&lt;/p&gt;

&lt;div class="support"&gt;

&lt;p&gt;ทางผู้ดูแลเว็บไซต์ดังกล่าว ได้แก้ไขบทความทั้งหมด โดยระบุที่มาของแต่ละบทความแล้ว ขอบคุณที่ให้ความร่วมมือครับ :)&lt;/p&gt;

&lt;/div&gt;

&lt;p&gt;วันนี้เพิ่งค้นพบว่า bombik.com โดนก๊อป&lt;a href="http://bombik.com/category/แนะนำโปรแกรมต่างๆ-และวิธีการใช้/วิธีการใช้โปรแกรม-photoscape"&gt;บทความชุด Photoscape&lt;/a&gt; ไปทั้งชุด โดยไม่มีการใส่ลิงก์อ้างอิง... เอ้อ ไม่ใช่สิ มีการใส่ลิงก์อ้างอิง แต่บอกว่ามาจากเว็บตัวเอง -_-a&lt;/p&gt;

&lt;p&gt;ตอนนี้ส่งเมล์ไปแจ้งตามแอดเดรสที่ระบุไว้ในหน้าเว็บแล้ว เนื้อหามีดังนี้
&lt;!--break--&gt;&lt;/p&gt;

&lt;blockquote&gt;

&lt;p&gt;&lt;strong&gt;การนำเนื้อหาในเว็บไซต์ bombik.com ไปใช้โดยไม่ระบุที่มา&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;สวัสดีครับ&lt;/p&gt;

&lt;p&gt;ผมพบว่ามีการนำข้อมูลเนื้อหาและรูปภาพจาก bombik.com ไปใช้ในเว็บ ████████ โดยไม่มีการอ้างอิงที่มา ตามรายการดังนี้ครับ&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;http://████████████/forum/index.php?topic=247.0 ทำสำเนามาจาก&lt;br /&gt;
http://bombik.com/node/24/ตอนที่-1-การดาวน์โหลดและรู้จักโปรแกรม&lt;/li&gt;
&lt;li&gt;http://████████████/forum/index.php?topic=286.0 ทำสำเนามาจาก&lt;br /&gt;
http://bombik.com/node/25/ตอนที่2-รู้จักส่วนต่างๆ-ของหน้าต่างแก้ไขภาพ&lt;/li&gt;
&lt;li&gt;http://████████████/forum/index.php?topic=289.0 ทำสำเนามาจาก&lt;br /&gt;
http://bombik.com/node/29/ตอนที่3-ย่อ-ขยาย-ทำกรอบ-และใส่ตัวอักษรให้กับภาพ&lt;/li&gt;
&lt;li&gt;http://████████████/forum/index.php?topic=290.0 ทำสำเนามาจาก&lt;br /&gt;
http://bombik.com/node/30/ตอนที่4-ทำภาพซีเปียง่ายๆ-ภาพใหม่กลายเป็นภาพเก่า&lt;/li&gt;
&lt;li&gt;http://████████████/forum/index.php?topic=291.0 ทำสำเนามาจาก&lt;br /&gt;
http://bombik.com/node/33/ตอนที่5-ทำภาพให้เหมือนภาพเก่า-โดยการใส่ฟิลเตอร์&lt;/li&gt;
&lt;li&gt;http://████████████/forum/index.php?topic=292.0 ทำสำเนามาจาก&lt;br /&gt;
http://bombik.com/node/34/ตอนที่6-ทำขอบมนและใส่เส้นขอบ&lt;/li&gt;
&lt;li&gt;http://████████████/forum/index.php?topic=330.0 ทำสำเนามาจาก&lt;br /&gt;
http://bombik.com/node/37/ตอนที่7-เพิ่มวัตถุให้กับรูปภาพ&lt;/li&gt;
&lt;li&gt;http://████████████/forum/index.php?topic=331.0 ทำสำเนามาจาก&lt;br /&gt;
http://bombik.com/node/38/ตอนที่8-การเซ็นเซอร์ภาพถ่าย-เฉพาะจุดที่ต้องการ&lt;/li&gt;
&lt;li&gt;http://████████████/forum/index.php?topic=332.0 ทำสำเนามาจาก&lt;br /&gt;
http://bombik.com/node/39/ตอนที่9-การตัดภาพในส่วนที่ต้องการ&lt;/li&gt;
&lt;li&gt;http://████████████/forum/index.php?topic=333.0 ทำสำเนามาจาก&lt;br /&gt;
http://bombik.com/node/44/ตอนที่10-การแก้ตาแดง&lt;/li&gt;
&lt;li&gt;http://████████████/forum/index.php?topic=334.0 ทำสำเนามาจาก&lt;br /&gt;
http://bombik.com/node/51/ตอนที่11-การจัดหน้ารูปภาพ&lt;/li&gt;
&lt;li&gt;http://████████████/forum/index.php?topic=544.0 ทำสำเนามาจาก&lt;br /&gt;
http://bombik.com/node/68/ตอนที่12-การทำภาพหลายๆ-ภาพในครั้งเดียว&lt;/li&gt;
&lt;li&gt;http://████████████/forum/index.php?topic=545.0 ทำสำเนามาจาก&lt;br /&gt;
http://bombik.com/node/93/ตอนที่13-การเปลี่ยนชื่อภาพหลายๆ-ภาพในครั้งเดียว&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;บทความทั้งหมดใน bombik.com ใช้สัญญาอนุญาตของครีเอทีฟคอมมอนส์แบบ แสดงที่มา-ไม่ใช้เพื่อการค้า-ไม่ดัดแปลง 3.0 ประเทศไทย (http://creativecommons.org/licenses/by-nc-nd/3.0/th/) โดยผู้ที่นำบทความไปใช้ต้องระบุที่มาของบทความด้วยเสมอ&lt;/p&gt;

&lt;p&gt;ดังนั้นขอให้คุณแก้ไขบทความในเว็บ ████████ ตามรายการข้างต้น โดยการระบุที่มาของบทความให้ถูกต้องด้วยครับ หรือหากไม่ต้องการอ้างอิงที่มา ทาง bombik.com ขอให้คุณลบบทความดังกล่าวออกทั้งหมด เนื่องจากเป็นการนำไปใช้โดยผิดสัญญาอนุญาตที่เจ้าของผลงานได้ระบุไว้ครับ&lt;/p&gt;

&lt;p&gt;ศึกษิต&lt;br /&gt;
ผู้ดูแลระบบ และผู้ร่วมจัดทำเว็บไซต์ bombik.com&lt;/p&gt;

&lt;/blockquote&gt;

&lt;p&gt;รอดูผลกันต่อไป&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/suksit?a=0NoYUh7Etk0:-amZXq4kLPY:V-t1I-SPZMU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=V-t1I-SPZMU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/suksit?a=0NoYUh7Etk0:-amZXq4kLPY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/suksit?a=0NoYUh7Etk0:-amZXq4kLPY:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/suksit?a=0NoYUh7Etk0:-amZXq4kLPY:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/suksit/~4/0NoYUh7Etk0" height="1" width="1"/&gt;</description>
 <comments>http://suksit.com/node/260/bombik-com-got-plagiarized#comments</comments>
 <category domain="http://suksit.com/tag/creative-commons">creative commons</category>
 <category domain="http://suksit.com/tag/plagarism">plagarism</category>
 <pubDate>Tue, 01 Sep 2009 18:37:53 +0000</pubDate>
 <dc:creator>kong</dc:creator>
 <guid isPermaLink="false">260 at http://suksit.com</guid>
<feedburner:origLink>http://suksit.com/node/260/bombik-com-got-plagiarized</feedburner:origLink></item>
<item>
 <title>How to Limit Privatemsg Recipients to Specific Users</title>
 <link>http://feedproxy.google.com/~r/suksit/~3/q86N-fgNB4w/how-to-limit-privatemsg-recipients-to-specific-users</link>
 <description>&lt;p&gt;คราวที่แล้วเขียนถึง&lt;a href="http://suksit.com/node/253/a-simple-way-to-integrate-webform-and-privatemsg-in-drupal"&gt;การส่งข้อความจาก Webform โดยใช้โมดูล Privatemsg&lt;/a&gt; ไป คราวนี้ก็ยังคงวนเวียนอยู่กับโมดูล &lt;a href="http://drupal.org/project/privatemsg"&gt;Privatemsg&lt;/a&gt; เหมือนเดิม&lt;/p&gt;

&lt;p&gt;พอดีเว็บที่กำลังทำอยู่ มี requirement ว่าให้ผู้ใช้สามารถส่งข้อความส่วนตัวถึงผู้ดูแลระบบได้เท่านั้น โดยระบบส่งข้อความจะใช้โมดูล Privatemsg เป็นหลัก&lt;/p&gt;

&lt;p&gt;วิธีทำที่คิดไว้คร่าวๆ ก็คือต้องแก้ไขฟอร์มสำหรับส่ง private message โดยกำหนดชื่อผู้รับไว้ตายตัวคือ admin จากนั้นก็ disable หรือซ่อนฟิลด์ Recipients ซะ ให้ผู้ใช้กรอกเฉพาะ Subject กับ Body พอ แน่นอนว่าพระเอกของงานนี้คือ &lt;a href="http://drupal.org/node/37775"&gt;Form API&lt;/a&gt;
&lt;!--break--&gt;
หลักการคือสร้างโมดูลใหม่ แล้ว implement &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;hook_form_alter()&lt;/code&gt;&lt;/span&gt; ขี้เกียจอธิบายยาว เอาโค้ดไปดูก่อนละกัน :P&lt;/p&gt;

&lt;div class="geshifilter"&gt;&lt;pre class="php geshifilter-php" style="font-family:monospace;"&gt;&lt;span style="color: #009933; font-style: italic;"&gt;/**
 * Implementation of hook_form_alter().
 */&lt;/span&gt;
&lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; mymodule_form_alter&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #339933;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$form&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #339933;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$form_state&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$form_id&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt; 
  &lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$form_id&lt;/span&gt; &lt;span style="color: #339933;"&gt;==&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;'privatemsg_new'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
    &lt;span style="color: #000088;"&gt;$form&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'privatemsg'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'recipient_list'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;a href="http://www.php.net/array"&gt;&lt;span style="color: #990000;"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;
      &lt;span style="color: #0000ff;"&gt;'#title'&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; t&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'To'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
      &lt;span style="color: #0000ff;"&gt;'#type'&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;'item'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
      &lt;span style="color: #0000ff;"&gt;'#value'&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;'admin'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
      &lt;span style="color: #0000ff;"&gt;'#weight'&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #339933;"&gt;-&lt;/span&gt;10&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
    &lt;span style="color: #000088;"&gt;$form&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'privatemsg'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'recipient'&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt;  &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;a href="http://www.php.net/array"&gt;&lt;span style="color: #990000;"&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;
      &lt;span style="color: #0000ff;"&gt;'#type'&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;'value'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
      &lt;span style="color: #0000ff;"&gt;'#value'&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;'admin'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;อันนี้คือแบบทื่อๆ สุดๆ อธิบายความหมายได้ดังนี้&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;เพิ่มฟิลด์ recipient_list เอาไว้โชว์ให้ผู้ใช้เห็นว่า ฟอร์มนี้จะส่งไปให้ admin นะ สังเกตว่า &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;#type&lt;/code&gt;&lt;/span&gt; เป็น item ธรรมดา ไม่มีประโยชน์อื่นนอกจากเอาไว้แสดงผล&lt;/li&gt;
&lt;li&gt;เปลี่ยนฟิลด์ recipient เป็นแบบ value แล้วกำหนดค่าเป็น admin&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ส่วนที่สำคัญคือฟิลด์ recipient เนื่องจากค่าในฟิลด์นี้ เป็นตัวกำหนดรายชื่อของผู้ใช้ที่ Privatemsg จะส่งข้อความไปให้ ปกติ &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;#type&lt;/code&gt;&lt;/span&gt; ของฟิลด์นี้จะเป็น textfield แต่เราเปลี่ยนให้เป็น value ซะ ซึ่งมันจะไม่โชว์ในฟอร์ม แต่จะส่งค่าไปด้วยเมื่อผู้ใช้กด submit เป็นการบังคับว่ายังไงๆ ก็ต้องส่งไปหา admin ชัวร์ๆ&lt;/p&gt;

&lt;p&gt;แน่นอนว่าถ้าต้องการบังคับให้ส่งไปหามากกว่า 1 คน ก็สามารถระบุลงไปใน &lt;span class="geshifilter"&gt;&lt;code class="geshifilter-text"&gt;#value&lt;/code&gt;&lt;/span&gt; ของฟิลด์ recipient ได้เลย โดยใช้ลูกน้ำคั่น เช่น 'admin, user1, user2'&lt;/p&gt;

&lt;p&gt;จากหลักการนี้เราสามารถปรับเปลี่ยนรูปแบบฟอร์มของ Privatemsg ได้อีกเยอะ ตามแต่ความต้องการ เช่น เปลี่ยนจาก textfield เป็น drop-down list หรืออาจจะกรองรายชื่อ user ตาม role หรือตามข้อกำหนดบางอย่าง ก่อนที่จะเอามากำหนดเป็น value หรือเป็นลิสต์ให้เลือกอีกที เป็นต้น&lt;/p&gt;

&lt;p&gt;ในโมดูลที่ใช้จริงจะมีรายละเอียดมากกว่านี้ เช่น ผู้ใช้บางคนจะสามารถส่งข้อความหาใครก็ได้ ก็สามารถทำได้โดยกำหนด permission ให้ผู้ใช้ แล้วมาเพิ่มเงื่อนไขในโค้ดให้ตรวจสอบก่อนจะแก้ไขฟอร์ม ฯลฯ อะไรทำนองนี้ครับ&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/suksit?a=q86N-fgNB4w:hdh1wJS6XyQ:V-t1I-SPZMU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=V-t1I-SPZMU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/suksit?a=q86N-fgNB4w:hdh1wJS6XyQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/suksit?a=q86N-fgNB4w:hdh1wJS6XyQ:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/suksit?a=q86N-fgNB4w:hdh1wJS6XyQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/suksit/~4/q86N-fgNB4w" height="1" width="1"/&gt;</description>
 <comments>http://suksit.com/node/259/how-to-limit-privatemsg-recipients-to-specific-users#comments</comments>
 <category domain="http://suksit.com/tag/drupal">drupal</category>
 <category domain="http://suksit.com/tag/how-to-0">how-to</category>
 <category domain="http://suksit.com/tag/module">module</category>
 <category domain="http://suksit.com/tag/privatemsg">privatemsg</category>
 <pubDate>Mon, 31 Aug 2009 14:19:22 +0000</pubDate>
 <dc:creator>kong</dc:creator>
 <guid isPermaLink="false">259 at http://suksit.com</guid>
<feedburner:origLink>http://suksit.com/node/259/how-to-limit-privatemsg-recipients-to-specific-users</feedburner:origLink></item>
<item>
 <title>Taking Screenshots of Websites Without Opening Browsers</title>
 <link>http://feedproxy.google.com/~r/suksit/~3/Pk79XPXUlyU/taking-screenshots-of-websites-without-opening-browsers</link>
 <description>&lt;p&gt;พอดีได้รับมอบหมายงานจากหัวหน้า ว่าทำยังไงก็ได้ ให้มีรูปพยากรณ์อากาศจาก&lt;a href="http://www.tmd.go.th/index.php"&gt;เว็บกรมอุตุฯ&lt;/a&gt; มาโชว์บนจอ LCD โดยอัพเดตทุกๆ ชั่วโมง การเอามาโชว์นั้นไม่ยาก เพราะแค่อัพโหลดไฟล์ตามขนาดที่กำหนดเข้าเซิร์ฟเวอร์ หลังจากนั้นโปรแกรมมันจะจัดการให้เอง&lt;/p&gt;

&lt;p&gt;รูปที่ต้องการนั้น 2 ใน 3 สามารถโหลดมาใช้งานได้เลย เพราะเป็นไฟล์ .jpg ธรรมดา ปัญหาคือรูปอุณหภูมิสูงสุด-ต่ำสุดประจำวัน ที่มันดันเป็น Flash ทางออกที่คิดว่าง่ายที่สุดคือ capture หน้าจอมันมาดื้อๆ นี่แหละ&lt;/p&gt;

&lt;p&gt;คำถามคือทำยังไงให้มัน capture หน้าจอให้อัตโนมัติทุกๆ ชั่วโมง ทีแรกว่าจะใช้ AutoIt เปิดบราวเซอร์แล้วสั่ง printscreen แต่คิดว่าดูแล้วไม่ค่อยโปรเท่าไร ลอง google ไป google มา ก็พบว่าอันที่จริงมันมีเครื่องมือแสนสะดวกให้ใช้อยู่แล้ว
&lt;!--break--&gt;
ตัวแรกที่เจอคือ &lt;a href="http://www.websitescreenshots.com"&gt;WebShot&lt;/a&gt; หน้าตาดูดีมีสกุลมาก แต่โหลดมาแล้วเซ็ง เพราะเวอร์ชันฟรีมันจะ capture หน้าจอออกมาเป็นภาพขาว-ดำ เท่านั้น แสรดดดด&lt;/p&gt;

&lt;p&gt;สองตัวต่อมาเจอพร้อมกัน (เพราะมันอยู่ในหน้าเดียวกัน) นั่นคือ &lt;a href="http://iecapt.sourceforge.net"&gt;IECapt&lt;/a&gt; ที่ใช้เอนจิ้นของ IE และ &lt;a href="http://cutycapt.sourceforge.net"&gt;CutyCapt&lt;/a&gt; ที่ใช้ Qt คู่นี้อยู่ใน SourceForge ลอง IECapt แล้วเวิร์ก เลยตัดสินใจใช้ตัวนี้ไปเลย&lt;/p&gt;

&lt;p&gt;จริงๆ CutyCapt ก็น่าลอง เพราะดู command line option แล้วหรูหราอลังการกว่า IECapt ไม่น้อย (cross platform ด้วย) แต่ผมไม่ค่อยมั่นใจเว็บราชการไทยสักเท่าไร เลยเอาตัวที่ชัวร์ๆ ดีกว่า -_-a&lt;/p&gt;

&lt;p&gt;สุดท้ายระหว่างค้นหาเจอโปรแกรมสำหรับทำ screenshot หน้าเว็บทำนองเดียวกันนี้บนลินุกซ์ นั่นคือ &lt;a href="http://khtml2png.sourceforge.net"&gt;khtml2png&lt;/a&gt; ส่วนแมคก็ไม่น้อยหน้า มี &lt;a href="http://www.paulhammond.org/webkit2png"&gt;webkit2png&lt;/a&gt; ไว้ให้ใช้เหมือนกัน&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/suksit?a=Pk79XPXUlyU:sTq5MqbE_Ho:V-t1I-SPZMU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=V-t1I-SPZMU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/suksit?a=Pk79XPXUlyU:sTq5MqbE_Ho:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/suksit?a=Pk79XPXUlyU:sTq5MqbE_Ho:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/suksit?a=Pk79XPXUlyU:sTq5MqbE_Ho:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/suksit?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/suksit/~4/Pk79XPXUlyU" height="1" width="1"/&gt;</description>
 <comments>http://suksit.com/node/258/taking-screenshots-of-websites-without-opening-browsers#comments</comments>
 <category domain="http://suksit.com/tag/cutycapt">cutycapt</category>
 <category domain="http://suksit.com/tag/iecapt">iecapt</category>
 <category domain="http://suksit.com/tag/khtml2png">khtml2png</category>
 <category domain="http://suksit.com/tag/linux">linux</category>
 <category domain="http://suksit.com/tag/tips-and-tricks">tips and tricks</category>
 <category domain="http://suksit.com/tag/webkit2png">webkit2png</category>
 <category domain="http://suksit.com/tag/webshot">webshot</category>
 <category domain="http://suksit.com/tag/windows">windows</category>
 <pubDate>Wed, 26 Aug 2009 04:38:51 +0000</pubDate>
 <dc:creator>kong</dc:creator>
 <guid isPermaLink="false">258 at http://suksit.com</guid>
<feedburner:origLink>http://suksit.com/node/258/taking-screenshots-of-websites-without-opening-browsers</feedburner:origLink></item>
</channel>
</rss>
