<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://f.kamthorn.org/~d/styles/itemcontent.css"?><rss 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/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>My Life As `Kamthorn'</title>
	
	<link>http://kamthorn.org</link>
	<description />
	<lastBuildDate>Sat, 07 Mar 2009 14:25:29 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<feedburner:info uri="kamthorn" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>14.080825</geo:lat><geo:long>100.602965</geo:long><creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/</creativeCommons:license><image><link>http://creativecommons.org/licenses/by-sa/3.0/</link><url>http://creativecommons.org/images/public/somerights20.gif</url><title>Some Rights Reserved</title></image><xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" /><feedburner:emailServiceId>kamthorn</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Fkamthorn.org%2Ffeed" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Fkamthorn.org%2Ffeed" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Fkamthorn.org%2Ffeed" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://kamthorn.org/feed" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Fkamthorn.org%2Ffeed" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Fkamthorn.org%2Ffeed" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Fkamthorn.org%2Ffeed" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Fkamthorn.org%2Ffeed" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Fkamthorn.org%2Ffeed" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Fkamthorn.org%2Ffeed" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://www.flurry.com/pushRssFeed.do?r=fb&amp;url=http%3A%2F%2Fkamthorn.org%2Ffeed" src="http://www.flurry.com/images/flurry_rss_logo2.gif">Subscribe with Flurry</feedburner:feedFlare><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://f.kamthorn.org/kamthorn-rss" /><feedburner:info uri="kamthorn-rss" /><item>
		<title>เสวนา พรบ.ว่าด้วยการกระทำความผิดเกี่ยวกับคอมพิวเตอร์</title>
		<link>http://f.kamthorn.org/~r/kamthorn-rss/~3/zXDz6CvV24A/computer-crime-act-discussion</link>
		<comments>http://kamthorn.org/2008/09/26/computer-crime-act-discussion#comments</comments>
		<pubDate>Fri, 26 Sep 2008 08:24:01 +0000</pubDate>
		<dc:creator>กำธร</dc:creator>
				<category><![CDATA[Public]]></category>
		<category><![CDATA[Computer Crime]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Law]]></category>
		<category><![CDATA[Thailand]]></category>

		<guid isPermaLink="false">http://kamthorn.org/?p=184</guid>
		<description><![CDATA[เมื่อวานนี้ (25 กันยายน 2551) ในงานมหกรรมซอฟต์แวร์โอเพนซอร์สแห่งชาติครั้งที่ 8 ซึ่งจัดพร้อมกับงานประชุมวิชาการประจำปีของเนคเทค 2008 ผมได้ทำหน้าที่เป็นพิธีกรดำเนินรายการเสวนา พรบ.ว่าด้วยการกระทำความผิดเกี่ยวกับคอมพิวเตอร์ และ Central Log Server ซึ่งมีแขกรับเชิญ 3 ท่านคือ ร.ต.ท.ดรัณ จาดเจริญ สว.กลุ่มงานตรวจสอบฯ ศูนย์ตรวจสอบและวิเคราะห์การกระทำความผิดทางเทคโนโลยี สำนักงานตำรวจแห่งชาติ คุณสถาพร สอนเสนา จากกลุ่มงานนิติกร สำนักงานปลัดกระทรวงเทคโนโลยีสารสนเทศและการสื่อสาร และคุณสว่างพงศ์ หมวดเพชร จากบริษัทไอทีเบเกอรี่ เป็นหนึ่งในผู้ที่ได้พัฒนาผลิตภัณฑ์และจัดอบรมการทำ Central Log Server ด้วยตนเอง
โดยที่ผมเองก็กล่าวได้ว่ายังขาดความรู้ความเข้าใจการจัดเก็บล็อกให้ถูกต้อง คืออ่านในพรบ.แล้วก็ยังติดใจหลายประเด็น ก็ได้โอกาสซักถามในประเด็นต่าง ๆ ที่ตนสงสัย และเพื่อกันลืม และเป็นข้อมูลให้ผู้อื่นได้รับทราบด้วย ขอลิสต์เป็นประเด็นไปดังนี้

ทำไมต้องมี พรบ.นี้ &#8211; เพราะการกระทำความผิดเกี่ยวกับคอมพิวเตอร์มีลักษณะที่ต่างไปจากการกระทำความผิดอื่น ๆ เช่น ผู้กระทำความผิดสามารถทำในที่ลับไม่ให้ใครเห็นได้อย่างง่ายดาย ไม่ต้องเปิดเผยตัว พฤติกรรมการกระทำก็ไม่ชัดเจนเหมือนความผิดอื่น ๆ เช่น การขโมยปากกา ก็คือการนำเอาปากกาของผู้อื่นไปเป็นของของตน ปากกาของผู้เสียหาย ก็เห็นได้ขัดเจนว่าไปอยู่กับผู้กระทำความผิด [...]]]></description>
			<content:encoded><![CDATA[<p>เมื่อวานนี้ (25 กันยายน 2551) ในงานมหกรรมซอฟต์แวร์โอเพนซอร์สแห่งชาติครั้งที่ 8 ซึ่งจัดพร้อมกับงานประชุมวิชาการประจำปีของเนคเทค 2008 ผมได้ทำหน้าที่เป็นพิธีกรดำเนินรายการเสวนา พรบ.ว่าด้วยการกระทำความผิดเกี่ยวกับคอมพิวเตอร์ และ Central Log Server ซึ่งมีแขกรับเชิญ 3 ท่านคือ ร.ต.ท.ดรัณ จาดเจริญ สว.กลุ่มงานตรวจสอบฯ ศูนย์ตรวจสอบและวิเคราะห์การกระทำความผิดทางเทคโนโลยี สำนักงานตำรวจแห่งชาติ คุณสถาพร สอนเสนา จากกลุ่มงานนิติกร สำนักงานปลัดกระทรวงเทคโนโลยีสารสนเทศและการสื่อสาร และคุณสว่างพงศ์ หมวดเพชร จากบริษัทไอทีเบเกอรี่ เป็นหนึ่งในผู้ที่ได้พัฒนาผลิตภัณฑ์และจัดอบรมการทำ Central Log Server ด้วยตนเอง</p>
<p>โดยที่ผมเองก็กล่าวได้ว่ายังขาดความรู้ความเข้าใจการจัดเก็บล็อกให้ถูกต้อง คืออ่านในพรบ.แล้วก็ยังติดใจหลายประเด็น ก็ได้โอกาสซักถามในประเด็นต่าง ๆ ที่ตนสงสัย และเพื่อกันลืม และเป็นข้อมูลให้ผู้อื่นได้รับทราบด้วย ขอลิสต์เป็นประเด็นไปดังนี้</p>
<ul>
<li>ทำไมต้องมี พรบ.นี้ &#8211; เพราะการกระทำความผิดเกี่ยวกับคอมพิวเตอร์มีลักษณะที่ต่างไปจากการกระทำความผิดอื่น ๆ เช่น ผู้กระทำความผิดสามารถทำในที่ลับไม่ให้ใครเห็นได้อย่างง่ายดาย ไม่ต้องเปิดเผยตัว พฤติกรรมการกระทำก็ไม่ชัดเจนเหมือนความผิดอื่น ๆ เช่น การขโมยปากกา ก็คือการนำเอาปากกาของผู้อื่นไปเป็นของของตน ปากกาของผู้เสียหาย ก็เห็นได้ขัดเจนว่าไปอยู่กับผู้กระทำความผิด ในขณะที่การขโมยข้อมูลในคอมพิวเตอร์นั้น ข้อมูลเดิมยังอยู่ แต่ผู้กระทำความผิดได้ลักลอบสำเนาออกไปด้วยวิธีกาาต่าง ๆ โดยหาหลักฐานแทบไม่ได้เลย การมีพรบ.นี้ทำให้การกระทำดังกล่าวสามารถระบุความผิดได้ชัดเจนยิ่งขึ้น</li>
<li>ทำไมต้องเก็บข้อมูลการจราจรทางคอมพิวเตอร์ &#8211; เพื่อใช้ประโยชน์ในการสืบสวนสอบสวน และใช้เป็นพยานหลักฐานการเอาผิด ถ้าไม่เก็บ ก็สืบหาผู้กระทำความผิดไม่ได้ จับได้ก็ไม่มีหลักฐาน</li>
<li>อะไรบ้างที่จะถูกใช้เป็นหลักฐานในการเอาผิด &#8211; 1.เนื้อหา เช่นภาพที่อัพโหลดขึ้นเว็บ ข้อความที่โพสต์ 2. ข้อมูลการจราจรทางคอมพิวเตอร์ 3. การระบุตัวตน เช่น ณ เวลาดังกล่าว ใครเป็นผู้ใช้คอมพิวเตอร์ที่เป็นหมายเลขไอพีดังกล่าว ซึ่งการเก็บเวลาที่แม่นยำตรงกัน จะช่วยให้ระบุตัวตนได้ถูกต้อง</li>
<li>IT Policy &#8211; ในองค์กรต้องกำหนด IT Policy ให้ชัดเจนเพื่อให้ผู้ปฏิบัติงานมีความระมัดระวังการใช้คอมพิวเตอร์ที่ปลอดภัยขึ้น เช่นการใช้งานคอมพิวเตอร์ที่มีการใช้ร่วมกัน เมื่อใช้เสร็จต้องล็อกเอาท์ทุกครั้ง เพื่อป้องกันคนอื่นสวมรอยใช้งานในชื่อเรา เป็นต้น</li>
<li>ถ้าไม่มีเหตุการกระทำความผิดฯ จะมีเจ้าหน้าที่เข้ามาตรวจสอบการเก็บข้อมูลการจราจรทางคอมพิวเตอร์ และฟ้องเอาผิดหรือไม่ &#8211; ไม่มี ถ้าเราไม่เก็บข้อมูลการจราจรทางคอมพิวเตอร์ เจ้าหน้าที่จะไม่ทราบเลย จนกระทั่งมีเหตุการกระทำความผิดฯ เกิดขึ้น แล้วเจ้าหน้าที่ขอเรียกดูข้อมูลจากเรา แล้วเราไม่มีให้ เราก็มีความผิดทันที (ประเด็นนี้ยังติดใจอยู่ เพราะเหมือนว่าจริง ๆ แล้วเจ้าหน้าที่มีเพียงไม่กี่คน ไม่ว่างที่จะไปไล่ตรวจสอบด้วยอีกเหตุหนึ่ง)</li>
<li>ผลิตภัณฑ์สำหรับจัดเก็บข้อมูลจราจรทางคอมพิวเตอร์ที่อ้างว่าได้รับการรับรองจากกระทรวงเทคโนโลยีสารสนเทศและการสื่อสาร เป็นเช่นนั้นจริงหรือไม่ &#8211; ไม่จริง กระทรวงฯ ไม่เคยรับรองและไม่มีนโยบายจะรับรองผลิตภัณฑ์จัดเก็บข้อมูลการจราจรทางคอมพิวเตอร์ใด ๆ ถ้ามีแสดงว่าแอบอ้างเพื่อประโยชน์ทางการค้า</li>
<li>แล้วจะทราบได้อย่างไรว่าผลิตภัณฑ์ฯ ดังกล่าว ทำงานได้ถูกต้องจริง &#8211; ให้อ้างอิงจาก พรบ.และประกาศที่เกี่ยวข้อง ว่าคุณสมบัติของผลิตภัณฑ์เป็นไปตาม พรบ.และประกาศหรือไม่ (ผู้ขายต้องรับรองผลิตภัณฑ์ตัวเอง ว่างั้นเถอะ)</li>
<li>จำเป็นต้องซื้อผลิตภัณฑ์ฯ หรือไม่ &#8211; ไม่จำเป็น สามารถทำเองได้โดยใช้เครื่องมือที่เป็นโอเพนซอร์สทั้งหมด โดยต้องลงทุนศึกษา หรือเข้าอบรมก็ทำได้ แต่ถ้าจะให้สะดวก จะใช้บริการจากผู้ให้บริการ ต่าง ๆ ก็ได้</li>
<li>การทำให้ข้อมูลการจราจรทางคอมพิวเตอร์เชื่อถือได้ ทำอย่างไร &#8211; ใน พรบ. ไม่ได้กำหนดว่าทำอย่างไร ขึ้นอยู่กับเทคนิคและความเหมาะสม เช่นการแยก Server กับ Central Log ออกจากกัน การ sign key ใน archive ของ log หรือแม้แต่เก็บ log ตามปกติแต่มีขั้นตอนระเบียบวิธีปฏิบัติที่เชื่อถือได้ว่าไม่มีการดัดแปลงแก้ไข</li>
<li>ในการสืบสวน หรือแสดงพยานหลักฐานในศาล จะมีการตรวจสอบหรือไม่ว่าข้อมูลดังกล่าวได้รับการจัดเก็บอย่างน่าเชื่อถือจริง &#8211; โดยปกติจะไม่ตรวจสอบ ถือว่าผู้จัดเก็บข้อมูลเป็นพยาน ไม่มีส่วนได้ส่วนเสียในการกระทำความผิด เมื่อแสดงพยานหลักฐานอย่างไร ตำรวจ และศาลจะเชื่อตามนั้น ยกเว้นมีเหตุอันเชื่อได้ว่า ผู้จัดเก็บข้อมูลดังกล่าว อาจจะเกี่ยวข้อง รู้เห็นเป็นใจ หรือมีส่วนได้ส่วนเสียกับการกระทำความผิดดังกล่าว หรือถูกสงสัยว่าเป็นผู้กระทำความผิดเสียเอง</li>
<li>การจัดเก็บข้อมูลการจราจรด้วยวิธี sniff สามารถใช้ได้หรือไม่ &#8211; ไม่แนะนำให้ใช้วิธีดังกล่าว เนื่องจากเสี่ยงต่อการขัดต่อมาตราอื่นบางมาตรา ซึ่งจะทำให้ไม่สามารถนำมาใช้เป็นพยานหลักฐานได้ และมีเทคนิคอื่น ๆ ที่ไม่ต้องใช้วิธีการ sniff</li>
<li>ร้านอินเทอร์เน็ตคาเฟ่ ควรจัดเก็บข้อมูลอย่างไร &#8211; 1. จัดเก็บข้อมูลจราจรทางคอมพิวเตอร์ตามปกติ (คือยังไงก็ต้องมี gateway ที่เก็บ log อยู่ดี) 2. ผู้ใช้บริการต้องแสดงบัตรให้เจ้าหน้าที่ลงบันทึกหมายเลขบัตร และบันทึกเวลาใช้งาน เครื่องที่ใช้ทุกครั้ง ชาวต่างชาติก็ต้องแสดงพาสปอร์ต</li>
<li>ทำไมร้านเน็ตฯ ถูกเพ่งเล็งเป็นพิเศษ &#8211; ร้านอินเทอร์เน็ตคาเฟ่เป็นสถานที่สาธารณะที่มีคนเข้าออกเยอะ ถ้าร้านไหนไม่เข้มงวดเรื่องการจัดเก็บข้อมูลจะเป็นแหล่งให้ผู้กระทำความผิดเลือกใช้เป็นที่ก่อเหตุได้</li>
<li>ประเด็น Free Wi-Fi &#8211; 1. Free Wi-Fi ควรมีการออกรหัสให้ผู้ใช้ที่มีการลงทะเบียนด้วยหมายเลขบัตรฯ เท่านั้น มิฉะนั้นจะเป็นแหล่งเอื้อให้กระทำความผิดได้ 2. ระวัง Free Wi-Fi ปลอม ที่แอบเปิดให้บริการเพื่อดักจับ ID และรหัสผ่าน โดยเฉพาะที่ตั้งชื่อเลียนแบบ Wi-Fi อื่น ๆ แถว ๆ นั้น</li>
</ul>
<p>ฝากให้รับฟังไว้ครับ เพราะหลายประเด็นไม่ได้ระบุชัดเจนใน พรบ. ซึ่งอาจจะมีแนวทางปฏิบัติเปลี่ยนไปในอนาคตก็ได้</p>

<p><a href="http://feedads.g.doubleclick.net/~a/HKxnovfT-mkDf_LTWHRNV4cvQi8/0/da"><img src="http://feedads.g.doubleclick.net/~a/HKxnovfT-mkDf_LTWHRNV4cvQi8/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/HKxnovfT-mkDf_LTWHRNV4cvQi8/1/da"><img src="http://feedads.g.doubleclick.net/~a/HKxnovfT-mkDf_LTWHRNV4cvQi8/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/kamthorn?a=HZwujQvF"><img src="http://feeds.feedburner.com/~f/kamthorn?d=41" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=eAKNJy8A"><img src="http://feeds.feedburner.com/~f/kamthorn?i=eAKNJy8A" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=AQF9cwvn"><img src="http://feeds.feedburner.com/~f/kamthorn?d=45" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=W7rfzpZ4"><img src="http://feeds.feedburner.com/~f/kamthorn?i=W7rfzpZ4" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=qbEfModO"><img src="http://feeds.feedburner.com/~f/kamthorn?d=52" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/kamthorn/~4/rvU4qF4xcOc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://kamthorn.org/2008/09/26/computer-crime-act-discussion/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://kamthorn.org/2008/09/26/computer-crime-act-discussion</feedburner:origLink><feedburner:origLink>http://feedproxy.google.com/~r/kamthorn/~3/rvU4qF4xcOc/computer-crime-act-discussion</feedburner:origLink></item>
		<item>
		<title>Linux Virtualization</title>
		<link>http://f.kamthorn.org/~r/kamthorn-rss/~3/xYKZhaJelm8/linux-virtualization</link>
		<comments>http://kamthorn.org/2008/09/19/linux-virtualization#comments</comments>
		<pubDate>Fri, 19 Sep 2008 09:38:25 +0000</pubDate>
		<dc:creator>กำธร</dc:creator>
				<category><![CDATA[ลินุกซ์]]></category>
		<category><![CDATA[kvm]]></category>
		<category><![CDATA[openvz]]></category>
		<category><![CDATA[virtualization]]></category>
		<category><![CDATA[vserver]]></category>

		<guid isPermaLink="false">http://kamthorn.org/?p=181</guid>
		<description><![CDATA[3-4 คืนมานี้สนุกกับการทดลองเล่นกับ virtualization เพราะมีโอกาสได้ลองกับ server ขนาด quadcore 2 CPU ก่อนนี้ใช้ Linux Vserver อยู่แล้ว และยังใช้งานจริงถึงปัจจุบัน และคิดว่าที่ดีกว่าคือ OpenVZ อย่างน้อยมันกำหนด quota ต่าง ๆ ได้ดีกว่า เช่น CPU, memory, disk quota สามารถสร้าง template ของ guest os ง่าย ดูแล้วเหมาะมากที่จะนำไปให้บริการ VPS
OpenVZ มีข้อดีแบบเดียวกับ Linux Vserver คือไม่ได้กันเนื้อที่ disk และ memory แยกออกมาจาก host OS แบบขาดเลยเหมือนอันอื่น แต่เป็นลักษณะการแชร์กัน เสมือนอยู่บนระบบเดียวกันนั่นแหละ disk image ก็ไม่ต้องสร้าง เก็บ quest OS ไว้ใน directory [...]]]></description>
			<content:encoded><![CDATA[<p>3-4 คืนมานี้สนุกกับการทดลองเล่นกับ virtualization เพราะมีโอกาสได้ลองกับ server ขนาด quadcore 2 CPU ก่อนนี้ใช้ <a href="http://linux-vserver.org/">Linux Vserver</a> อยู่แล้ว และยังใช้งานจริงถึงปัจจุบัน และคิดว่าที่ดีกว่าคือ <a href="http://wiki.openvz.org/">OpenVZ</a> อย่างน้อยมันกำหนด quota ต่าง ๆ ได้ดีกว่า เช่น CPU, memory, disk quota สามารถสร้าง template ของ guest os ง่าย ดูแล้วเหมาะมากที่จะนำไปให้บริการ <a href="http://en.wikipedia.org/wiki/Virtual_private_server">VPS</a></p>
<p>OpenVZ มีข้อดีแบบเดียวกับ Linux Vserver คือไม่ได้กันเนื้อที่ disk และ memory แยกออกมาจาก host OS แบบขาดเลยเหมือนอันอื่น แต่เป็นลักษณะการแชร์กัน เสมือนอยู่บนระบบเดียวกันนั่นแหละ disk image ก็ไม่ต้องสร้าง เก็บ quest OS ไว้ใน directory อันหนึ่ง ทำให้ disk space ก็แชร์กัน ซึ่งดู ๆ แล้วก็คล้าย ๆ กับการใช้ chroot เลย แต่มันมีอะไรลึกซื้งกว่านั้นเยอะ ข้อจำกัดของ Vserver กับ OpenVZ มีแค่ว่าต้องเป็น Linux ด้วยกันเท่านั้นเอง อาจจะต่าง distro กันได้ เรื่อง Vserver กับ OpenVZ ไว้จะเขียนโดยละเอียดอีกที</p>
<p>อีกอันที่สนุกมากคือ KVM ที่มีข้อดีตรงใช้ความสามารถของ virtualization technology ที่มีใน CPU รุ่นใหม่ ๆ ทั้ง Intel และ AMD ทำให้ทำงานได้เร็วมาก โดย KVM นั้นมีส่วนที่เป็น kernel module และส่วนที่เป็น user space ซึ่งอันหลักก็ต่อยอดมาจาก qemu ที่มีชื่อเสียงอยู่ก่อนแล้ว ถ้าใช้ qemu เป็น ก็ใช้ KVM ไม่ยากเลย ซึ่ง KVM ก็ทำให้เป็นไปได้ที่จะมี Windows Server รันอยู่ใน Linux Server อีกทีได้</p>
<p>เรื่องที่ยากหน่อยคือการทำ network interface bridge ซึ่งถึงตอนนี้ก็ยังทำไม่ได้ ลองอ่านจากในเน็ตหลาย ๆ ที่แล้ว  เลยต้องเลี่ยงทำ network ภายใน แล้วใช้ iptables เปลี่ยนทางของข้อมูลแทน</p>
<p>ส่วน XEN นี่ยังไม่มีโอกาสได้ลองซักที ไว้ว่าง ๆ จะลองดูหน่อย</p>

<p><a href="http://feedads.g.doubleclick.net/~a/fOI5TtQAIJXtHG5rI5lRHH2ul6c/0/da"><img src="http://feedads.g.doubleclick.net/~a/fOI5TtQAIJXtHG5rI5lRHH2ul6c/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/fOI5TtQAIJXtHG5rI5lRHH2ul6c/1/da"><img src="http://feedads.g.doubleclick.net/~a/fOI5TtQAIJXtHG5rI5lRHH2ul6c/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/kamthorn?a=2iCP3K5g"><img src="http://feeds.feedburner.com/~f/kamthorn?d=41" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=16Tln4ba"><img src="http://feeds.feedburner.com/~f/kamthorn?i=16Tln4ba" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=HwCy7rcs"><img src="http://feeds.feedburner.com/~f/kamthorn?d=45" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=abjGP5MV"><img src="http://feeds.feedburner.com/~f/kamthorn?i=abjGP5MV" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=2j0D2HmV"><img src="http://feeds.feedburner.com/~f/kamthorn?d=52" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/kamthorn/~4/pYuIguwSGPM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://kamthorn.org/2008/09/19/linux-virtualization/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://kamthorn.org/2008/09/19/linux-virtualization</feedburner:origLink><feedburner:origLink>http://feedproxy.google.com/~r/kamthorn/~3/pYuIguwSGPM/linux-virtualization</feedburner:origLink></item>
		<item>
		<title>Installing Debian Etch with 256MB USB Memory Stick</title>
		<link>http://f.kamthorn.org/~r/kamthorn-rss/~3/f_lKxSyY-O0/installing-debian-etch-with-256mb-usb-memory-stick</link>
		<comments>http://kamthorn.org/2008/07/01/installing-debian-etch-with-256mb-usb-memory-stick#comments</comments>
		<pubDate>Tue, 01 Jul 2008 12:24:44 +0000</pubDate>
		<dc:creator>กำธร</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[Public]]></category>
		<category><![CDATA[ลินุกซ์]]></category>

		<guid isPermaLink="false">http://kamthorn.org/?p=180</guid>
		<description><![CDATA[มีครั้งหนึ่งผมได้รับโจทย์ให้ติดตั้ง server โดยที่ server ที่จะซื้อใหม่นั้นไม่มี cd-rom มาด้วย เข้าใจว่าเป็นเหตุผลด้านราคา ซึ่งในทางปฏิบัติก็คิดว่า server ทุกตัว คงได้ใช้ cd-rom เฉพาะตอนติดตั้ง และตอนอัพเกรด หรือแก้ไขปัญหาต่าง ๆ เท่านั้น นอกนั้นก็ไม่ได้ใช้เลย จึงไม่จำเป็นแล้วที่ server จะมี cd-rom ทีนี้ปัญหาจึงเป็นว่า จะติดตั้ง Debian โดยไม่ใช้ cd-rom ได้อย่างไร คิดแบบเร็ว ๆ ก็คือใช้ USB memory stick ไงล่ะ
แล้วจะทำได้อย่างไร ? ถาม Google จึงพบกับวิธีการในคู่มือของ Debian เองเลย ถึงได้รู้ว่า Debian เค้าเตรียมเรื่องแบบนี้ไว้อยู่แล้วแฮะ ขอสรุปสั้น ๆ เป็นวิธีการที่ผมทำตามขั้นตอนในเว็บดังกล่าวดังต่อไปนี้
คำเตือน: บางขั้นตอนต่อไปนี้เป็นคำสั่งที่ต้องใช้สิทธิของ root ซึ่งหลายคำสั่งเป็นอันตรายหากสั่งอย่างไม่ถูกต้อง ดังนั้นโปรดอ่านให้เข้าใจและทำตามอย่างระมัดระวัง

แน่นอนต้องมี USB memory stick [...]]]></description>
			<content:encoded><![CDATA[<p>มีครั้งหนึ่งผมได้รับโจทย์ให้ติดตั้ง server โดยที่ server ที่จะซื้อใหม่นั้นไม่มี cd-rom มาด้วย เข้าใจว่าเป็นเหตุผลด้านราคา ซึ่งในทางปฏิบัติก็คิดว่า server ทุกตัว คงได้ใช้ cd-rom เฉพาะตอนติดตั้ง และตอนอัพเกรด หรือแก้ไขปัญหาต่าง ๆ เท่านั้น นอกนั้นก็ไม่ได้ใช้เลย จึงไม่จำเป็นแล้วที่ server จะมี cd-rom ทีนี้ปัญหาจึงเป็นว่า จะติดตั้ง Debian โดยไม่ใช้ cd-rom ได้อย่างไร คิดแบบเร็ว ๆ ก็คือใช้ USB memory stick ไงล่ะ</p>
<p>แล้วจะทำได้อย่างไร ? ถาม Google จึงพบกับ<a href="http://www.debian.org/releases/stable/i386/ch04s04.html.en">วิธีการในคู่มือของ Debian เองเลย</a> ถึงได้รู้ว่า Debian เค้าเตรียมเรื่องแบบนี้ไว้อยู่แล้วแฮะ ขอสรุปสั้น ๆ เป็นวิธีการที่ผมทำตามขั้นตอนในเว็บดังกล่าวดังต่อไปนี้<br />
<font color="#ff0000"><b>คำเตือน: บางขั้นตอนต่อไปนี้เป็นคำสั่งที่ต้องใช้สิทธิของ root ซึ่งหลายคำสั่งเป็นอันตรายหากสั่งอย่างไม่ถูกต้อง ดังนั้นโปรดอ่านให้เข้าใจและทำตามอย่างระมัดระวัง</b></font></p>
<ol>
<li>แน่นอนต้องมี USB memory stick ก่อน ส่วนความจุนั้น ขึ้นอยู่กับว่าเราอยากใส่ระบบติดตั้งแบบไหน ผมกะว่าจะติดตั้งแค่แบบ netinst ซึ่งตัว iso มันแค่ 150 MB เอง ดังนั้น USB memory stick ตัวเก่า ๆ 256MB ของผม น่าจะได้ใช้ประโยชน์ก็คราวนี้แหละ และก็ถ้ามีข้อมูลที่ต้องการใช้อยู่ ก็คัดลอกออกจาก USB memory stick เสียให้เรียบร้อย จากนั้นก็ลองเช็คนิดนึงว่า USB memory stick ของเราเสียบที่ช่อง usb แล้วจะเห็นเป็น device อะไร ปกติจะเห็นเป็น /dev/sda แต่หลัง ๆ ก็ไม่แน่ เพราะถ้าฮาร์ดดิสก์ใช้ SCSI (คงน้อย) หรือ S-ATA มันจะใช้ sda ไปแล้ว ซึ่งคงจะเห็น USB เป็น sdb หรือ sdc หรืออื่น ๆ แทน ดังนั้น ในขั้นตอนต่อ ๆ ไปผมจะใช้ /dev/sdX แทนนะครับ ให้เปลี่ยน X เป็นตัวที่ถูกต้องต่อไป</li>
<li>แบ่งพาร์ทิชันใหม่ เนื่องจากเดิมนั้น เจ้า USB memory stick ของผมเป็นแบบ partitionless คือไม่มีการแบ่งพาร์ทิชัน แล้วใช้ทั้งตัวเป็นที่เก็บข้อมูลเลย เวลาใช้บนลินุกซ์ก็จะเมานท์ /dev/sdX มาใช้เลย ไม่ได้เป็น sdX1<br />
โดยการแบ่งจะใช้คำสั่ง dd เพื่อล้าง sector แรกก่อน และใช้ fdisk เพื่อสร้างพาร์ทิชัน โดย</p>
<pre># dd if=/dev/zero of=/dev/sdX bs=512 count=1
# fdisk /dev/sdX
</pre>
<p>กด n (สร้าง partition)<br />
กด p (เลือก primary partition)<br />
กด 1 (เลือก partition ที่ 1)<br />
กด enter เฉย ๆ เพื่อเริ่มจาก cylinder แรก<br />
กด enter เฉย ๆ เพื่อสิ้นสุดที่ cylinder สุดท้าย<br />
กด a เพื่อกำหนดให้ partition บูตได้<br />
กด 1 กำหนดให้บูตจาก partition 1<br />
กด w เพื่อบันทึกและออกจาก fdisk</li>
<li>สร้าง file system
<pre># mkdosfs /dev/sdX1
</pre>
<p>คำสั่ง mkdosfs ถ้าไม่มี ให้ติดตั้ง dosfstools ก่อนโดย apt-get install dosfstools (ปกติคิดว่ามีอยู่แล้วนะ)</li>
<li>ติดตั้ง syslinux สำหรับทำหน้าที่เป็น boot loader
<pre># apt-get install mtools syslinux
# syslinux /dev/sdX1</pre>
</li>
<li>เมานท์ USB memory stick ไปที่ตำแหน่งชั่วคราวซักที่หนึ่งก่อน
<pre># mkdir /mnt/tmp
# mount /dev/sdX1 /mnt/tmp</pre>
<p>จะเห็นแฟ้ม ldlinux.sys อยู่ในนี้แล้ว ไม่ต้องลบหรือทำอะไรกับมันนะครับ ตัวนี้เป็นส่วนหนึ่งของ boot loader</li>
<li>ดาวน์โหลดไฟล์ vmlinuz และ initrd.gz จาก <a href="http://mirror.in.th/debian/dists/Debian4.0r3/main/installer-amd64/current/images/hd-media/">http://mirror.in.th/debian/dists/Debian4.0r3/main/installer-amd64/current/images/hd-media/</a> ไปเก็บใน /mnt/tmp (รุ่นอื่น ๆ ก็เลือกเอาตามความเหมาะสมนะครับ ณ ปัจจุบันรุ่นที่ stable คือ 4.0r3 และผมก็เลือกติดตั้งเป็นแบบ 64bit ซึ่ง processor ของ server ใหม่ ๆ ในปัจจุบันก็สนับสนุนหมดแล้ว ยกเว้นจะเก่า ๆ จริง ๆ ก็ใช้ i386 แทน)</li>
<li>สร้างแฟ้ม syslinux.cfg ใน /mnt/tmp โดยมีเนื้อหาดังนี้
<pre>default vmlinuz
append initrd=initrd.gz</pre>
</li>
<li>ดาวน์โหลดไฟล์ ISO image ตัวติดตั้ง debian จาก <a href="ftp://mirror.in.th/debian_iso/4.0_r3/amd64/iso-cd/">http://mirror.in.th/debian_iso/4.0_r3/amd64/iso-cd/</a> ผมเลือกแบบ netinst ด้วยเหตุผลเรื่องขนาด ดังนั้นจึงเลือกไฟล์ debian-40r3-amd64-netinst.iso แล้วนำไปใส่ไว้ที่ /mnt/tmp เช่นกัน ถ้า USB memory stick ใหญ่กว่านี้เป็น 1GB ก็ดาวน์โหลดแผ่นติดตั้งแผ่นแรกมาลงก็ได้ หรือถ้าน้อยกว่านี้ เช่น 64MB ก็เลือกแบบ businesscard ก็ได้</li>
<li>unmount แล้วนำไปทดลองบูตดูได้เลย
<pre># umount /mnt/tmp</pre>
</li>
</ol>

<p><a href="http://feedads.g.doubleclick.net/~a/uY5cdFL4dxoxX7s9GQynqO2beXw/0/da"><img src="http://feedads.g.doubleclick.net/~a/uY5cdFL4dxoxX7s9GQynqO2beXw/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/uY5cdFL4dxoxX7s9GQynqO2beXw/1/da"><img src="http://feedads.g.doubleclick.net/~a/uY5cdFL4dxoxX7s9GQynqO2beXw/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/kamthorn?a=sEmarRqN"><img src="http://feeds.feedburner.com/~f/kamthorn?d=41" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=FPfjaSC5"><img src="http://feeds.feedburner.com/~f/kamthorn?i=FPfjaSC5" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=oFsHqbC7"><img src="http://feeds.feedburner.com/~f/kamthorn?d=45" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=Z4Dze2Tt"><img src="http://feeds.feedburner.com/~f/kamthorn?i=Z4Dze2Tt" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=LhCzQBLI"><img src="http://feeds.feedburner.com/~f/kamthorn?d=52" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/kamthorn/~4/S1pWTNwWF_s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://kamthorn.org/2008/07/01/installing-debian-etch-with-256mb-usb-memory-stick/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://kamthorn.org/2008/07/01/installing-debian-etch-with-256mb-usb-memory-stick</feedburner:origLink><feedburner:origLink>http://feedproxy.google.com/~r/kamthorn/~3/S1pWTNwWF_s/installing-debian-etch-with-256mb-usb-memory-stick</feedburner:origLink></item>
		<item>
		<title>Firefox Download Day 2008 (ควันหลง)</title>
		<link>http://f.kamthorn.org/~r/kamthorn-rss/~3/IUbq5VqYrio/firefox-download-day-2008-%e0%b8%84%e0%b8%a7%e0%b8%b1%e0%b8%99%e0%b8%ab%e0%b8%a5%e0%b8%87</link>
		<comments>http://kamthorn.org/2008/06/26/firefox-download-day-2008-%e0%b8%84%e0%b8%a7%e0%b8%b1%e0%b8%99%e0%b8%ab%e0%b8%a5%e0%b8%87#comments</comments>
		<pubDate>Thu, 26 Jun 2008 09:53:47 +0000</pubDate>
		<dc:creator>กำธร</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[firefox]]></category>

		<guid isPermaLink="false">http://kamthorn.org/2008/06/26/firefox-download-day-2008-%e0%b8%84%e0%b8%a7%e0%b8%b1%e0%b8%99%e0%b8%ab%e0%b8%a5%e0%b8%87</guid>
		<description><![CDATA[ในที่สุดก็ผ่านไปแล้วกับ Firefox Download Day 2008 เมื่อวันที่ 17 มิ.ย. 2551 แต่จริง ๆ เวลาบ้านเรากว่าจะดาวน์โหลดได้ก็ล่วงเข้าวันที่ 18 ละ ซึ่งเป็นกิจกรรมการตลาดที่ใช้ความร่วมมือของแฟนคลับทั่วโลก ผมก็สนุกกับเขาด้วย ช่วยดาวน์โหลด 2 ครั้ง เป็นเวอร์ชัน Linux กับ Windows ที่จริงโหลดมาก็ไม่ได้ใช้เลย เพราะใน Hardy นั้นก็เป็น Firefox 3.0 อยู่แล้ว สุดท้ายได้ Certificate มา 1 ใบ เท่มาก

ถามว่ากิจกรรมนี้ ทำแล้วได้อะไร ทำไปทำไม บ้างก็บอกว่าทำเอาสถิติไม่เห็นจะมีคุณค่าอะไรเลย โหลดไปใช้หรือเปล่าก็ไม่รู้ บ้างก็เอามาดูเปรียบเทียบเป็นรายประเทศแล้วตีความว่า ประเทศไหนเป็นอย่างไร เช่น ความเจริญทางด้าน IT, เศรษฐกิจ, ความตื่นตัวเรื่อง Open Source เป็นต้น
ในความเห็นส่วนตัวคิดว่า ทำไปแล้ว &#8220;สนุกดี&#8221; ครับ ถ้ามองลึก ๆ [...]]]></description>
			<content:encoded><![CDATA[<p>ในที่สุดก็ผ่านไปแล้วกับ Firefox Download Day 2008 เมื่อวันที่ 17 มิ.ย. 2551 แต่จริง ๆ เวลาบ้านเรากว่าจะดาวน์โหลดได้ก็ล่วงเข้าวันที่ 18 ละ ซึ่งเป็นกิจกรรมการตลาดที่ใช้ความร่วมมือของแฟนคลับทั่วโลก ผมก็สนุกกับเขาด้วย ช่วยดาวน์โหลด 2 ครั้ง เป็นเวอร์ชัน Linux กับ Windows ที่จริงโหลดมาก็ไม่ได้ใช้เลย เพราะใน Hardy นั้นก็เป็น Firefox 3.0 อยู่แล้ว สุดท้ายได้ Certificate มา 1 ใบ เท่มาก</p>
<p><a href="http://www.flickr.com/photos/kamthorn/2589298675/" title="Firefox Download Day 2008 Cert. by Kamthorn, on Flickr"><img src="http://farm4.static.flickr.com/3062/2589298675_be4b9433b7.jpg" alt="Firefox Download Day 2008 Cert." width="500" height="379" /></a></p>
<p>ถามว่ากิจกรรมนี้ ทำแล้วได้อะไร ทำไปทำไม บ้างก็บอกว่าทำเอาสถิติไม่เห็นจะมีคุณค่าอะไรเลย โหลดไปใช้หรือเปล่าก็ไม่รู้ บ้างก็เอามาดูเปรียบเทียบเป็นรายประเทศแล้วตีความว่า ประเทศไหนเป็นอย่างไร เช่น ความเจริญทางด้าน IT, เศรษฐกิจ, ความตื่นตัวเรื่อง Open Source เป็นต้น</p>
<p>ในความเห็นส่วนตัวคิดว่า ทำไปแล้ว &#8220;สนุกดี&#8221; ครับ ถ้ามองลึก ๆ หน่อย ต้องย้ำว่ากิจกรรมนี้ เป็นกิจกรรมทางการตลาดครับ ถ้าเราดูตัวเลขตรง ๆ อาจจะเขวไปได้ว่าความหมายมันคืออะไร แต่จากประสบการณ์ของตัวเองที่ได้ร่วมกิจกรรมนี้ แล้วได้ชักชวนเพื่อน ๆ ที่รู้จักให้เข้ามาร่วม เลยได้เปิดโอกาสแนะนำ Firefox ไปด้วยว่ามันคืออะไร ดีอย่างไร และก็พบว่ามีแฟน Firefox หลายคนทำแบบเดียวกันนี้ด้วย คิดว่ามีเยอะมากด้วย จำนวนดาวน์โหลดของไทยถึงได้สูงเกินแสนแล้วในวันนี้ ในแผนที่ก็จะเห็นประเทศไทยเป็นสีแดงเข้มแล้ว ดังนั้นเป้าหมายของกิจกรรมนี้จริง ๆ จึงไม่ได้อยู่ที่ตัวชี้วัดชนิด lag (ประมาณดูผลที่ตามมา) นั่นก็คือจำนวนการดาวน์โหลดของประเทศ หรือทั้งโลก แต่อยู่ที่ตัวชี้วัดชนิด lead (คือสิ่งที่พยายามทำเพื่อมุ่งสู่ผลลัพธ์ที่ต้องการ ซึ่งจริง ๆ เราไม่ได้วัด) ที่แฟน Firefox แต่ละคน แต่ละกลุ่มช่วยกันทำขึ้นมามากกว่าครับ</p>
<p>สุดท้ายผลที่ตามมาจริง ๆ คือจำนวนการใช้งาน Firefox ก็จะเพิ่มขึ้นซึ่งคงต้องรอสักพักคงมีสถิติมาให้ดูกัน</p>
<p><b>ลิงก์ที่เกี่ยวข้อง</b><br />
ดาวน์โหลด Firefox 3.0: <a href="http://www.mozilla.com/en-US/firefox/">http://www.mozilla.com/en-US/firefox/</a><br />
แผนที่แสดงยอดดาวน์โหลดแบ่งเป็นประเทศ: <a href="http://www.spreadfirefox.com/en-US/worldrecord/">http://www.spreadfirefox.com/en-US/worldrecord/</a><br />
ข่าวใน Blognone โดยเฉพาะในส่วนความคิดเห็นของสมาชิก: <a href="http://www.blognone.com/node/8102">http://www.blognone.com/node/8102</a><br />
ข่าวใน Mhafai: <a href="http://www.mhafai.com/2008/06/firefox-3-83-million-downloads-24-hours">http://www.mhafai.com/2008/06/firefox-3-83-million-downloads-24-hours</a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/WHwLbWMexkA5eniO-hXyZBRrZV4/0/da"><img src="http://feedads.g.doubleclick.net/~a/WHwLbWMexkA5eniO-hXyZBRrZV4/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/WHwLbWMexkA5eniO-hXyZBRrZV4/1/da"><img src="http://feedads.g.doubleclick.net/~a/WHwLbWMexkA5eniO-hXyZBRrZV4/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/kamthorn?a=ouJ58EOS"><img src="http://feeds.feedburner.com/~f/kamthorn?d=41" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=lRpZhzt7"><img src="http://feeds.feedburner.com/~f/kamthorn?i=lRpZhzt7" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=hsLlJKhA"><img src="http://feeds.feedburner.com/~f/kamthorn?d=45" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=CJif47a4"><img src="http://feeds.feedburner.com/~f/kamthorn?i=CJif47a4" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=0G30clFO"><img src="http://feeds.feedburner.com/~f/kamthorn?d=52" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/kamthorn/~4/aqbelmXg1E8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://kamthorn.org/2008/06/26/firefox-download-day-2008-%e0%b8%84%e0%b8%a7%e0%b8%b1%e0%b8%99%e0%b8%ab%e0%b8%a5%e0%b8%87/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://kamthorn.org/2008/06/26/firefox-download-day-2008-%e0%b8%84%e0%b8%a7%e0%b8%b1%e0%b8%99%e0%b8%ab%e0%b8%a5%e0%b8%87</feedburner:origLink><feedburner:origLink>http://feedproxy.google.com/~r/kamthorn/~3/aqbelmXg1E8/firefox-download-day-2008-%e0%b8%84%e0%b8%a7%e0%b8%b1%e0%b8%99%e0%b8%ab%e0%b8%a5%e0%b8%87</feedburner:origLink></item>
		<item>
		<title>Google Treasure Hunt 2008 Question 4 (prime)</title>
		<link>http://f.kamthorn.org/~r/kamthorn-rss/~3/vw-kIkDMxb8/google-treasure-hunt-2008-question-4-prime</link>
		<comments>http://kamthorn.org/2008/06/06/google-treasure-hunt-2008-question-4-prime#comments</comments>
		<pubDate>Fri, 06 Jun 2008 10:48:09 +0000</pubDate>
		<dc:creator>กำธร</dc:creator>
				<category><![CDATA[Public]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[Treasurehunt]]></category>

		<guid isPermaLink="false">http://kamthorn.org/2008/06/06/google-treasure-hunt-2008-question-4-prime</guid>
		<description><![CDATA[ตอนจบของการล่าสมบัติ คือการหาจำนวนเฉพาะที่น้อยที่สุดที่เป็นผลรวมของจำนวนเฉพาะที่ต่อเนื่องกันตามจำนวนที่ระบุเท่ากัน โดยของผมได้ 15, 31, 127, 515 จำนวน จะบอกว่าเห็นแว๊บแรก มองเห็นว่ามันคือ 2^4-1, 2^5-1, 2^7-1, 2^9+3 ทำให้อดคิดไม่ได้ว่ามันเกี่ยวอะไรกันหรือเปล่า จริง ๆ ไม่ได้เกี่ยวอะไร (มั๊ง)
แต่ข้อนี้ผมทำได้ช้ามาก ๆ เพราะตอนแรกอ่านโจทย์ไม่ละเอียดเอง ไม่ทันสังเกตว่ามันต้องการแค่จำนวนเฉพาะที่ต่อเนื่องกัน ผมนึกว่าจำนวนเฉพาะใด ๆ ก็ได้มาบวกกัน ทำให้โจทย์ยากขึ้นเยอะมาก ซึ่งจริง ๆ เขียนโค้ดจนได้โค้ดที่พร้อมรันแล้ว ซึ่งประเมินแล้วว่ารันนานแน่ ๆ เพราะซับซ้อนมาก ขนาด list ที่ใช้ก็ใหญ่มาก ต้องเก็บข้อมูลเป็น bit เพื่อลดขนาดข้อมูลกันเลยทีเดียว อัพโหลดโค้ด และ text file ที่เก็บจำนวนเฉพาะที่คำนวณไว้แล้ว 6 แสนตัวไปไว้เครื่อง server Linux 64bit ram 8GB รันไปได้หน่อยนึง กะว่าคงต้องรอสักอาทิตย์จึงจะเห็นผล จนแว๊บเห็นคุณ @macroart tweet [...]]]></description>
			<content:encoded><![CDATA[<p>ตอนจบของการล่าสมบัติ คือการหา<b>จำนวนเฉพาะที่น้อยที่สุด</b>ที่เป็นผลรวมของ<b>จำนวนเฉพาะที่ต่อเนื่องกัน</b>ตามจำนวนที่ระบุเท่ากัน โดยของผมได้ 15, 31, 127, 515 จำนวน จะบอกว่าเห็นแว๊บแรก มองเห็นว่ามันคือ 2^4-1, 2^5-1, 2^7-1, 2^9+3 ทำให้อดคิดไม่ได้ว่ามันเกี่ยวอะไรกันหรือเปล่า จริง ๆ ไม่ได้เกี่ยวอะไร (มั๊ง)</p>
<p>แต่ข้อนี้ผมทำได้ช้ามาก ๆ เพราะตอนแรกอ่านโจทย์ไม่ละเอียดเอง ไม่ทันสังเกตว่ามันต้องการแค่จำนวนเฉพาะที่ต่อเนื่องกัน ผมนึกว่าจำนวนเฉพาะใด ๆ ก็ได้มาบวกกัน ทำให้โจทย์ยากขึ้นเยอะมาก ซึ่งจริง ๆ เขียนโค้ดจนได้โค้ดที่พร้อมรันแล้ว ซึ่งประเมินแล้วว่ารันนานแน่ ๆ เพราะซับซ้อนมาก ขนาด list ที่ใช้ก็ใหญ่มาก ต้องเก็บข้อมูลเป็น bit เพื่อลดขนาดข้อมูลกันเลยทีเดียว อัพโหลดโค้ด และ text file ที่เก็บจำนวนเฉพาะที่คำนวณไว้แล้ว 6 แสนตัวไปไว้เครื่อง server Linux 64bit ram 8GB รันไปได้หน่อยนึง กะว่าคงต้องรอสักอาทิตย์จึงจะเห็นผล จนแว๊บเห็นคุณ <a href="http://twitter.com/macroart">@macroart</a> tweet บอกว่า<a href="http://blog.macroart.net/2008/06/google-treasure-hunt-puzzle-4-sum-of-prime-numbers.html">เขียนบล็อกเรื่องนี้</a>ไปแล้ว เลยเข้าไปอ่านดูถึงรู้ว่าพลาดไปแล้ว</p>
<p>สรุปว่าเขียนใหม่ครับ เหลือโค้ดไว้ใช้เฉพาะตัวโหลด prime ใน file มาเป็น list ที่เหลือเขียนใหม่เลย ลองแบบยังไม่อ่านแนวทางของคุณ <a href="http://twitter.com/macroart">@macroart</a> แต่สุดท้ายได้แนวคิดคล้าย ๆ กัน คือผมมองเป็นบล็อก เหมือนรถไฟ 4 ขบวนค่อยวิ่งออกจากต้นทาง โดยตอนแรกหาผลรวมเท่าจำนวนที่ระบุของแต่ละขบวนก่อน แล้วค่อย ๆ ขยับรถไฟไปทีละหน่อย โดยลบเลขตัวน้อยท้ายขบวนออก บวกด้วยตัวถัดไปที่อยู่หัวขบวน ค่อย ๆ เทียบค่าทีละคู่ ดังนั้นคู่ที่ 1 กับ 2 จะเริ่มวิ่งก่อน จนกว่าจะได้ผลรวมเท่ากัน ค่อยเทียบกับขบวนที่ 3 และเมื่อทั้ง 3 ขบวนมีผลรวมเท่ากัน ค่อยไปเทียบกับขบวนที่ 4 จนกว่าจะเท่ากันหมด</p>
<p>รอบแรกมีบั๊กนิดหน่อย เพราะการอ้างตำแหน่ง list หัวขบวนผิด พอแก้แล้วก็รันไม่กี่วินาทีก็ได้คำตอบ ช้ากว่าของ <a href="http://twitter.com/macroart">@macroart</a> เพราะรถไฟของแกมีการเร่งเครื่องได้ด้วยถ้าผลรวมต่างกันมาก ๆ ตรงนี้ไม่ได้คิด</p>
<p>ผลลัพธ์ที่ได้คือ</p>
<pre>ANSWER = 7448179
[41266, 21229, 5870, 1441] [7448179, 7448179, 7448179, 7448179]
0 : 496459 496471 496477 496481 496487 496493 496499 496511 496549 496579 496583 496609 496631 496669 496681
1 : 240073 240089 240101 240109 240113 240131 240139 240151 240169 240173 240197 240203 240209 240257 240259 240263 240271 240283 240287 240319 240341 240347 240349 240353 240371 240379 240421 240433 240437 240473 240479
2 : 57973 57977 57991 58013 58027 58031 58043 58049 58057 58061 58067 58073 58099 58109 58111 58129 58147 58151 58153 58169 58171 58189 58193 58199 58207 58211 58217 58229 58231 58237 58243 58271 58309 58313 58321 58337 58363 58367 58369 58379 58391 58393 58403 58411 58417 58427 58439 58441 58451 58453 58477 58481 58511 58537 58543 58549 58567 58573 58579 58601 58603 58613 58631 58657 58661 58679 58687 58693 58699 58711 58727 58733 58741 58757 58763 58771 58787 58789 58831 58889 58897 58901 58907 58909 58913 58921 58937 58943 58963 58967 58979 58991 58997 59009 59011 59021 59023 59029 59051 59053 59063 59069 59077 59083 59093 59107 59113 59119 59123 59141 59149 59159 59167 59183 59197 59207 59209 59219 59221 59233 59239 59243 59263 59273 59281 59333 59341
3 : 12041 12043 12049 12071 12073 12097 12101 12107 12109 12113 12119 12143 12149 12157 12161 12163 12197 12203 12211 12227 12239 12241 12251 12253 12263 12269 12277 12281 12289 12301 12323 12329 12343 12347 12373 12377 12379 12391 12401 12409 12413 12421 12433 12437 12451 12457 12473 12479 12487 12491 12497 12503 12511 12517 12527 12539 12541 12547 12553 12569 12577 12583 12589 12601 12611 12613 12619 12637 12641 12647 12653 12659 12671 12689 12697 12703 12713 12721 12739 12743 12757 12763 12781 12791 12799 12809 12821 12823 12829 12841 12853 12889 12893 12899 12907 12911 12917 12919 12923 12941 12953 12959 12967 12973 12979 12983 13001 13003 13007 13009 13033 13037 13043 13049 13063 13093 13099 13103 13109 13121 13127 13147 13151 13159 13163 13171 13177 13183 13187 13217 13219 13229 13241 13249 13259 13267 13291 13297 13309 13313 13327 13331 13337 13339 13367 13381 13397 13399 13411 13417 13421 13441 13451 13457 13463 13469 13477 13487 13499 13513 13523 13537 13553 13567 13577 13591 13597 13613 13619 13627 13633 13649 13669 13679 13681 13687 13691 13693 13697 13709 13711 13721 13723 13729 13751 13757 13759 13763 13781 13789 13799 13807 13829 13831 13841 13859 13873 13877 13879 13883 13901 13903 13907 13913 13921 13931 13933 13963 13967 13997 13999 14009 14011 14029 14033 14051 14057 14071 14081 14083 14087 14107 14143 14149 14153 14159 14173 14177 14197 14207 14221 14243 14249 14251 14281 14293 14303 14321 14323 14327 14341 14347 14369 14387 14389 14401 14407 14411 14419 14423 14431 14437 14447 14449 14461 14479 14489 14503 14519 14533 14537 14543 14549 14551 14557 14561 14563 14591 14593 14621 14627 14629 14633 14639 14653 14657 14669 14683 14699 14713 14717 14723 14731 14737 14741 14747 14753 14759 14767 14771 14779 14783 14797 14813 14821 14827 14831 14843 14851 14867 14869 14879 14887 14891 14897 14923 14929 14939 14947 14951 14957 14969 14983 15013 15017 15031 15053 15061 15073 15077 15083 15091 15101 15107 15121 15131 15137 15139 15149 15161 15173 15187 15193 15199 15217 15227 15233 15241 15259 15263 15269 15271 15277 15287 15289 15299 15307 15313 15319 15329 15331 15349 15359 15361 15373 15377 15383 15391 15401 15413 15427 15439 15443 15451 15461 15467 15473 15493 15497 15511 15527 15541 15551 15559 15569 15581 15583 15601 15607 15619 15629 15641 15643 15647 15649 15661 15667 15671 15679 15683 15727 15731 15733 15737 15739 15749 15761 15767 15773 15787 15791 15797 15803 15809 15817 15823 15859 15877 15881 15887 15889 15901 15907 15913 15919 15923 15937 15959 15971 15973 15991 16001 16007 16033 16057 16061 16063 16067 16069 16073 16087 16091 16097 16103 16111 16127 16139 16141 16183 16187 16189 16193 16217 16223 16229 16231 16249 16253 16267 16273 16301 16319 16333 16339 16349 16361 16363 16369 16381 16411 16417 16421 16427 16433 16447 16451 16453 16477 16481 16487 16493 16519 16529 16547 16553 16561 16567 16573 16603 16607 16619 16631 16633 16649 16651 16657 16661 16673 16691 16693 16699 16703 16729 16741 16747 16759 16763 16787 16811 16823 16829 16831 16843 16871 16879 16883 16889 16901 16903 16921 16927 16931 16937 16943 16963
done.

real	0m21.637s
user	0m16.273s
sys	0m0.328s</pre>
<p>7448179 คือจำนวนเฉพาะที่เล็กที่สุด ที่เป็นผลบวกของจำนวนเฉพาะที่ต่อเนื่องกันจำนวน 15, 31, 127 และ 515 จำนวน</p>
<p>ยังไม่เฉลยโค้ดนะครับ ขออุบไว้ก่อน เดี๋ยวไม่สนุก</p>
<p>สรุปว่าได้คำตอบครบทั้ง 4 ข้อแล้ว นอนหลับสนิทซักที เก็บภาพนี้ไว้เป็นที่ระลึก</p>
<p><a href="http://www.flickr.com/photos/kamthorn/2555965960/" title="google-treasurehunt-result by Kamthorn, on Flickr"><img src="http://farm4.static.flickr.com/3016/2555965960_97e43e998e.jpg" width="500" height="266" alt="google-treasurehunt-result" /></a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/L3WWcKi15ALILfMDBnNLjGY9m10/0/da"><img src="http://feedads.g.doubleclick.net/~a/L3WWcKi15ALILfMDBnNLjGY9m10/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/L3WWcKi15ALILfMDBnNLjGY9m10/1/da"><img src="http://feedads.g.doubleclick.net/~a/L3WWcKi15ALILfMDBnNLjGY9m10/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/kamthorn?a=BJA2IZ1i"><img src="http://feeds.feedburner.com/~f/kamthorn?d=41" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=XEqKm7OE"><img src="http://feeds.feedburner.com/~f/kamthorn?i=XEqKm7OE" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=mrNjlGWW"><img src="http://feeds.feedburner.com/~f/kamthorn?d=45" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=BLe58PDZ"><img src="http://feeds.feedburner.com/~f/kamthorn?i=BLe58PDZ" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=3qcLn0b4"><img src="http://feeds.feedburner.com/~f/kamthorn?d=52" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/kamthorn/~4/o-jJoVA2xvs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://kamthorn.org/2008/06/06/google-treasure-hunt-2008-question-4-prime/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://kamthorn.org/2008/06/06/google-treasure-hunt-2008-question-4-prime</feedburner:origLink><feedburner:origLink>http://feedproxy.google.com/~r/kamthorn/~3/o-jJoVA2xvs/google-treasure-hunt-2008-question-4-prime</feedburner:origLink></item>
		<item>
		<title>Pipe for My Comments on Blognone</title>
		<link>http://f.kamthorn.org/~r/kamthorn-rss/~3/Pn9BKRknUGI/pipe-for-my-comments-on-blognone</link>
		<comments>http://kamthorn.org/2008/06/06/pipe-for-my-comments-on-blognone#comments</comments>
		<pubDate>Fri, 06 Jun 2008 07:02:19 +0000</pubDate>
		<dc:creator>กำธร</dc:creator>
				<category><![CDATA[Public]]></category>
		<category><![CDATA[blognone]]></category>
		<category><![CDATA[Pipes]]></category>
		<category><![CDATA[Yahoo]]></category>

		<guid isPermaLink="false">http://kamthorn.org/2008/06/06/pipe-for-my-comments-on-blognone</guid>
		<description><![CDATA[ผม subscribe เอา comment feed ของ Blognone ไว้ใน google reader ซึ่งเยอะจัด ส่วนใหญ่ไม่ค่อยได้ใช้ประโยชน์อะไร มาวันนี้นึกสนุก อยากเก็บ comment ต่าง ๆ ของตัวเองที่ตอบไว้ใน Blognone ทั้งหมดไว้ใน Google reader เลยขอลองสักหน่อย
ปัญหาคือ comment ของ Blognone มีเยอะมาก และแน่นอนว่าไม่ได้แยก user ไว้ให้ เราต้องมา filter เอง พอพูดถึงการ filter feed ก็เลยนึกถึง Yahoo pipes ซึ่งเคยลองเล่นมาบ้างแล้ว สนุกดี ครั้งนี้คงจะเป็นครั้งแรกที่จะเอามาใช้ให้เกิดประโยชน์จริงจังซักที ใช้เวลาไม่นานนักก็สร้าง pipes ขึ้นตามรูป

อันแรก เป็น source ชนิด feed แล้วมาผ่าน filter เพื่อเลือกเฉพาะที่มี item.dc:creator เป็นตามที่เราระบุใน text [...]]]></description>
			<content:encoded><![CDATA[<p>ผม subscribe เอา <a href="http://feeds.feedburner.com/blognone-comment">comment feed</a> ของ <a href="http://www.blognone.com/">Blognone</a> ไว้ใน <a href="http://reader.google.com/">google reader</a> ซึ่งเยอะจัด ส่วนใหญ่ไม่ค่อยได้ใช้ประโยชน์อะไร มาวันนี้นึกสนุก อยากเก็บ comment ต่าง ๆ ของตัวเองที่ตอบไว้ใน Blognone ทั้งหมดไว้ใน Google reader เลยขอลองสักหน่อย</p>
<p>ปัญหาคือ comment ของ Blognone มีเยอะมาก และแน่นอนว่าไม่ได้แยก user ไว้ให้ เราต้องมา filter เอง พอพูดถึงการ filter feed ก็เลยนึกถึง Yahoo pipes ซึ่งเคยลองเล่นมาบ้างแล้ว สนุกดี ครั้งนี้คงจะเป็นครั้งแรกที่จะเอามาใช้ให้เกิดประโยชน์จริงจังซักที ใช้เวลาไม่นานนักก็สร้าง pipes ขึ้นตามรูป</p>
<p><a href="http://www.flickr.com/photos/kamthorn/2555727798/" title="yahoo-pipe-my-bn-comments by Kamthorn, on Flickr"><img src="http://farm4.static.flickr.com/3029/2555727798_f82df23e8e_o.png" width="456" height="447" alt="yahoo-pipe-my-bn-comments" /></a></p>
<p>อันแรก เป็น source ชนิด feed แล้วมาผ่าน filter เพื่อเลือกเฉพาะที่มี item.dc:creator เป็นตามที่เราระบุใน text input เท่านั้นเอง ก็เรียบร้อย จัดการ save แล้ว publish จากนั้นมาดูวิธีใช้งานกัน</p>
<p>วิธีแรก ดูผ่านหน้าเพจปกติของ Yahoo! pipes โดยเข้าไปที่ <a href="http://pipes.yahoo.com/pipes/pipe.info?_id=f8b3f41bdc451c216630a6c503d61fb5">http://pipes.yahoo.com/pipes/pipe.info?_id=f8b3f41bdc451c216630a6c503d61fb5</a> แล้วกรอก blognone login name แล้วกด &#8220;Run Pipe&#8221; หรือจะใส่ &amp;name=username ต่อท้าย url เข้าไปเลยก็ได้ แต่จากที่ลองดูพบว่า มันจะได้เฉพาะ comment ท้าย ๆ มาทำ filter ซึ่งบางครั้ง comment ของเรามันตกไปแล้ว</p>
<p>วิธีที่ดีกว่าคือเรียกเป็น feed เพื่อไป เก็บและอ่านใน Google reader โดย subcribe ไปที่ <a href="http://pipes.yahoo.com/pipes/pipe.run?_id=f8b3f41bdc451c216630a6c503d61fb5&#038;_render=rss&amp;name=username">http://pipes.yahoo.com/pipes/pipe.run?_id=f8b3f41bdc451c216630a6c503d61fb5&#038;_render=rss&amp;name=username</a> อย่าลืมเปลี่ยนตรง username เป็นชื่อ login ใน blognone ของคุณเอง</p>
<p>อ๊ะ หรือใครใช้ <a href="http://twitter.com/">twitter</a> จะใช้ <a href="http://twitterfeed.com/">twitterfeed</a> ส่งเข้าไปใน twitter time line ของคุณก็ได้นะ</p>
<p>ใช้แล้วได้ผลอย่างไรบอกเล่ากันด้วยครับ</p>

<p><a href="http://feedads.g.doubleclick.net/~a/7ku_DXcasCPPVLDBPE3guS1_ncY/0/da"><img src="http://feedads.g.doubleclick.net/~a/7ku_DXcasCPPVLDBPE3guS1_ncY/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/7ku_DXcasCPPVLDBPE3guS1_ncY/1/da"><img src="http://feedads.g.doubleclick.net/~a/7ku_DXcasCPPVLDBPE3guS1_ncY/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/kamthorn?a=92ZuX52f"><img src="http://feeds.feedburner.com/~f/kamthorn?d=41" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=kNnJfuqX"><img src="http://feeds.feedburner.com/~f/kamthorn?i=kNnJfuqX" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=A4hsKVDH"><img src="http://feeds.feedburner.com/~f/kamthorn?d=45" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=EZVLY40B"><img src="http://feeds.feedburner.com/~f/kamthorn?i=EZVLY40B" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=CbFdNNBw"><img src="http://feeds.feedburner.com/~f/kamthorn?d=52" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/kamthorn/~4/U69r2Cwc6Mo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://kamthorn.org/2008/06/06/pipe-for-my-comments-on-blognone/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://kamthorn.org/2008/06/06/pipe-for-my-comments-on-blognone</feedburner:origLink><feedburner:origLink>http://feedproxy.google.com/~r/kamthorn/~3/U69r2Cwc6Mo/pipe-for-my-comments-on-blognone</feedburner:origLink></item>
		<item>
		<title>What Punctuation Mark Are You?</title>
		<link>http://f.kamthorn.org/~r/kamthorn-rss/~3/vwdVc9KKseA/what-punctuation-mark-are-you</link>
		<comments>http://kamthorn.org/2008/06/03/what-punctuation-mark-are-you#comments</comments>
		<pubDate>Mon, 02 Jun 2008 18:19:37 +0000</pubDate>
		<dc:creator>กำธร</dc:creator>
				<category><![CDATA[Public]]></category>
		<category><![CDATA[aboutme]]></category>

		<guid isPermaLink="false">http://kamthorn.org/?p=176</guid>
		<description><![CDATA[




You Are a Colon






You are very orderly and fact driven.
You aren&#8217;t concerned much with theories or dreams&#8230; only what&#8217;s true or untrue.
You are brilliant and incredibly learned. Anything you know is well researched.
You like to make lists and sort through things step by step. You aren&#8217;t subject to whim or emotions.
Your friends see you as [...]]]></description>
			<content:encoded><![CDATA[<table width="350" align="center" border="0" cellpadding="2" cellspacing="0">
<tbody>
<tr>
<td align="center" bgcolor="#eeeeee">
<font style="color: black; font-size: 14pt;" face="Georgia, Times New Roman, Times, serif"><br />
<strong>You Are a Colon</strong><br />
</font></td>
</tr>
<tr>
<td bgcolor="#ffffff">
<center><img src="http://www.blogthingsimages.com/whatpunctuationmarkareyouquiz/colon.gif" width="100" height="100" /></center><br />
<font color="#000000"><br />
You are very orderly and fact driven.</p>
<p>You aren&#8217;t concerned much with theories or dreams&#8230; only what&#8217;s true or untrue.</p>
<p>You are brilliant and incredibly learned. Anything you know is well researched.</p>
<p>You like to make lists and sort through things step by step. You aren&#8217;t subject to whim or emotions.</p>
<p>Your friends see you as a constant source of knowledge and advice.</p>
<p>(But they are a little sick of you being right all of the time!)</p>
<p>You excel in: Leadership positions</p>
<p>You get along best with: The Semi-Colon<br />
</font></td>
</tr>
</tbody>
</table>
<div align="center"><a href="http://www.blogthings.com/whatpunctuationmarkareyouquiz/">What Punctuation Mark Are You?</a></div>

<p><a href="http://feedads.g.doubleclick.net/~a/UurAv2WlyrWeAtDYCDH55T2FAnU/0/da"><img src="http://feedads.g.doubleclick.net/~a/UurAv2WlyrWeAtDYCDH55T2FAnU/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/UurAv2WlyrWeAtDYCDH55T2FAnU/1/da"><img src="http://feedads.g.doubleclick.net/~a/UurAv2WlyrWeAtDYCDH55T2FAnU/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/kamthorn?a=36ss62id"><img src="http://feeds.feedburner.com/~f/kamthorn?d=41" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=K8WH5UOK"><img src="http://feeds.feedburner.com/~f/kamthorn?i=K8WH5UOK" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=Yoya4IVQ"><img src="http://feeds.feedburner.com/~f/kamthorn?d=45" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=QczNaO3j"><img src="http://feeds.feedburner.com/~f/kamthorn?i=QczNaO3j" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=XTtwUqVX"><img src="http://feeds.feedburner.com/~f/kamthorn?d=52" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/kamthorn/~4/tIa3VsW3wic" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://kamthorn.org/2008/06/03/what-punctuation-mark-are-you/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://kamthorn.org/2008/06/03/what-punctuation-mark-are-you</feedburner:origLink><feedburner:origLink>http://feedproxy.google.com/~r/kamthorn/~3/tIa3VsW3wic/what-punctuation-mark-are-you</feedburner:origLink></item>
		<item>
		<title>Optimizing Treasurehunt’s Question 1 (robot)</title>
		<link>http://f.kamthorn.org/~r/kamthorn-rss/~3/oT5qzMynNX0/optimizing-treasurehunts-question-1-robot</link>
		<comments>http://kamthorn.org/2008/05/30/optimizing-treasurehunts-question-1-robot#comments</comments>
		<pubDate>Fri, 30 May 2008 04:21:32 +0000</pubDate>
		<dc:creator>กำธร</dc:creator>
				<category><![CDATA[Public]]></category>
		<category><![CDATA[Treasure Hunt]]></category>

		<guid isPermaLink="false">http://kamthorn.org/2008/05/30/optimizing-treasurehunts-question-1-robot</guid>
		<description><![CDATA[เมื่อพิจารณาดี ๆ แล้วพบว่าตาราง list สำหรับใช้คำนวณนั้น มีลักษณะสมมาตรบางส่วน เลยปรับปรุงให้ใช้หน่วยความจำในส่วนที่สมมาตรนั้นเพียงครึ่งเดียว ทำให้ลดการใช้หน่วยความจำได้พอสมควร และการคำนวณใน list ย่อย นั้นใช้เพียง list ก่อนหน้าเท่านั้น ดังนั้นพอคำนวณได้ list ปัจจุบันแล้ว ก็ลบ list ก่อนหน้าทิ้งได้ แต่ผมไม่อยากแก้โค้ดมาก เลยเอาแค่เปลี่ยนเป็น list ว่างพอ ผลคือ
a=2000
b=2000
if b&#62;a:
&#160; a, b = b, a
d=&#91;&#93;
for i in range&#40;a&#41;:
&#160; d&#91;i:&#93;=&#91;&#91;&#93;&#93;
&#160; if i&#62;=b:
&#160; &#160; x = b
&#160; else:
&#160; &#160; x = i
&#160; for j in range&#40;x+1&#41;:
&#160; &#160; if &#40;i == 0&#41; [...]]]></description>
			<content:encoded><![CDATA[<p>เมื่อพิจารณาดี ๆ แล้วพบว่าตาราง list สำหรับใช้คำนวณนั้น มีลักษณะสมมาตรบางส่วน เลยปรับปรุงให้ใช้หน่วยความจำในส่วนที่สมมาตรนั้นเพียงครึ่งเดียว ทำให้ลดการใช้หน่วยความจำได้พอสมควร และการคำนวณใน list ย่อย นั้นใช้เพียง list ก่อนหน้าเท่านั้น ดังนั้นพอคำนวณได้ list ปัจจุบันแล้ว ก็ลบ list ก่อนหน้าทิ้งได้ แต่ผมไม่อยากแก้โค้ดมาก เลยเอาแค่เปลี่ยนเป็น list ว่างพอ ผลคือ</p>
<div class="dean_ch" style="white-space: nowrap;">a=<span class="nu0">2000</span><br />
b=<span class="nu0">2000</span></p>
<p><span class="kw1">if</span> b&gt;a:<br />
&nbsp; a, b = b, a<br />
d=<span class="br0">&#91;</span><span class="br0">&#93;</span><br />
<span class="kw1">for</span> i <span class="kw1">in</span> <span class="kw2">range</span><span class="br0">&#40;</span>a<span class="br0">&#41;</span>:<br />
&nbsp; d<span class="br0">&#91;</span>i:<span class="br0">&#93;</span>=<span class="br0">&#91;</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#93;</span><br />
&nbsp; <span class="kw1">if</span> i&gt;=b:<br />
&nbsp; &nbsp; x = b<br />
&nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; x = i<br />
&nbsp; <span class="kw1">for</span> j <span class="kw1">in</span> <span class="kw2">range</span><span class="br0">&#40;</span>x<span class="nu0">+1</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>i == <span class="nu0">0</span><span class="br0">&#41;</span> <span class="kw1">and</span> <span class="br0">&#40;</span>j == <span class="nu0">0</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; d<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#91;</span>j:<span class="br0">&#93;</span> = <span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; <span class="kw1">elif</span> <span class="br0">&#40;</span>i == <span class="nu0">0</span><span class="br0">&#41;</span> <span class="kw1">or</span> <span class="br0">&#40;</span>j == <span class="nu0">0</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; d<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#91;</span>j:<span class="br0">&#93;</span> = <span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; <span class="kw1">elif</span> i == j:<br />
&nbsp; &nbsp; &nbsp; d<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#91;</span>j:<span class="br0">&#93;</span> = <span class="br0">&#91;</span>d<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#91;</span>j<span class="nu0">-1</span><span class="br0">&#93;</span>*<span class="nu0">2</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; d<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#91;</span>j:<span class="br0">&#93;</span> = <span class="br0">&#91;</span>d<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#91;</span>j<span class="nu0">-1</span><span class="br0">&#93;</span> + d<span class="br0">&#91;</span>i<span class="nu0">-1</span><span class="br0">&#93;</span><span class="br0">&#91;</span>j<span class="br0">&#93;</span><span class="br0">&#93;</span><br />
&nbsp; <span class="kw1">if</span> i&gt;<span class="nu0">0</span>:<br />
&nbsp; &nbsp; d<span class="br0">&#91;</span>i<span class="nu0">-1</span><span class="br0">&#93;</span>=<span class="br0">&#91;</span><span class="br0">&#93;</span></p>
<p><span class="kw1">print</span> d<span class="br0">&#91;</span>a<span class="nu0">-1</span><span class="br0">&#93;</span><span class="br0">&#91;</span>b<span class="nu0">-1</span><span class="br0">&#93;</span></div>
<p>ผลการรัน โดยใช้ time จับเวลา</p>
<pre>415828425864924998634542842325676808706232957586556725463361909680781449739748170
786476583991009842613588566821101566552449812050519515271426829403308897930154848
139000401217874574325171349240478804805012554662232593418186105627855887297242750
191258293109799452562416018445296661723328582808673234975864811354576092306731674
226129026615041968499816993517068588780940662630054770440825519413455865220243087
597454080782838938422451159980693138755678460019308423353936671267937407109197183
261946634690754460222691463521097187455850580048349711806796515481309363032514472
631419167126959879296426641287728281408263950661584874428072352076560611103304329
056994774368533971570942013663930927771345889508878174490486498112868394435125871
368770117617083125252317200772612121394477978635381281677951466408518108004063757
181565789433577065739615351320655283808516684687687348436814782925229015434783262
936635458985024720378317210338353260437300968307371995465273889042991687076670199
592582593447226951517354719649532201876810233809966157181452417833096317816478439
040563226541144136090250318325435743209975329838676879857054480550574759550296644
05427578211111064192312240045083183062752759630345186798202023360000

real	0m6.381s
user	0m5.024s
sys	0m0.076s</pre>
<p>ลองแก้ขนาดเป็น 4000&#215;4000 คำตอบยาวมากไม่โพสต์แล้วกัน แต่จับเวลาได้</p>
<pre>real	0m59.338s
user	0m27.342s
sys	0m0.148s</pre>
<p>ทั้งหมดรันบนแล็ปท็อป AMD Turion64 2.2GHz (1 core), RAM 1GB</p>

<p><a href="http://feedads.g.doubleclick.net/~a/bkNyg1xNYk0Cq7SrT6Hx8qL-3vY/0/da"><img src="http://feedads.g.doubleclick.net/~a/bkNyg1xNYk0Cq7SrT6Hx8qL-3vY/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/bkNyg1xNYk0Cq7SrT6Hx8qL-3vY/1/da"><img src="http://feedads.g.doubleclick.net/~a/bkNyg1xNYk0Cq7SrT6Hx8qL-3vY/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/kamthorn?a=FMmX6RAk"><img src="http://feeds.feedburner.com/~f/kamthorn?d=41" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=9wxwkFkB"><img src="http://feeds.feedburner.com/~f/kamthorn?i=9wxwkFkB" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=gAFFe2qG"><img src="http://feeds.feedburner.com/~f/kamthorn?d=45" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=5aKNPjwa"><img src="http://feeds.feedburner.com/~f/kamthorn?i=5aKNPjwa" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=6bQiEgqB"><img src="http://feeds.feedburner.com/~f/kamthorn?d=52" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/kamthorn/~4/A3ZKPY_H8a8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://kamthorn.org/2008/05/30/optimizing-treasurehunts-question-1-robot/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://kamthorn.org/2008/05/30/optimizing-treasurehunts-question-1-robot</feedburner:origLink><feedburner:origLink>http://feedproxy.google.com/~r/kamthorn/~3/A3ZKPY_H8a8/optimizing-treasurehunts-question-1-robot</feedburner:origLink></item>
		<item>
		<title>Google Treasure Hunt</title>
		<link>http://f.kamthorn.org/~r/kamthorn-rss/~3/YWs6lscdH9Q/google-treasure-hunt</link>
		<comments>http://kamthorn.org/2008/05/29/google-treasure-hunt#comments</comments>
		<pubDate>Thu, 29 May 2008 16:29:16 +0000</pubDate>
		<dc:creator>กำธร</dc:creator>
				<category><![CDATA[Public]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[Treasure Hunt]]></category>

		<guid isPermaLink="false">http://kamthorn.org/?p=174</guid>
		<description><![CDATA[เล่นมั่ง ๆ
ตอนแรกที่เห็นโจทย์ข้อแรก (robot) สมองกำลังมึน คิดไปมายิ่งปวดหัว เลยเลิกซะ แต่พอเห็นหลาย ๆ คนโพสต์บล็อก เชียร์ว่าไม่ยาก ๆ เอาวะลองดูใหม่ซักตั้ง
เข้าเว็บ http://treasurehunt.appspot.com/ ปุ๊บคราวนี้ได้ข้อ 3 (network) เลย ลองอันนี้ก่อนละกัน พบว่าง่ายมาก ๆ สำหรับคนที่เข้าใจเรื่อง routing table ของระบบเน็ตเวิร์คแบบ TCP/IP หลักการคือดูว่าจากต้นทางจะไปหาปลายทางต้องเดินผ่าน node ไหนบ้าง เช่นผมเริ่มจาก G ต้องไป A ก็ดูว่า ip ของ A คืออะไร แล้วดูในตารางว่า แถว G มี route ไปหา A ไหม ซึ่งดูได้จากคอลัมน์ของ routing 3 คอลัมน์แรก ถ้ามีก็ให้ไป ip นั้นเลย ถ้าไม่มี ให้ไป default [...]]]></description>
			<content:encoded><![CDATA[<p>เล่นมั่ง ๆ</p>
<p>ตอนแรกที่เห็นโจทย์ข้อแรก (robot) สมองกำลังมึน คิดไปมายิ่งปวดหัว เลยเลิกซะ แต่พอเห็นหลาย ๆ คนโพสต์บล็อก เชียร์ว่าไม่ยาก ๆ เอาวะลองดูใหม่ซักตั้ง</p>
<p>เข้าเว็บ <a href="http://treasurehunt.appspot.com/">http://treasurehunt.appspot.com/</a> ปุ๊บคราวนี้ได้ข้อ 3 (network) เลย ลองอันนี้ก่อนละกัน พบว่าง่ายมาก ๆ สำหรับคนที่เข้าใจเรื่อง routing table ของระบบเน็ตเวิร์คแบบ TCP/IP หลักการคือดูว่าจากต้นทางจะไปหาปลายทางต้องเดินผ่าน node ไหนบ้าง เช่นผมเริ่มจาก G ต้องไป A ก็ดูว่า ip ของ A คืออะไร แล้วดูในตารางว่า แถว G มี route ไปหา A ไหม ซึ่งดูได้จากคอลัมน์ของ routing 3 คอลัมน์แรก ถ้ามีก็ให้ไป ip นั้นเลย ถ้าไม่มี ให้ไป default route คือคอลัมน์สุดท้าย เช่นของผมไม่มีใน 3 คอลัมน์แรก ก็ให้ดู ip ในคอลัมน์สุดท้ายซึ่งบอกให้ไป ip หนึ่ง ดูในตารางพบว่าเป็นของ H ก็จดในกระดาษว่า GH แล้วก็ทำเช่นเดียวกันไปเรื่อย ๆ สุดท้ายก็พบว่าเส้นทางเดินคือ GHIJKCOLMBA ก็คือคำตอบที่ต้องส่งไป คำถามนี้ใช้เวลา 2-3 นาทีก็เสร็จ ถูกในครั้งแรกเลยด้วย</p>
<p>ย้อนมาทำข้อ 1 (robot) มีตารางขนาดใหญ่อันหนึ่ง หุ่นยนต์อยู่มุมบนซ้าย ปลายทางอยู่มุมล่างขวา ให้หาจำนวนเส้นทางที่หุ่นยนต์สามารถเดินจากมุมบนซ้ายมามุมล่างขวา โดยให้หุ่นยนต์เดินลง หรือเดินไปทางขวาเท่านั้น วิธีคิดน่าจะมี 2 แนวทางคือ ใช้คณิตศาสตร์ คือเรื่องความน่าจะเป็น กับโปรแกรมมิ่งเอาดื้อ ๆ ซึ่งผมเลือกเขียนโปรแกรม ง่ายกว่าสำหรับผม ก่อนอื่นก็หาแพตเทิร์นของมันให้ได้ก่อน โดยค่อย ๆ คิดโดยมองจากมุมล่างขวาซึ่งเป็นปลายทางว่า</p>
<p>ตารางขนาด 1&#215;1 หุ่นยนต์อยู่ที่ตำแหน่งเดียวกับปลายทาง คำตอบ = 0<br />
ตารางขนาด 1&#215;2 คำตอบ = 1<br />
ตารางขนาด 1xn คำตอบ = 1<br />
ตารางขนาด nx1 คำตอบ = 1 เช่นกัน</p>
<p>ตารางขนาด 2&#215;2 คำตอบ = 2<br />
ตารางขนาด 2&#215;3, 3&#215;2 คำตอบ = 3<br />
ตารางขนาด 3&#215;3 คำตอบ = 6</p>
<p>ไล่ต่อไปอีกหน่อย ก็เริ่มจับทางได้ว่า จำนวนวิธีการเดินของตารางขนาด mxn ก็คือ จำนวนวิธีการเดินของตารางขนาด (m-1) x n + จำนวนวิธีการเดินของตารางขนาด m x (n-1)</p>
<p>เขียนให้สวย ๆ ก็ได้ว่า f(m,n) = f(m-1,n) + f(m,n-1) แบบนี้มัน recursive ชัด ๆ ว่าแล้วก็จับ python มาเขียนโค้ด ได้ว่า</p>
<div class="dean_ch" style="white-space: nowrap;"><span class="kw1">def</span> r<span class="br0">&#40;</span>a,b<span class="br0">&#41;</span>:<br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>a == <span class="nu0">1</span><span class="br0">&#41;</span> <span class="kw1">and</span> <span class="br0">&#40;</span>b == <span class="nu0">1</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span><br />
&nbsp; <span class="kw1">elif</span> <span class="br0">&#40;</span>a == <span class="nu0">1</span><span class="br0">&#41;</span> <span class="kw1">or</span> <span class="br0">&#40;</span>b == <span class="nu0">1</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">1</span><br />
&nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; <span class="kw1">return</span> r<span class="br0">&#40;</span>a<span class="nu0">-1</span>,b<span class="br0">&#41;</span>+r<span class="br0">&#40;</span>a,b<span class="nu0">-1</span><span class="br0">&#41;</span></p>
<p>m, n = <span class="nu0">4</span>, <span class="nu0">5</span><br />
<span class="kw1">print</span> r<span class="br0">&#40;</span>m,n<span class="br0">&#41;</span></div>
<p>ลองค่า m และ n น้อย ๆ ดูแล้วถูกต้องดี อืมม ไม่เลว ๆ แต่พอใส่ค่าจริง ๆ ลงไป คือ 43, 49 ปรากฏว่าเงียบไปนานมาก ดูท่าไม่ดีละ ลองลดลงเหลือ 20, 20 ก็ยังนาน เฮ่ย ไม่ธรรมดาแฮะ แสดงว่าจำนวนทางเดินมันเยอะมาก ทำ recursive ไม่ไหวแล้ว เปลี่ยนมาเป็น array ละกัน</p>
<div class="dean_ch" style="white-space: nowrap;">a=<span class="nu0">43</span><br />
b=<span class="nu0">49</span></p>
<p>d=<span class="br0">&#91;</span><span class="br0">&#93;</span><br />
<span class="kw1">for</span> i <span class="kw1">in</span> <span class="kw2">range</span><span class="br0">&#40;</span>a<span class="br0">&#41;</span>:<br />
&nbsp; d<span class="br0">&#91;</span>i:<span class="br0">&#93;</span>=<span class="br0">&#91;</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#93;</span><br />
&nbsp; <span class="kw1">for</span> j <span class="kw1">in</span> <span class="kw2">range</span><span class="br0">&#40;</span>b<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>i == <span class="nu0">0</span><span class="br0">&#41;</span> <span class="kw1">and</span> <span class="br0">&#40;</span>j == <span class="nu0">0</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; d<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#91;</span>j:<span class="br0">&#93;</span> = <span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; <span class="kw1">elif</span> <span class="br0">&#40;</span>i == <span class="nu0">0</span><span class="br0">&#41;</span> <span class="kw1">or</span> <span class="br0">&#40;</span>j == <span class="nu0">0</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; d<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#91;</span>j:<span class="br0">&#93;</span> = <span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; d<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#91;</span>j:<span class="br0">&#93;</span> = <span class="br0">&#91;</span>d<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#91;</span>j<span class="nu0">-1</span><span class="br0">&#93;</span> + d<span class="br0">&#91;</span>i<span class="nu0">-1</span><span class="br0">&#93;</span><span class="br0">&#91;</span>j<span class="br0">&#93;</span><span class="br0">&#93;</span></p>
<p><span class="kw1">print</span> d<span class="br0">&#91;</span>a<span class="nu0">-1</span><span class="br0">&#93;</span><span class="br0">&#91;</span>b<span class="nu0">-1</span><span class="br0">&#93;</span></div>
<p>โชคดีที่ python ใช้เลขจำนวนเต็มขนาดใหญ่ได้ทันที เพราะคำตอบของมันคือ 85182187099351463190080550 ส่งคำตอบเข้าไป ผ่านฉลุย (ถ้าใช้โปรแกรมแรกคิด คงหลายวันเสร็จ)</p>
<p>คำถามข้อที่ 2 ให้ดาวน์โหลดไฟล์ .zip มาไฟล์หนึ่ง พร้อมโจทย์</p>
<blockquote><p> Unzip the archive, then process the resulting files to obtain a numeric result. You&#8217;ll be taking the sum of lines from files matching a certain description, and multiplying those sums together to obtain a final result. Note that files have many different extensions, like &#8216;.pdf&#8217; and &#8216;.js&#8217;, but all are plain text files containing a small number of lines of text.</p>
<p>Sum of line 4 for all files with path or name containing stu and ending in .pdf<br />
Sum of line 4 for all files with path or name containing zzz and ending in .js<br />
Hint: If the requested line does not exist, do not increment the sum.</p>
<p>Multiply all the above sums together and enter the product below.<br />
(Note: Answer must be an exact, decimal representation of the number.) </p></blockquote>
<p>โอว แบบนี้ต้องเขียนโปรแกรมเท่านั้น และหนทางหาคำตอบที่ดีที่สุดคือ shell programming ครับพี่น้อง ไม่ยากเลย แต่ครั้งแรกตีโจทย์ผิด อ่านไม่ดีเอง คือคิดว่าชื่อแฟ้มมี stu และนามสกุล .pdf เท่านั้น ที่จริงแล้วในชื่อ path ก็ได้ รอบแรกผิดแค่ตรงนี้เอง</p>
<p>มีอีกจุดที่ต้องระวังคือ โจทย์ให้เอาบรรทัดที่ 4 มา แต่ถ้าจำนวนบรรทัดมีไม่ถึง ก็ไม่ต้องเพิ่มค่า sum ดีที่โจทย์เตือนไว้ เพราะไม่อย่างนั้น ถ้าใช้แค่ head + tail จะได้บรรทัดสุดท้ายมาเสมอ โดยอาจจะไม่ใช่บรรทัดที่ 4 ก็ได้ ผลคือได้ shell script หน้าตาอย่างนี้มา</p>
<div class="dean_ch" style="white-space: nowrap;"><span class="re2">ln1=</span><span class="nu0">4</span><br />
<span class="re2">st1=</span><span class="st0">&quot;stu&quot;</span><br />
<span class="re2">ext1=</span><span class="st0">&quot;.pdf&quot;</span></p>
<p><span class="re2">ln2=</span><span class="nu0">4</span><br />
<span class="re2">st2=</span><span class="st0">&quot;zzz&quot;</span><br />
<span class="re2">ext2=</span><span class="st0">&quot;.js&quot;</span></p>
<p>repeat<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp;<span class="re2">n=</span><span class="nu0">1</span><br />
&nbsp;<span class="kw1">while</span> <span class="br0">&#91;</span> <span class="re0">$<span class="br0">&#123;</span>n<span class="br0">&#125;</span></span> -le $<span class="br0">&#123;</span><span class="nu0">1</span><span class="br0">&#125;</span> <span class="br0">&#93;</span>; <span class="kw1">do</span><br />
&nbsp; &nbsp;<span class="re2">n=</span>$<span class="br0">&#40;</span><span class="br0">&#40;</span><span class="re1">$n</span><span class="nu0">+1</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp;<span class="kw3">echo</span> <span class="nu0">0</span><br />
&nbsp;<span class="kw1">done</span><br />
<span class="br0">&#125;</span></p>
<p><span class="re2">s=</span><span class="nu0">0</span><br />
<span class="kw1">for</span> a <span class="kw1">in</span> `<span class="kw2">find</span> . | <span class="kw2">grep</span> <span class="re0">$<span class="br0">&#123;</span>st1<span class="br0">&#125;</span></span> | <span class="kw2">grep</span> <span class="re0">$<span class="br0">&#123;</span>ext1<span class="br0">&#125;</span></span>$`; <span class="kw1">do</span><br />
&nbsp; <span class="re2">s=</span>$<span class="br0">&#40;</span><span class="br0">&#40;</span>`repeat <span class="re0">$<span class="br0">&#123;</span>ln1<span class="br0">&#125;</span></span> | <span class="kw2">cat</span> <span class="re0">$<span class="br0">&#123;</span>a<span class="br0">&#125;</span></span> &#8211; | <span class="kw2">head</span> -n <span class="re0">$<span class="br0">&#123;</span>ln1<span class="br0">&#125;</span></span> | <span class="kw2">tail</span> -n <span class="nu0">1</span>`+<span class="re0">$<span class="br0">&#123;</span>s<span class="br0">&#125;</span></span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
<span class="kw1">done</span></p>
<p><span class="re2">t=</span><span class="nu0">0</span><br />
<span class="kw1">for</span> a <span class="kw1">in</span> `<span class="kw2">find</span> . | <span class="kw2">grep</span> <span class="re0">$<span class="br0">&#123;</span>st2<span class="br0">&#125;</span></span> | <span class="kw2">grep</span> <span class="re0">$<span class="br0">&#123;</span>ext2<span class="br0">&#125;</span></span>$`; <span class="kw1">do</span><br />
&nbsp; <span class="re2">t=</span>$<span class="br0">&#40;</span><span class="br0">&#40;</span>`repeat <span class="re0">$<span class="br0">&#123;</span>ln2<span class="br0">&#125;</span></span> | <span class="kw2">cat</span> <span class="re0">$<span class="br0">&#123;</span>a<span class="br0">&#125;</span></span> &#8211; | <span class="kw2">head</span> -n <span class="re0">$<span class="br0">&#123;</span>ln2<span class="br0">&#125;</span></span> | <span class="kw2">tail</span> -n <span class="nu0">1</span>`+<span class="re0">$<span class="br0">&#123;</span>t<span class="br0">&#125;</span></span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
<span class="kw1">done</span></p>
<p><span class="kw3">echo</span> <span class="st0">&quot;s= ${s}&quot;</span><br />
<span class="kw3">echo</span> <span class="st0">&quot;t= ${t}&quot;</span><br />
<span class="kw3">echo</span> <span class="st0">&quot;s*t= $((${s}*${t}))&quot;</span></div>
<p>ซึ่งผมได้คำตอบคือ 2683982036 ส่งไปในครั้งที่สองก็ถูกต้องเรียบร้อยดี</p>
<p>รออาทิตย์หน้าจะมีคำถามใหม่มาอีก แต่ไม่รู้วันไหน เห็นว่าตอบถูกหมดเป็นคนแรกมีรางวัลให้ ทำอย่างไรจะได้เป็นคนแรกล่ะนี่ เอาน่าเผื่อมีรางวัลปลอบใจเป็น invite ให้ลองใช้ google app engine ก็คงจะดี</p>

<p><a href="http://feedads.g.doubleclick.net/~a/mQ-Sw9DpgfGKLsOLcTzao4eWdpQ/0/da"><img src="http://feedads.g.doubleclick.net/~a/mQ-Sw9DpgfGKLsOLcTzao4eWdpQ/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/mQ-Sw9DpgfGKLsOLcTzao4eWdpQ/1/da"><img src="http://feedads.g.doubleclick.net/~a/mQ-Sw9DpgfGKLsOLcTzao4eWdpQ/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/kamthorn?a=XOw9Fjnd"><img src="http://feeds.feedburner.com/~f/kamthorn?d=41" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=7EDipAep"><img src="http://feeds.feedburner.com/~f/kamthorn?i=7EDipAep" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=6aKj72wR"><img src="http://feeds.feedburner.com/~f/kamthorn?d=45" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=U52rxu8R"><img src="http://feeds.feedburner.com/~f/kamthorn?i=U52rxu8R" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=DFD6g416"><img src="http://feeds.feedburner.com/~f/kamthorn?d=52" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/kamthorn/~4/i70g-t_S58Y" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://kamthorn.org/2008/05/29/google-treasure-hunt/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://kamthorn.org/2008/05/29/google-treasure-hunt</feedburner:origLink><feedburner:origLink>http://feedproxy.google.com/~r/kamthorn/~3/i70g-t_S58Y/google-treasure-hunt</feedburner:origLink></item>
		<item>
		<title>Thai Font Tuning in Hardy 1</title>
		<link>http://f.kamthorn.org/~r/kamthorn-rss/~3/_OyvqwVvnTE/thai-font-tuning-in-hardy-1</link>
		<comments>http://kamthorn.org/2008/05/12/thai-font-tuning-in-hardy-1#comments</comments>
		<pubDate>Mon, 12 May 2008 10:57:59 +0000</pubDate>
		<dc:creator>กำธร</dc:creator>
				<category><![CDATA[Public]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[ลินุกซ์]]></category>
		<category><![CDATA[font]]></category>
		<category><![CDATA[Hardy]]></category>
		<category><![CDATA[Waree]]></category>

		<guid isPermaLink="false">http://kamthorn.org/2008/05/12/thai-font-tuning-in-hardy-1</guid>
		<description><![CDATA[ใน Ubuntu Hardy (8.04) มีฟอนต์ไทยใหม่มาให้ใช้ 3 ตัว คือ Waree, Umpush และ Sawasdee โดยเฉพาะ Waree นั้นถูกกำหนดให้เป็นฟอนต์ปริยายแทน Loma แล้ว ดังนั้นเมื่อติดตั้งครั้งแรกจะเป็นหน้าตาฟอนต์แปลกไปไม่คุ้นตา ก็ด้วยเหตุนี้นี่เอง
ในตอนแรกนี้จะปรับแต่งฟอนต์เพียงเล็กน้อย โดยยังคงใช้ Waree เหมือนเดิม ก่อนอื่นมาดูก่อนว่าปัญหาที่เราจะพบคืออะไร

ดูกันใกล้ ๆ
 
นี่คือปัญหาที่เราจะพบเมื่อติดตั้ง Hardy สังเกตว่าตัวอักษรขนาดเล็ก หัวจะหายบ้าง รูตรงหัวตันบ้าง รูปทรงผิดเพี้ยนค่อนข้างมาก ส่วนตัวอักษรที่ใหญ่ขึ้นกลับมีปัญหาที่แปลกไปอีกแบบคือเส้นที่บาง ๆ จะหายไป สังเกตตรงประโยคตัวอย่าง
ปัญหานี้เกิดจาก โดยปกติแล้ว Hardy จะกำหนดให้ใช้ font hinting แบบ native คือเป็น hint ที่ฝังมากับฟอนต์เลย เช่นฟอนต์ Bitstream Vera ซึ่งจะแสดงได้สวยงาม คมชัดไม่เบลอในทุกขนาดตัวอักษร ส่วนฟอนต์ที่ไม่มี hint จะยังคงแสดงเบลอ ๆ เหมือนเดิม แต่ฟอนต์ [...]]]></description>
			<content:encoded><![CDATA[<p>ใน Ubuntu Hardy (8.04) มีฟอนต์ไทยใหม่มาให้ใช้ 3 ตัว คือ Waree, Umpush และ Sawasdee โดยเฉพาะ Waree นั้นถูกกำหนดให้เป็นฟอนต์ปริยายแทน Loma แล้ว ดังนั้นเมื่อติดตั้งครั้งแรกจะเป็นหน้าตาฟอนต์แปลกไปไม่คุ้นตา ก็ด้วยเหตุนี้นี่เอง</p>
<p>ในตอนแรกนี้จะปรับแต่งฟอนต์เพียงเล็กน้อย โดยยังคงใช้ Waree เหมือนเดิม ก่อนอื่นมาดูก่อนว่าปัญหาที่เราจะพบคืออะไร</p>
<p><a href="http://www.flickr.com/photos/kamthorn/2486200050/" title="1-default by Kamthorn, on Flickr"><img src="http://farm3.static.flickr.com/2366/2486200050_1b8ba45c56.jpg" alt="1-default" height="413" width="500" /></a></p>
<p>ดูกันใกล้ ๆ</p>
<p><a href="http://www.flickr.com/photos/kamthorn/2486200052/" title="1-default-1 by Kamthorn, on Flickr"><img src="http://farm3.static.flickr.com/2074/2486200052_2cc7ec436f_o.png" alt="1-default-1" height="188" width="138" /></a> <a href="http://www.flickr.com/photos/kamthorn/2486200054/" title="1-default-2 by Kamthorn, on Flickr"><img src="http://farm3.static.flickr.com/2162/2486200054_0bcd81100d_o.png" alt="1-default-2" height="292" width="435" /></a></p>
<p>นี่คือปัญหาที่เราจะพบเมื่อติดตั้ง Hardy สังเกตว่าตัวอักษรขนาดเล็ก หัวจะหายบ้าง รูตรงหัวตันบ้าง รูปทรงผิดเพี้ยนค่อนข้างมาก ส่วนตัวอักษรที่ใหญ่ขึ้นกลับมีปัญหาที่แปลกไปอีกแบบคือเส้นที่บาง ๆ จะหายไป สังเกตตรงประโยคตัวอย่าง</p>
<p>ปัญหานี้เกิดจาก โดยปกติแล้ว Hardy จะกำหนดให้ใช้ font hinting แบบ native คือเป็น hint ที่ฝังมากับฟอนต์เลย เช่นฟอนต์ Bitstream Vera ซึ่งจะแสดงได้สวยงาม คมชัดไม่เบลอในทุกขนาดตัวอักษร ส่วนฟอนต์ที่ไม่มี hint จะยังคงแสดงเบลอ ๆ เหมือนเดิม แต่ฟอนต์ Waree นั้นมี hint อยู่ด้วย แต่อย่างที่ทราบการดีว่าการทำ hint ให้สมบูรณ์นั้นยากมาก ฟอนต์ Waree จึงแสดงออกมาดีที่สุดได้แบบที่เห็น</p>
<p>ทางแก้แบบง่ายคือ ลดระดับของ hint ลงเหลือแค่ระดับ slight หรือ &#8220;นิดหน่อย&#8221; โดยเลือกเมนู &#8220;ระบบ&#8221; &#8211;> &#8220;ปรับแต่งพื้นโต๊ะ&#8221; &#8211;> &#8220;รูปโฉม&#8221; แล้วเลือกแท็บ &#8220;แบบอักษร&#8221; แล้วคลิกปุ่ม &#8220;รายละเอียด&#8230;&#8221; จากนั้นตั้งค่า Hinting เป็น &#8220;นิดหน่อย&#8221; ตามภาพ</p>
<p><a href="http://www.flickr.com/photos/kamthorn/2486200056/" title="2-font-render-details by Kamthorn, on Flickr"><img src="http://farm3.static.flickr.com/2260/2486200056_e923500661.jpg" alt="2-font-render-details" height="413" width="500" /></a></p>
<p>ผลคือ</p>
<p><a href="http://www.flickr.com/photos/kamthorn/2486200062/" title="3-screen2 by Kamthorn, on Flickr"><img src="http://farm3.static.flickr.com/2374/2486200062_939bfe6602.jpg" alt="3-screen2" height="413" width="500" /></a></p>
<p><a href="http://www.flickr.com/photos/kamthorn/2486200066/" title="3-screen2-1 by Kamthorn, on Flickr"><img src="http://farm3.static.flickr.com/2355/2486200066_53a3faba3c_o.png" alt="3-screen2-1" height="187" width="138" /></a> <a href="http://www.flickr.com/photos/kamthorn/2485487069/" title="3-screen2-2 by Kamthorn, on Flickr"><img src="http://farm4.static.flickr.com/3212/2485487069_ab3959cb9b_o.png" alt="3-screen2-2" height="291" width="439" /></a></p>
<p>การตั้งระดับ Hint เป็น slight จะทำให้การเรนเดอร์ฟอนต์เน้นที่รูปทรงของฟอนต์มากกว่าความคมชัด ทำให้เห็นได้อย่างชัดเจนว่ารูปทรงของฟอนต์ถูกต้องสวยงาม แต่ก็มีความเบลอมากเช่นกัน และยังทำให้ฟอนต์ภาษาอังกฤษเบลอไปด้วย</p>
<p>สำหรับท่านที่พอใจกับการตั้งฟอนต์แบบนี้ก็หยุดได้เลยครับ แต่สำหรับผมแล้ว ผมต้องการมากกว่านั้น ผมอยากให้ตัวอักษรภาษาอังกฤษชัดเท่าที่มันจะชัดได้ ในขณะที่ภาษาไทยก็ไม่เพี้ยนถึงขั้นเส้นหาย หัวหาย</p>
<p>ทางออกคือ libfreetype ในปัจจุบันมี autohint ซึ่งเป็นวิธีการเรนเดอร์ฟอนต์โดยไม่ต้องพึ่ง hint ที่มาในตัวฟอนต์เอง แต่จะสร้าง hint อัตโนมัติ ซึ่งตัวหลัง ๆ นี่มันทำได้ดีมาก ๆ แต่เราจะใช้ autohint เฉพาะกับฟอนต์ที่เราต้องการ ในที่นี้คือฟอนต์ภาษาไทยเท่านั้น ฟอนต์ที่มี native hint ดี ๆ อย่าง Bitstream Vera เราจะไม่แตะ จะใช้ native hint เหมือนเดิม</p>
<p>ขั้นแรก สร้างแฟ้ม <kbd>.fonts.conf</kbd> ไว้ที่ home ของท่านเองโดยให้มีเนื้อหาดังนี้</p>
<pre>&lt;?xml version="1.0"?&gt;
&lt;!DOCTYPE fontconfig SYSTEM "fonts.dtd"&gt;
&lt;fontconfig&gt;
        &lt;match target="font"&gt;
                &lt;test name="family"&gt;
                        &lt;string&gt;Loma&lt;/string&gt;
                        &lt;string&gt;Garuda&lt;/string&gt;
                        &lt;string&gt;Norasi&lt;/string&gt;
                        &lt;string&gt;Kinari&lt;/string&gt;
                        &lt;string&gt;Purisa&lt;/string&gt;
                        &lt;string&gt;TlwgMono&lt;/string&gt;
                        &lt;string&gt;TlwgTypewriter&lt;/string&gt;
                        &lt;string&gt;Waree&lt;/string&gt;
                        &lt;string&gt;Umpush&lt;/string&gt;
                        &lt;string&gt;Sawasdee&lt;/string&gt;
                &lt;/test&gt;
                &lt;edit name="autohint" mode="assign"&gt;&lt;bool&gt;true&lt;/bool&gt;&lt;/edit&gt;
        &lt;/match&gt;
&lt;/fontconfig&gt;</pre>
<p>จากนั้นให้ล็อกเอาท์ออกจากระบบ แล้วล็อกอินเข้ามาใหม่ แล้วตั้งค่าฟอนต์ให้เป็นตามภาพนี้</p>
<p><a href="http://www.flickr.com/photos/kamthorn/2485387805/" title="4-font-render-details-full by Kamthorn, on Flickr"><img src="http://farm3.static.flickr.com/2285/2485387805_f4f336fc12.jpg" alt="4-font-render-details-full" height="413" width="500" /></a></p>
<p>ผลลัพธ์สุดท้าย</p>
<p><a href="http://www.flickr.com/photos/kamthorn/2485387811/" title="5-screen3 by Kamthorn, on Flickr"><img src="http://farm4.static.flickr.com/3061/2485387811_aaf5d6ac5e.jpg" alt="5-screen3" height="413" width="500" /></a></p>
<p><a href="http://www.flickr.com/photos/kamthorn/2485387817/" title="5-screen3-1 by Kamthorn, on Flickr"><img src="http://farm3.static.flickr.com/2088/2485387817_d80fc06721_o.png" alt="5-screen3-1" height="190" width="141" /></a> <a href="http://www.flickr.com/photos/kamthorn/2485387819/" title="5-screen3-2 by Kamthorn, on Flickr"><img src="http://farm3.static.flickr.com/2363/2485387819_076caeb707_o.png" alt="5-screen3-2" height="291" width="441" /></a></p>
<p>จะเห็นว่าตัวอักษรภาษาอังกฤษมีความคมชัดเป็นปกติ ส่วนตัวไทยนั้นมีหัวหาง เส้นต่าง ๆ ครบถ้วน อ่านได้ชัดเจนดี มีเพี้ยนบ้างแต่น้อยมาก ๆ</p>
<p>เป็นอย่างไรครับ เห็นความงามของฟอนต์ Waree หรือยัง</p>

<p><a href="http://feedads.g.doubleclick.net/~a/EA1qMgPS3bk46bd41G_AJ2DmQTg/0/da"><img src="http://feedads.g.doubleclick.net/~a/EA1qMgPS3bk46bd41G_AJ2DmQTg/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/EA1qMgPS3bk46bd41G_AJ2DmQTg/1/da"><img src="http://feedads.g.doubleclick.net/~a/EA1qMgPS3bk46bd41G_AJ2DmQTg/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/kamthorn?a=Vi2el0Cj"><img src="http://feeds.feedburner.com/~f/kamthorn?d=41" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=OoQQhgJO"><img src="http://feeds.feedburner.com/~f/kamthorn?i=OoQQhgJO" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=dXQ5OPce"><img src="http://feeds.feedburner.com/~f/kamthorn?d=45" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=FLgOmsba"><img src="http://feeds.feedburner.com/~f/kamthorn?i=FLgOmsba" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/kamthorn?a=0y7EMd2h"><img src="http://feeds.feedburner.com/~f/kamthorn?d=52" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/kamthorn/~4/-zfjBKC4d3U" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://kamthorn.org/2008/05/12/thai-font-tuning-in-hardy-1/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://kamthorn.org/2008/05/12/thai-font-tuning-in-hardy-1</feedburner:origLink><feedburner:origLink>http://feedproxy.google.com/~r/kamthorn/~3/-zfjBKC4d3U/thai-font-tuning-in-hardy-1</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 4.276 seconds. --><!-- Cached page generated by WP-Super-Cache on 2010-03-10 15:29:33 -->
