<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Cholwich's blog &#187; programming</title>
	<atom:link href="http://cholwich.org/wordpress/tag/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://cholwich.org/wordpress</link>
	<description>Just another blog of mine</description>
	<lastBuildDate>Thu, 02 Jun 2011 02:00:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>จับลอกการบ้านแบบพื้นๆ</title>
		<link>http://cholwich.org/wordpress/2011/01/17/%e0%b8%88%e0%b8%b1%e0%b8%9a%e0%b8%a5%e0%b8%ad%e0%b8%81%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b8%9a%e0%b9%89%e0%b8%b2%e0%b8%99%e0%b9%81%e0%b8%9a%e0%b8%9a%e0%b8%9e%e0%b8%b7%e0%b9%89%e0%b8%99%e0%b9%86/</link>
		<comments>http://cholwich.org/wordpress/2011/01/17/%e0%b8%88%e0%b8%b1%e0%b8%9a%e0%b8%a5%e0%b8%ad%e0%b8%81%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b8%9a%e0%b9%89%e0%b8%b2%e0%b8%99%e0%b9%81%e0%b8%9a%e0%b8%9a%e0%b8%9e%e0%b8%b7%e0%b9%89%e0%b8%99%e0%b9%86/#comments</comments>
		<pubDate>Mon, 17 Jan 2011 08:58:10 +0000</pubDate>
		<dc:creator>cholwich</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[teaching]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[plagiarism]]></category>

		<guid isPermaLink="false">http://cholwich.org/wordpress/?p=414</guid>
		<description><![CDATA[เทอมนี้ผมได้รับมอบหมายให้สอนวิชา Introduction to Computers and Programming ซึ่งเป็นวิชาพื้นฐานสำหรับนักศึกษาชั้นปีที่ 1 ทุกโปรแกรม มีนักศึกษาลงทะเบียนจำนวนมาก อย่างเทอมนี้ก็มีเกือบ 300 คน เนื้อหาหลักก็คือสอนการเขียนโปรแกรมภาษา C กับอัลกอริทึมพื้นฐาน (อย่างเช่น searching และ sorting) แต่การเขียนโปรแกรมเป็นทักษะที่ต้องฝึกฝนบ่อยๆ จึงทำเข้าใจและทำได้ วิชาก็เลยมีทั้งบรรยาย ปฏิบัติการ และการบ้าน (ปีนี้ดีหน่อยที่สามารถหาคนมาช่วยตรวจการบ้านได้) เมื่อมีการบ้านให้คะแนนแล้ว ผมก็อยากจะให้ทำการบ้านกันจริงๆ (อย่างน้อยก็ควรจะได้สัมผัสและฝึกฝนด้วยตนเอง) เลยจะต้องหาทางตรวจว่าลอกการบ้านกันบ้างหรือเปล่า แต่การบ้านแรกคำถามจะค่อนข้างง่ายมาก ไม่สามารถพลิกแพลงหรือเขียนโปรแกรมแบบที่แตกต่างกันมากนัก (ส่วนใหญ่จะฝึกการเขียน expression ตามสูตรที่กำหนดให้) ก็เลยตรวจการลอกข้อสอบแบบง่ายๆ ก่อน (การบ้านครั้งต่อไปค่อยขยับขยายความซับซ้อนในการตรวจจับให้เพิ่มขึ้น) คือ ตรวจแค่ว่าส่งไฟล์เดียวกันมาหรือเปล่า ในที่นี้แปลว่าเอาไฟล์มาจากเพื่อนแล้วก็ upload ส่งมาให้เลยโดยไม่แตะต้องใดๆ ทั้งสิ้น เมื่อจะตรวจแบบพื้นๆ ผมก็แค่ใช้ hash function มาสร้าง message digest จากไฟล์ที่นักศึกษาส่งมา ถ้าไฟล์ไหนมี message digest [...]]]></description>
			<content:encoded><![CDATA[<p>เทอมนี้ผมได้รับมอบหมายให้สอนวิชา Introduction to Computers and Programming ซึ่งเป็นวิชาพื้นฐานสำหรับนักศึกษาชั้นปีที่ 1 ทุกโปรแกรม มีนักศึกษาลงทะเบียนจำนวนมาก อย่างเทอมนี้ก็มีเกือบ 300 คน เนื้อหาหลักก็คือสอนการเขียนโปรแกรมภาษา C กับอัลกอริทึมพื้นฐาน (อย่างเช่น searching และ sorting) แต่การเขียนโปรแกรมเป็นทักษะที่ต้องฝึกฝนบ่อยๆ จึงทำเข้าใจและทำได้ วิชาก็เลยมีทั้งบรรยาย ปฏิบัติการ และการบ้าน (ปีนี้ดีหน่อยที่สามารถหาคนมาช่วยตรวจการบ้านได้)</p>
<p>เมื่อมีการบ้านให้คะแนนแล้ว ผมก็อยากจะให้ทำการบ้านกันจริงๆ (อย่างน้อยก็ควรจะได้สัมผัสและฝึกฝนด้วยตนเอง) เลยจะต้องหาทางตรวจว่าลอกการบ้านกันบ้างหรือเปล่า แต่การบ้านแรกคำถามจะค่อนข้างง่ายมาก ไม่สามารถพลิกแพลงหรือเขียนโปรแกรมแบบที่แตกต่างกันมากนัก (ส่วนใหญ่จะฝึกการเขียน expression ตามสูตรที่กำหนดให้) ก็เลยตรวจการลอกข้อสอบแบบง่ายๆ ก่อน (การบ้านครั้งต่อไปค่อยขยับขยายความซับซ้อนในการตรวจจับให้เพิ่มขึ้น) คือ ตรวจแค่ว่าส่งไฟล์เดียวกันมาหรือเปล่า ในที่นี้แปลว่าเอาไฟล์มาจากเพื่อนแล้วก็ upload ส่งมาให้เลยโดยไม่แตะต้องใดๆ ทั้งสิ้น</p>
<p>เมื่อจะตรวจแบบพื้นๆ ผมก็แค่ใช้ hash function มาสร้าง message digest จากไฟล์ที่นักศึกษาส่งมา ถ้าไฟล์ไหนมี message digest เหมือนกัน ก็แปลว่าลอกกันมาทั้งไฟล์ จะไปได้หักคะแนนถูก การหาค่า message digest ของไฟล์การบ้านทั้งหมด ก็ใช้คำสั่ง find ของ unix</p>
<pre class="bash">
$ cd assignment1
$ find . -name "*" -not -type d -exec shasum '{}' \; | sort > digest_list.txt
</pre>
<p>คำสั่ง find ใช้หาชื่อไฟล์ตามเงื่อนไขที่กำหนด ในที่นี้คือเอาทุกไฟล์ ยกเว้นไดเรคทอรี เมื่อได้ไฟล์แล้ว เราก็สามารถสั่งให้รันโปรแกรม shasum โดย &#8216;{}&#8217; จะถูกแทนด้วยชื่อไฟล์ที่ค้นเจอแต่ละไฟล์ จากนั้นก็เอาไปเรียงลำดับเพื่อให้ไฟล์ที่มี digest เหมือนกันอยู่ติดกัน เก็บลงไฟล์​ digest_list.txt ที่เหลือก็แค่เขียนโปรแกรมจับกลุ่มว่าไฟล์ที่เหมือนกันมีใครบ้าง จัดเป็นกลุ่มก็เรียบร้อย</p>
]]></content:encoded>
			<wfw:commentRss>http://cholwich.org/wordpress/2011/01/17/%e0%b8%88%e0%b8%b1%e0%b8%9a%e0%b8%a5%e0%b8%ad%e0%b8%81%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b8%9a%e0%b9%89%e0%b8%b2%e0%b8%99%e0%b9%81%e0%b8%9a%e0%b8%9a%e0%b8%9e%e0%b8%b7%e0%b9%89%e0%b8%99%e0%b9%86/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>ลองเล่น Go</title>
		<link>http://cholwich.org/wordpress/2009/11/22/%e0%b8%a5%e0%b8%ad%e0%b8%87%e0%b9%80%e0%b8%a5%e0%b9%88%e0%b8%99-go/</link>
		<comments>http://cholwich.org/wordpress/2009/11/22/%e0%b8%a5%e0%b8%ad%e0%b8%87%e0%b9%80%e0%b8%a5%e0%b9%88%e0%b8%99-go/#comments</comments>
		<pubDate>Sun, 22 Nov 2009 14:07:27 +0000</pubDate>
		<dc:creator>cholwich</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[go]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://cholwich.org/wordpress/?p=349</guid>
		<description><![CDATA[ไม่ได้เขียนอะไรใหม่ๆ ที่นี่มาเกือบครึ่งปี เพราะงานยุ่ง แล้วก็ยังเสพติด twitter และ facebook งอมแงมอีกต่างหาก วันนี้มีเวลาว่าง (จริงๆ ก็ไม่ว่างหรอก แต่ขี้เกียจทำงานที่ควรจะทำ) เลยเอา Go Programming Language ที่พัฒนาโดย Google มาลองเล่นดู เนื่องจากผมใช้ Mac OS X ซึ่งเป็นแพลตฟอร์มที่สนับสนุนอยู่แล้ว ก็เลยติดตั้งไม่ยาก แค่มี XCode อยู่ แล้วลง mercurial เพิ่ม ก็สามารถโหลดซอร์สโค้ดคอมไพเลอร์ของ Go มาคอมไพล์เองได้เลย ใช้เวลาคอมไพล์ตัวคอมไพเลอร์สั้นมาก แป๊บเดียวเสร็จ ประทับใจพอสมควร จากนั้นก็เลยลองเขียนโปรแกรมแบบมั่วๆ (เพราะยังงงกับ syntax อยู่) เพื่อแก้ปัญหา N-Queens แบบง่ายๆ (ใช้ backtracking search ด้วย recursive ดื้อๆ เอานี่แหละ) โดยใช้ Go: package main [...]]]></description>
			<content:encoded><![CDATA[<p>ไม่ได้เขียนอะไรใหม่ๆ ที่นี่มาเกือบครึ่งปี เพราะงานยุ่ง แล้วก็ยังเสพติด <a href="http://twitter.com">twitter</a> และ <a href="http://facebook.com">facebook</a> งอมแงมอีกต่างหาก วันนี้มีเวลาว่าง (จริงๆ ก็ไม่ว่างหรอก แต่ขี้เกียจทำงานที่ควรจะทำ) เลยเอา <a href="http://golang.org">Go Programming Language</a> ที่พัฒนาโดย <a href="http://google.com">Google</a> มาลองเล่นดู เนื่องจากผมใช้ Mac OS X ซึ่งเป็นแพลตฟอร์มที่สนับสนุนอยู่แล้ว ก็เลยติดตั้งไม่ยาก แค่มี XCode อยู่ แล้วลง mercurial เพิ่ม ก็สามารถโหลดซอร์สโค้ดคอมไพเลอร์ของ Go มาคอมไพล์เองได้เลย ใช้เวลาคอมไพล์ตัวคอมไพเลอร์สั้นมาก แป๊บเดียวเสร็จ ประทับใจพอสมควร</p>
<p>จากนั้นก็เลยลองเขียนโปรแกรมแบบมั่วๆ (เพราะยังงงกับ syntax อยู่) เพื่อแก้ปัญหา N-Queens แบบง่ายๆ (ใช้ backtracking search ด้วย recursive ดื้อๆ เอานี่แหละ) โดยใช้ Go:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">package main
&nbsp;
import <span style="color: #ff0000;">&quot;fmt&quot;</span>
&nbsp;
var N <span style="color: #993333;">int</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">10</span>
&nbsp;
func nqueens<span style="color: #009900;">&#40;</span>board <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #993333;">int</span><span style="color: #339933;">,</span> filled <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span> <span style="color: #993333;">int</span> <span style="color: #009900;">&#123;</span>
	var attack bool <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">false</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> filled <span style="color: #339933;">==</span> N<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">for</span> i<span style="color: #339933;">:=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i<span style="color: #339933;">&lt;</span>N<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span> <span style="color: #009900;">&#123;</span>
			fmt.<span style="color: #202020;">Printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span><span style="color: #339933;">,</span> board<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#125;</span>
		fmt.<span style="color: #202020;">Printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">1</span>
	<span style="color: #009900;">&#125;</span>
	filled <span style="color: #339933;">+=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">for</span> i<span style="color: #339933;">:=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i<span style="color: #339933;">&lt;</span>N<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span> <span style="color: #009900;">&#123;</span>
		board<span style="color: #009900;">&#91;</span>filled<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> i<span style="color: #339933;">;</span>
		attack <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">false</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">for</span> j<span style="color: #339933;">:=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> j<span style="color: #339933;">&lt;</span>filled<span style="color: #339933;">;</span> j<span style="color: #339933;">++</span> <span style="color: #009900;">&#123;</span>
			dy <span style="color: #339933;">:=</span> board<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">-</span>board<span style="color: #009900;">&#91;</span>filled<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
			dx <span style="color: #339933;">:=</span> j <span style="color: #339933;">-</span> filled<span style="color: #339933;">;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>board<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> board<span style="color: #009900;">&#91;</span>filled<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> 
			<span style="color: #009900;">&#40;</span>dy<span style="color: #339933;">/</span>dx <span style="color: #339933;">==</span> <span style="color: #0000dd;">1</span> <span style="color: #339933;">||</span> dy<span style="color: #339933;">/</span>dx <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>dy<span style="color: #339933;">%</span>dx <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				attack <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">true</span><span style="color: #339933;">;</span>
				<span style="color: #000000; font-weight: bold;">break</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>		
		<span style="color: #b1b100;">if</span> <span style="color: #339933;">!</span>attack <span style="color: #009900;">&#123;</span>
			nqueens<span style="color: #009900;">&#40;</span>board<span style="color: #339933;">,</span> filled<span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#125;</span>	
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
func main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	var board <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #993333;">int</span> <span style="color: #339933;">=</span> make<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #993333;">int</span><span style="color: #339933;">,</span> N<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	nqueens<span style="color: #009900;">&#40;</span>board<span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>ด้วยความอยากรู้ ก็เลยลองเอาโปรแกรมนี้เอามาแปลงเป็นภาษา C แบบตรงๆ บรรทัดต่อบรรทัด</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include&lt;stdio.h&gt;</span>
<span style="color: #339933;">#include&lt;stdlib.h&gt;</span>
&nbsp;
<span style="color: #993333;">const</span> <span style="color: #993333;">int</span> N<span style="color: #339933;">=</span><span style="color: #0000dd;">10</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">int</span> nqueens<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> <span style="color: #339933;">*</span>board<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> filled<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">int</span> i<span style="color: #339933;">,</span>j<span style="color: #339933;">,</span>attack<span style="color: #339933;">,</span>dy<span style="color: #339933;">,</span>dx<span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>filled <span style="color: #339933;">==</span> N<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i<span style="color: #339933;">&lt;</span>N<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
			<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span><span style="color: #339933;">,</span> board<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	filled<span style="color: #339933;">++;</span>
	<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i<span style="color: #339933;">&lt;</span>N<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		board<span style="color: #009900;">&#91;</span>filled<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> i<span style="color: #339933;">;</span>
		attack <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>j<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> j<span style="color: #339933;">&lt;</span>filled<span style="color: #339933;">;</span> j<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			dy <span style="color: #339933;">=</span> board<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">-</span>board<span style="color: #009900;">&#91;</span>filled<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
			dx <span style="color: #339933;">=</span> j <span style="color: #339933;">-</span> filled<span style="color: #339933;">;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>board<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> board<span style="color: #009900;">&#91;</span>filled<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span>
			<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>dy<span style="color: #339933;">/</span>dx <span style="color: #339933;">==</span> <span style="color: #0000dd;">1</span> <span style="color: #339933;">||</span> dy<span style="color: #339933;">/</span>dx <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>dy<span style="color: #339933;">%</span>dx <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				attack <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
				<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>attack<span style="color: #009900;">&#41;</span>
			nqueens<span style="color: #009900;">&#40;</span>board<span style="color: #339933;">,</span> filled<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">int</span> <span style="color: #339933;">*</span>board <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>malloc<span style="color: #009900;">&#40;</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span>N<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	nqueens<span style="color: #009900;">&#40;</span>board<span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>เสร็จแล้วก็ลองเขียน Python อีกโปรแกรมหนึ่ง</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> nqueens<span style="color: black;">&#40;</span>board, filled<span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">global</span> N
	<span style="color: #ff7700;font-weight:bold;">if</span> filled == N-<span style="color: #ff4500;">1</span>:
		<span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> board:
			<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;%d<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span> <span style="color: #66cc66;">%</span> board<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span>,
		<span style="color: #ff7700;font-weight:bold;">print</span>
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span>
	filled+=<span style="color: #ff4500;">1</span>
	<span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">xrange</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, N<span style="color: black;">&#41;</span>:
		board<span style="color: black;">&#91;</span>filled<span style="color: black;">&#93;</span> = i
		attack = <span style="color: #008000;">False</span>
		<span style="color: #ff7700;font-weight:bold;">for</span> j <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">xrange</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, filled<span style="color: black;">&#41;</span>:
			dy = board<span style="color: black;">&#91;</span>j<span style="color: black;">&#93;</span>-board<span style="color: black;">&#91;</span>filled<span style="color: black;">&#93;</span>
			dx = j - filled
			<span style="color: #ff7700;font-weight:bold;">if</span> board<span style="color: black;">&#91;</span>j<span style="color: black;">&#93;</span> == board<span style="color: black;">&#91;</span>filled<span style="color: black;">&#93;</span> <span style="color: #ff7700;font-weight:bold;">or</span> <span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>dy/dx == <span style="color: #ff4500;">1</span> <span style="color: #ff7700;font-weight:bold;">or</span> dy/dx == -<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">and</span> dy<span style="color: #66cc66;">%</span>dx==<span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>:
				attack = <span style="color: #008000;">True</span>
				<span style="color: #ff7700;font-weight:bold;">break</span>
		<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> attack:
			nqueens<span style="color: black;">&#40;</span>board, filled<span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #ff4500;">0</span>
N=<span style="color: #ff4500;">10</span>
board = <span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">*</span>N
nqueens<span style="color: black;">&#40;</span>board, -<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span></pre></div></div>

<p>ทดลองรัน (ด้วย N=10) แล้วจับเวลาง่ายๆ ด้วย time ก็จะได้ผลเป็น</p>
<table>
<tr>
<th></th>
<th>Go</th>
<th>C</th>
<th>Python</th>
</tr>
<tr>
<th>real</th>
<td>0m0.165s</td>
<td>0m0.041s</td>
<td>0m1.048s</td>
</tr>
<tr>
<th>user</th>
<td>0m0.116s</td>
<td>0m0.029s</td>
<td>0m1.028s</td>
</tr>
<tr>
<th>sys</th>
<td>0m0.040s</td>
<td>0m0.002s</td>
<td>0m0.015s</td>
</tr>
</table>
<p>ประสิทธิภาพแบบคร่าวๆ ก็ถือว่าใช้ได้ทีเดียว ไม่ได้แย่กว่า C นัก แต่ไม่รู้ว่าผมชินกับภาษา C มากเกินไปหรือเปล่า ทำให้ผมรู้สึกแปลกๆ งงๆ กับ syntax ของ Go มันดูไม่ค่อยสวยงามยังไงไม่รู้ บอกไม่ถูก เหมือนแค่เอา C มาตัดบางส่วนออก เพราะกลัวจะพิมพ์เยอะเกินไป มันเลยดูขัดๆ อีกอย่าง Go ก็ไม่ได้เขียนสั้นๆ ง่ายๆ ได้เหมือน Python ผมว่าโครงสร้าง syntax ของ C กับ Python สวยงามกว่าเยอะ แต่ผมก็ยังไม่ลอง concurrent programming ที่เป็นจุดขายของ Go เหมือนกัน เอาไว้หนีงานมาลองใหม่คราวหน้าละกัน</p>
]]></content:encoded>
			<wfw:commentRss>http://cholwich.org/wordpress/2009/11/22/%e0%b8%a5%e0%b8%ad%e0%b8%87%e0%b9%80%e0%b8%a5%e0%b9%88%e0%b8%99-go/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>เขียนโปรแกรมกันเถอะ</title>
		<link>http://cholwich.org/wordpress/2009/06/07/%e0%b9%80%e0%b8%82%e0%b8%b5%e0%b8%a2%e0%b8%99%e0%b9%82%e0%b8%9b%e0%b8%a3%e0%b9%81%e0%b8%81%e0%b8%a3%e0%b8%a1%e0%b8%81%e0%b8%b1%e0%b8%99%e0%b9%80%e0%b8%96%e0%b8%ad%e0%b8%b0/</link>
		<comments>http://cholwich.org/wordpress/2009/06/07/%e0%b9%80%e0%b8%82%e0%b8%b5%e0%b8%a2%e0%b8%99%e0%b9%82%e0%b8%9b%e0%b8%a3%e0%b9%81%e0%b8%81%e0%b8%a3%e0%b8%a1%e0%b8%81%e0%b8%b1%e0%b8%99%e0%b9%80%e0%b8%96%e0%b8%ad%e0%b8%b0/#comments</comments>
		<pubDate>Sun, 07 Jun 2009 01:16:54 +0000</pubDate>
		<dc:creator>cholwich</dc:creator>
				<category><![CDATA[thought]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[teaching]]></category>

		<guid isPermaLink="false">http://cholwich.org/wordpress/?p=330</guid>
		<description><![CDATA[เมื่อวานนี้อ่านข่าวบน /.jp แล้วเจอบทสัมภาษณ์ประธานบริษัท NTT Data ซึ่งเป็นบริษัท IT ในกลุ่ม NTT 若い時にプログラムを書こう、必ず人生の豊かさにつながる &#8211; 山下徹　NTTデータ社長 แปลเป็นไทยได้ความว่า เขียนโปรแกรมกันไปเถอะในช่วงที่อายุยังน้อย, สิ่งเหล่านี้จะเชื่อมโยงกับความรุ่มรวยในชีวิตอย่างแน่นอน &#8211; โทรุ ยะมะชิตะ ประธานบริษัทเอ็นทีทีดาต้า ถ้าอ่านบทสัมภาษณ์ฉบับเต็มแล้ว จะมีประเด็นต่างๆ อยู่หลายประเด็น แต่ในฐานะคนสอนหนังสือเด็กปริญญาตรี ผมสนใจประเด็นการเขียนโปรแกรมเป็นหลัก เพราะปัจจุบันผมรู้สึกว่าตัวเองยังไม่สามารถทำให้เด็กๆ ที่สอนอยู่ หันมาชอบ สนใจและตั้งใจที่จะเขียนโปรแกรมคอมพิวเตอร์ได้ แม้ว่าเด็กๆ เหล่านั้นจะเรียนในสาขาที่โลกภายนอกคาดหวังว่า เมื่อจบแล้วจะต้องมีทักษะในการเขียนโปรแกรมที่เพียงพอ จริงอยู่ว่าเด็กส่วนใหญ่จะพอเขียนโปรแกรมได้ อาจจะใช้วิธีตัดแปะเอาบ้าง หาทางเอาตัวรอดกันไปได้ แต่ส่วนใหญ่มักจะรู้สึกว่าการเขียนโปรแกรมเป็นเรื่องยาก เป็นเรื่องน่าเบื่อ เป็นงานคนชั้นล่าง (เหมือนผู้ใช้แรงงานในสังคมไอที) โดยเฉพาะค่านิยมอันหลังนี้ เป็นสิ่งที่ผมไม่เห็นด้วยที่สุด เพราะผมเชื่อว่าเราไม่สามารถเป็น system analyst เป็น project manager ที่ดี หรือเป็นตำแหน่งต่างๆ ที่บางบริษัทบอกว่าเป็นเหมือนยอดปิระมิดได้ โดยไม่มีพื้นฐาน ทักษะการเขียนโปรแกรม หรือไม่รู้ว่าถ้าออกแบบไปอย่างนี้แล้วคนที่เอาไป implement เขาจะทำยังไง ผมตั้งใจว่าต่อไปนี้ผมพยายามลบค่านิยมนี้ออกจากเด็กๆ [...]]]></description>
			<content:encoded><![CDATA[<p>เมื่อวานนี้อ่านข่าวบน <a href="http://slashdot.jp">/.jp</a> แล้วเจอบทสัมภาษณ์ประธานบริษัท NTT Data ซึ่งเป็นบริษัท IT ในกลุ่ม NTT</p>
<blockquote><p>若い時にプログラムを書こう、必ず人生の豊かさにつながる<br />
&#8211; 山下徹　NTTデータ社長</p></blockquote>
<p>แปลเป็นไทยได้ความว่า</p>
<blockquote><p>เขียนโปรแกรมกันไปเถอะในช่วงที่อายุยังน้อย, สิ่งเหล่านี้จะเชื่อมโยงกับความรุ่มรวยในชีวิตอย่างแน่นอน<br />
&#8211; โทรุ ยะมะชิตะ ประธานบริษัทเอ็นทีทีดาต้า</p></blockquote>
<p>ถ้าอ่านบทสัมภาษณ์ฉบับเต็มแล้ว จะมีประเด็นต่างๆ อยู่หลายประเด็น แต่ในฐานะคนสอนหนังสือเด็กปริญญาตรี ผมสนใจประเด็นการเขียนโปรแกรมเป็นหลัก เพราะปัจจุบันผมรู้สึกว่าตัวเองยังไม่สามารถทำให้เด็กๆ ที่สอนอยู่ หันมาชอบ สนใจและตั้งใจที่จะเขียนโปรแกรมคอมพิวเตอร์ได้ แม้ว่าเด็กๆ เหล่านั้นจะเรียนในสาขาที่โลกภายนอกคาดหวังว่า เมื่อจบแล้วจะต้องมีทักษะในการเขียนโปรแกรมที่เพียงพอ</p>
<p>จริงอยู่ว่าเด็กส่วนใหญ่จะพอเขียนโปรแกรมได้ อาจจะใช้วิธีตัดแปะเอาบ้าง หาทางเอาตัวรอดกันไปได้ แต่ส่วนใหญ่มักจะรู้สึกว่าการเขียนโปรแกรมเป็นเรื่องยาก เป็นเรื่องน่าเบื่อ เป็นงานคนชั้นล่าง (เหมือนผู้ใช้แรงงานในสังคมไอที) โดยเฉพาะค่านิยมอันหลังนี้ เป็นสิ่งที่ผมไม่เห็นด้วยที่สุด เพราะผมเชื่อว่าเราไม่สามารถเป็น system analyst เป็น project manager ที่ดี หรือเป็นตำแหน่งต่างๆ ที่บางบริษัทบอกว่าเป็นเหมือนยอดปิระมิดได้ โดยไม่มีพื้นฐาน ทักษะการเขียนโปรแกรม หรือไม่รู้ว่าถ้าออกแบบไปอย่างนี้แล้วคนที่เอาไป implement เขาจะทำยังไง</p>
<p>ผมตั้งใจว่าต่อไปนี้ผมพยายามลบค่านิยมนี้ออกจากเด็กๆ ที่เข้ามาเรียนในภาค แม้ว่ามันจะเป็นเรื่องยาก เพราะแนวความคิดว่างานบริหารจัดการเป็นงานสบายเป็นเรื่องที่ฝังรากลึกไปแล้ว รวมถึงการเสนอทางเลือกที่ดูเหมือนดีกว่า ว่าการเรียนวิธีการบริหารจัดการโดยตรงก็สามารถเข้าใจวิธีการ และเทคนิคต่างๆ ได้ สามารถเริ่มงานโดยเป็นผู้บริหารได้เลย ไม่จำเป็นต้องทำงานต๊อกต๋อยเหมือนพวกที่เรียนเขียนโปรแกรม เขาทำแค่ออกแบบ เสนอแนวความคิด ที่เหลือก็ปล่อยให้ใครก็ไม่รู้ทำก็หมดเรื่อง</p>
<p>จริงอยู่ ที่เด็กที่จบจากภาคผมทุกคนไม่จำเป็นต้องไปทำงานเขียนโปรแกรม มีงานที่น่าสนใจอีกเยอะ แต่ผมก็เชื่ออย่างประโยคข้างบนว่า ทักษะการเขียนโปรแกรมจะชักนำไปสู่ความรุ่มรวยในชีวิตการทำงาน ทำให้เรามีทักษะที่เพียงพอในการทำสิ่งต่างๆ สำเร็จไปด้วยดี</p>
<p>ปัญหาอย่างหนึ่งสำหรับตัวผมเอง ก็คือ ผมรู้สึกว่าผมยังไม่รู้ ไม่มีวิธีดีๆ ที่จะสอนให้เด็กๆ เข้าใจความสนุกสนาน แล้วความน่าสนใจของการเขียนโปรแกรมได้ คงต้องพยายามกันต่อไป</p>
<p>อ้างอิง: http://slashdot.jp/developers/09/06/05/066228.shtml</p>
]]></content:encoded>
			<wfw:commentRss>http://cholwich.org/wordpress/2009/06/07/%e0%b9%80%e0%b8%82%e0%b8%b5%e0%b8%a2%e0%b8%99%e0%b9%82%e0%b8%9b%e0%b8%a3%e0%b9%81%e0%b8%81%e0%b8%a3%e0%b8%a1%e0%b8%81%e0%b8%b1%e0%b8%99%e0%b9%80%e0%b8%96%e0%b8%ad%e0%b8%b0/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Mail Merge ด้วย Python</title>
		<link>http://cholwich.org/wordpress/2009/04/22/mail-merge-%e0%b8%94%e0%b9%89%e0%b8%a7%e0%b8%a2-python/</link>
		<comments>http://cholwich.org/wordpress/2009/04/22/mail-merge-%e0%b8%94%e0%b9%89%e0%b8%a7%e0%b8%a2-python/#comments</comments>
		<pubDate>Wed, 22 Apr 2009 12:03:22 +0000</pubDate>
		<dc:creator>cholwich</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://cholwich.org/wordpress/?p=286</guid>
		<description><![CDATA[หลังจากถูกถล่มด้วยงานต่างๆ ทำให้ไม่ได้มาเขียนสองเดือนกว่าๆ พอดีช่วงนี้ช่วยจัดงาน PAKDD2009 อยู่ และมีงานที่เกี่ยวข้องที่ต้องใช้สคริปต์ เลยเอามาจดไว้ที่นี่หน่อยกันลืม เรื่องของเรื่องก็คือผมต้องการส่งอีเมลไปยังคนหลายๆ คน โดยมีเนื้อหาที่แตกต่างกันเล็กน้อย ผมเลยเริ่มจากเปิด OpenOffice.org Spreadsheet ขึ้นมาเขียนข้อมูลต่างๆ ที่ต้องการแปะลงไปในจดหมาย แล้วเก็บเป็นไฟล์ CSV (Comma-Separated Value) ที่เป็นสำหรับเก็บข้อมูลแบบง่ายที่สุด แต่ละบรรทัดแทนข้อมูลแต่ละเรคอร์ด และใช้เครื่องหมาย &#8220;,&#8221; คั่นระหว่างข้อมูลแต่ละฟิลด์ จากนั้นก็เขียนสคริปต์ Python เพื่ออ่านข้อมูลจากไฟล์ CSV ที่ทำไว้ เอาไปแปะในเทมเพลตที่เตรียมไว้ โดย Python จะมีคลาสสำหรับอ่านเขียนไฟล์ CSV เป็นคลาสมาตรฐานอยู่แล้ว ก็เลยสามารถทำงานได้สะดวกมาก วิธีใช้คลาส csv เพื่ออ่านข้อมูล จะทำอย่างนี้ import csv data = csv.reader&#40;open&#40;'myfile.csv'&#41;, delimiter=',', quotechar='&#34;'&#41; for row in data: print row&#91;0&#93; csv.reader เป็นคลาสสำหรับจัดการอ่านข้อมูลแบบ [...]]]></description>
			<content:encoded><![CDATA[<p>หลังจากถูกถล่มด้วยงานต่างๆ ทำให้ไม่ได้มาเขียนสองเดือนกว่าๆ พอดีช่วงนี้ช่วยจัดงาน <a href="http://www.pakdd2009.org">PAKDD2009</a> อยู่ และมีงานที่เกี่ยวข้องที่ต้องใช้สคริปต์ เลยเอามาจดไว้ที่นี่หน่อยกันลืม</p>
<p>เรื่องของเรื่องก็คือผมต้องการส่งอีเมลไปยังคนหลายๆ คน โดยมีเนื้อหาที่แตกต่างกันเล็กน้อย ผมเลยเริ่มจากเปิด OpenOffice.org Spreadsheet ขึ้นมาเขียนข้อมูลต่างๆ ที่ต้องการแปะลงไปในจดหมาย แล้วเก็บเป็นไฟล์ CSV (Comma-Separated Value) ที่เป็นสำหรับเก็บข้อมูลแบบง่ายที่สุด แต่ละบรรทัดแทนข้อมูลแต่ละเรคอร์ด และใช้เครื่องหมาย &#8220;,&#8221; คั่นระหว่างข้อมูลแต่ละฟิลด์ จากนั้นก็เขียนสคริปต์ Python เพื่ออ่านข้อมูลจากไฟล์ CSV ที่ทำไว้ เอาไปแปะในเทมเพลตที่เตรียมไว้ โดย Python จะมีคลาสสำหรับอ่านเขียนไฟล์ CSV เป็นคลาสมาตรฐานอยู่แล้ว ก็เลยสามารถทำงานได้สะดวกมาก</p>
<p>วิธีใช้คลาส csv เพื่ออ่านข้อมูล จะทำอย่างนี้</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">csv</span>
data = <span style="color: #dc143c;">csv</span>.<span style="color: black;">reader</span><span style="color: black;">&#40;</span><span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'myfile.csv'</span><span style="color: black;">&#41;</span>, delimiter=<span style="color: #483d8b;">','</span>, quotechar=<span style="color: #483d8b;">'&quot;'</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">for</span> row <span style="color: #ff7700;font-weight:bold;">in</span> data:
	<span style="color: #ff7700;font-weight:bold;">print</span> row<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span></pre></div></div>

<p>csv.reader เป็นคลาสสำหรับจัดการอ่านข้อมูลแบบ CSV รับอาร์กิวเมนต์เป็นไฟล์ เครื่องหมายที่ใช้คั่นระหว่างฟิลด์ และเครื่องหมายที่ใช้เป็น quote ครอบข้อมูลแต่ละฟิลด์ เมื่อสร้างออพเจคต์ของ csv.reader ขึ้นมาแล้ว ก็สามารถวนรอบเพื่ออ่านไฟล์ขึ้นมาทีละเรคอร์ดได้เลย โดยข้อมูลที่อ่านขึ้นมาจะเก็บไว้ในรูปอาเรย์ อย่างกรณีนี้ row[0] ก็คือข้อมูลในฟิลด์แรกสุด</p>
<p>หลังจากนี้เราก็ต้องเตรียมเทมเพลต ซึ่งก็คือกำหนดตัวแปรสตริงเท่านั้นเอง เช่น</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">template = <span style="color: #483d8b;">&quot;&quot;&quot;
Dear {r[0]},
&nbsp;
I would like to send you the following information:
&nbsp;
{r[1]}
&nbsp;
Best Regards,
Cholwich
&quot;&quot;&quot;</span></pre></div></div>

<p>จะเห็นว่าสตริงนี้มีสัญลักษณ์พิเศษ ระบุข้อมูลที่เราต้องการจะเอาไปแทรก {r[0]} หมายถึงสมาชิกตัวแรกของตัวแปร r ที่ส่งมาเป็นพารามิเตอร์ อันนี้เป็นฟีเจอร์ String Formatting ของ Python อยู่แล้ว เมื่อกำหนดเทมเพลตเสร็จ สั่งให้ Python แทรกข้อมูลโดย</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">output = template.<span style="color: black;">format</span><span style="color: black;">&#40;</span>r=row<span style="color: black;">&#41;</span></pre></div></div>

<p>จะได้ผลลัพธ์ที่ผสานข้อมูลเข้าไปแล้ว เป็นสตริงเก็บไว้ที่ตัวแปรชื่อ output จากนั้นผมก็สามารถเอาไปส่งเมล์ หรือเอาไปเขียนลงไฟล์เก็บไว้ได้ พอเอาทั้งหมดมารวมกันก็จะได้</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">csv</span>
&nbsp;
template = <span style="color: #483d8b;">&quot;&quot;&quot;
Dear {r[0]},
&nbsp;
I would like to send you the following information:
&nbsp;
{r[1]}
&nbsp;
Best Regards,
Cholwich.
&quot;&quot;&quot;</span>
data = <span style="color: #dc143c;">csv</span>.<span style="color: black;">reader</span><span style="color: black;">&#40;</span><span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'myfile.csv'</span><span style="color: black;">&#41;</span>, delimiter=<span style="color: #483d8b;">','</span>, quotechar=<span style="color: #483d8b;">'&quot;'</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">for</span> row <span style="color: #ff7700;font-weight:bold;">in</span> data:
	output = template.<span style="color: black;">format</span><span style="color: black;">&#40;</span>r=row<span style="color: black;">&#41;</span>
	f = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>row<span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span>, <span style="color: #483d8b;">'w'</span><span style="color: black;">&#41;</span>
	f.<span style="color: black;">write</span><span style="color: black;">&#40;</span>output<span style="color: black;">&#41;</span>
	f.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>สุดท้ายก็จะได้สคริปต์ง่ายๆ สำหรับทำ mail merge ที่ได้ output เป็นไฟล์แยกกัน โดยระบุชื่อไฟล์ไว้ที่ row[2]</p>
<p>อ้างอิง:</p>
<ol>
<li><a href="http://docs.python.org/whatsnew/2.6.html#pep-3101-advanced-string-formatting">PEP 3103: Advanced String Formatting</a></li>
<li><a href="http://docs.python.org/library/csv.html">Python csv &mdash; CSV File Reading and Writing</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://cholwich.org/wordpress/2009/04/22/mail-merge-%e0%b8%94%e0%b9%89%e0%b8%a7%e0%b8%a2-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Student Randomizer</title>
		<link>http://cholwich.org/wordpress/2008/12/02/student-randomizer/</link>
		<comments>http://cholwich.org/wordpress/2008/12/02/student-randomizer/#comments</comments>
		<pubDate>Tue, 02 Dec 2008 16:31:20 +0000</pubDate>
		<dc:creator>cholwich</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[teaching]]></category>

		<guid isPermaLink="false">http://cholwich.org/wordpress/?p=141</guid>
		<description><![CDATA[ด้วยความที่อยากให้นักศึกษามีส่วนร่วมในการเรียนมากขึ้น เทอมนี้เลยพยายามเรียกนักศึกษาให้ช่วยตอบคำถาม หรือออกมาทำอะไรเล่นหน้าห้อง อย่างน้อยจะได้หลับกันน้อยลง หรือพยายามทำแบบฝึกหัดที่ให้ในห้องเรียนบ้าง แต่จะให้เลือกชื่อก็จำชื่อนักศึกษาทั้งหมดไม่ได้ แถมอาจจะเรียกบางคนซ้ำ หรือไม่ได้เรียกบางคนเลย เมื่อวานพอมีเวลาว่างอยู่บ้าง เลยนั่งเขียนโปรแกรม Java เล็กๆ ขึ้นมาหนึ่งตัว เอาไว้สำหรับสุ่มชื่อนักศึกษาในชั้นเรียน ตอนแรกก็กะจะทำเป็นโปรแกรมง่ายๆ คือแค่เปิดไฟล์อ่านชื่อนักศึกษามา แล้วก็แค่สุ่ม แต่ถ้าทำอย่างนั้นก็มีโอกาสที่บางคนจะโดนซ้ำ หรือสุ่มไม่ทั่วถึง เพื่อเผื่อแผ่ให้ทุกคนถูกเรียกกันอย่างทั่วถึง เลยปรับการสุ่มนิดหน่อย โดยเก็บจำนวนครั้งที่นักศึกษาแต่ละคนถูกเรียกไว้ ถ้าโดนเรียกแล้วหนึ่งครั้ง ก็จะกำหนดโอกาสที่จะถูกสุ่มขึ้นมาอีกให้เป็น 1/2 ของเพื่อนที่ยังไม่เคยโดนเรียก ถ้าโดนสองครั้งก็จะลดไปอีกให้เหลือ 1/4 ของเพื่อนๆ คือให้เป็น 1/(2^n) เมื่อ n เป็นจำนวนครั้งที่ถูกเรียก เสร็จแล้วก็มานึกอีกว่าบางคนอาจจะโดนเรียกแล้วไม่อยู่ อย่ากระนั้นเลยจะต้องเก็บข้อมูลไว้หน่อยว่าคนนี้โดดเรียน เลยทำปุ่มให้กดได้ด้วยว่าโดดไปแล้วกี่ครั้ง (ไม่รู้เก็บไว้ทำไมเหมือนกัน) สุดท้ายได้โปรแกรมออกมาหน้าตาแบบนี้ ถ้าใครสนใจลองโหลดไปเล่นได้ที่นี่ วิธีใช้ก็คือเตรียม text file ใส่ชื่อนักศึกษาบรรทัดละคน เขียน ID ก่อน แล้วค่อยตามด้วยชื่อ คั่นด้วย TAB อาจจะใส่จำนวนครั้งที่เรียกนักศึกษาไปแล้วด้วยก็ได้ คั่นด้วย TAB เหมือนกัน ส่วนโค้ด [...]]]></description>
			<content:encoded><![CDATA[<p>ด้วยความที่อยากให้นักศึกษามีส่วนร่วมในการเรียนมากขึ้น เทอมนี้เลยพยายามเรียกนักศึกษาให้ช่วยตอบคำถาม หรือออกมาทำอะไรเล่นหน้าห้อง อย่างน้อยจะได้หลับกันน้อยลง หรือพยายามทำแบบฝึกหัดที่ให้ในห้องเรียนบ้าง แต่จะให้เลือกชื่อก็จำชื่อนักศึกษาทั้งหมดไม่ได้ แถมอาจจะเรียกบางคนซ้ำ หรือไม่ได้เรียกบางคนเลย เมื่อวานพอมีเวลาว่างอยู่บ้าง เลยนั่งเขียนโปรแกรม Java เล็กๆ ขึ้นมาหนึ่งตัว เอาไว้สำหรับสุ่มชื่อนักศึกษาในชั้นเรียน ตอนแรกก็กะจะทำเป็นโปรแกรมง่ายๆ คือแค่เปิดไฟล์อ่านชื่อนักศึกษามา แล้วก็แค่สุ่ม แต่ถ้าทำอย่างนั้นก็มีโอกาสที่บางคนจะโดนซ้ำ หรือสุ่มไม่ทั่วถึง</p>
<p>เพื่อเผื่อแผ่ให้ทุกคนถูกเรียกกันอย่างทั่วถึง เลยปรับการสุ่มนิดหน่อย โดยเก็บจำนวนครั้งที่นักศึกษาแต่ละคนถูกเรียกไว้ ถ้าโดนเรียกแล้วหนึ่งครั้ง ก็จะกำหนดโอกาสที่จะถูกสุ่มขึ้นมาอีกให้เป็น 1/2 ของเพื่อนที่ยังไม่เคยโดนเรียก ถ้าโดนสองครั้งก็จะลดไปอีกให้เหลือ 1/4 ของเพื่อนๆ คือให้เป็น 1/(2^n) เมื่อ n เป็นจำนวนครั้งที่ถูกเรียก เสร็จแล้วก็มานึกอีกว่าบางคนอาจจะโดนเรียกแล้วไม่อยู่ อย่ากระนั้นเลยจะต้องเก็บข้อมูลไว้หน่อยว่าคนนี้โดดเรียน เลยทำปุ่มให้กดได้ด้วยว่าโดดไปแล้วกี่ครั้ง (ไม่รู้เก็บไว้ทำไมเหมือนกัน)</p>
<p>สุดท้ายได้โปรแกรมออกมาหน้าตาแบบนี้</p>
<p><a href="http://cholwich.org/wordpress/wp-content/uploads/2008/12/stdrnd.png"><img class="aligncenter size-medium wp-image-142" title="Student Randomizer" src="http://cholwich.org/wordpress/wp-content/uploads/2008/12/stdrnd-300x112.png" alt="" width="300" height="112" /></a></p>
<p>ถ้าใครสนใจลองโหลดไปเล่นได้<a href="http://cholwich.org/programs/StudentRandomizer.jar">ที่นี่</a> วิธีใช้ก็คือเตรียม text file ใส่ชื่อนักศึกษาบรรทัดละคน เขียน ID ก่อน แล้วค่อยตามด้วยชื่อ คั่นด้วย TAB อาจจะใส่จำนวนครั้งที่เรียกนักศึกษาไปแล้วด้วยก็ได้ คั่นด้วย TAB เหมือนกัน</p>
<p>ส่วนโค้ด ถ้าใครอยากได้ก็ขอมาล่ะกันครับ มันค่อนข้างเละเทะ ไม่อยากเผย อายครับ <img src='http://cholwich.org/wordpress/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  ถ้ามีเวลาบ้าอีก ก็อาจจะเพิ่มฟีเจอร์อื่นๆ ไปด้วย</p>
]]></content:encoded>
			<wfw:commentRss>http://cholwich.org/wordpress/2008/12/02/student-randomizer/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Ruby กับ Prolog</title>
		<link>http://cholwich.org/wordpress/2008/04/10/ruby-%e0%b8%81%e0%b8%b1%e0%b8%9a-prolog/</link>
		<comments>http://cholwich.org/wordpress/2008/04/10/ruby-%e0%b8%81%e0%b8%b1%e0%b8%9a-prolog/#comments</comments>
		<pubDate>Thu, 10 Apr 2008 13:07:34 +0000</pubDate>
		<dc:creator>cholwich</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[prolog]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://cholwich.org/wordpress/?p=52</guid>
		<description><![CDATA[ช่วงนี้ได้อ่านหนังสือ &#8220;The Ruby Programming Language&#8221; ทำให้มีโอกาสได้รู้เทคนิค หรือฟีเจอร์ของภาษา Ruby หลายอย่าง แม้ว่าจะใช้ Ruby มาตั้งแต่สมัยอยู่ญี่ปุ่น แต่ยังไม่เคยมีโอกาสอ่านหนังสือจริงๆ จังๆ ส่วนใหญ่ก็ใช้ไปแบบงูๆ ปลาๆ เหตุผลเดียวที่ใช้ก็คือรู้สึกว่า syntax ค่อนข้างคงที่ไม่กำกวม แถมยังเป็น OOP ทำให้ง่ายต่อการทำงานบางอย่าง วันนี้เพิ่งอ่านเจอว่าเราสามารถเขียน method ที่รับอาร์กิวเมนต์จำนวนไม่คงที่ได้ โดยใช้วิธีการกำหนดพารามิเตอร์เพิ่มหนึ่งตัว นอกเหนือจากพารามิเตอร์ปกติ และให้ใส่เครื่องหมาย * ไว้ข้างหน้าพารามิเตอร์ตัวนั้น เช่น def min&#40;first, *rest&#41; min=first rest.each &#123;&#124;x&#124; min=x if x&#60;min&#125; return min end method นี้จะหาค่าต่ำที่สุดของอาร์กิวเมนต์ทั้งหมดที่รับมา เช่น &#62;&#62; min&#40;4,2,1,5&#41; =&#62; 1 โดย first เป็นพารามิเตอร์หลัก หมายความว่าจะต้องรับข้อมูลมาอย่างน้อยหนึ่งตัว ส่วน [...]]]></description>
			<content:encoded><![CDATA[<p>ช่วงนี้ได้อ่านหนังสือ &#8220;The Ruby Programming Language&#8221; ทำให้มีโอกาสได้รู้เทคนิค หรือฟีเจอร์ของภาษา Ruby หลายอย่าง แม้ว่าจะใช้ Ruby มาตั้งแต่สมัยอยู่ญี่ปุ่น แต่ยังไม่เคยมีโอกาสอ่านหนังสือจริงๆ จังๆ ส่วนใหญ่ก็ใช้ไปแบบงูๆ ปลาๆ เหตุผลเดียวที่ใช้ก็คือรู้สึกว่า syntax ค่อนข้างคงที่ไม่กำกวม แถมยังเป็น OOP ทำให้ง่ายต่อการทำงานบางอย่าง วันนี้เพิ่งอ่านเจอว่าเราสามารถเขียน method ที่รับอาร์กิวเมนต์จำนวนไม่คงที่ได้ โดยใช้วิธีการกำหนดพารามิเตอร์เพิ่มหนึ่งตัว นอกเหนือจากพารามิเตอร์ปกติ และให้ใส่เครื่องหมาย <code>*</code> ไว้ข้างหน้าพารามิเตอร์ตัวนั้น เช่น</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> min<span style="color:#006600; font-weight:bold;">&#40;</span>first, <span style="color:#006600; font-weight:bold;">*</span>rest<span style="color:#006600; font-weight:bold;">&#41;</span> 
  min=first
  rest.<span style="color:#9900CC;">each</span> <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span>x<span style="color:#006600; font-weight:bold;">|</span> min=x <span style="color:#9966CC; font-weight:bold;">if</span> x<span style="color:#006600; font-weight:bold;">&lt;</span>min<span style="color:#006600; font-weight:bold;">&#125;</span>
  <span style="color:#0000FF; font-weight:bold;">return</span> min
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>method นี้จะหาค่าต่ำที่สุดของอาร์กิวเมนต์ทั้งหมดที่รับมา เช่น</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#006600; font-weight:bold;">&gt;&gt;</span> min<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">4</span>,<span style="color:#006666;">2</span>,<span style="color:#006666;">1</span>,<span style="color:#006666;">5</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">1</span></pre></div></div>

<p>โดย first เป็นพารามิเตอร์หลัก หมายความว่าจะต้องรับข้อมูลมาอย่างน้อยหนึ่งตัว ส่วน rest เป็นพารามิเตอร์สำหรับค่าอื่นๆ ที่เหลือ ในที่นี้เมื่ออ้างถึง rest จะเป็นอะเรย์เก็บค่าต่างๆ ที่ได้รับมา ดังนั้นจึงสามารถใช้ rest.each ในการอ้างถึงสมาชิกแต่ละตัว แล้วเปรียบเทียบหาค่าต่ำที่สุดได้ </p>
<p>ลองดูฟีเจอร์นี้ของ Ruby แล้ว ก็รู้สึกว่าไม่ต่างจากรูปแบบลิสต์ <code>[head|tail]</code> ของ Prolog คือลิสต์ถูกแบ่งเป็นสองส่วน ได้แก่ ส่วนหัว กับส่วนที่เหลือ (ตรงนี้จะต่างจากภาษา C ที่ใช้วิธีกำหนดทั้งหมดไว้ในอะเรย์ แล้วระบุจำนวนอาร์กิวเมนต์มาให้) เลยอยากจะลองเขียน method reverse สำหรับสลับลำดับข้อมูลในลิสต์เรียงกลับจากลำดับเดิม โดยใช้วิธี recursive แบบ Prolog ดู</p>

<div class="wp_syntax"><div class="code"><pre class="prolog" style="font-family:monospace;">reverse<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span>
reverse<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#91;</span>H<span style="color: #339933;">|</span>T<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> R<span style="color: #009900;">&#41;</span> <span style="color: #339933;">:-</span> reverse<span style="color: #009900;">&#40;</span>T<span style="color: #339933;">,</span>TR<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> append<span style="color: #009900;">&#40;</span>T<span style="color: #339933;">,</span><span style="color: #009900;">&#91;</span>H<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>R<span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> reverse<span style="color:#006600; font-weight:bold;">&#40;</span>first, <span style="color:#006600; font-weight:bold;">*</span>rest<span style="color:#006600; font-weight:bold;">&#41;</span> 
  <span style="color:#9966CC; font-weight:bold;">if</span> rest.<span style="color:#9900CC;">empty</span>?
    <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#006600; font-weight:bold;">&#91;</span>first<span style="color:#006600; font-weight:bold;">&#93;</span> 
  <span style="color:#9966CC; font-weight:bold;">else</span> 
    <span style="color:#0000FF; font-weight:bold;">return</span> reverse<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">*</span>rest<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> first
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>ลองเทียบกันดูในแง่ความหมาย จะเห็นว่่าเหมือนกันเป๊ะๆ แถมยังใช้เครื่องหมายคล้ายๆ กันอีก จุดที่แตกต่างที่สุดก็เห็นจะอยู่ที่ลักษณะของ reverse ใน Ruby เป็นฟังก์ชันมีการส่งค่ากลับ ส่วน reverse ของ Prolog เป็น predicate แสดงความสัมพันธ์ระหว่าง list สองอัน </p>
<p>เป็นอันสิ้นสุดการทดลองของวันนี้แต่เพียงเท่านี้ </p>
]]></content:encoded>
			<wfw:commentRss>http://cholwich.org/wordpress/2008/04/10/ruby-%e0%b8%81%e0%b8%b1%e0%b8%9a-prolog/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ruby กับ UTF8</title>
		<link>http://cholwich.org/wordpress/2008/04/10/ruby-%e0%b8%81%e0%b8%b1%e0%b8%9a-utf8/</link>
		<comments>http://cholwich.org/wordpress/2008/04/10/ruby-%e0%b8%81%e0%b8%b1%e0%b8%9a-utf8/#comments</comments>
		<pubDate>Thu, 10 Apr 2008 02:23:43 +0000</pubDate>
		<dc:creator>cholwich</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://cholwich.org/wordpress/?p=50</guid>
		<description><![CDATA[คิดว่าคงจะรู้กันโดยทั่วไปแล้ว ว่าเราสามารถใช้ Ruby กับ String ที่เข้ารหัสแบบ UTF-8 ได้ ที่ว่าใช้ได้นี่หมายความว่า ได้ข้อมูล (ข้อความ) มา ก็สามารถเก็บลงไปในตัวแปรได้เลย ไม่เกิดปัญหาอะไร แต่โดยการทำงานจริงๆ แล้ว Ruby ไม่ได้สนับสนุน UTF-8 หรือการเข้ารหัสข้อความแบบใดๆ ทั้งสิ้น เพียงแค่พิจารณาว่า String ก็คือลำดับของตัวอักษร ที่ตัวอักษรหนึ่งตัวมีขนาดเท่ากัน (จะเป็น 1 ไบต์ หรือ 2 ไบต์ ก็แล้วแต่การใช้งาน) ดังนั้นจึงใช้กับ UTF-8 ที่เก็บตัวอักษรแต่ละตัวด้วยที่ไม่เท่ากันไม่ได้ พอดีช่วงนี้กำลังเขียน Ruby เพื่อจัดการข้อความภาษาไทย และพยายามออกแบบให้จัดการกับภาษาอื่นๆ ได้ด้วย ก็เลยต้องเก็บทุกอย่างไว้เป็น UTF-8 จะได้ไม่เสียเวลาแปลงข้อมูล เสร็จแล้วทีนี้จะต้องเข้าถึงตัวอักษรแต่ละตัวเพื่อคำนวณค่าอะไรบางอย่าง จะใช้ [] ก็ไม่ได้แล้ว เพราะจะได้ตัวอักษรไม่ตรงตัว สุดท้ายเลยต้องไปหา gem ที่ช่วยจัดการ UTF-8 มาลองใช้ด้วย เท่าที่ลองหาดูก็เจอ icu4r [...]]]></description>
			<content:encoded><![CDATA[<p>คิดว่าคงจะรู้กันโดยทั่วไปแล้ว ว่าเราสามารถใช้ Ruby กับ String ที่เข้ารหัสแบบ UTF-8 ได้ ที่ว่าใช้ได้นี่หมายความว่า ได้ข้อมูล (ข้อความ) มา ก็สามารถเก็บลงไปในตัวแปรได้เลย ไม่เกิดปัญหาอะไร แต่โดยการทำงานจริงๆ แล้ว Ruby ไม่ได้สนับสนุน UTF-8 หรือการเข้ารหัสข้อความแบบใดๆ ทั้งสิ้น เพียงแค่พิจารณาว่า String ก็คือลำดับของตัวอักษร ที่ตัวอักษรหนึ่งตัวมีขนาดเท่ากัน (จะเป็น 1 ไบต์ หรือ 2 ไบต์ ก็แล้วแต่การใช้งาน) ดังนั้นจึงใช้กับ UTF-8 ที่เก็บตัวอักษรแต่ละตัวด้วยที่ไม่เท่ากันไม่ได้</p>
<p>พอดีช่วงนี้กำลังเขียน Ruby เพื่อจัดการข้อความภาษาไทย และพยายามออกแบบให้จัดการกับภาษาอื่นๆ ได้ด้วย ก็เลยต้องเก็บทุกอย่างไว้เป็น UTF-8 จะได้ไม่เสียเวลาแปลงข้อมูล เสร็จแล้วทีนี้จะต้องเข้าถึงตัวอักษรแต่ละตัวเพื่อคำนวณค่าอะไรบางอย่าง จะใช้ <code>[]</code> ก็ไม่ได้แล้ว เพราะจะได้ตัวอักษรไม่ตรงตัว สุดท้ายเลยต้องไปหา gem ที่ช่วยจัดการ UTF-8 มาลองใช้ด้วย เท่าที่ลองหาดูก็เจอ</p>
<ul>
<li><a href="http://icu4r.rubyforge.org/">icu4r</a> เป็น binding ที่ทำให้ Ruby ใช้ความสามารถของ ICU ได้ โดยสร้าง class ใหม่ชื่อ UString มาใช้โดยเฉพาะ ดูท่าทางจะใช้ได้ดี แต่ก็มีข้อเสียอยู่ที่ติดตั้งยาก ต้องลง ICU ไว้ในระบบก่อน สุดท้ายเลยเลิกไป</li>
<li><a href="http://www.flexiguided.de/publications.utf8proc.reference.en.html">utf8proc</a> เป็น module อีกอันหนึ่ง ที่เพิ่มส่วนขยายให้คลาส String ซึ่งก็มีข้อจำกัดในฟังก์ชันการทำงาน แถมยังไม่ค่อยมีเอกสารเท่าไหร่</li>
<li><a href="http://rubyforge.org/projects/char-encodings/">character-encodings</a> อันนี้ไปเจอทีหลังสุด ฟีเจอร์ต่างๆ ก็ดูดี ใช้งานไม่ยุ่งยาก (แต่อาจจะหาเอกสารยากเหมือนกัน) แต่คนเขียนพยายามบอกว่ามันคือส่วนหนึ่งที่อาจจะรวมเข้าไปใน Ruby 2.0 เลยเลือกใช้อันนี้</li>
</ul>
<p>การใช้งานก็ไม่ยาก ลองดูตามตัวอย่างนี้ได้เลย</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rubygems'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'encoding/character/utf-8'</span>
s = <span style="color:#006600; font-weight:bold;">+</span><span style="color:#996600;">&quot;สวัสดีครับ&quot;</span>
a = <span style="color:#CC0066; font-weight:bold;">Array</span>.<span style="color:#9900CC;">new</span>
s.<span style="color:#9900CC;">each_char</span> <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span>c<span style="color:#006600; font-weight:bold;">|</span> a <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> c<span style="color:#006600; font-weight:bold;">&#125;</span></pre></div></div>

<p>แค่นี้เราก็แยกตัวอักษรแต่ละตัวจาก s ไปไว้ในอะเรย์ a ได้เลย ตัวอักษรแต่ละตัวก็ยังเก็บในฐานะ String เหมือนเดิม ถ้ามองในแง่ความสะดวกแล้ว การทำแบบนี้ก็ง่ายดี แต่ดูแล้วมันต้องแปลงไปแปลงมาอยู่หลายรอบเหมือนกัน</p>
]]></content:encoded>
			<wfw:commentRss>http://cholwich.org/wordpress/2008/04/10/ruby-%e0%b8%81%e0%b8%b1%e0%b8%9a-utf8/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>เขียนโปรแกรม</title>
		<link>http://cholwich.org/wordpress/2007/07/13/%e0%b9%80%e0%b8%82%e0%b8%b5%e0%b8%a2%e0%b8%99%e0%b9%82%e0%b8%9b%e0%b8%a3%e0%b9%81%e0%b8%81%e0%b8%a3%e0%b8%a1/</link>
		<comments>http://cholwich.org/wordpress/2007/07/13/%e0%b9%80%e0%b8%82%e0%b8%b5%e0%b8%a2%e0%b8%99%e0%b9%82%e0%b8%9b%e0%b8%a3%e0%b9%81%e0%b8%81%e0%b8%a3%e0%b8%a1/#comments</comments>
		<pubDate>Fri, 13 Jul 2007 03:47:31 +0000</pubDate>
		<dc:creator>cholwich</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[quote]]></category>

		<guid isPermaLink="false">http://cholwich.org/wordpress/2007/07/13/%e0%b9%80%e0%b8%82%e0%b8%b5%e0%b8%a2%e0%b8%99%e0%b9%82%e0%b8%9b%e0%b8%a3%e0%b9%81%e0%b8%81%e0%b8%a3%e0%b8%a1/</guid>
		<description><![CDATA[วันนี้อ่านหนังสือใหม่ &#8220;Beautiful Code&#8221; ซึ่งเป็นหนังสือรวมบทความเกี่ยวกันการเขียนโปรแกรม โดยนักวิทยาศาสตร์ และนักพัฒนาโปรแกรมคอมพิวเตอร์ชั้นนำของโลก เลยไปเจอ quote โดนใจในตอนท้ายบทที่ 3 I believe that computer programming is a practical skill, and I agree with Pólya that we &#8220;acquire any practical skill by imitation and practice.&#8221; Programmers who long to write beautiful code should therefore read beautiful programs and imitate the techniques they learn as they write [...]]]></description>
			<content:encoded><![CDATA[<p>วันนี้อ่านหนังสือใหม่ &#8220;Beautiful Code&#8221; ซึ่งเป็นหนังสือรวมบทความเกี่ยวกันการเขียนโปรแกรม โดยนักวิทยาศาสตร์ และนักพัฒนาโปรแกรมคอมพิวเตอร์ชั้นนำของโลก เลยไปเจอ quote โดนใจในตอนท้ายบทที่ 3</p>
<blockquote><p>I believe that computer programming is a practical skill, and I agree with Pólya that we &#8220;acquire any practical skill by imitation and practice.&#8221; Programmers who long to write beautiful code should therefore read beautiful programs and imitate the techniques they learn as they write their own programs.<br />
- Jon Bentley, &#8220;The Most Beautiful Code I Never Wrote&#8221; in &#8220;Beautiful Code&#8221;</p></blockquote>
<p>เข้ากันสถานการณ์ที่กำลังสอนวิชาพื้นฐานให้กับนักศึกษาปีหนึ่งเลย ตอนนี้ก็พยายามย้ำเสมอๆ ว่า Programming เป็นทักษะ ที่ต้องอาศัยการฝึกฝน ไม่ใช่จำรูปแบบคำสั่งได้ แล้วจะเขียนได้ เพราะพยายามกระตุ้นให้คิดให้ทำโจทย์ในห้องเรียน แต่ก็ยังไม่ค่อยประสบความสำเร็จเท่าที่ควร สุดท้ายเลยกลายเป็นอธิบายวิธีทำโจทย์ หรือวิธีคิด วิธีเขียน อยู่ฝ่ายเดียว แต่มองอีกแง่หนึ่งก็อาจจะเป็นการเพิ่มประสบการณ์ให้นักศึกษาก็ได้ ถ้าได้ลองเอาวิธีที่สอนไป ไปคิด ไปลองเล่นเองบ้าง</p>
]]></content:encoded>
			<wfw:commentRss>http://cholwich.org/wordpress/2007/07/13/%e0%b9%80%e0%b8%82%e0%b8%b5%e0%b8%a2%e0%b8%99%e0%b9%82%e0%b8%9b%e0%b8%a3%e0%b9%81%e0%b8%81%e0%b8%a3%e0%b8%a1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>qsort@stdlib</title>
		<link>http://cholwich.org/wordpress/2007/06/05/qsortstdlib/</link>
		<comments>http://cholwich.org/wordpress/2007/06/05/qsortstdlib/#comments</comments>
		<pubDate>Tue, 05 Jun 2007 07:50:03 +0000</pubDate>
		<dc:creator>cholwich</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[qsort]]></category>

		<guid isPermaLink="false">http://cholwich.org/wordpress/2007/06/05/qsortstdlib/</guid>
		<description><![CDATA[ในไลบรารีมาตรฐานของภาษาซี มีฟังก์ชันสำหรับจัดการข้อมูลที่สำคัญอยู่ 2 ฟังก์ชัน คือ bsearch สำหรับการค้นหาข้อมูลแบบ binary search และ qsort สำหรับเรียงลำดับข้อมูลโดยใช้อัลกอริทึม quick sort โดยปกตินักศึกษาส่วนใหญ่มักจะไม่ใช้ เพราะมันดูเหมือนจะยุ่งยากซับซ้อน โดยเฉพาะเรื่องเกี่ยวกับ pointer วันนี้ต้องเขียนโปรแกรมเพื่อเรียงลำดับสายอักขระ เลยเอามาเขียนอธิบายวิธีการใช้ไว้หน่อย เผื่อจะเป็นประโยชน์ต่อตัวเอง และคนที่ผ่านมาเห็น void qsort&#40;void *base, size_t nmemb, size_t size, int&#40;*compar&#41;&#40;const void *, const void *&#41;&#41; จาก function prototype จะเห็นว่าฟังก์ชันนี้ต้องการ argument 4 ตัว คือ base เป็น pointer ที่ชี้ไปยังอะเรย์ที่ใช้เก็บข้อมูลทั้งหมด nmemb ใช้ระบุจำนวนสมาชิกของอะเรย์ที่ต้องการเรียงลำดับ size กำหนดขนาดของข้อมูลแต่ละชุด ซึ่งจำเป็นต้องใช้เวลาย้ายข้อมูลสลับตำแหน่งกัน compar เป็น pointer [...]]]></description>
			<content:encoded><![CDATA[<p>ในไลบรารีมาตรฐานของภาษาซี มีฟังก์ชันสำหรับจัดการข้อมูลที่สำคัญอยู่ 2 ฟังก์ชัน คือ bsearch สำหรับการค้นหาข้อมูลแบบ binary search และ qsort สำหรับเรียงลำดับข้อมูลโดยใช้อัลกอริทึม quick sort โดยปกตินักศึกษาส่วนใหญ่มักจะไม่ใช้ เพราะมันดูเหมือนจะยุ่งยากซับซ้อน โดยเฉพาะเรื่องเกี่ยวกับ pointer วันนี้ต้องเขียนโปรแกรมเพื่อเรียงลำดับสายอักขระ เลยเอามาเขียนอธิบายวิธีการใช้ไว้หน่อย เผื่อจะเป็นประโยชน์ต่อตัวเอง และคนที่ผ่านมาเห็น</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> qsort<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span>base<span style="color: #339933;">,</span> size_t nmemb<span style="color: #339933;">,</span> size_t size<span style="color: #339933;">,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>compar<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>จาก function prototype จะเห็นว่าฟังก์ชันนี้ต้องการ argument 4 ตัว คือ</p>
<ol>
<li>base เป็น pointer ที่ชี้ไปยังอะเรย์ที่ใช้เก็บข้อมูลทั้งหมด</li>
<li>nmemb ใช้ระบุจำนวนสมาชิกของอะเรย์ที่ต้องการเรียงลำดับ</li>
<li>size กำหนดขนาดของข้อมูลแต่ละชุด ซึ่งจำเป็นต้องใช้เวลาย้ายข้อมูลสลับตำแหน่งกัน</li>
<li>compar เป็น pointer ที่ชี้ไปยังฟังก์ชัน เพื่อเปรียบเทียบสมาชิกแต่ละตัวในอะเรย์ ฟังก์ชันนี้ควรจะให้ค่าน้อยกว่าศูนย์ เท่ากับศูนย์ และมากกว่าศูนย์ เช่นเดียวกับฟังก์ชัน strcmp</li>
</ol>
<p><strong>ตัวอย่าง</strong> ผมต้องการเรียงลำดับสตริง ซึ่งในภาษาซีจะใช้ char * ดังนั้นผมจึงสร้างตัวแปรแบบ char ** เพื่อเป็นอะเรย์สำหรับเก็บ pointer ที่ชี้ไปยังสตริงแต่ละตัว ส่วน nmemb ก็คือจำนวนสมาชิกของอะเรย์ กับ size ก็คือ sizeof(char) หาได้ไม่ยาก ปัญหาหลักอยู่ที่ฟังก์ชันสำหรับเปรียบเทียบข้อมูล ซึ่งจะเห็นว่าเรามีฟังก์ชัน strcmp สำหรับเปรียบเทียบสตริงอยู่แล้ว เพียงแต่ prototype อาจจะไม่เหมือนกัน เลยต้องทำฟังก์ชันขึ้นมาห่อไว้หน่อย</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> compare<span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>a<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>b<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span>pa <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span>pb <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>b<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> strcmp<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>pa<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>pb<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>อ้อ เวลาฟังก์ชัน qsort เรียก compar มาทำงาน จะเรียกโดยส่ง pointer ที่ชี้ไปยังสมาชิก 2 ตัวในอะเรย์ไปให้ ฉะนั้นจึงต้องมา cast ให้เป็น char ** ก่อน แล้วถึงจะไปเรียกใช้ strcmp ได้ ส่วนการเรียกฟังก์ชัน qsort ก็แค่</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">qsort<span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span> n<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> compare<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>สุดท้ายที่อยากฝากไว้ก็คือ &#8220;don&#8217;t reinvent the wheel&#8221; เราควรจะใช้สิ่งที่มีอยู่แล้วให้เป็นประโยชน์ให้มากที่สุด โดยเฉพาะอย่างยิ่งฟังก์ชันมาตรฐานต่างๆ เพราะฟังก์ชันเหล่านี้ได้รับการพัฒนามายาวนาน ผ่านร้อนผ่านหนาวมาเยอะ น่าจะทำงานได้ดีกว่าการเขียนฟังก์ชันขึ้นมาใช้งานเอง แต่ทั้งนี้ไม่ได้บอกว่าไม่ควรทำเองนะ เพียงแต่พยายามปรับใช้สิ่งต่างๆ ที่มีอยู่ให้ดี เพื่อจะได้มีเวลาไปทำให้สิ่งใหม่ๆ</p>
<p>อ้างอิง: man qsort</p>
]]></content:encoded>
			<wfw:commentRss>http://cholwich.org/wordpress/2007/06/05/qsortstdlib/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>PHP-PCNTL</title>
		<link>http://cholwich.org/wordpress/2007/05/28/php-pcntl/</link>
		<comments>http://cholwich.org/wordpress/2007/05/28/php-pcntl/#comments</comments>
		<pubDate>Mon, 28 May 2007 08:04:58 +0000</pubDate>
		<dc:creator>cholwich</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://cholwich.org/wordpress/2007/05/28/php-pcntl/</guid>
		<description><![CDATA[ช่วงนี้กำลังพัฒนาระบบให้กับที่ทำงานอย่างที่พูดถึงไปแล้วในหัวข้อก่อน เสร็จแล้วระบบนี้จะต้องสร้าง report ออกมาเป็น PDF ตอนแรกก็พยายามไปค้นๆ เจอ fpdf ซึ่งเป็นไลบรารีสำหรับสร้างเอกสารแบบ PDF โดยใช้ php แต่ลองใช้ดูสักพักก็รู้สึกว่าใช้งานยาก คือจะปรับแต่งให้ได้ดั่งใจค่อนข้างยาก (เผอิญ report ที่ต้องการ ประกอบด้วยตารางเป็นส่วนใหญ่) สุดท้ายเลยกลับมาตายรังโดยใช้ php สร้าง source สำหรับ LaTeX จากนั้นก็ใช้ pdflatex รันก็เสร็จแล้ว ทีนี้พอทำส่วนประกอบต่างๆ เสร็จ ก็อยากจะทำเท่ห์โดยให้ pdflatex ทำงานแบบพื้นหลัง แล้วค่อยใช้ Ajax มาคอยเช็คดูว่าสร้าง pdf เสร็จหรือยัง ก็จำเป็นต้องสร้าง process ใหม่ขึ้นมาเพื่อเรียก pdflatex มาทำงาน ลองค้นดูก็พบว่า php มีกลุ่มคำสั่ง pcntl (Process Control) สำหรับควบคุม process ต่างๆ ซึ่งในนั่นจะมีคำสั่ง pcntl_fork() เอาไว้สร้าง process [...]]]></description>
			<content:encoded><![CDATA[<p>ช่วงนี้กำลังพัฒนาระบบให้กับที่ทำงานอย่างที่พูดถึงไปแล้วในหัวข้อก่อน เสร็จแล้วระบบนี้จะต้องสร้าง report ออกมาเป็น PDF ตอนแรกก็พยายามไปค้นๆ เจอ <a href="http://www.fpdf.org">fpdf</a> ซึ่งเป็นไลบรารีสำหรับสร้างเอกสารแบบ PDF โดยใช้ php แต่ลองใช้ดูสักพักก็รู้สึกว่าใช้งานยาก คือจะปรับแต่งให้ได้ดั่งใจค่อนข้างยาก (เผอิญ report ที่ต้องการ ประกอบด้วยตารางเป็นส่วนใหญ่) สุดท้ายเลยกลับมาตายรังโดยใช้ php สร้าง source สำหรับ LaTeX จากนั้นก็ใช้  pdflatex รันก็เสร็จแล้ว</p>
<p>ทีนี้พอทำส่วนประกอบต่างๆ เสร็จ ก็อยากจะทำเท่ห์โดยให้ pdflatex ทำงานแบบพื้นหลัง แล้วค่อยใช้ Ajax มาคอยเช็คดูว่าสร้าง pdf เสร็จหรือยัง ก็จำเป็นต้องสร้าง process ใหม่ขึ้นมาเพื่อเรียก pdflatex มาทำงาน ลองค้นดูก็พบว่า php มีกลุ่มคำสั่ง pcntl (Process Control) สำหรับควบคุม process ต่างๆ ซึ่งในนั่นจะมีคำสั่ง pcntl_fork() เอาไว้สร้าง process ลูก และ pcntl_exec(&#8230;) สำหรับกำหนดให้เรียกโปรแกรมมาทำงาน</p>
<p>พอใช้ก็โดนเตือนว่าไม่รู้จักคำสั่งพวกนี้ ลองหาไปหามา ก็มีคนบอกว่าต้อง enable pcntl ก่อน ใน ubuntu ไม่ได้ทำมาให้ สุดท้ายก็เลยไปพยายามสร้าง .deb ขึ้นมาใหม่เพื่อการนี้ แต่ก็ยังใช้ไม่ได้ ลองค้นดูอีกเจอว่า คำสั่งพวกนี้จะใช้ได้เฉพาะเวลาใช้ php แบบ CGI เท่านั้น ไม่สามารถใช้ได้เวลาทำงานเป็น module หนึ่งของ Apache (คิดว่าคงเพราะทำงานเป็นส่วนหนึ่งของ process ของ Apache ถ้ายอมให้ทำได้ ก็อาจจะเกิดปัญหาต่างๆ ได้ ต่างจากแบบ CGI ที่ทำงานอยู่บน process ของ php เอง)</p>
<p>สุดท้ายก็เลยเปลี่ยนใจไม่ใช้แล้ว เพราะดูท่าทางจะยุ่งยาก แล้ว pdflatex มันก็ไม่ได้ทำงานนานเท่าไหร่ เนื่องจากไฟล์ค่อนข้างเล็ก</p>
]]></content:encoded>
			<wfw:commentRss>http://cholwich.org/wordpress/2007/05/28/php-pcntl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

