<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2enclosuresfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:media="http://search.yahoo.com/mrss/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Tutor0x</title><link>http://tutor0x.blogspot.com/</link><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Tutor0x" /><description>Blog of the geek, by the geek, and for the geek.</description><language>en</language><managingEditor>noreply@blogger.com (Nattawut Phetmak)</managingEditor><lastBuildDate>Sun, 20 May 2012 23:06:10 PDT</lastBuildDate><generator>Blogger http://www.blogger.com</generator><openSearch:totalResults xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">84</openSearch:totalResults><openSearch:startIndex xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">1</openSearch:startIndex><openSearch:itemsPerPage xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">25</openSearch:itemsPerPage><feedburner:info uri="tutor0x" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><itunes:owner><itunes:email>noreply@blogger.com</itunes:email></itunes:owner><itunes:explicit>no</itunes:explicit><itunes:subtitle>Blog of the geek, by the geek, and for the geek.</itunes:subtitle><item><title>Python: จัดการตัวแปรจาก CLI ด้วย argparse</title><link>http://feedproxy.google.com/~r/Tutor0x/~3/8MAP4jhPfqo/python-cli-argparse.html</link><category>Python</category><author>noreply@blogger.com (Nattawut Phetmak)</author><pubDate>Tue, 10 Apr 2012 23:53:53 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3074227793814140422.post-3892554121699342447</guid><description>การสร้าง &lt;a href="http://en.wikipedia.org/wiki/Command-line_interface"&gt;CLI&lt;/a&gt; สำหรับ script ที่รับตัวแปรตอนเรียกโปรแกรมนั้น แม้จะใช้ &lt;code&gt;sys.argv&lt;/code&gt; เพื่อดึงส่วน argument ได้ แต่เมื่อต้องทำงานที่ซับซ้อนแล้ว module ที่จะช่วยให้งานนี้เป็นระเบียบเรียบร้อยคือ &lt;code&gt;argparse&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;ตัวอย่างเช่น โปรแกรม &lt;code&gt;sq.py&lt;/code&gt; ที่จะทำการยกกำลังสองเลขที่รับเข้ามา&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;import argparse  parser = argparse.ArgumentParser() parser.add_argument('num') args = parser.parse_args()  print(int(args.num)**2) &lt;/script&gt;&lt;br /&gt;เมื่อเรียกโปรแกรมนี้ผ่านทาง CLI จะได้ผลลัพท์ดังนี้&lt;br /&gt;&lt;script class="brush: bash" type="syntaxhighlighter"&gt;$ python sq.py usage: sq.py [-h] num sq.py: error: too few arguments $ $ python sq.py 19 361 &lt;/script&gt;&lt;br /&gt;สังเกตกว่า num มีประเภทตัวแปรเป็น string ก่อนที่จะนำไปใช้คำนวณต้องแปลงค่าให้เป็น int ก่อน ซึ่งเราสามารถบอกประเภทให้ตัว parser แต่แรกเลยก็ได้ โดยแก้ไขบรรทัดที่ 4 เป็น&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;parser.add_argument('num', type=int) &lt;/script&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;จากตัวอย่างที่แล้ว ตัวแปร num คือตัวแปรแบบ positional argument ซึ่งหมายความว่า ต้องป้อนตัวแปรเหล่านี้ให้ครบ&lt;br /&gt;&lt;br /&gt;ลองดูโปรแกรม &lt;code&gt;acal.py&lt;/code&gt; ที่รับตัวเลข 3 ตัว แล้วหาผลรวม&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;import argparse  parser = argparse.ArgumentParser() parser.add_argument('num', type=int, nargs=3) args = parser.parse_args()  print(sum(args.num)) &lt;/script&gt;&lt;br /&gt;นอกจากกำหนดจำนวน argument ด้วยตัวเลขแล้ว ยังสามารถใช้ wildcard ?, +, * เพื่อบอกจำนวนก็ย่อมได้ เช่นปรับปรุงโปรแกรมข้างต้นให้รับ argument ได้ไม่จำกัดโดยเปลี่ยนบรรทัดที่ 4 เป็น&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;parser.add_argument('num', type=int, nargs='+') &lt;/script&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;สำหรับตัวแปรอีกประเภทคือ optional argument เช่น -h โดยมีวิธีเขียนที่แตกต่างออกไปเล็กน้อย&lt;br /&gt;&lt;br /&gt;คราวนี้มาปรับปรุง &lt;code&gt;acal.py&lt;/code&gt; ให้รับ optional argument เพื่อให้สามารถเลือก max หรือ min แทนการ sum ได้&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;import argparse  parser = argparse.ArgumentParser() parser.add_argument('num', type=int, nargs='+') parser.add_argument('-M', '--max', dest='main', action='store_const',                     const=max, default=sum) parser.add_argument('-m', '--min', dest='main', action='store_const',                     const=min, default=sum) args = parser.parse_args()  print(args.main(args.num)) &lt;/script&gt;&lt;br /&gt;และยังมี optional argument แบบที่สามารถรับ argument ต่อท้ายอีกได้ด้วย ลองดูตัวอย่างการเปิดไฟล์สำหรับเขียนโดยเพิ่มคำสั่งนี้เข้าไปหลังบรรทัดที่ 8&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;parser.add_argument('-f', '--file', metavar='FILE', dest='file',                     type=argparse.FileType('w')) &lt;/script&gt;&lt;br /&gt;เนื่องจากการเปิดไฟล์ด้วย &lt;code&gt;open&lt;/code&gt; เพื่อเขียนต้องบอก option &lt;code&gt;'w'&lt;/code&gt; ด้วย แต่เพราะ type รับตัวแปรเดียว ตรงนี้ให้ใช้ &lt;code&gt;argparse.FileType('w')&lt;/code&gt; แทน (หรือจะใชประยุกต์ใช้ &lt;code&gt;lambda f: open(f, 'w')&lt;/code&gt; ก็ย่อมได้)&lt;br /&gt;&lt;br /&gt;จุดสังเกตอีกอย่างที่เพิ่มขึ้นมาคือ &lt;code&gt;metavar&lt;/code&gt; ซึ่งเป็นการบ่งว่า optional argument นี้รับตัวแปรเพิ่มได้ แต่ถ้าเอาไปใส่ให้กับ positional argument จะกลายเป็นแค่การบอกชื่อย่อเท่านั้น&lt;br /&gt;&lt;br /&gt;หลังจากเปิดไฟล์กันได้แล้ว ถึงตอนนี้ก็ต้องจัดการกับการแสดงผลที่บรรทัด 11 ใหม่หมด&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;output = args.main(args.num) if args.file:     args.file.write(str(output))     args.file.close() else:     print(output) &lt;/script&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;คราวนี้ก็ลองเขียน help เต็มรูปแบบให้กับ &lt;code&gt;acal.py&lt;/code&gt; กันดูครับ&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;import argparse  parser = argparse.ArgumentParser(description='Advance Calculator.',                                  epilog='WTFPL (C) 2012 neizod') parser.add_argument('numbers', metavar='N', type=int, nargs='+',                     help='list of numbers for summation') parser.add_argument('-M', '--max', dest='main', action='store_const',                     const=max, default=sum, help='find max insteed') parser.add_argument('-m', '--min', dest='main', action='store_const',                     const=min, default=sum, help='find min instead') parser.add_argument('-f', '--file', metavar='FILE', dest='file',                     type=argparse.FileType('w'),                     help='store output to a file') args = parser.parse_args()  output = args.main(args.numbers) if args.file:     args.file.write(str(output))     args.file.close() else:     print(output) &lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3074227793814140422-3892554121699342447?l=tutor0x.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Tutor0x/~4/8MAP4jhPfqo" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tutor0x.blogspot.com/2012/04/python-cli-argparse.html</feedburner:origLink></item><item><title>PHP: แทรก/ดึงข้อมูลออกจากอาร์เรย์ที่เรียงลำดับ</title><link>http://feedproxy.google.com/~r/Tutor0x/~3/CP2jUB4rjGM/php-arraysplice.html</link><category>PHP</category><author>noreply@blogger.com (Nattawut Phetmak)</author><pubDate>Mon, 02 Apr 2012 14:46:57 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3074227793814140422.post-4092559672492433853</guid><description>ใน PHP ตัวแปรชุดแบบอาร์เรย์นั้นจะถูก implement ด้วย &lt;a href="http://en.wikipedia.org/wiki/Hash_table"&gt;hash table&lt;/a&gt; ทั้งหมด นี่อาจเป็นข้อดีในแง่ความสะดวก แต่ถ้าหากเราลองทำอะไรอย่างนี้&lt;br /&gt;&lt;script class="brush: php" type="syntaxhighlighter"&gt;function print_array($array, $size) {     for($i = 0; $i &lt; $size; $i++) {         echo 'at ' . $i . ' = ';         if(isset($array[$i])) {             echo $array[$i];         } else {             echo 'nodata';         }         echo nl2br("\n");     } }  $arr = array('a', 'b', 'c', 'd'); unset($arr[2]);  print_array($arr, 4); // output: //   at 0 = a //   at 1 = b //   at 2 = nodata //   at 3 = d &lt;/script&gt;จะพบว่าตัวที่ถูก &lt;code&gt;unset&lt;/code&gt; ไปนั้น กลายเป็นรูโหว่ๆ อยู่กลางอาร์เรย์ โดยที่ index ของ element ใน array ไม่เลื่อนลงมาถมช่องโหว่ให้เต็ม  ทางแก้นอกจากเลี่ยงไปใช้การวนแบบ foreach แทนแล้ว ในสถานการณ์ที่เลข index มีความสำคัญ (ต้องเลื่อนไปถมให้เต็ม) ก็มี &lt;code&gt;array_splice&lt;/code&gt; สำหรับงานนี้ครับ &lt;script class="brush: php" type="syntaxhighlighter"&gt;$arr = array('a', 'b', 'c', 'd'); array_splice($arr, 2, 1);  print_array($arr, 4); // output: //   at 0 = a //   at 1 = b //   at 2 = d //   at 3 = nodata &lt;/script&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;สำหรับ argument ที่ให้กับ &lt;code&gt;array_splice&lt;/code&gt; จะมีอยู่ทั้งหมด 4 ตัว โดยบังคับใส่อย่างน้อย 2 ตัวได้แก่อาร์เรย์ที่จะเปลี่ยนแปลง และตำแหน่งเริ่มต้นที่จะลบตัวแปรในอาร์เรย์ทิ้ง&lt;br /&gt;&lt;script class="brush: php" type="syntaxhighlighter"&gt;$arr = array('a', 'b', 'c', 'd'); array_splice($arr, 2); // now $arr is array('a', 'b') &lt;/script&gt;&lt;br /&gt;argument ตัวที่ 3 จะเป็นการบอกจำนวนของตัวแปรในอาร์เรย์ที่จะลบทิ้ง&lt;i&gt;ตั้งแต่จุดเริ่มต้นที่ได้บอกไว้&lt;/i&gt; (ถ้าไม่ใส่ก็คือลบทั้งหมด) ซึ่งถ้าตัวเลขนี้เป็นลบ มันจะเป็นการบอกจำนวนของตัวแปรที่เหลือจากการลบนี้แทน&lt;br /&gt;&lt;script class="brush: php" type="syntaxhighlighter"&gt;$arr = array('a', 'b', 'c', 'd'); array_splice($arr, 1, 1);  $arr = array('a', 'b', 'c', 'd'); array_splice($arr, 1, -2);  // both $arr is array('a', 'c', 'd') &lt;/script&gt;&lt;br /&gt;ส่วน argument ตัวสุดท้ายคืออาร์เรย์ที่จะนำเข้ามาแทรกลงในตำแหน่งที่ลบไป และเนื่องจากเราไม่สามารถข้าม argument ตัวที่ 3 ได้ ดังนั้นถ้าต้องการลบอาร์เรย์ต้นฉบับทิ้งจนสุดแล้วค่อยต่อท้ายด้วยอาร์เรย์ใหม่ ให้ใส่ argument ตัวที่ 3 เป็น &lt;code&gt;count&lt;/code&gt; เพื่อให้มั่นใจว่าลบตัวแปรทิ้งจนหมดก็ได้&lt;br /&gt;&lt;script class="brush: php" type="syntaxhighlighter"&gt;$arr = array('a', 'b', 'c', 'd'); array_splice($arr, 2, 0, array('z', 'y')); // now $arr is array('a', 'b', 'z', 'y', 'c', 'd')  $arr = array('a', 'b', 'c', 'd'); array_splice($arr, 1, count($arr), array('e', 'i')); // now $arr is array('a', 'e', 'i') &lt;/script&gt;&lt;br /&gt;อย่างไรก็ตาม แม้ว่าเราจะสามารถใช้เครื่องมือเหล่านี้เพื่อสร้างอาร์เรย์ที่รักษาการเรียงลำดับตัวเลขไว้ได้ แต่โดยพื้นฐานของมันแล้ว มันไม่ได้ implement มาเพื่องานเช่นนี้โดยเฉพาะ ถ้าต้องการทำงานเช่นนี้โดยที่ยังคงประสิทธิภาพไว้อยู่ อาจพิจรณาการ implement แบบ &lt;a href="http://en.wikipedia.org/wiki/Linked_list"&gt;linked list&lt;/a&gt; แทนครับ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3074227793814140422-4092559672492433853?l=tutor0x.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Tutor0x/~4/CP2jUB4rjGM" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tutor0x.blogspot.com/2012/04/php-arraysplice.html</feedburner:origLink></item><item><title>Python: เรียงลำดับข้อมูล</title><link>http://feedproxy.google.com/~r/Tutor0x/~3/he78qOxuwuE/python.html</link><category>Python</category><author>noreply@blogger.com (Nattawut Phetmak)</author><pubDate>Mon, 26 Mar 2012 14:25:12 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3074227793814140422.post-3407109601544626176</guid><description>การเรียงลำดับข้อมูลใน Python นั้น มีเครื่องมือที่ช่วยอำนวยความสะดวกคือ &lt;code&gt;sorted&lt;/code&gt; และ &lt;code&gt;list.sort&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;ความแตกต่างของสองตัวนี้ คือ &lt;code&gt;sorted&lt;/code&gt; จะมองแบบ functional ได้ของใหม่ออกมา (โดยที่ของเก่าไม่เปลี่ยนค่า) ส่วน &lt;code&gt;list.sort&lt;/code&gt; จะมองแบบ OOP คือเข้าไปเปลี่ยนแปลงการเรียงลำดับในตัว list object&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;chaos = [4, 1, 0, 3, 2]  # functional paradigm print(sorted(chaos)) # get: [0, 1, 2, 3, 4] print(chaos) # get: [4, 1, 0, 3, 2]  # OOP paradigm chaos.sort() print(chaos) # get: [0, 1, 2, 3, 4] &lt;/script&gt;&lt;br /&gt;หรือถ้าจะเรียงจากมากไปน้อย&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;chaos.sort(reverse=True) print(chaos) # get: [4, 3, 2, 1, 0] &lt;/script&gt;&lt;br /&gt;สิ่งที่ต้องระวังคือ สมาชิกแต่ละตัวใน list ต้องอยู่ในรูปแบบของข้อมูลที่สามารถนำมาเปรียบเทียบมากกว่า-น้อยกว่าได้ (อย่าง [1, 2, 'a'] หมดสิทธิ์)&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;ตัวเลือกอีกตัวคือ key ที่ใช้ในการเปรียบเทียบ ซึ่งทำได้โดยส่งผ่านฟังก์ชันที่รับค่า 1 ตัวแปรเข้าไปเป็น key&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;letter = ['a', 'b', 'A', 'B']  letter.sort() print(letter) # get: ['A', 'B', 'a', 'b']  letter.sort(key=str.lower) print(letter) # get: ['A', 'a', 'B', 'b']  def test_sort(c):     if c &gt;= 'a':         return ord(c)     else:         return -ord(c)  letter.sort(key=test_sort) print(letter) # get: ['B', 'A', 'a', 'b'] &lt;/script&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;ข้อมูลทางเทคนิคคือการเรียงลำดับจะใช้อัลกอริทึม &lt;a href="http://en.wikipedia.org/wiki/Timsort"&gt;Timsort&lt;/a&gt; ซึ่งมีประสิทธิภาพที่ O(n log n) และเป็นแบบ stable (สมาชิกหลังการจัดเรียงแล้วยังคงลำดับเดิมอยู่) ครับ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3074227793814140422-3407109601544626176?l=tutor0x.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Tutor0x/~4/he78qOxuwuE" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://tutor0x.blogspot.com/2012/03/python.html</feedburner:origLink></item><item><title>PHP: วัน และเวลา</title><link>http://feedproxy.google.com/~r/Tutor0x/~3/mWXCKQR88PM/php_24.html</link><category>PHP</category><author>noreply@blogger.com (mementototem)</author><pubDate>Sat, 24 Mar 2012 00:28:07 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3074227793814140422.post-2634235878658746634</guid><description>ฟังชั่นที่แสดงวัน และเวลาออกมาใน PHP จะใช้ &lt;a href="http://php.net/manual/en/function.date.php"&gt;&lt;code&gt;date()&lt;/code&gt;&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;string &lt;b&gt;date&lt;/b&gt; ( string &lt;i&gt;$format&lt;/i&gt;[, int &lt;i&gt;$timestamp&lt;/i&gt; = &lt;i&gt;time()&lt;/i&gt; ] )&lt;/code&gt;&lt;/blockquote&gt;&lt;code&gt;$format&lt;/code&gt; เป็นตัวกำหนดให้แสดงวัน และ/หรือเวลาออกมาในรูปแบบต่าง ๆ สามารถรายละเอียดของตัวอักษรที่ใช้แสดงผลได้จาก &lt;a href="http://php.net/manual/en/function.date.php"&gt;function.date&lt;/a&gt; นอกจากจะเขียนรูปแบบเองแล้ว PHP ยังเตรียมรูปแบบที่ใช้บ่อย (ในงานเบื้องหลัง) ไว้ให้บางส่วน &lt;ul&gt;&lt;li&gt;&lt;code&gt;DATE_RSS&lt;/code&gt;: รูปแบบที่ใช้สำหรับ RSS (Sat, 24 Mar 2012 12:23:34 +0700)&lt;/li&gt;&lt;li&gt;&lt;code&gt;DATE_COOKIE&lt;/code&gt;: รูปแบบที่ใช้สำหรับ cookie (Saturday, 24-Mar-12 12:23:34 ICT)&lt;/li&gt;&lt;li&gt;&lt;code&gt;DATE_W3C&lt;/code&gt;: รูปแบบตาม &lt;abbr title="World Wide Web Consortium"&gt;W3C&lt;/abbr&gt; (2012-03-24T12:23:34+07:00)&lt;/li&gt;&lt;/ul&gt;ส่วนที่เหลือดูจาก &lt;a href="http://www.php.net/manual/en/class.datetime.php#datetime.constants.types"&gt;class.datetime&lt;/a&gt;&lt;script class="brush: php" type="syntaxhighlighter"&gt;echo date('l, F d, Y'); // print: Saturday, March 24, 2012  echo date('n/j/Y G:i'); // print: 3/24/2012 13:42  echo date('H:i:s'); // print: 13:42:31  echo date(DATE_RSS); // print: Sat, 24 Mar 2012 13:42:31 +0700 &lt;/script&gt;&lt;code&gt;$timestamp&lt;/code&gt; ใช้สร้างวันเวลาขึ้นมาแสดงผล ผ่านฟังชั่น &lt;a href="http://www.php.net/manual/en/function.mktime.php"&gt;&lt;code&gt;mktime()&lt;/code&gt;&lt;/a&gt; และ &lt;a href="http://www.php.net/manual/en/function.strtotime.php"&gt;&lt;code&gt;strtotime()&lt;/code&gt;&lt;/a&gt;&lt;blockquote&gt;&lt;code&gt;int &lt;strong&gt;mktime&lt;/strong&gt; (&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[&amp;nbsp; int &lt;em&gt;$hour&lt;/em&gt; = &lt;em&gt;date("H")&lt;/em&gt; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[, int &lt;em&gt;$minute&lt;/em&gt; = &lt;em&gt;date("i")&lt;/em&gt; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[, int &lt;em&gt;$second&lt;/em&gt; = &lt;em&gt;date("s")&lt;/em&gt; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[, int &lt;em&gt;$month&lt;/em&gt; = &lt;em&gt;date("n")&lt;/em&gt; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[, int &lt;em&gt;$day&lt;/em&gt; = &lt;em&gt;date("j")&lt;/em&gt; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[, int &lt;em&gt;$year&lt;/em&gt; = &lt;em&gt;date("Y")&lt;/em&gt; ]]]]]] ) &lt;br /&gt;&lt;br /&gt;int &lt;strong&gt;strtotime&lt;/strong&gt; ( string &lt;em&gt;$time&lt;/em&gt; [, int &lt;em&gt;$now&lt;/em&gt; = &lt;em&gt;time()&lt;/em&gt; ] ) &lt;/code&gt;&lt;/blockquote&gt;ผลของทั้ง 2 ฟังชั่นเหมือนกันคือได้ &lt;a href="http://en.wikipedia.org/wiki/Unix_timestamp"&gt;unix timestamp&lt;/a&gt; เหมือนกัน แต่ &lt;code&gt;mktime()&lt;/code&gt; จะรับค่าเป็นตัวเลขระบุเจาะจง ส่วน &lt;code&gt;strtotime()&lt;/code&gt; จะรับค่าเป็นข้อความได้&lt;br /&gt;&lt;br /&gt;สำหรับ &lt;code&gt;$now&lt;/code&gt; ใน &lt;code&gt;strtotime()&lt;/code&gt; คือ เวลาที่เริ่มต้นคำนวณ หากระบุค่าของ &lt;code&gt;$time&lt;/code&gt; เป็นข้อความสัมพันธ์กับการเพิ่มลดเวลา &lt;script class="brush: php" type="syntaxhighlighter"&gt;$t = mktime(15, 36, 0, 3, 5, 2012); echo date('l, F d, Y H:i', $t); // print: Monday, March 05, 2012 15:36  // tomorrow but current time $t = mktime(date("H"), date("i"), date("s"), date("n"), date("j")+1, date("Y")); echo date('l, F d, Y H:i') $t); // print: Sunday, March 25, 2012 13:46  $t = strtotime("now"); echo date('l, F d, Y H:i', $t); // print: Saturday, March 24, 2012 13:46  $t = strtotime("tomorrow"); echo date('l, F d, Y H:i', $t); // print: Sunday, March 25, 2012 00:00 // note: time = 00:00  $t = strtotime("+24 hours"); echo date('l, F d, Y H:i', $t); // print: Sunday, March 25, 2012 13:46  $t = strtotime("next saturday"); echo date('l, F d, Y H:i', $t); // print: Saturday, March 31, 2012 00:00  $t = strtotime("April 1, 2012"); echo date('l, F d, Y H:i', $t); // print: Sunday, April 01, 2012 00:00  $t_new = strtotime("+37 days 2 hours", $t); echo date('l, F d, Y H:i', $t_new); // print: Tuesday, May 08, 2012 02:00 &lt;/script&gt;แม้ว่า &lt;code&gt;strtotime()&lt;/code&gt; จะสามารถพิมพ์เป็นภาษาที่มนุษย์เข้าใจได้ทันที แต่ว่าให้ระวังเรื่อง วัน-เดือน-ปี ที่เป็นตัวเลขจำนวนน้อย ๆ เช่น 10-11-12 เพราะบอกยากว่าแท้ที่จริงแล้วเป็นวันที่เท่าไหร่กันแน่ ทาง PHP จะทึกทักเอาเองว่า ถ้าคั่นด้วย / จะเป็นแบบอเมริกัน (m/d/y) แต่ถ้าคั่นด้วย - หรือ . จะเป็นแบบยุโรป (d-m-y) ทางออกที่ดีคือใช้มาตรฐาน ISO 8601 (YYYY-MM-DD) แทน&lt;br /&gt;&lt;br /&gt;ฟังชั่นอื่น ๆ ที่เกี่ยวกับ วัน และเวลา ยังมีอีกมากสามารถอ่านเพิ่มได้จาก &lt;a href="http://www.php.net/manual/en/ref.datetime.php"&gt;ref.datetime&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3074227793814140422-2634235878658746634?l=tutor0x.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Tutor0x/~4/mWXCKQR88PM" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tutor0x.blogspot.com/2012/03/php_24.html</feedburner:origLink></item><item><title>PHP: รับข้อมูลจาก form</title><link>http://feedproxy.google.com/~r/Tutor0x/~3/8USRtzy7gJw/php-form.html</link><category>PHP</category><author>noreply@blogger.com (mementototem)</author><pubDate>Tue, 20 Mar 2012 22:39:04 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3074227793814140422.post-1438994042991440431</guid><description>ในครั้งก่อน ๆ จะเป็นการทำงานเฉพาะส่วนของ PHP ไม่มีการรับค่าจากผู้ใช้ ส่วนอันนี้จะพูดถึงการรับค่าจากผู้ใช้ผ่าน &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; ของ HTML กันบ้าง&lt;br /&gt;&lt;br /&gt;การส่งค่าจาก &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; จะส่งมายังเซิฟเวอร์ได้ 2 แบบคือ &lt;ul&gt;&lt;li&gt;&lt;code&gt;get&lt;/code&gt;: ข้อมูลจะถูกส่งผ่าน URL ทำให้มองเห็นได้ทุกคน และจำกัดปริมาณการส่ง&lt;/li&gt;&lt;li&gt;&lt;code&gt;post&lt;/code&gt;: ข้อมูลที่ส่งจะมองไม่เห็น (ง่าย ๆ) และ (เกือบ) ไม่จำกัดปริมาณการส่ง (ขึ้นอยู่กับค่า &lt;code&gt;post_max_size&lt;/code&gt; ในไฟล์ php.ini)&lt;/li&gt;&lt;/ul&gt;จะส่งค่าแบบใดนั้น ขึ้นอยู่กับข้อมูลที่จะส่ง ถ้าไม่เป็นความลับ หรือต้องการให้มีการคัดลอก URL แล้วเอาไปใช้ได้โดยไม่จำเป็นต้องกรอกข้อมูลอีกก็ใช้ &lt;code&gt;get&lt;/code&gt; ไป แต่ถ้าข้อมูลนั้นเป็นความลับ หรือมีปริมาณมาก ๆ ก็ส่งผ่าน &lt;code&gt;post&lt;/code&gt; โดยกำหนดค่า &lt;code&gt;method&lt;/code&gt; ส่วน &lt;code&gt;action&lt;/code&gt; คือไฟล์ .php ที่จะให้ประมวลผลข้อมูลจาก &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; อันนี้  &lt;script class="brush: html" type="syntaxhighlighter"&gt;&lt;!-- Use 'get' for able to user copy url for later used --&gt;&lt;form method="get" action="bmi.php"&gt;     &lt;label for="height"&gt;Height (cm):&lt;/label&gt;     &lt;input type="text" id="height" name="height" /&gt;     &lt;label for="weight"&gt;Weight (kg):&lt;/label&gt;     &lt;input type="text" id="weight" name="weight" /&gt;     &lt;input type="submit" id="send" name="send" value="Calculate" /&gt;&lt;/form&gt; &lt;!-- Use 'post' for hide username/password from eavesdropping --&gt;&lt;form method="post" action="loginout.php"&gt;     &lt;label for="username"&gt;Username:&lt;/label&gt;     &lt;input type="text" id="username" name="username" /&gt;     &lt;label for="password"&gt;Password:&lt;/label&gt;     &lt;input type="password" id="password" name="password" /&gt;     &lt;input type="submit" id="send" name="send" value="Login" /&gt;&lt;/form&gt;&lt;/script&gt; ส่วนการนำค่ามาใช้งานนั้นจะใช้ผ่าน &lt;code&gt;$_GET&lt;/code&gt; สำหรับ &lt;code&gt;get&lt;/code&gt; และใช้ &lt;code&gt;$_POST&lt;/code&gt; สำหรับ &lt;code&gt;post&lt;/code&gt; ซึ่งเป็น &lt;a href="http://tutor0x.blogspot.com/2012/02/php-arrays.html"&gt;associative array&lt;/a&gt; มี key เป็น &lt;code&gt;name&lt;/code&gt; ของ &lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt; อันนั้น ๆ &lt;br /&gt;&lt;br /&gt;ทั้ง &lt;code&gt;$_GET&lt;/code&gt; และ &lt;code&gt;$_POST&lt;/code&gt; ถือเป็นตัวแปรแบบ superglobal ที่เรียกใช้ได้ทุกที่ตลอดเวลา แตกต่างจากตัวแปรแบบ global ตรงที่ไม่ต้องใส่ &lt;code&gt;global&lt;/code&gt; นำก่อนจะใช้งาน &lt;script class="brush: php" type="syntaxhighlighter"&gt;// file: bmi.php $height = ((int)$_GET['height']) / 100;  // Centimeter to Meter $weight = (int)$_GET['weight']; $bmi = 0;  if ($height &gt; 0 || $weight &gt; 0) {      $bmi = $weight / ($height * $height);      echo 'Your BMI is ' . $bmi; } else {      echo "Are you a spirit?"; }  // file: loginout.php $correct_user = 'root'; $correct_pass = '81dc9bdb52d04dc20036dbd8313ed055';  $user = $_POST['username']; $pass = md5($_POST['password']);  if ($pass === $correct_pass &amp;&amp; $user === $correct_user) {      echo 'Logged in completed, redirecting...'; } else {      echo 'Invalid username or password or both'; } &lt;/script&gt; นอกจากนี้ยังมี &lt;code&gt;$_REQUEST&lt;/code&gt; ที่เก็บค่าทั้งของ &lt;code&gt;$_POST&lt;/code&gt;, &lt;code&gt;$_GET&lt;/code&gt; และ &lt;code&gt;$_COOKIE&lt;/code&gt; ไว้ด้วยกัน แต่เสี่ยงที่จะถูกโจมตี จึงไม่แนะนำให้ใช้ &lt;br /&gt;&lt;br /&gt;และสิ่งสำคัญอีกอย่างคือ ควรจะตรวจสอบความถูกต้อง (validation) ของค่าที่ได้จากผู้ใช้ และ/หรือแปลงค่า (cast) ให้ถูกต้องก่อนจะนำมาใช้งานเสมอ จะเต็มรูปแบบหรือคร่าว ๆ ก็แล้วแต่ความเหมาะสม และหากใช้ค่าที่รับมากับฐานข้อมูล หรือส่งต่อให้ระบบอื่น ๆ ควรจะเรียกใช้ฟังชั่น string escape ที่เกี่ยวข้องเสียก่อนทุกครั้ง ซึ่งจะป้องกันการโจมตีได้ระดับหนึ่ง&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3074227793814140422-1438994042991440431?l=tutor0x.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Tutor0x/~4/8USRtzy7gJw" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://tutor0x.blogspot.com/2012/03/php-form.html</feedburner:origLink></item><item><title>Python: ใช้ทศนิยมแบบ decimal และ fractions</title><link>http://feedproxy.google.com/~r/Tutor0x/~3/uBIOt7d8hL0/python-decimal-fractions.html</link><category>Python</category><author>noreply@blogger.com (Nattawut Phetmak)</author><pubDate>Fri, 16 Mar 2012 13:52:32 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3074227793814140422.post-7038322443540975632</guid><description>การจัดการเลขทศนิยมในคอมพิวเตอร์ส่วนมาก จะใช้ &lt;a href="http://en.wikipedia.org/wiki/Floating_point"&gt;floating point&lt;/a&gt; แบบ &lt;a href="http://en.wikipedia.org/wiki/IEEE_754-2008"&gt;IEEE 754&lt;/a&gt; ทำให้ความแม่นยำในหลักท้ายๆ หายไปเสมอ เช่น&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;a = 0.1 + 0.1 + 0.1 print(a) # get: 0.30000000000000004  print(a == 0.3) # get: False  print(round(a, 10) == 0.3) # get: True &lt;/script&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;ทางแก้นอกจากจะปัดเศษตามข้างต้นแล้ว ยังมี &lt;code&gt;decimal&lt;/code&gt; เมื่อต้องการค่าที่แม่นยำครับ&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;import decimal  d = decimal.Decimal   print(d(1)) # get: Decimal('1') print(d(0.1)) # get: Decimal('0.10000000000000000555111512312578270211815834...') print(d('0.1')) # get: Decimal('0.1')  print(d('0.1') + d('0.1') + d('0.1') == d('0.3')) # get: True &lt;/script&gt;&lt;br /&gt;ค่าปริยายของตำแหน่งทศนิยมอยู่ที่ 28 หลัก คือ&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;r = d('1.23456789012345678901234567890') print(r) # get: Decimal('1.23456789012345678901234567890') (30 places) print(r+1) # get: Decimal('2.234567890123456789012345679') (28 places) &lt;/script&gt;&lt;br /&gt;จะเห็นว่าเมื่อนำมาคำนวณ ความแม่นยำจะถอยกลับมาที่ 28 ตำแหน่ง ถ้าต้องการความละเอียดมากกว่านั้น&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;decimal.getcontext().prec = 50  n = d('1.234567890123456789012345678901234567890') print(n+1) # get: Decimal('2.234567890123456789012345678901234567890') (40 places) &lt;/script&gt;&lt;br /&gt;และการเปลี่ยนวิธีการปัดค่าตัวท้าย&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;print(d(6) / d(9)) # get: Decimal('0.6666666666666666666666666667')  decimal.getcontext().rounding = 'ROUND_DOWN'  print(d(6) / d(9)) # get: Decimal('0.6666666666666666666666666666') &lt;/script&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;ส่วน &lt;code&gt;fractions&lt;/code&gt; เป็นการเก็บเศษส่วนที่เขียนได้ในรูปของจำนวนเต็มหารกัน (&lt;a href="http://en.wikipedia.org/wiki/Rational_number"&gt;จำนวนตรรกยะ&lt;/a&gt;) วิธีใช้คือ&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;import fractions  f = fractions.Fraction  print(f(1, 10)) # get: Fraction(1, 10) print(f('0.1')) # get: Fraction(1, 10) print(f('1/10')) # get: Fraction(1, 10) print(f('1/10') + f('1/10') + f('1/10') == f('3/10')) # get: True  print(f(f(4, 7), f(3, 5))) # get: Fraction(20, 21) &lt;/script&gt;&lt;br /&gt;แม้ว่า &lt;code&gt;fractions&lt;/code&gt; จะไม่สูญเสียความแม่นยำเลย แต่มันก็ไม่สามารถเก็บจำนวนอตรรกยะ (อย่างเช่น &lt;code&gt;sqrt(2)&lt;/code&gt;) ก็เลือกใช้เครื่องมือเหล่านี้ให้ถูกงานนะครับ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3074227793814140422-7038322443540975632?l=tutor0x.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Tutor0x/~4/uBIOt7d8hL0" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tutor0x.blogspot.com/2012/03/python-decimal-fractions.html</feedburner:origLink></item><item><title>PHP: Function</title><link>http://feedproxy.google.com/~r/Tutor0x/~3/Y08zzce_Snw/php-function.html</link><category>PHP</category><author>noreply@blogger.com (mementototem)</author><pubDate>Wed, 14 Mar 2012 04:57:02 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3074227793814140422.post-3101340976688277675</guid><description>ฟังชั่น (function) จะแบ่งเป็น 2 ประเภทคือ &lt;ul&gt;&lt;li&gt;ฟังชั่นที่มากับตัวภาษา (built-in function) เช่น &lt;code&gt;abs()&lt;/code&gt;, &lt;code&gt;max()&lt;/code&gt;, &lt;code&gt;min()&lt;/code&gt;&lt;/li&gt;&lt;li&gt;ฟังชั่นที่สร้างขึ้นเอง&lt;/li&gt;&lt;/ul&gt; ในที่นี้จะพูดถึงการสร้างฟังชั่นขึ้นมาใช้เอง ส่วน built-in function ดูได้จาก &lt;a href="http://www.w3schools.com/php/default.asp"&gt;W3School&lt;/a&gt; (แต่อาจจะนำมาเขียนถึงในบางฟังชั่น)&lt;br /&gt;&lt;br /&gt;การสร้างฟังชั่น จะมีรูปแบบประมาณนี้ &lt;script class="brush: php" type="syntaxhighlighter"&gt;function function_name($parameter) {      // code } &lt;/script&gt; ตัวอย่างการสั่งพิมพ์ข้อความโดยไม่มีการส่งค่า และคืนค่า &lt;script class="brush: php" type="syntaxhighlighter"&gt;function stand_up() {      echo 'Please stand up!'; }  stand_up(); // print: Please stand up! &lt;/script&gt; สำหรับการส่งค่าไปยังฟังชั่น สามารถสั่งได้ 2 แบบคือ &lt;ul&gt;&lt;li&gt;By Value เป็นส่งค่าของตัวแปรไปให้ ซึ่งค่าที่ถูกแก้ไขในฟังชั่นจะไม่ทำให้ค่าของตัวแปรที่ส่งเปลี่ยนแปลงไป&lt;/li&gt;&lt;li&gt;By Reference เป็นส่งตำแหน่งอ้างอิงของตัวแปรไปให้ ซึ่งทำให้ค่าของตัวแปรที่ส่งเปลี่ยนแปลงไป การส่งค่าแบบ by reference จะใช้ &amp; นำหน้าชื่อตัวแปร&lt;/li&gt;&lt;/ul&gt;&lt;script class="brush: php" type="syntaxhighlighter"&gt;// By value function function double($num) {      echo 'Double value of ' . $num . ' is ';      $num = $num * 2;      echo $num; } // By reference function function half(&amp;$num) {     echo 'Half value of ' . $num . ' is ';     $num = $num / 2;     echo $num; }  $x = 50;  double($x); // print: Double value of 50 is 100 echo $x; // print: 50  half($x); // print: Half value of 50 is 25 echo $x; // print: 25  &lt;/script&gt;นอกจากนี้ยังกำหนดค่าโดยปริยาย (default) ให้กับพารามิเตอร์ของฟังชั่นได้โดยใช้ = ส่วนมากมักจะใส่ตัวแปรที่มีค่าโดยปริยายไว้หลังสุด &lt;script class="brush: php" type="syntaxhighlighter"&gt;function vat_include($prize, $vat = 7) {      $total = $prize + (($prize * $vat) / 100);      echo 'Payment: ' . $total; }  // use default vat = 7% vat_include(200); // print: Payment: 214  // use custom vat = 10% vat_include(1000, 10); //print: Payment: 1100 &lt;/script&gt; การคืนค่าจากฟังชั่น ใช้ &lt;code&gt;return&lt;/code&gt;&lt;script class="brush: php" type="syntaxhighlighter"&gt;function power_up($num) {      return $num * $num; }  $pow = power_up(20); // $pow = 400 &lt;/script&gt;&lt;code&gt;return&lt;/code&gt; จะถือว่าเป็นการจบการทำงานของฟังชั่นนั้น เมื่อเจอ &lt;code&gt;return&lt;/code&gt; โค้ดที่อยู่หลัง &lt;code&gt;return&lt;/code&gt; จะไม่ถูกเรียกใช้งาน จึงสามารถนำไปประยุกต์ให้หยุดการทำงานของฟังชั่นเมื่อพบข้อผิดพลาดได้ &lt;script class="brush: php" type="syntaxhighlighter"&gt;function divide_func($base, $divider) {      if (0 == $divide) {           echo 'Cannot divide by zero';           return;      }      $result = $base / $divider;      echo 'Result is ' . $result; } &lt;/script&gt;ใช้ฟังชั่นเมื่อไหร่? ใช้เมื่อรู้สึกว่า จะต้องเขียนชุดคำสั่งเดิม ๆ มากกว่า 1 ครั้ง จำไว้ว่า &lt;strong&gt;โปรแกรมเมอร์นั้นขี้เกียจ&lt;/strong&gt; เราจะไม่เขียนชุดคำสั่งเดิม ๆ ซ้ำเป็นครั้งที่ 2 (ที่จริง เพื่อให้แก้ไขจัดการง่าย ถ้าหากโค้ดมีบั๊ก แก้ที่เดียวจบ)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3074227793814140422-3101340976688277675?l=tutor0x.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Tutor0x/~4/Y08zzce_Snw" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tutor0x.blogspot.com/2012/03/php-function.html</feedburner:origLink></item><item><title>Python: โครงสร้างข้อมูลชุดแบบอื่นๆ จาก collections</title><link>http://feedproxy.google.com/~r/Tutor0x/~3/2l4U77_xJ1I/python-collections.html</link><category>Python</category><author>noreply@blogger.com (Nattawut Phetmak)</author><pubDate>Thu, 15 Mar 2012 06:56:29 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3074227793814140422.post-6824591485055797352</guid><description>นอกจาก list, dictionary, tuple และ set แล้ว ยังมีโครงสร้างข้อมูลชุดแบบอื่นๆ เช่น&lt;br /&gt;&lt;br /&gt;deque ที่ทำความเร็วได้ดีกว่าการใช้ &lt;code&gt;list.append(elem)&lt;/code&gt; และ &lt;code&gt;list.pop(0)&lt;/code&gt; สร้าง&lt;a href="http://en.wikipedia.org/wiki/Queue_(data_structure)"&gt;คิว&lt;/a&gt;เอง&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;from collections import deque  d = deque([1,2,3,4]) d.append(5) print(d) # get: deque([1,2,3,4,5]) d.popleft() # get: deque([2,3,4,5]) &lt;/script&gt;&lt;br /&gt;อีกประเด็ตที่น่าสนใจคือ deque สามารถจำกัดขนาดได้ครับ&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;e = deque('abcde', 3) print(e) # get: deque(['c', 'd', 'e'], maxlen=3) e.appendleft('z') print(e) # get: deque(['z', 'c', 'd'], maxlen=3) e.rotate(1) print(e) # get: deque(['d', 'z', 'c'], maxlen=3) &lt;/script&gt;&lt;br /&gt;ระวังไว้หน่อยตอนที่เพิ่มค่าเข้าไปจนล้น มันไม่ได้คืนตัวที่โดนปัดทิ้งให้นะ&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;defaultdict ที่จะสร้างค่าเริ่มต้นให้เสมอเมื่อเรียกใช้ index ตัวที่ยังไม่มีใน dict&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;from collections import defaultdict  salary = defaultdict(int) print(salary) # get: defaultdict(&lt;class 'int'&gt;, {}) print(salary['jack']) # get: 0 print(salary) # get: defaultdict(&lt;class 'int'&gt;, {'jack': 0}) &lt;/script&gt;&lt;br /&gt;และจะเห็นความง่ายของมันเมื่อสร้าง dict ที่เก็บ list ของ key ที่ซ้ำกันได้&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;like = [('alice', 'lego'), ('mac', 'novel'), ('mac', 'burger'),         ('tom', 'lego'), ('alice', 'barbie')]  child = defaultdict(list) for k, v in like:     child[k].append(v) print(child) # get: defaultdict(&lt;class 'list'&gt;, #          {'mac': ['novel', 'burger'], #           'alice': ['lego', 'barbie'], #           'tom': ['lego]}) &lt;/script&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;namedtuple สำหรับสร้าง tuple ที่มีชื่อสำหรับเรียกแทนตัวแปรต่างๆ (หรืออาจมองว่ามันเป็น struct ที่สามารถเรียกตำแหน่งได้จากทั้งตำแหน่งและชื่อก็ได้)&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;from collections import namedtuple  point = namedtuple('coordinate', 'x y z') p0 = point(1, 2, 3) print(p0) # get: coordinate(x=1, y=2, z=3) p1 = point(z=0, x=4, y=2) print(p1) # get: coordinate(x=4, y=2, z=0)  print(p0[0]+p1[0]) # get: 5 print(p0.x) # get: 1 &lt;/script&gt;&lt;br /&gt;สังเกตความสะดวกในการประกาศตัวแปรชุด xyz นะครับ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3074227793814140422-6824591485055797352?l=tutor0x.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Tutor0x/~4/2l4U77_xJ1I" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://tutor0x.blogspot.com/2012/03/python-collections.html</feedburner:origLink></item><item><title>Python: วัดประสิทธิภาพ code ด้วย timeit</title><link>http://feedproxy.google.com/~r/Tutor0x/~3/WvrK6y4XecQ/python-code-timeit.html</link><category>Python</category><author>noreply@blogger.com (Nattawut Phetmak)</author><pubDate>Sat, 10 Mar 2012 10:44:16 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3074227793814140422.post-5977269414726043260</guid><description>ก่อนที่จะวัดความเร็ว มี 2 ฟังก์ชันที่ควรรู้จักคือ &lt;code&gt;eval&lt;/code&gt; และ &lt;code&gt;exec&lt;/code&gt; ซึ่งจะทำการรับ code ที่เก็บเป็น string มารัน&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;print(eval('2*3*7')) # get: 42  x = 3 exec('x = 7') print(x) # get: 7 &lt;/script&gt;&lt;br /&gt;ความแตกต่างคือ &lt;code&gt;eval&lt;/code&gt; จะสามารถใช้ได้กับ expression เท่านั้น ไม่สามารถใช้กับ statement ได้ (คือไม่สามารถกำหนดค่าให้กับตัวแปรได้นั่นเอง)&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;การวัดความเร็วสามารถทำได้โดยฟังก์ชัน &lt;code&gt;timeit&lt;/code&gt; จากโมดูล &lt;code&gt;timeit&lt;/code&gt; โดยส่งผ่าน code เข้าไปเช่นนี้&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;from timeit import timeit  # compare time creating list [0, 2, 4, 6, 8] print(timeit('list(range(0, 10, 2))')) # get: 0.988918 sec print(timeit('list(range(10))[::2]')) # get: 1.358130 sec print(timeit('[i for i in range(10) if i %2 == 0]')) # get: 2.965018 sec &lt;/script&gt;&lt;br /&gt;ตัวเลือกหนึ่งที่น่าสนใจคือ number ซึ่งหมายถึงรอบที่ใช้ทดลองเพื่อหาเวลารวม (ค่าปริยายคือหนึ่งล้าน) ถ้ารู้สึกว่าใช้เวลาทดลองนานเกินไปก็ลดรอบได้&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;print(timeit('[i for i in range(10) if i %2 == 0]', number=500000)) # get: 1.463683 sec &lt;/script&gt;&lt;br /&gt;ส่วนการจะทดสอบ function ที่เขียนไว้ล่วงหน้าแล้ว ก็ทำได้ผ่านการ setup เช่นนี้&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;def fast_strict():     return [0, 2, 4, 6, 8]  print(timeit('fast_strict()', setup='from __main__ import fast_strict')) # get: 0.315065 sec &lt;/script&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;หรือถ้าหากต้องการทดสอบจาก shell ก็สามารถสั่งแบบนี้ได้&lt;br /&gt;&lt;script class="brush: shell" type="syntaxhighlighter"&gt;$ python -m timeit "(lambda: [0,2,4,6,8])()" 1000000 loops, best of 3: 0.422 usec per loop &lt;/script&gt;&lt;br /&gt;สังเกตว่ารูปแบบการพิมพ์ผลลัพท์ที่ได้จะต่างออกไปเล็กน้อยนะครับ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3074227793814140422-5977269414726043260?l=tutor0x.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Tutor0x/~4/WvrK6y4XecQ" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tutor0x.blogspot.com/2012/03/python-code-timeit.html</feedburner:origLink></item><item><title>Visual Basic: ฟังก์ชันและการทำงานย่อย</title><link>http://feedproxy.google.com/~r/Tutor0x/~3/QJokSaQ1Bvk/visual-basic_08.html</link><category>Visual Basic .NET</category><author>noreply@blogger.com (Nattawut Phetmak)</author><pubDate>Thu, 15 Mar 2012 07:01:16 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3074227793814140422.post-5000000351161252149</guid><description>การทำงานย่อยใน Visual Basic สามารถแบ่งได้เป็น 2 อย่างคือ &lt;code&gt;Function&lt;/code&gt; และ &lt;code&gt;Sub&lt;/code&gt; &lt;br /&gt;&lt;br /&gt;ความแตกต่างคือ &lt;code&gt;Function&lt;/code&gt; เป็นการทำงานย่อยที่ (ควรจะ) ส่งค่าแบบ &lt;code&gt;ByVal&lt;/code&gt; (ส่งค่าของตัวแปรเข้าไป ถ้ามีการเปลี่ยนค่าระหว่างทำงาน ตัวแปรต้นทางจะไม่เปลี่ยน) และเมื่อทำงานเสร็จเรียบร้อยก็ (ควรจะ) ส่งค่าคืนกลับมา เช่น&lt;br /&gt;&lt;script class="brush: vb" type="syntaxhighlighter"&gt;Private Function square(ByVal x As Integer) As Integer     Return x * x End Function &lt;/script&gt;&lt;br /&gt;หรือถ้าจะแหกฎนั้น&lt;br /&gt;&lt;script class="brush: vb" type="syntaxhighlighter"&gt;Private Function square(ByVal x As Integer, ByRef answer As Integer)     answer = x * x     Return Nothing End Function &lt;/script&gt;&lt;br /&gt;สังเกตว่าต้องมีการคืนค่าเสมอนะครับ (แม้จะเขียนโดยที่ไม่ให้คืนค่าก็ตาม)&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;ส่วนการใช้ &lt;code&gt;Sub&lt;/code&gt; จะถูกมองคล้ายๆ การแยกส่วนของ code ออกเป็นหลายๆ ส่วน ตัวแปรส่วนใหญ่ส่งเข้าไปแบบ &lt;code&gt;ByRef&lt;/code&gt; (เมื่อเปลี่ยนค่าตัวแปร ตัวแปรที่ต้นทางจะเปลี่ยนด้วย) และเมื่อทำงานเสร็จจะไม่มีการคืนค่าครับ&lt;br /&gt;&lt;script class="brush: vb" type="syntaxhighlighter"&gt;Private Sub square(ByRef x As Integer, ByRef answer As Integer)     answer = x * x End Sub &lt;/script&gt;&lt;br /&gt;ความแตกต่างอีกอย่างคือการที่ &lt;code&gt;Sub&lt;/code&gt; สามารถ &lt;code&gt;Handles&lt;/code&gt; เหตุการณ์ต่างๆ เช่นการคลิกเมาส์ได้ โดยเปลี่ยนไปส่งผ่านตัวแปรที่เกี่ยวกับ event 2 ตัวแทน (ซึ่งจะเหมือนกับการดับเบิลคลิกเข้าไปเขียน code) ดังนี้&lt;br /&gt;&lt;script class="brush: vb" type="syntaxhighlighter"&gt;Private Sub testSquare(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn1.Click     Dim x As Integer = 5     MessageBox.Show(x * x) End Sub &lt;/script&gt;&lt;br /&gt;(อันที่จริงแล้ว &lt;code&gt;Function&lt;/code&gt; ก็ &lt;code&gt;Handles&lt;/code&gt; ได้ แต่มักไม่ทำกัน เพราะผิด concept)&lt;br /&gt;&lt;br /&gt;สรุปคือตัดสินใจจากสถานการณ์นั้นๆ ว่าจะใช้ &lt;code&gt;Function&lt;/code&gt; (มีการคืนค่า) หรือจะใช้ &lt;code&gt;Sub&lt;/code&gt; (จัดระเบียบ code, อิงกับ event ภายนอก) ให้เหมาะกับงานด้วยนะครับ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3074227793814140422-5000000351161252149?l=tutor0x.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Tutor0x/~4/QJokSaQ1Bvk" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://tutor0x.blogspot.com/2012/03/visual-basic_08.html</feedburner:origLink></item><item><title>PHP: วนรอบ</title><link>http://feedproxy.google.com/~r/Tutor0x/~3/DskiwBYO_Ts/php.html</link><category>PHP</category><author>noreply@blogger.com (mementototem)</author><pubDate>Tue, 06 Mar 2012 20:43:29 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3074227793814140422.post-8109220016819829253</guid><description>การวนรอบ (loop) ใน PHP มี 4 แบบ คือ&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;while&lt;/code&gt;&lt;/strong&gt; ตรวจสอบ แล้วค่อยวนรอบ&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;do...while&lt;/code&gt;&lt;/strong&gt; ทำก่อน 1 ครั้งแล้วค่อยตรวจสอบ&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;for&lt;/code&gt;&lt;/strong&gt; วนรอบตามจำนวนที่กำหนด&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;foreach&lt;/code&gt;&lt;/strong&gt; วนรอบตามจำนวน element ใน array&lt;/li&gt;&lt;/ul&gt;&lt;hr /&gt;&lt;br /&gt; &lt;h3&gt;&lt;code&gt;while&lt;/code&gt;&lt;/h3&gt;&lt;code&gt;while&lt;/code&gt; จะตรวจสอบค่าก่อน หากเป็นจริง จึงวนทำตามคำสั่งภายใน หากเป็นเท็จก็จะไม่วนรอบนั้น ๆ มักใช้ในกรณีที่ไม่รู้จำนวนรอบที่แน่นอน หรือไม่ต้องการหาจำนวนรอบก่อนที่จะวน เช่น วนรอบแสดงข้อมูลจากไฟล์ หรือฐานข้อมูลเป็นต้น &lt;code&gt;while&lt;/code&gt; สามารถเขียนได้ 2 แบบ เช่นเดียวกับ &lt;code&gt;switch&lt;/code&gt;&lt;br /&gt;&lt;script class="brush: php" type="syntaxhighlighter"&gt;&lt;?php  $num = 1;  echo 'Count from 1 to 10: '; while ($num&lt;=10) {      echo $num . ', ';      $num++; }  $readable = false; while ($num &lt;= 10):      // this code is never execute.      echo 'Reading file...'; endwhile; &lt;/script&gt;&lt;hr /&gt;&lt;br /&gt; &lt;h3&gt;&lt;code&gt;do...while&lt;/code&gt;&lt;/h3&gt;&lt;code&gt;do...while&lt;/code&gt; จะทำตามคำสั่งใน &lt;code&gt;do&lt;/code&gt; ก่อน 1 ครั้งแล้วค่อยตรวจสอบ หากยังเป็นจริงก็ทำใน &lt;code&gt;do&lt;/code&gt; อีก โดยทั่วไปแล้วแทบไม่ต่างจาก &lt;code&gt;while&lt;/code&gt; เลย แต่การใช้ &lt;code&gt;do...while&lt;/code&gt; เพื่อให้มั่นใจว่า คำสั่งใน loop จะถูกสั่งแน่ ๆ อย่างน้อย 1 ครั้ง &lt;script class="brush: php" type="syntaxhighlighter"&gt;&lt;?php  $readable = false; $msg = 'Checking status...'; do {      // this code will execute ONLY one time.      echo $msg . '&amp;#60;br /&amp;#62;';      if ($readable == true) {           $msg = 'Reading file...';      } } while ($readable); &lt;/script&gt;&lt;hr /&gt;&lt;br /&gt; &lt;h3&gt;&lt;code&gt;for&lt;/code&gt;&lt;/h3&gt;&lt;code&gt;for&lt;/code&gt; จะวนตามจำนวนที่ระบุเอาไว้จนครบแล้วออกจากการวนรอบ มักใช้ในการวนรอบที่มีจำนวนแน่นอนซึ่งต่างจาก &lt;code&gt;while&lt;/code&gt; และ &lt;code&gt;do...while&lt;/code&gt; ที่มักใช้กับจำนวนรอบที่ไม่แน่นอน &lt;code&gt;for&lt;/code&gt;สามารถเขียนได้ 2 แบบเหมือนกับ &lt;code&gt;while&lt;/code&gt;&lt;script class="brush: php" type="syntaxhighlighter"&gt;&lt;?php  echo 'Count from 1 to 10: '; for($i = 0; $i &lt;= 10; $i++) {      echo $i . ', '; }  // Same as above for($i = 0; $i &lt;= 10; $i++):      echo $i . ', '; endfor; &lt;/script&gt;&lt;hr /&gt;&lt;br /&gt; &lt;h3&gt;&lt;code&gt;foreach&lt;/code&gt;&lt;/h3&gt;&lt;code&gt;foreach&lt;/code&gt; ใช้ในการวนดูข้อมูลใน array เป็นหลัก เขียนได้ 2 แบบเช่นกัน &lt;script class="brush: php" type="syntaxhighlighter"&gt;&lt;?php  $all_subjects = array('Math', 'Science', 'Drawing'); echo 'I learn '; foreach($all_subjects as $subj) {      echo $subj . ', '; }  // loop through Associative Arrays $instructors = array(      'Math'    =&gt; 'Andre Marie Ampere',      'Science' =&gt; 'Albert Einstein',      'Drawing' =&gt; 'Leonardo da Vinci',  ); foreach($instructors as $subject =&gt; $teacher):      echo $teacher . ' teach ' . $subject . '&amp;#60;br /&amp;#62;'; endforeach;  // you can change value in array by use reference prefix (&amp;) $double_this = array(1, 2, 3, 4, 5); foreach($double_this as &amp;$num) {      $num = $num * 2; } // $double_this = array(2, 4, 6, 8, 10) &lt;/script&gt;&lt;hr /&gt;&lt;br /&gt; &lt;h3&gt;&lt;code&gt;break&lt;/code&gt; และ &lt;code&gt;continue&lt;/code&gt;&lt;/h3&gt;&lt;code&gt;break&lt;/code&gt; จะเป็นการออกจากการวนรอบก่อนที่จะครบตามที่กำหนดไว้ &lt;script class="brush: php" type="syntaxhighlighter"&gt;&lt;?php  // print: Count from 1 to 5: 1, 2, 3, 4, 5,  echo 'Count from 1 to 5: '; for($i = 0; $i &lt;= 10; $i++) {      if ($i &gt; 5) {           // break out of loop           break;      }      echo $i . ', '; } &lt;/script&gt;&lt;code&gt;continue&lt;/code&gt; จะข้ามรอบนั้น ๆ ไป แต่ยังวนรอบอยู่เหมือนเดิม &lt;script class="brush: php" type="syntaxhighlighter"&gt;&lt;?php  // print: Simple even number: 2, 4, 6, 8, 10,  echo 'Simple even number: '; for($i = 1; $i &lt;= 10; $i++) {      if (($i % 2) == 1) {           // Odd number? skip this loop           continue;      }      echo $i . ', '; } &lt;/script&gt;&lt;hr /&gt;&lt;br /&gt;&lt;h3&gt;สรุปเรื่องคำสั่งทางเลือก&lt;/h3&gt;จากบทความเรื่อง &lt;a href="http://tutor0x.blogspot.com/2012/02/php-if-else-switch.html"&gt;&lt;code&gt;if...else&lt;/code&gt; และ &lt;code&gt;switch&lt;/code&gt;&lt;/a&gt; กับเรื่องการวนรอบ จะเห็นว่า ใน PHP จะมีคำสั่ง หรือ syntax ทางเลือกอยู่หลายแบบ สรุปรวมเท่าที่เขียนมาทั้งหมดจะมี &lt;ul&gt;&lt;li&gt;&lt;code&gt;if...else&lt;/code&gt; ที่ใช้ &lt;code&gt;if ():&lt;/code&gt; (ร่วมกับ &lt;code&gt;else:&lt;/code&gt; และ/หรือ &lt;code&gt;elseif ():&lt;/code&gt;) และปิดด้วย &lt;code&gt;endif;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;switch&lt;/code&gt; ที่ใช้ &lt;code&gt;switch ():&lt;/code&gt; และปิดด้วย &lt;code&gt;endswitch;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;while&lt;/code&gt; ที่ใช้ &lt;code&gt;while ():&lt;/code&gt; และปิดด้วย &lt;code&gt;endwhile;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;for&lt;/code&gt; ที่ใช้ &lt;code&gt;for ():&lt;/code&gt; และปิดด้วย &lt;code&gt;endfor;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;foreach&lt;/code&gt; ที่ใช้ &lt;code&gt;foreach ():&lt;/code&gt; และปิดด้วย &lt;code&gt;endforeach;&lt;/code&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3074227793814140422-8109220016819829253?l=tutor0x.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Tutor0x/~4/DskiwBYO_Ts" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://tutor0x.blogspot.com/2012/03/php.html</feedburner:origLink></item><item><title>Visual Basic: ตัวแปรชุดแบบอาเรย์</title><link>http://feedproxy.google.com/~r/Tutor0x/~3/39rt4yvjJRc/visual-basic.html</link><category>Visual Basic .NET</category><author>noreply@blogger.com (Nattawut Phetmak)</author><pubDate>Tue, 06 Mar 2012 14:09:44 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3074227793814140422.post-1564450588816828401</guid><description>แนวคิด array ใน Visual Basic อาจมองได้ว่ามันเป็น object ที่เรียกใช้ attribute เป็นตัวเลขก็ได้&lt;br /&gt;&lt;script class="brush: vb" type="syntaxhighlighter"&gt;Private Sub testArray(...) Handles btn1.Click     Dim numbers(1) As Integer      numbers(0) = 42     numbers(1) = 666      ' get 1st element of array     MessageBox.Show(numbers(0)) End Sub &lt;/script&gt;&lt;br /&gt;สังเกตว่า การประกาศขนาด array จะบอกเป็นขนาดลบด้วยหนึ่ง ถ้ากลัวงง จะไม่ประกาศขนาด array ก็สามารถทำเช่นนี้ได้&lt;br /&gt;&lt;script class="brush: vb" type="syntaxhighlighter"&gt;Private Sub testArray(...) Handles btn1.Click     Dim words() As String      words = {"hi", "hello", "how are you"} End Sub &lt;/script&gt;&lt;br /&gt;และ attribute ประจำ array ที่ควรรู้ก็คือ&lt;br /&gt;&lt;script class="brush: vb" type="syntaxhighlighter"&gt;Private Sub testArray(...) Handles btn1.Click     Dim numbers(2) As String = {1, 2, 3}      ' get length of array     MessageBox.Show(numbers.Length) End Sub &lt;/script&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;สำหรับ array ในหลายมิติ ก็ใช้เครื่องหมาย &lt;code&gt;,&lt;/code&gt; คั่นแต่ละมิติออกจากกัน&lt;br /&gt;&lt;script class="brush: vb" type="syntaxhighlighter"&gt;Private Sub testArray(...) Handles btn1.Click     Dim grid(,) As String     grid = {{"A", "B", "C"}, {"D", "E", "F"}, {"G", "H", "I"}}      ' get element at (0, 2)     MessageBox.Show(grid(0, 2)) End Sub &lt;/script&gt;&lt;br /&gt;แต่คราวนี้ การใช้ตรวจสอบขนาดโดยใช้ &lt;code&gt;Length&lt;/code&gt; จะให้ผลลัพท์ที่ประหลาดแล้ว ถ้าต้องการขนาดของ array ในมิติย่อยๆ ให้ใช้ &lt;code&gt;GetLength&lt;/code&gt; แทน&lt;br /&gt;&lt;script class="brush: vb" type="syntaxhighlighter"&gt;Private Sub testArray(...) Handles btn1.Click     Dim box(,,) As Integer     box = {{{1, 2, 3}, {4, 5, 6}}}      ' length of 1st dimension     MessageBox.Show(box.GetLength(0)) End Sub &lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3074227793814140422-1564450588816828401?l=tutor0x.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Tutor0x/~4/39rt4yvjJRc" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tutor0x.blogspot.com/2012/03/visual-basic.html</feedburner:origLink></item><item><title>ร้อยไลค์</title><link>http://feedproxy.google.com/~r/Tutor0x/~3/qIXy1eEb0Kw/blog-post.html</link><category>Announcement</category><author>noreply@blogger.com (Nattawut Phetmak)</author><pubDate>Sat, 03 Mar 2012 03:35:13 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3074227793814140422.post-8956640332586498330</guid><description>นับตั้งแต่วันที่&lt;a href="http://tutor0x.blogspot.com/2011/10/blog-post.html"&gt;ปัดฝุ่น&lt;/a&gt;เว็บ ขอจดไว้ว่า เราบรรลุ milestone แรกที่ 100 like แล้วครับ!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;สถิติเล็กน้อยๆ&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ใช้เวลาเก็บ achievement นี้ไป 129 วัน&lt;/li&gt;&lt;li&gt;รวมได้ 9,142 visits และ 13,755 pageviews&lt;/li&gt;&lt;li&gt;new/return visitor อยู่ที่ 55% ต่อ 45%&lt;/li&gt;&lt;li&gt;ใช้ Chrome เข้ากันถึง 57% เลย! ส่วน Firefox ก็ 27%&lt;/li&gt;&lt;li&gt;Windows 78%, Mac 10%, Linux 7%&lt;/li&gt;&lt;li&gt;traffic 92% มาจาก &lt;a href="http://www.blognone.com/"&gt;Blognone&lt;/a&gt; (ขอขอบคุณมา ณ ที่นี้ด้วย)&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3074227793814140422-8956640332586498330?l=tutor0x.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Tutor0x/~4/qIXy1eEb0Kw" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tutor0x.blogspot.com/2012/03/blog-post.html</feedburner:origLink></item><item><title>let's code: ย่อโปรแกรมให้สั้นที่ 140byt.es</title><link>http://feedproxy.google.com/~r/Tutor0x/~3/6rTQWycw5V4/lets-code-140bytes.html</link><category>Let's Code</category><author>noreply@blogger.com (Nattawut Phetmak)</author><pubDate>Sat, 03 Mar 2012 07:29:56 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3074227793814140422.post-2259421434489549682</guid><description>&lt;a href="http://140byt.es/"&gt;140byt.es&lt;/a&gt; เป็นเว็บที่เกิดจากกลุ่มผู้ใช้งานทวิตเตอร์ เล่นสนุกกันโดยการเขียน code สั้นๆ แล้วทวีต (เพราะทวิตเตอร์อนุญาตให้ใช้ได้แค่ 140 ตัวอักษรต่อทวีต) ดังนั้นหลายๆ อันก็ต้องลงมือเขียนแบบ obfuscate กันเลยทีเดียว นับได้ว่าเป็นการฝึกพลังลมปราณอย่างหนึ่งนะครับ ;D&lt;br /&gt;&lt;br /&gt;ความแตกต่างที่น่าสนใจจากที่อื่นๆ คือ ไม่มีโจทย์ตายตัวว่าจะต้องเขียนโปรแกรมอะไร ย่อให้ได้สั้นเท่าไหร่ แต่ขึ้นอยู่กับเราเลยว่าคิดอะไรออก แล้วก็ย่อให้อยู่ในขนาด 140 ตัวอักษรก็พอ (เกินก็ได้ - แล้วค่อยๆ แก้กันไปเรื่อยๆ) หรือว่าถ้ายังไม่แก่กล้าพอก็ไปศึกษา/ให้ความเห็น code ของคนอื่นๆ ก่อนก็ได้ ด้านประเภทของโปรแกรมก็มีอยู่หลากหลายมาก ตั้งแต่คำนวณทางคณิตศาสตร์ธรรมดาๆ ไปจนกระทั่งเขียนเกมกันเลยทีเดียว&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;ภาษาที่ใช้ได้&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;JavaScript&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;รูปแบบการตรวจคำตอบ&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;ส่ง source code ให้ชุมชนช่วยกันตรวจสอบ&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;ตัวอย่างโปรแกรม&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://gist.github.com/998671"&gt;Fibonacci (41b)&lt;/a&gt;: มือใหม่เริ่มที่ตรงนี้เลยครับ กับการหาเลขฟีโบนัชชีแบบง่ายๆ โดยการ recursive&lt;/li&gt;&lt;li&gt;&lt;a href="https://gist.github.com/983535"&gt;RGB to HEX (68b)&lt;/a&gt;: แปลงค่าสีจากตัวเลขของ RGB ไปเป็น code สีตัวอักษร เทคนิคคือ shift bit&lt;/li&gt;&lt;li&gt;&lt;a href="https://gist.github.com/1188477"&gt;Konami Code (105b)&lt;/a&gt;: ปลดล็อกสูตร 30 ตัว จากการตวจสอบ regular expression&lt;/li&gt;&lt;li&gt;&lt;a href="https://gist.github.com/1334626"&gt;Minesweeper (125b)&lt;/a&gt;: เกมกู้ระเบิดนั่นเองครับ (เริ่มแกะ code ไม่รู้เรื่องแล้ว 555+)&lt;/li&gt;&lt;li&gt;&lt;a href="https://gist.github.com/1029102"&gt;Vigenère Cypher (138b)&lt;/a&gt;: รหัสลับวิจเญอแนร์ (เลื่อนอักษรตามขนาดอักษรแต่ละตัวในกุญแจ)&lt;/li&gt;&lt;li&gt;&lt;a href="https://gist.github.com/1230481"&gt;Sudoku (141b)&lt;/a&gt;: แก้ซูโดกุ เกินมาแค่ตัวเดียวเองนะ :'D (ใครสนใจไปช่วยลดขนาดมันบ้าง)&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3074227793814140422-2259421434489549682?l=tutor0x.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Tutor0x/~4/6rTQWycw5V4" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tutor0x.blogspot.com/2012/03/lets-code-140bytes.html</feedburner:origLink></item><item><title>let's code: แก้โจทย์ Google Code Jam</title><link>http://feedproxy.google.com/~r/Tutor0x/~3/jkLf9H2Cg_0/lets-code-google-code-jam.html</link><category>Let's Code</category><author>noreply@blogger.com (Nattawut Phetmak)</author><pubDate>Tue, 28 Feb 2012 12:31:09 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3074227793814140422.post-4109215991316152806</guid><description>&lt;a href="http://code.google.com/codejam/"&gt;Google Code Jam&lt;/a&gt; เป็นงานแข่งขันแก้โจทย์โปรแกรมมิ่งที่ Google จัดขึ้นปีละครั้งในช่วงปิดเทอม ของรางวัลนอกเหนือไปเงินเป็นหมื่นเหรียญสำหรับผู้ชนะเลิศแล้ว สิ่งที่ล่อตาล่อใจเหล่า geek ทั้งหลาย คงหนีไม่พ้นเสื้อยืดกูเกิลสำหรับยอดฝีมือ 1000 คนแรกเท่านั้น เรียกได้ว่า ใส่แล้วหล่อราศีจับกันเลยทีเดียว&lt;br /&gt;&lt;br /&gt;และถึงแม้ว่างานจะมีจัดแค่ปีละหนึ่งครั้ง แต่ตัวเว็บก็สามารถเข้าไปแก้โจทย์เล่นได้ตลอดเวลาครับ ซึ่งก็พอมีโจทย์ที่ไม่ยากเท่าไหร่โผล่มาบ้าง (หาดูได้ในรอบคัดตัว) แต่โจทย์ส่วนใหญ่ก็ไม่ใช่สนามเด็กเล่นสำหรับมือใหม่แน่ๆ ข้อดีอีกอย่างที่น่าสนใจคือการที่สามารถใช้ได้หลากหลายภาษา จึงเหมาะอย่างยิ่งสำหรับผู้ที่เป็นภาษาใดภาษาหนึ่งอยู่แล้ว และต้องการฝึกฝนภาษาใหม่ๆ เพิ่มเติมครับ&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;ภาษาที่ใช้ได้&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;ภาษาใดก็ได้ที่มี compiler ฟรีให้ใช้งาน&lt;br /&gt;(ตัวอย่างภาษาที่ไม่ผ่านเกณฑ์เช่น Maple, Mathematica)&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;รูปแบบการตรวจคำตอบ&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;ดาว์นโหลด test case มาประมวลผลเอง แล้วส่งคำตอบ (พร้อม source code) ให้ server&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;ตัวอย่างโจทย์&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/codejam/contest/351101/dashboard#s=p1"&gt;Reverse Words&lt;/a&gt;: ให้ประโยคในภาษาอังกฤษมาประโยคหนึ่ง จงเรียงลำดับของคำแต่ละคำใหม่ โดยกลับให้ตำแหน่งของคำที่อยู่ด้านท้ายมาอยู่ด้านหน้า ด้านหน้าลงไปอยู่ด้านท้าย&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/codejam/contest/189252/dashboard#s=p1"&gt;Center of Mass&lt;/a&gt;: ให้ตำแหน่งและความเร็วของหิ่งห้อยกลุ่มหนึ่งมา จงหาว่าที่เวลาเท่าใด จุดศูนย์กลางมวลของกลุ่มหิ่งห้อยกลุ่มนั้น จะเข้าไปใกล้กับจุด origin มากที่สุด และจุดนั้นอยู่ห่างจากจุด origin เป็นระยะทางเท่าใด สมมติว่านี่เป็นหิ่งห้อยในอุดมคติ (มวลเท่ากัน, ขนาดเป็นศูนย์)&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/codejam/contest/90101/dashboard#s=p1"&gt;Watersheds&lt;/a&gt;: ให้แผนที่ระดับความสูงของป่าแห่งหนึ่งมา สมมติว่าเกิดฝนตกทั่วป่า จงแบ่งโซนพื้นที่ป่าแห่งนั้น โดยมีกฎว่าน้ำฝนที่ตกลงมาสู่พื้นนั้น จะไหลจากที่สูงลงไปยังที่ต่ำที่สุดเสมอ&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3074227793814140422-4109215991316152806?l=tutor0x.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Tutor0x/~4/jkLf9H2Cg_0" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tutor0x.blogspot.com/2012/02/lets-code-google-code-jam.html</feedburner:origLink></item><item><title>Python: เทคนิคสำหรับเขียนให้สั้น</title><link>http://feedproxy.google.com/~r/Tutor0x/~3/mQTpGg-l9_U/python.html</link><category>Python</category><author>noreply@blogger.com (Nattawut Phetmak)</author><pubDate>Sat, 25 Feb 2012 12:42:20 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3074227793814140422.post-874568108051861784</guid><description>ในภาษาอื่น อาจพบ shorthand if-else เช่น &lt;code&gt;condition ? true : false ;&lt;/code&gt; ส่วนใน Python เรามี&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;True if condition else False &lt;/script&gt;&lt;br /&gt;อย่าลืมว่าการย่อแบบนี้ ต้องมีส่วน else เสมอนะครับ&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;สำหรับ generator expressions (หรือที่มักเรียกกันว่า list comprehension เมื่อได้ผลลัพท์เป็น list) มีเทคนิคการกรองข้อมูล (filter) เช่นนี้&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;[i for i in range(10) if i%2 == 0] # get: [0, 2, 4, 6, 8] &lt;/script&gt;&lt;br /&gt;ส่วนการซ้อนชั้นของประโยค for ก็จะไล่ทำจากด้านหน้าไปด้านหลังเรื่อยๆ เช่นเดียวกับการวน for หลายชั้นครับ&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;[i+j for i in 'abc' for j in 'xyz' if ord(j)-ord(i) != 23] # get: ['ay', 'az', 'bx', 'bz', 'cx', cy'] &lt;/script&gt;&lt;br /&gt;ข้อสังเกตคือ การ filter นี้มีแต่ if อย่างเดียวนะครับ ไม่มี else และถ้าเอาไปใช้รวมกับ shorthand if-else ก็ระวังว่าจะงงเองหละ&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;[i if i%4 == 0 else -i for i in range(10) if i%2 == 0] # get: [0, -2, 4, -6, 8] &lt;/script&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;สำหรับการเขียน slice เราสามารถเล่นกับมันได้มากขึ้นอีกโดยการบอก step ครับ&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;my_list = list(range(10)) my_list = my_list[::2] # get: [0, 2, 4, 6, 8] &lt;/script&gt;&lt;br /&gt;แต่ส่วนใหญ่ประโยชน์ของมันจะมาจากการกลับตำแหน่งของสมาชิกใน list มากกว่า คือ&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;my_list = my_list[::-1] # get: [8, 6, 4, 2, 0] &lt;/script&gt;&lt;br /&gt;นอกจากนี้ เรายังสามารถ unzip ตัวแปรในกรณีที่ไม่ต้องการระบุตัวแปรครบทุกตัวได้ด้วย&lt;br /&gt;&lt;script class="brush: python" type="syntaxhighlighter"&gt;first, *remain = my_list print(first) # get: 8 print(remain) # get: [6, 4, 2, 0] &lt;/script&gt;&lt;br /&gt;อย่างไรก็ดี แม้ว่าเทคนิคเหล่านี้จะทำให้ code ของเราดูสั้น (เพราะจำนวนบรรทัดที่ลดลง) แต่ก็ควรเลือกใช้ให้เหมาะสมด้วยนะครับ ไม่งั้นแล้วจะกลายเป็นว่า code ของเราจะอ่านยากและไร้ระเบียบไปแทน แถมบางเทคนิคก็อาจก่อนให้เกิดปัญหาด้าน performance อีกด้วยนะ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3074227793814140422-874568108051861784?l=tutor0x.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Tutor0x/~4/mQTpGg-l9_U" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tutor0x.blogspot.com/2012/02/python.html</feedburner:origLink></item><item><title>PHP: Arrays</title><link>http://feedproxy.google.com/~r/Tutor0x/~3/fsm2pNrnSFc/php-arrays.html</link><category>PHP</category><author>noreply@blogger.com (mementototem)</author><pubDate>Fri, 24 Feb 2012 23:32:44 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3074227793814140422.post-3302695202824404407</guid><description>Array คือ กลุ่มของตัวแปร ใน PHP แบ่งออกเป็น 3 กลุ่ม คล้าย ๆ กับภาษาอื่น คือ&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Numberic Array ใช้ตัวเลข (index) ระบุตำแหน่งใน array&lt;/li&gt;&lt;li&gt;Associative Array ใช้คำบอกตำแหน่ง array ในบางภาษาเรียก array ลักษณะนี้ว่า dictionary&lt;/li&gt;&lt;li&gt;Multidimensional Array เป็น array ซ้อน array&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h3&gt;Numberic Arrays&lt;/h3&gt;&lt;br /&gt;เริ่มนับจาก 0 เป็น index ของ array ตัวแรก&lt;br /&gt;&lt;script class="brush: php" type="syntaxhighlighter"&gt;&lt;?php  // Create array $characters = array('Zidane', 'Vivi', 'Steiner', 'Garnet', 'Freya', 'Quina', 'Eiko');  // Get value echo $characters[1] . ' is black mage'; // print: Vivi is black mage  // Add more value into array at last point $characters[] = 'Amarant';  // Change value in array $characters[3] = 'Dagger'; echo $characters[3]; // print: Dagger  // Count item in array echo count($characters); // print: 8 &lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Associative Arrays&lt;/h3&gt;&lt;br /&gt;จะใช้ คำ (key) แทน ตัวเลข (index) ทำให้มันมีความหมายในตัวเอง เข้าใจง่าย เรียกใช้ง่าย&lt;br /&gt;&lt;script class="brush: php" type="syntaxhighlighter"&gt;&lt;?php  $eidolon = 'phoenix';  // Create array $skills = array(      'fenrir'   =&gt; 'Terrestrial Rage',      'phoenix'  =&gt; 'Rebirth Flame',      'cabuncle' =&gt; 'Ruby Light', );  // Get value echo $eidolon . ' use skill ' . $skills[$eidolon];  // Add more item $skills['madeen'] = 'Terra Homing';  // Change value $skills['fenrir'] = 'Millennial Decay'; &lt;/script&gt;&lt;br /&gt;&lt;h3&gt;Multidimensional Arrays&lt;/h3&gt;&lt;br /&gt;พูดง่าย ๆ คือ การใช้ array เป็นค่าใน array อีกตัวหนึ่งนั่นเอง&lt;br /&gt;&lt;script class="brush: php" type="syntaxhighlighter"&gt;$weapons = array(      'garnet' =&gt; array('Rod', 'Racket'),      'eiko'   =&gt; array('Flutes', 'Racket') ); // print: Garnet primary weapon is Rod echo 'Garnet primary weapon is ' . $weapons['garnet'][0];  // print: $weapons have 2 elements echo '$weapons have ' . count($weapons) . ' elements';  // print: $weapons have 6 elements (with inside array) echo '$weapons have ' . count($weapons, 1) . ' elements (with inside array)'; &lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3074227793814140422-3302695202824404407?l=tutor0x.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Tutor0x/~4/fsm2pNrnSFc" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tutor0x.blogspot.com/2012/02/php-arrays.html</feedburner:origLink></item><item><title>PHP: If... Else และ Switch</title><link>http://feedproxy.google.com/~r/Tutor0x/~3/d1TMgyM1v6Y/php-if-else-switch.html</link><category>PHP</category><author>noreply@blogger.com (mementototem)</author><pubDate>Sun, 26 Feb 2012 02:37:12 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3074227793814140422.post-4605433142986643826</guid><description>&lt;h3&gt;If... Else...&lt;/h3&gt;&lt;br /&gt;คำสั่งทางเลือก If... Else ใน PHP จะใช้อยู่ 2 แบบ คือ if {} else และ if: else:&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: php" type="syntaxhighlighter"&gt;&lt;?php  if ('male' == $sex) {      echo 'Hello, Mister ' . $name; } elseif ('female' == $sex) {      echo 'Hello, Miss ' . $name; } else {      echo 'Hello, Khun ' . $name; }  // or if ('male' == $sex):      echo 'Hello, Mister ' . $name; elseif ('female' == $sex):      echo 'Hello, Miss ' . $name; else:      echo 'Hello, Khun ' . $name; endif; &lt;/script&gt; elseif ในแบบแรก สามารถเขียนแทนด้วย else if ได้ แต่จะทำงานช้ากว่า เพราะเป็นการแยกคำสั่งออกเป็น 2 คำสั่ง แต่ที่จะเป็นคำสั่งของ if อันแรกอันเดียวก็เป็น if 2 อัน และหากมีคำสั่งใน if แค่บรรทัดเดียวสามารถละ {} ได้ แต่ก็ต้องมั่นใจว่า อ่านโค้ดแล้วไม่งง  ส่วนในแบบหลัง elseif &lt;strong&gt;ต้องติดกันเท่านั้น&lt;/strong&gt;, ในแบบหลังนี้มักใช้ตอนที่เขียน PHP ร่วมกับ HTML หรือมีคำสั่งใน if... else เยอะมาก ๆ เพราะอ่านเข้าใจง่ายกว่า เช่น  &lt;script class="brush: php" type="syntaxhighlighter"&gt;&lt;?php if($htime &lt; 12): ?&gt;     &lt;span&gt;Good morning&lt;/span&gt;&lt;?php elseif($htime &lt; 17): ?&gt;     &lt;span&gt;Good afternoon&lt;/span&gt;&lt;?php elseif ($htime &lt; 19): ?&gt;     &lt;span&gt;Good evening&lt;/span&gt;&lt;?php else: ?&gt;     &lt;span&gt;Good night&lt;/span&gt;&lt;?php endif; ?&gt;&lt;/script&gt; &lt;br /&gt;แต่ถ้าต้องการคืนค่า หรือทำตามคำสั่งสั้น ๆ ง่าย ๆ สามารถใช้คำสั่ง ?: (ternary operator) แทนได้ โดยที่จะมีรูปแบบคือ&lt;br /&gt;&lt;br /&gt;ทำการเปรียบเทียบ ? ถ้าเป็นจริงทำอันนี้ : ถ้าเป็นเท็จทำอันนี้&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: php" type="syntaxhighlighter"&gt;&lt;?php  $type = (6 == $legs): 'Insect' ? 'Arachnid'; &lt;/script&gt; &lt;hr /&gt;     &lt;h3&gt;   Comparison Operator&lt;/h3&gt;operator ในการเปรียบเทียบ จะมีเหมือน ๆ กับภาษาอื่นคือ  == คือ เท่ากัน (แปลงค่าเปรียบเทียบกรณีตัวแปรต่างชนิดกัน === คือ เท่ากันทุกประการ (ถ้าตัวแปรต่างชนิดก็จะถือว่าไม่เท่ากัน) != และ &lt;&gt; คือ ไม่เท่ากัน !== คือ ค่าไม่เท่ากัน หรือ ต่างชนิดกัน &lt; คือ น้อยกว่า &gt; คือ มากกว่า &lt;= คือ น้อยกว่า หรือเท่ากับ &gt;= คือ มากกว่า หรือเท่ากับ  &lt;script class="brush: php" type="syntaxhighlighter"&gt;&lt;?php  $a = 2; $b = '2';  $result = ($a == $b) ? 'yes' : 'no';    // = yes; $result = ($a === $b) ? 'yes' : 'no';   // = no; $result = ($a != $b) ? 'yes' : 'no';    // = no; $result = ($a !== $b) ? 'yes' : 'no';   // = yes; &lt;/script&gt; &lt;hr /&gt;     &lt;h3&gt;   Switch&lt;/h3&gt;ถ้าตรวจสอบค่าจากตัวแปรตัวเดียว ในรูปแบบต่าง ๆ สามารถใช้ switch แทน if... elseif ยาว ๆ ได้ ซึ่งโค้ดที่ได้จะอ่านง่ายกว่าด้วย เช่น  &lt;script class="brush: php" type="syntaxhighlighter"&gt;&lt;?php  switch($color) {      case 'red':           $meaning = 'desire';           break;      case 'white':           $meaning = 'purity';           break;      case 'yellow':           $meaing = 'friendship';           break;      case 'pink':           $meaning = 'love';           break;      case 'orange':           $meaning = 'forever';           break;      case 'violet':      case 'purple':           $meaning = 'first love';           break;      case 'peach':           $meaning = 'sincerity';           break;      case 'black':           $meaning = 'sorrow';           break;      default:           // Not match any case           $meaning = 'unknown its meaning'; } &lt;/script&gt;&lt;br /&gt;และก็เหมือนกับ if... else ที่สามารถใช้รูปของ : ได้ด้วย คือ switch(ตัวแปรที่ต้องการ): ...(case: ต่าง ๆ)... endswitch;&lt;br /&gt;&lt;br /&gt;และเนื่องจาก เมื่อ switch เจอ case ไหนแล้ว จะทำตาม case นั้นลงไปจนออกนอก switch หากไม่เจอคำสั่ง break; จึงประยุกต์ให้ตรวจสอบค่าหลาย ๆ ค่า แต่ทำคำสั่งเดียวกันได้ อย่างเช่น case: 'violet' และ case: purple จากตัวอย่างข้างบน&lt;br /&gt;&lt;br /&gt;ถ้าสังเกต การเปรียบเทียบตัวแปรกับค่าคงที่ ผมจะให้ค่าคงที่ขึ้นก่อน รูปแบบนี้เรียกว่า Yoda Condition ข้อดีของมันคือ ถ้าเราเผลอใช้ = อันเดียวแทนที่จะเป็น == มันจะแจ้ง error ขึ้นมา แทนที่จะทำงานไปตามปกติ แล้วเกิดบั๊กที่ตรวจสอบได้ยาก แต่ข้อเสียคือ ทำให้การอ่านโค้ดไม่เป็นธรรมชาติ (ผู้ชาย เท่ากับ เพศ แทนที่จะเป็น เพศ เท่ากับ ผู้ชาย) ... ยกเว้นว่าจะชื่นชอบ Star War และเข้าใจท่าน Yoda เป็นอย่างดี...&lt;br /&gt;&lt;br /&gt;แต่เราก็ไม่ควรจะใช้ Yoda Condition ในทุก ๆ ภาษา, บางภาษาเช่น Java ไม่อนุญาตให้กำหนดค่าตัวแปรในตอนเปรียบเทียบค่าอยู่แล้ว จึงไม่มีเหตุผลที่จะใช้ Yoda Condition แม้แต่น้อย&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3074227793814140422-4605433142986643826?l=tutor0x.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Tutor0x/~4/d1TMgyM1v6Y" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tutor0x.blogspot.com/2012/02/php-if-else-switch.html</feedburner:origLink></item><item><title>let's code: แก้โจทย์ Interviewstreet</title><link>http://feedproxy.google.com/~r/Tutor0x/~3/Dp8Dv89lvdk/lets-code-interviewstreet.html</link><category>Let's Code</category><author>noreply@blogger.com (Nattawut Phetmak)</author><pubDate>Sun, 26 Feb 2012 02:37:01 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3074227793814140422.post-3096089359249918855</guid><description>&lt;a href="https://www.interviewstreet.com/challenges/"&gt;Interviewstreet&lt;/a&gt; เป็นเว็บหางานสำหรับโปรแกรมเมอร์แนวใหม่ ที่ตัดสินคัดเลือกคนขั้นต้นด้วยการจัดให้เขียนโปรแกรมแข่งกันซะเลย (แล้วค่อยไปยื่น resume + สัมภาษณ์ทีหลัง) เพียงแค่ทำโจทย์ผ่าน 7 ข้อ ก็มีสิทธิยื่นใบสมัครกับบริษัทเช่น Facebook, Microsoft, Amazon.com, Dropbox ฯลฯ เรียกได้ว่า นอกจากจะได้ฝึกสมองแก้โจทย์แล้ว ยังมีโอกาสลุ้นไปทำงานกับบริษัทเหล่านี้อีกด้วย&lt;br /&gt;&lt;br /&gt;แม้ว่าตอนนี้เว็บจะมีโจทย์ให้ไปเล่นไม่มากเท่าไหร่ แต่ความยากนั้นรับรองว่าไม่ธรรมดาแน่นอน (โจทย์ค่อนข้างง่ายแต่ test case โหดมาก) นอกจากที่จะต้องใช้ algorithm ที่มีประสิทธิภาพควบคู่ไปกับ data structure ที่เหมาะสมแล้ว ยังต้องแม่นในการพิสูจน์ทางคณิตศาสตร์เพื่อนำมาลดขนาดของ big-O ด้วยครับ&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;ภาษาที่ใช้ได้&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;C/C++, C#, Java,&lt;br /&gt;Haskell, Clojure, Scala,&lt;br /&gt;PHP, Ruby, Python, Perl&lt;br /&gt;&lt;br /&gt;ปล. ไม่ต้องกังวลจนเกินไปว่า เขียนภาษาในกลุ่ม script แล้วจะเสียเปรียบกลุ่ม native/managed นะครับ เพราะทางเว็บได้ชดเชยเวลาให้ตามสัดส่วนครับ&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;รูปแบบการตรวจคำตอบ&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;ส่ง source code ให้ server ประมวลผลกับ test case&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;ตัวอย่างโจทย์&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://www.interviewstreet.com/challenges/dashboard/#problem/4e14b2cc47f78"&gt;Meeting Point&lt;/a&gt;: หมู่บ้านแห่งหนึ่ง บ้านแต่ละหลังจะสามารถสร้างอยู่บนจุดตัดของกริดได้เท่านั้น จากบ้านหลังหนึ่งถ้าเดินทางตรงๆ ไปจุดถัดไปในทิศทั้ง 4 จะใช้เวลา 1 หน่วย แต่ถ้าเดินทางทะแยงในทิศทั้ง 4 ก็จะใช้เวลา 1 หน่วยเช่นกัน ถ้าให้พิกัดของบ้านทุกหลังในหมู่บ้านแห่งหนึ่งมา จงหาบ้านหลังที่ถ้าทุกคนในหมู่บ้านเดินทางมาประชุมที่บ้านหลังนั้น เวลารวมของการเดินทางของทุกคนจะมีค่าน้อยที่สุด&lt;/li&gt;&lt;li&gt;&lt;a href="https://www.interviewstreet.com/challenges/dashboard/#problem/4eac48496bee2"&gt;String Reduction&lt;/a&gt;: ในระบบภาษาระบบหนึ่ง มีตัวอักษรแค่ 3 ตัวคือ abc เท่านั้น ถ้าต้องการย่อคำในภาษานั้น โดยกฎการย่อคือ จะย่อตัวอักษรไม่เหมือนกัน 2 ตัวที่อยู่ติดกันให้กลายเป็นตัวอักษรตัวที่ 3 ถ้าให้คำๆ หนึ่งมา ให้บอกว่าคำนั้นสามารถย่อให้สั้นที่สุดเหลือกี่ตัวอักษร&lt;/li&gt;&lt;li&gt;&lt;a href="https://www.interviewstreet.com/challenges/dashboard/#problem/4f1c739a6ea3a"&gt;Changing Bit&lt;/a&gt;: ให้บิตของตัวเลขขนาดใหญ่มาก (ใหญ่ได้ถึง 100,000 บิต) มา 2 ชุด ถ้าให้การคิวรี่อีกจำนวนหนึ่งมา ซึ่งสามารถ 1. ทำการเปลี่ยนข้อมูลบิตใดบิตหนึ่งในเลขทั้งสอง และ 2. นำเลขทั้งสองมาบวกกัน แล้วพิมพ์ค่าของบิตในตำแหน่งที่ร้องขอ จงสร้างระบบสำหรับตัวเลขและการคิวรีนี้&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3074227793814140422-3096089359249918855?l=tutor0x.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Tutor0x/~4/Dp8Dv89lvdk" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://tutor0x.blogspot.com/2012/02/lets-code-interviewstreet.html</feedburner:origLink></item><item><title>เปิดหมวดใหม่ let's code</title><link>http://feedproxy.google.com/~r/Tutor0x/~3/KscvzFkaRCo/lets-code.html</link><category>Announcement</category><author>noreply@blogger.com (Nattawut Phetmak)</author><pubDate>Wed, 22 Feb 2012 12:23:10 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3074227793814140422.post-6033094042146932646</guid><description>ถึงตอนนี้ เว็บเราก็มีบทเรียน Python ที่เนื้อหาครอบคลุมการใช้งานได้เยอะพอควรแล้ว (และ PHP กำลังตามมาในอีกไม่ช้าโดยฝีมือของคุณ mementototem) แต่แค่รู้วิธีใช้ไม่ได้ลงมือโค้ดมันก็แปลกๆ อยู่ (แถมพาลจะลืมเอาได้ง่ายๆ) เลยคิดว่าแนะนำเว็บที่สามารถไปเขียนโปรแกรมแข่งกับเพื่อนๆ ได้ไว้บ้างดีกว่า เผื่อว่าเกิดว่างๆ เบื่อๆ หรืออยากฝึกปรือตัวเอง จะได้รู้ว่าควรไปลับฝีมือที่สำนักไหนครับ :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3074227793814140422-6033094042146932646?l=tutor0x.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Tutor0x/~4/KscvzFkaRCo" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://tutor0x.blogspot.com/2012/02/lets-code.html</feedburner:origLink></item><item><title>let's code: แก้โจทย์ ACM-ICPC</title><link>http://feedproxy.google.com/~r/Tutor0x/~3/vwIG2FL3MmQ/lets-code-acm-icpc.html</link><category>Let's Code</category><author>noreply@blogger.com (Nattawut Phetmak)</author><pubDate>Thu, 23 Feb 2012 00:00:49 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3074227793814140422.post-6062258992699127815</guid><description>&lt;a href="http://cm.baylor.edu/welcome.icpc"&gt;ACM-ICPC&lt;/a&gt; หรือเรามักที่เรียกย่อๆ กันว่า ACM คืองานแข่งขันโปรแกรมมิ่งในระดับอุดมศึกษาทั่วโลก นศ.ที่เรียนทางด้านวิศวกรรม-วิทยาการคอมพิวเตอร์ ก็คงหนีไม่พ้นที่จะโดนอาจารย์ชักชวนให้ลงแข่งเป็นแน่แท้&lt;br /&gt;&lt;br /&gt;และด้วยความที่มันเป็นการแข่งที่แพร่หลายมาก ก็ทำให้มี mirror site เกิดขึ้นมากมาย เช่น &lt;a href="http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8"&gt;Online Judge&lt;/a&gt;, &lt;a href="http://acm.zju.edu.cn/onlinejudge/showProblemsets.do"&gt;Zhejiang University&lt;/a&gt; หรือจะลองไปถามๆ อาจารย์ที่ภาควิชาคอมพิวเตอร์ดูก็ได้นะ :D&lt;br /&gt;&lt;br /&gt;ระดับความยากของโจทย์นั้นถือว่าอยู่ในระดับกลางๆ เนื่องจากการแข่งแต่ละรอบจะมีโจทย์ให้ทำค่อนข้างเยอะพอสมควร แต่ก็ชดเชยกับการที่ลงแข่งกันเป็นทีมละไม่เกิน 3 คน ทำให้สามารถแบ่งหน้าที่ตามที่แต่ละคนถนัดได้ครับ&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;ภาษาที่ใช้ได้&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;C/C++, Java, Pascal&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;รูปแบบการตรวจคำตอบ&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;ส่ง source code ให้ server ประมวลผลกับ test case&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;ตัวอย่างโจทย์&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://livearchive.onlinejudge.org/external/20/2088.pdf"&gt;2088 - Entropy&lt;/a&gt;: สมมติให้คำในภาษาอังกฤษมาคือ "AAAAABCD" ถ้าย่อตัวอักษรแต่ละตัวด้วยบิตดังนี้ {"A": "0", "B": "10", "C": "110", "D": "111"} จะได้ว่าคำนี้สามารถเขียนด้วยบิตได้สั้นที่สุด (entropy encoding) ถ้าให้คำใดๆ มา จงบอกว่าคำนั้นสามารถย่อได้เหลือกี่บิต&lt;/li&gt;&lt;li&gt;&lt;a href="http://livearchive.onlinejudge.org/external/21/2145.pdf"&gt;2145 - Lost in Space&lt;/a&gt;: ให้ความยาวด้านทั้งสามของสามเหลี่ยมต้นแบบมา และให้เซ็ตของพิกัด xyz ของจุดมาอีกจำนวนหนึ่ง จงหาจุด 3 จุดจากเซ็ตนั้น ที่จะสร้างสามเหลี่ยมคล้ายกับสามเหลี่ยมต้นแบบ (มีสัดส่วนด้านทั้งสามคงเดิม) และมี error น้อยกว่า 0.01%&lt;/li&gt;&lt;li&gt;&lt;a href="http://livearchive.onlinejudge.org/external/23/2334.pdf"&gt;2334 - Gridland&lt;/a&gt;: สมมติประเทศ ซึ่งเมืองแต่ละเมืองอยู่บนกริดขนาด N x M แต่ละเมืองสามารถเดินทางไปยังเมืองอื่นๆ ที่อยู่ติดกันได้ 8 ทิศ คนขายของต้องเดินทางสั้นที่สุดเป็นระยะทางเท่าไหร่ ถึงจะผ่านเมืองครบทุกเมือง&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3074227793814140422-6062258992699127815?l=tutor0x.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Tutor0x/~4/vwIG2FL3MmQ" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><enclosure url="http://livearchive.onlinejudge.org/external/20/2088.pdf" length="218277" type="application/pdf" /><media:content url="http://livearchive.onlinejudge.org/external/20/2088.pdf" fileSize="218277" type="application/pdf" /><itunes:explicit>no</itunes:explicit><itunes:subtitle>ACM-ICPC หรือเรามักที่เรียกย่อๆ กันว่า ACM คืองานแข่งขันโปรแกรมมิ่งในระดับอุดมศึกษาทั่วโลก นศ.ที่เรียนทางด้านวิศวกรรม-วิทยาการคอมพิวเตอร์ ก็คงหนีไม่พ้นที่จะโดนอาจารย์ชักชวนให้ลงแข่งเป็นแน่แท้ และด้วยความที่มันเป็นการแข่งที่แพร่หลายมาก ก็ทำให้มี mirror sit</itunes:subtitle><itunes:author>noreply@blogger.com (Nattawut Phetmak)</itunes:author><itunes:summary>ACM-ICPC หรือเรามักที่เรียกย่อๆ กันว่า ACM คืองานแข่งขันโปรแกรมมิ่งในระดับอุดมศึกษาทั่วโลก นศ.ที่เรียนทางด้านวิศวกรรม-วิทยาการคอมพิวเตอร์ ก็คงหนีไม่พ้นที่จะโดนอาจารย์ชักชวนให้ลงแข่งเป็นแน่แท้ และด้วยความที่มันเป็นการแข่งที่แพร่หลายมาก ก็ทำให้มี mirror site เกิดขึ้นมากมาย เช่น Online Judge, Zhejiang University หรือจะลองไปถามๆ อาจารย์ที่ภาควิชาคอมพิวเตอร์ดูก็ได้นะ :D ระดับความยากของโจทย์นั้นถือว่าอยู่ในระดับกลางๆ เนื่องจากการแข่งแต่ละรอบจะมีโจทย์ให้ทำค่อนข้างเยอะพอสมควร แต่ก็ชดเชยกับการที่ลงแข่งกันเป็นทีมละไม่เกิน 3 คน ทำให้สามารถแบ่งหน้าที่ตามที่แต่ละคนถนัดได้ครับ ภาษาที่ใช้ได้ C/C++, Java, Pascal รูปแบบการตรวจคำตอบ ส่ง source code ให้ server ประมวลผลกับ test case ตัวอย่างโจทย์ 2088 - Entropy: สมมติให้คำในภาษาอังกฤษมาคือ "AAAAABCD" ถ้าย่อตัวอักษรแต่ละตัวด้วยบิตดังนี้ {"A": "0", "B": "10", "C": "110", "D": "111"} จะได้ว่าคำนี้สามารถเขียนด้วยบิตได้สั้นที่สุด (entropy encoding) ถ้าให้คำใดๆ มา จงบอกว่าคำนั้นสามารถย่อได้เหลือกี่บิต2145 - Lost in Space: ให้ความยาวด้านทั้งสามของสามเหลี่ยมต้นแบบมา และให้เซ็ตของพิกัด xyz ของจุดมาอีกจำนวนหนึ่ง จงหาจุด 3 จุดจากเซ็ตนั้น ที่จะสร้างสามเหลี่ยมคล้ายกับสามเหลี่ยมต้นแบบ (มีสัดส่วนด้านทั้งสามคงเดิม) และมี error น้อยกว่า 0.01%2334 - Gridland: สมมติประเทศ ซึ่งเมืองแต่ละเมืองอยู่บนกริดขนาด N x M แต่ละเมืองสามารถเดินทางไปยังเมืองอื่นๆ ที่อยู่ติดกันได้ 8 ทิศ คนขายของต้องเดินทางสั้นที่สุดเป็นระยะทางเท่าไหร่ ถึงจะผ่านเมืองครบทุกเมือง</itunes:summary><itunes:keywords>Let's Code</itunes:keywords><feedburner:origLink>http://tutor0x.blogspot.com/2012/02/lets-code-acm-icpc.html</feedburner:origLink></item><item><title>PHP: Operator</title><link>http://feedproxy.google.com/~r/Tutor0x/~3/CXp_bK-Ms14/php-operator.html</link><category>PHP</category><author>noreply@blogger.com (mementototem)</author><pubDate>Wed, 22 Feb 2012 09:33:41 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3074227793814140422.post-6340818321682949907</guid><description>Operator หรือ ตัวดำเนินการใน PHP จะเหมือนกับ C/C++ คือมี บวก ลบ คูณ หาร หารเอาเศษ เพิ่มขึ้นหนึ่ง และลดลงหนึ่ง&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: php" type="syntaxhighlighter"&gt;&lt;?php  echo 2 + 3; // print: 5 echo 6 - 2; // print: 4 echo 2 * 6 // print: 12 echo 18 / 4 // print: 4.5 (float) echo 18 % 4 // print: 2  $x = 8; echo $x++; // print: 8 (yes! 8); echo $x; // print: 9 (increase after run that line) echo $x--; // print: 9 echo $x; //print: 8  // but echo ++$x; // print: 9 (increase before echo out) echo $x; // print: 9 echo --$x; // print: 8 &lt;/script&gt; ควรระวังการใช้ เพิ่มขึ้นหนึ่ง(++) และลดลงหนึ่ง(--) ร่วมกับคำสั่งอย่างอื่นตรงนี้ด้วย แต่ถ้าสั่งเดี่ยว ๆ บรรทัดเดียวของมันเองก็ไม่ใช่ปัญหา จะแบบไหนก็ไม่ต่างกัน &lt;hr /&gt;  การกำหนดค่า นอกจากจะใช้เครื่องหมาย = อย่างเดียวก็ใช้ร่วมกับ operator บวก ลบ คูณ หาร หารเอาเศษ ได้ด้วย หากเป็นการกระทำกับตัวมันเองและค่า หรือตัวแปรอื่น ๆ &lt;script class="brush: php" type="syntaxhighlighter"&gt;&lt;?php  $x = 5; echo $x += 3; // == $x = $x + 3; print: 8 echo $x -= 2; // print: 6 echo $x *= 4; // print: 24; echo $x /= 3; // print: 8 echo $x %= 5; // print: 3 &lt;/script&gt; &lt;hr /&gt;   ส่วนการเชื่อมต่อข้อความนั้น (string) จะใช้ . ในการเชื่อมข้อความเข้าด้วยกัน แต่ถ้าใช้ร่วมกับตัวแปรชนิดอื่นอย่าง boolean หรือ int ก็จะถูกแปลงมาให้เป็น string ก่อนที่จะเชื่อมต่อกับข้อความ &lt;script class="brush: php" type="syntaxhighlighter"&gt;&lt;?php  echo "Hello, " . "Tutor0x!"; // print: Hello, Tutor0x echo "Life: " . 10; // print: Life: 10 echo "This story is " . true; // print: This story is 1; (cast to int, then cast to string) echo 10 . "10"; // print: 1010 echo 10 + "10"; // print: 20 (cast "10" to int (note: arithmetic operator), then calculate 10+10) &lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3074227793814140422-6340818321682949907?l=tutor0x.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Tutor0x/~4/CXp_bK-Ms14" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tutor0x.blogspot.com/2012/02/php-operator.html</feedburner:origLink></item><item><title>PHP: ตัวแปร</title><link>http://feedproxy.google.com/~r/Tutor0x/~3/JTyjsdPMMIU/php_20.html</link><category>PHP</category><author>noreply@blogger.com (mementototem)</author><pubDate>Mon, 20 Feb 2012 19:17:39 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3074227793814140422.post-6752576143640727395</guid><description>ใน PHP ตัวแปรเป็นประเภท weak type (ไม่ต้องกำหนดชนิดตัวแปรก่อนกำหนดค่า) และ dynamic type (สามารถเปลี่ยนชนิดตัวแปรได้ด้วยการกำหนดค่าใหม่) โดยมีชนิดตัวแปรหลักอยู่ 8 ชนิด คือ&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Boolean&lt;/strong&gt; ที่เก็บค่า true (จริง) หรือ false (เท็จ) โดยไม่คำนึงถึงตัวใหญ่ตัวเล็ก (จะใช้ TRUE หรือ TrUe ก็ true เหมือนกัน) การแปลงเป็น boolean ใช้ (bool) หรือ (boolean)&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: php" type="syntaxhighlighter"&gt;$tabool = TrUe; var_dump($tabool);   // bool(true) var_dump( (bool) 1 );  // bool(true) var_dump( (bool) 0 );  // bool(false) var_dump( (bool) -1 );  // bool(true)!!! var_dump( (bool) '' );  // bool(false) var_dump( (bool) '0' );  // bool(false)!!! var_dump( (bool) 'a' );  // bool(true) var_dump( (bool) 'false' ); // bool(true)! &lt;/script&gt; &lt;br /&gt;&lt;strong&gt;Integer&lt;/strong&gt; หรือ int เก็บค่าตัวเลข สามารถกำหนดเป็นเลขฐานสิบ ฐานแปด (ขึ้นต้นด้วย 0) ฐานสอง (ขึ้นต้นด้วย 0b &amp;mdash; ต้องเป็น PHP5.4+) หรือฐานสิบหก (ขึ้นต้นด้วย 0x) ก็ได้ และกำหนดเครื่องหมาย - เพื่อให้เป็นค่าลบได้ ข้อจำกัดที่ควรรู้เกี่ยวกับ integer คือ ถ้า php ทำงานแบบ 32bit มันจะมีขนาด 32bit แต่ถ้าทำงานบนระบบ 64bit มันจะมีขนาด 64bit ถ้าค่ามีขนาดเกินที่ int จะเก็บได้ PHP จะแปลงชนิดตัวแปรจาก int เป็น float โดยอัตโนมัติ... การแปลงเป็น int ใช้ (int) หรือ (integer) หรือใช้ฟังชั่น intval() ก็ได้&lt;br /&gt;&lt;script class="brush: php" type="syntaxhighlighter"&gt;var_dump( (int) 1234 );  // int(1234) var_dump( (int) 012 );  // int(10) var_dump( (int) 01292 ); // int(10) - 92 ด้านหลังถูกตัดออก(เกินตัวเลขสูงสุดที่มีได้ในฐานนั้น ๆ) var_dump( (int) 0110 );  // int(6) var_dump( (int) 0xabc ); // int(2748) var_dump( (int) -0xabc ); // int(-2748) var_dump( (int) false ); // int(0) var_dump( (int) true );  // int(1) &lt;/script&gt; &lt;br /&gt;&lt;strong&gt;Float&lt;/strong&gt; (บางคนเรียก double) พูดง่าย ๆ คือ ตัวเลขที่มีจุดทศนิยม&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: php" type="syntaxhighlighter"&gt;var_dump((float)123);  // float(123) var_dump((float)123.0);  // float(123) var_dump((float)123.4);  // float(123.4) &lt;/script&gt; &lt;br /&gt;&lt;strong&gt;String&lt;/strong&gt; เก็บข้อความ โดยมี " (double quoted) หรือ ' (single qouted) ครอบข้อความนั้น ๆ โดย single quoted จะใส่ escape character ได้แค่ \' และ \\ นอกจากนั้นจะเป็นอย่างที่ใส่ ส่วน double quoted จะสามารถใส่ escape character ได้ครบ และสามารถดึงค่าตัวแปรออกมาแสดงได้ด้วย นอกจากนี้ยังมีกำหนดค่าตัวแปรโดย heredoc และ nowdoc ได้&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: php" type="syntaxhighlighter"&gt;$king = 'Nero'; $city = 'Rome'; // print: $king is Nero echo '$king is ' . $king; // print: Nero burned Rome echo "$king burned $city"; &lt;/script&gt; &lt;br /&gt;&lt;strong&gt;Array&lt;/strong&gt; เก็บค่าเป็นชุด ๆ ใน PHP สามารถเรียกโดยใช้ index ก็ได้ หรือจะใช้แบบ dictionary หรือ associated array (key =&gt; value) ก็ได้ เราสามารถใช้ array เก็บ array ได้ด้วยนะ แต่ระวังซ้อนกันเยอะจนงงเอง...&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: php" type="syntaxhighlighter"&gt;$fruits = array('Banana','Mango','Orange'); //print: Orange is sweet. echo $fruits[2] . ' is sweet.'; $digimon = array (  'name'    =&gt; 'Angelmon',  'type'    =&gt; 'Angel Digimon',  'from'    =&gt; 'Patamon',  'partner' =&gt; 'Takeru', ); // print: Takeru is Angelmon's partner echo $digimon['partner'] . ' is ' . $digimon['name'] . '\'s partner.'; &lt;/script&gt; &lt;br /&gt;&lt;strong&gt;Object&lt;/strong&gt; เป็น instance ของคลาส โดยทั่วไป เมื่อสร้างคลาสขึ้นมาแล้ว จะต้องสร้าง object ของคลาสเพื่อเรียกใช้งานฟังชั่นต่าง ๆ ภายในคลาสนั้น ๆ&lt;br /&gt;&lt;br /&gt;นอกจากนี้ยังมี ชนิดตัวแปรแบบพิเศษอีก 2 ตัวคือ&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Resources&lt;/strong&gt; ซึ่งเป็นข้อมูลที่ได้จากแหล่งภายนอกอย่าง ฐานข้อมูล หรือไฟล์ จะต้องส่งให้ฟังชั่นที่เกี่ยวข้องดึงข้อมูลออกมาก่อนที่จะนำมาแสดงผล&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;NULL&lt;/strong&gt; บ่งบอกว่า ไม่มีค่า ตัวแปรนั้น ไม่ได้ถูกกำหนดค่าใด ๆ ไว้ (หรืออีกนัยหนึ่งคือ ยังไม่มีตัวแปรนั้นเกิดขึ้น) สามารถแปลงเป็น NULL ได้โดย (unset) แต่ตัวแปร และค่าของตัวแปรยังอยู่นะ แค่คืนค่ากลับมาเป็น NULL เฉย ๆ (ทำไปเพื่อ?)&lt;br /&gt;&lt;script class="brush: php" type="syntaxhighlighter"&gt;$full = 100; // print: 100 echo $full; // print: NULL var_dump( (unset) $full ); // print: 100 echo $full; &lt;/script&gt; &lt;br /&gt;นอกจากนั้นยังมี ตัวแปรแบบ pseudo ที่มักเอาไว้เขียนเป็น doc ของฟังชั่นคือ&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Mixed&lt;/strong&gt; เป็นตัวแปรชนิดไหนก็ได้ (แต่ไม่ได้หมายความว่า "ตัวแปรทุกชนิด" นะ)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Number&lt;/strong&gt; เป็นตัวเลข จะเป็น int หรือ float ก็ไม่เกี่ยง&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Callback&lt;/strong&gt; เป็น string แต่เป็น string ที่บอกชื่อฟังชั่น มักใช้ในฟังชั่นประเภท callback ที่ส่งค่าต่อให้ฟังชั่นที่เกี่ยวข้องทำงาน แล้วส่งค่ากลับมา&lt;br /&gt;&lt;br /&gt;เราสามารถตรวจสอบชนิดของตัวแปรโดยใช้ฟังชั่น gettype()&lt;br /&gt;&lt;script class="brush: php" type="syntaxhighlighter"&gt;$unknown_type = 0x648684; // print: integer echo gettype($unknown_type); $it_float = 123.321; // print: double echo gettype($it_float); &lt;/script&gt; &lt;br /&gt;เราสามารถใช้ var_dump() ที่แสดงข้อมูลทุกอย่างของตัวแปร และ&amp;nbsp; print_r() เพื่อแสดงข้อมูลของตัวแปรให้อ่านได้ง่าย ๆ แต่ถ้า แสดงออกมาแล้วยังอ่านไม่รู้เรื่อง เพราะติดกันไปหมดก็ครอบส่วนนั้นด้วยแท็ก &amp;lt;pre&amp;gt; ครับ&lt;br /&gt;&lt;br /&gt;ใน PHP มีการตรวจสอบค่าเฉพาะของตัวแปรอยู่หลายแบบ ซึ่งบางครั้งก็ดูเหมือนจะซ้ำซ้อนกัน เช่น&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://php.net/manual/en/function.empty.php"&gt;empty()&lt;/a&gt; ตัวแปรนั้นว่างเปล่า (0, '', array(), false) หรือไม่&lt;/li&gt;&lt;li&gt;&lt;a href="http://php.net/manual/en/function.isset.php"&gt;isset()&lt;/a&gt; ตัวแปรนั้นถูกกำหนดค่าใด ๆ ที่ไม่ใช่ NULL หรือไม่&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;script class="brush: php" type="syntaxhighlighter"&gt;$test_array = array( 0, 0.0, '', '0', 'a', array(), false, 'false', null ); echo "Testing value contain: 0, 0.0, '', '0', 'a', array(), false, 'false', null\n&lt;hr /&gt;\n"; echo "Will return 'bool(true)' if that variable is empty.\n\n"; for ( $i = 0; $i &lt; 9;$i++ ) {  $check = empty( $test_array[$i] );  var_dump($test_array[$i]);  echo ' is ';  var_dump( $check );  echo "\n"; } echo "&lt;hr /&gt;\n\n"; echo "Will return 'bool(true)' if that variable is set.\n\n"; $not_defined = isset( $never_exist ); echo '$never_exist is not define so... '; var_dump($not_defined); echo "\n"; for ( $i = 0; $i &lt; 9; $i++ ) {  $check = isset( $test_array[$i] );  var_dump($test_array[$i]);  echo ' is ';  var_dump( $check );  echo "\n"; } &lt;/script&gt;&lt;br /&gt;ผลที่ได้จะแสดงความแตกต่างระหว่าง empty() กับ isset() ลองสังเกตดูเองนะครับ ; )&lt;br /&gt;&lt;br /&gt;แม้ว่า บางอันจะทำให้สับสนไปบ้าง เช่น -1 มีค่าเป็น true, กำหนดค่าตัวแปรเป็น null แต่ถูกมองว่า ไม่เคยมีตัวแปรนี้อยู่, หรือเรียกชนิดตัวแปรว่า float แต่พอสั่งแสดงชนิดตัวแปรกลับแสดงเป็น double แต่มันก็มีข้อดีของมันอยู่บ้าง หากรู้เท่าทัน และรู้จักนำมาใช้ประโยชน์&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3074227793814140422-6752576143640727395?l=tutor0x.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Tutor0x/~4/JTyjsdPMMIU" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tutor0x.blogspot.com/2012/02/php_20.html</feedburner:origLink></item><item><title>Visual Basic: รับค่าและแสดงผลอย่างง่าย</title><link>http://feedproxy.google.com/~r/Tutor0x/~3/D48rKBaWzfc/visual-basic.html</link><category>Visual Basic .NET</category><author>noreply@blogger.com (Nattawut Phetmak)</author><pubDate>Mon, 20 Feb 2012 04:33:02 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3074227793814140422.post-3621722993514776470</guid><description>การรับค่าจากผู้ใช้เข้ามา แบบง่ายที่สุดคือการใช้ TextBox ร่วมกับ Button เพื่อรับข้อมูล&lt;br /&gt;&lt;script class="brush: vb" type="syntaxhighlighter"&gt;Private Sub testInput(...) Handles btn1.Click     Dim input_txt As String     Dim input_num As Integer      input_txt = txtBox1.Text     input_num = Val(txtBox2.Text) End Sub &lt;/script&gt;&lt;br /&gt;หรือจะให้ผู้ใช้กดปุ่ม เพื่อมี InputBox โผล่ขึ้นมาก็ได้&lt;br /&gt;&lt;script class="brush: vb" type="syntaxhighlighter"&gt;Private Sub testInput(...) Handles btn1.Click     Dim input_txt As String      input_txt = InputBox("Says something.") End Sub &lt;/script&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;เนื่องจาก Visual Basic เน้นการเขียนโปรแกรมแบบ GUI ดังนั้นการรับค่าจึงไม่ได้มีแต่ข้อความเพียงอย่างเดียว สำหรับการรับค่าเข้ามาแบบอื่นๆ ที่ควรรู้จักคือ&lt;br /&gt;&lt;br /&gt;CheckBox จะให้ค่าเป็น True หรือ False เท่านั้น&lt;br /&gt;&lt;script class="brush: vb" type="syntaxhighlighter"&gt;Private Sub testOthersInput(...) Handles btn1.Click     MessageBox.show(chkBox1.Checked) End Sub &lt;/script&gt;&lt;br /&gt;ส่วน RadioButton ก็จะเหมือนกับ CheckBox ทุกประการ ยกเว้นที่ผู้ใช้จะสามารถเลือกได้เพียง 1 อันภายในเขตของ GroupBox หนึ่งๆ เท่านั้น&lt;br /&gt;&lt;br /&gt;ด้าน ListBox จะคล้ายกับ RadioButton ตรงที่สามารเลือกได้เพียง 1 อย่างเท่านั้น แต่จะใช้ได้สะดวกกว่าเมื่อมีตัวเลือกจำนวนมากๆ การกำหนดตัวเลือกเริ่มต้นให้มันจะทำผ่าน &lt;code&gt;properties -&gt; data -&gt; items&lt;/code&gt; ก็ได้ หรือจะกำหนดค่าให้มันตอนโหลดโปรแกรมดังนี้&lt;br /&gt;&lt;script class="brush: vb" type="syntaxhighlighter"&gt;Private Sub frmLoad(...) Handles MyBase.Load     lstBox1.Items.Add("Apple")     lstBox1.Items.Add("Google")     lstBox1.Items.Add("Microsoft") End Sub &lt;/script&gt;&lt;br /&gt;และเมื่อต้องการค่าของมันว่าผู้ใช้เลือกตัวเลือกไหน ก็เรียกดูได้จาก&lt;br /&gt;&lt;script class="brush: vb" type="syntaxhighlighter"&gt;Private Sub testOthersInput(...) Handles btn1.Click     MessageBox.show(lstBox1.SelectedIndex)     MessageBox.show(lstBox1.SelectedItem) End Sub &lt;/script&gt;&lt;br /&gt;ถ้าผู้ใช้ไม่ได้เลือกอะไรเลย จะได้ค่า index กลับมาเป็น -1 หรือได้ค่า item เป็นข้อความว่างครับ&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;ส่วนการแสดงผลข้อมูลออกมานั้น นอกจากจะใช้ &lt;code&gt;MessageBox&lt;/code&gt; อย่างที่ใช้ประจำในตอนก่อนๆ แล้ว ยังสามารถกำหนดค่าของสิ่งต่างๆ ให้เปลี่ยนเป็นคำที่ต้องการได้ด้วย&lt;br /&gt;&lt;script class="brush: vb" type="syntaxhighlighter"&gt;Private Sub testOutput(...) Handles btn1.Click     txtBox1.Text = "Hello World."     chkBox1.Checked = True     lstBox1.SelectedIndex = 2 End Sub &lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3074227793814140422-3621722993514776470?l=tutor0x.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Tutor0x/~4/D48rKBaWzfc" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tutor0x.blogspot.com/2012/02/visual-basic.html</feedburner:origLink></item><item><title>misc: เวลาในระบบคอมพิวเตอร์</title><link>http://feedproxy.google.com/~r/Tutor0x/~3/BLSg9AJ7-Qc/misc.html</link><category>Miscellaneous</category><author>noreply@blogger.com (Nattawut Phetmak)</author><pubDate>Tue, 14 Feb 2012 05:18:55 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3074227793814140422.post-1203434253109438206</guid><description>เมื่อพูดถึงเวลาในคอมพิวเตอร์นั้น &lt;a href="http://en.wikipedia.org/wiki/Unix_time"&gt;เวลา Unix&lt;/a&gt; มักถูกอ้างอิงใช้เป็นมาตรฐานมากที่สุด มันคือเวลาเป็นวินาทีนับจากเที่ยงคืนของวันที่ 1 มกราคม 1970 ตามเวลาสากล UTC มาจนถึงปัจจุบัน&lt;br /&gt;&lt;br /&gt;สำหรับระบบที่ implement มันแบบ 32 บิท อาจพบปัญหาได้ใน&lt;a href="http://en.wikipedia.org/wiki/Year_2038_problem"&gt;ปี 2038&lt;/a&gt; เนื่องจากเลขที่ใช้ overflow ครับ&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;แม้ว่าจะเราจะสามารถเรียกเวลา Unix มาดูได้ แต่มันคงไร้ประโยชน์ถ้าไม่สามารถเปลี่ยนให้อยู่ในรูปแบบที่สื่อสารกับคนทั่วไปได้รู้เรื่อง&lt;br /&gt;&lt;br /&gt;รูปแบบข้างล่างนี้ถือเป็น&lt;a href="http://en.wikipedia.org/wiki/Date_(Unix)"&gt;มาตรฐานการเขียนแทนเวลาของระบบ Unix&lt;/a&gt; ที่สามารถเรียกใช้ได้จากโปรแกรมต่างๆ ครับ&lt;br /&gt;&lt;br /&gt;&lt;table border="1"&gt;&lt;tr&gt; &lt;th&gt;รูปแบบ&lt;/th&gt;&lt;th&gt;ตัวเลข&lt;/th&gt;&lt;th&gt;0 นำหน้า&lt;/th&gt;&lt;th&gt;ชื่อเต็ม&lt;/th&gt;&lt;th&gt;ชื่อย่อ&lt;/th&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;วันของสัปดาห์&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%u&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%a&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%A&lt;/code&gt;&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;วันของเดือน&lt;/td&gt;&lt;td&gt;&lt;code&gt;%e&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%d&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;วันของปี&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%j&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;สัปดาห์&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%V&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;เดือน&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%m&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%b&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%B&lt;/code&gt;&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;ปี&lt;/td&gt;&lt;td&gt;&lt;code&gt;%y&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%Y&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;เขตเวลา&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%z&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%Z&lt;/code&gt;&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;12 ชั่วโมง&lt;/td&gt;&lt;td&gt;&lt;code&gt;%l&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%I&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%p&lt;/code&gt;&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;24 ชั่วโมง&lt;/td&gt;&lt;td&gt;&lt;code&gt;%k&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%H&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;นาที&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%M&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;วินาที&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%S&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;นอกจากนี้ ยังมีรูปแบบที่ใช้บ่อยๆ ที่ถูกเก็บเป็นตัวย่อไว้ให้เรียกใช้ ดังนี้&lt;br /&gt;&lt;br /&gt;&lt;code&gt;%s = &lt;/code&gt;เวลา Unix&lt;br /&gt;&lt;code&gt;%D = %m/%d/%y&lt;/code&gt;&lt;br /&gt;&lt;code&gt;%F = %Y-%m-%d&lt;/code&gt;&lt;br /&gt;&lt;code&gt;%r = %I:%M:%S %p&lt;/code&gt;&lt;br /&gt;&lt;code&gt;%R = %H:%M&lt;/code&gt;&lt;br /&gt;&lt;code&gt;%T = %H:%M:%S&lt;/code&gt;&lt;br /&gt;&lt;code&gt;%c = %a %b %d %H:%M:%S %Y&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;สำหรับค่าเริ่มต้นเมื่อไม่ได้กำหนดรูปแบบเป็นพิเศษ จะได้รูปแบบเป็น &lt;code&gt;%c&lt;/code&gt; เช่น Tue Feb 14 16:03:42 2012 ครับ&lt;br /&gt;&lt;br /&gt;อย่างไรก็ตาม โปรแกรมต่างๆ อาจมีวิธีเรียกใช้ค่าเหล่านี้แตกต่างกันไปบ้าง อย่าลืมเช็คกับเอกสารประจำโปรแกรมนั้นๆ ด้วยนะครับ&lt;br /&gt;&lt;br /&gt;ปล. ไหนๆ วันนี้ก็วันแห่งความรักทั้งที รู้จักเวลา Unix ไปแล้ว ก็อย่าลืมแบ่งเวลาไปใส่ใจเธอด้วยนะครับ :P&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3074227793814140422-1203434253109438206?l=tutor0x.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Tutor0x/~4/BLSg9AJ7-Qc" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tutor0x.blogspot.com/2012/02/misc.html</feedburner:origLink></item><media:rating>nonadult</media:rating></channel></rss>

