<?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>PUPASOFT BLOG!</title>
	<atom:link href="http://blog.pupasoft.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.pupasoft.com</link>
	<description>Proactive Units for Practical Applications</description>
	<lastBuildDate>Mon, 22 Feb 2010 12:05:22 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Create blog and use Rich Editor in Groovy on Grails (grails-ui plugin)</title>
		<link>http://blog.pupasoft.com/2010/02/22/create-blog-and-use-rich-editor-in-groovy-on-grails-grails-ui-plugin/</link>
		<comments>http://blog.pupasoft.com/2010/02/22/create-blog-and-use-rich-editor-in-groovy-on-grails-grails-ui-plugin/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 12:05:22 +0000</pubDate>
		<dc:creator>Emperor_bear</dc:creator>
				<category><![CDATA[Groovy on Grails]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://blog.pupasoft.com/?p=3450</guid>
		<description><![CDATA[สวัสดีครับล วันนี้เรามาลองสร้าง blog และเอา plug in  บางตัวมาใช้ในโปรเจค Groovy on Grails กันนะ
Example


ก่อนอื่นเลยให้เราสร้าง Groovy on Grails ใหม่ใน NetBeans ชื่อว่า my_blog ละกันนะ
ใครทำไม่เป็นดูตามลิ้งนี้เลยนะ CLICK!!!
เมื่อทำเสร็จแล้วก็มาสร้าง blog กัน ก่อนอื่นเลยเรามาสร้าง domain ที่ชื่อว่า blog ก่อน ให้มันอยู่ใน blogger package ละกันนะ
create domain

give domain name

เราก็จะได้ domain ที่ชื่อว่า blog มาแล้ว
หลังจากนั้นให้เราไปแก้ไฟล์ ใน grails-app/domain/blogger/Blog.groovy

class Blog &#123;
static constraints = &#123;
      title&#40;blank:false&#41;
    [...]]]></description>
			<content:encoded><![CDATA[<p>สวัสดีครับล วันนี้เรามาลองสร้าง blog และเอา plug in  บางตัวมาใช้ในโปรเจค Groovy on Grails กันนะ</p>
<p>Example</p>
<p><a href="http://blog.pupasoft.com/wp-content/uploads/2010/02/rich_editor_example.png"><img class="alignnone size-full wp-image-3451" title="rich_editor_example" src="http://blog.pupasoft.com/wp-content/uploads/2010/02/rich_editor_example.png" alt="" width="592" height="214" /></a></p>
<p><span id="more-3450"></span></p>
<p>ก่อนอื่นเลยให้เราสร้าง Groovy on Grails ใหม่ใน NetBeans ชื่อว่า my_blog ละกันนะ</p>
<p>ใครทำไม่เป็นดูตามลิ้งนี้เลยนะ <a title="การสร้าง project" href="http://blog.pupasoft.com/2009/11/25/aeronzgroovy-on-grails-hello-world-with-netbeans/">CLICK!!!</a></p>
<p>เมื่อทำเสร็จแล้วก็มาสร้าง blog กัน ก่อนอื่นเลยเรามาสร้าง domain ที่ชื่อว่า blog ก่อน ให้มันอยู่ใน blogger package ละกันนะ</p>
<p><em>create domain</em></p>
<p><a href="http://blog.pupasoft.com/wp-content/uploads/2010/02/new_domain.png"><img class="alignnone size-thumbnail wp-image-3452" title="new_domain" src="http://blog.pupasoft.com/wp-content/uploads/2010/02/new_domain-150x150.png" alt="" width="150" height="150" /></a></p>
<p><em>give domain name</em></p>
<p><a href="http://blog.pupasoft.com/wp-content/uploads/2010/02/fill_domain_name.png"><img class="alignnone size-thumbnail wp-image-3454" title="fill_domain_name" src="http://blog.pupasoft.com/wp-content/uploads/2010/02/fill_domain_name-150x124.png" alt="" width="150" height="124" /></a></p>
<p>เราก็จะได้ domain ที่ชื่อว่า blog มาแล้ว</p>
<p>หลังจากนั้นให้เราไปแก้ไฟล์ ใน grails-app/domain/blogger/Blog.groovy</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Blog <span style="color:#006600; font-weight:bold;">&#123;</span>
static constraints = <span style="color:#006600; font-weight:bold;">&#123;</span>
      title<span style="color:#006600; font-weight:bold;">&#40;</span>blank:<span style="color:#0000FF; font-weight:bold;">false</span><span style="color:#006600; font-weight:bold;">&#41;</span>
      body<span style="color:#006600; font-weight:bold;">&#40;</span>widget:<span style="color:#996600;">&quot;textarea&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">&#125;</span>
      <span style="color:#CC0066; font-weight:bold;">String</span> title
      <span style="color:#CC0066; font-weight:bold;">String</span> body
<span style="color:#006600; font-weight:bold;">&#125;</span></pre></div></div>

<p>เมื่อเราได้ Domain ก็ต้องมาสร้างส่วนของ Controller กับ View แต่ด้วยความขี้เกียจเราจึงใช้ Function การ generate ใน groovy กัน มันจะ gen ให้หมดเลยโดยดูจาก domain</p>
<p>ให้เราคลิกขวาที่ชื่อ project เรา แล้วเลือก Run Grails Command</p>
<p><a href="http://blog.pupasoft.com/wp-content/uploads/2010/02/go_to_Run_Grail_command.png"><img class="alignnone size-thumbnail wp-image-3460" title="go_to_Run_Grail_command" src="http://blog.pupasoft.com/wp-content/uploads/2010/02/go_to_Run_Grail_command-150x150.png" alt="" width="150" height="150" /></a></p>
<p>เราจะเจอหน้าต่างใหม่โผล่ขึ้นมา ทีนี้เราก็เติมคำในช่องว่างกัน</p>
<p><a href="http://blog.pupasoft.com/wp-content/uploads/2010/02/generate_all.png"><img class="alignnone size-thumbnail wp-image-3461" title="generate_all" src="http://blog.pupasoft.com/wp-content/uploads/2010/02/generate_all-150x150.png" alt="" width="150" height="150" /></a></p>
<p>ในช่อง filter ปล่อยว่างไป</p>
<p>ส่วนของ parameter เราก็ใส่ ชื่อpackage.ชื่อdomain ในที่นี้ blogger.Blog</p>
<p>ใน Matching Task เป็นส่วนที่ให่เราเลือกว่าเราจะใช้ฟังก์ชันอะไร เราต้องการ generate-all ก็เลือกมันซะ</p>
<p>แล้วก็คลิกที่ Run ดู มันจะมีตัววิ่งวืดๆ เต็มเลยรอซักพักนะ ก็จะเป็นอันเสร็จ</p>
<p>รัน project เราดู คลิกขวาที่ชื่อ project แล้วเลือก Run</p>
<p><a href="http://blog.pupasoft.com/wp-content/uploads/2010/02/run_project.png"><img class="alignnone size-thumbnail wp-image-3463" title="run_project" src="http://blog.pupasoft.com/wp-content/uploads/2010/02/run_project-150x150.png" alt="" width="150" height="150" /></a></p>
<p>ซักพักมันก็จะขึ้น web browser มา</p>
<p><a href="http://blog.pupasoft.com/wp-content/uploads/2010/02/first_web_page.png"><img class="alignnone size-thumbnail wp-image-3464" title="first_web_page" src="http://blog.pupasoft.com/wp-content/uploads/2010/02/first_web_page-150x150.png" alt="" width="150" height="150" /></a></p>
<p>เลือก blogger.BlogController</p>
<p><a href="http://blog.pupasoft.com/wp-content/uploads/2010/02/next_page.png"><img class="alignnone size-thumbnail wp-image-3465" title="next_page" src="http://blog.pupasoft.com/wp-content/uploads/2010/02/next_page-150x150.png" alt="" width="150" height="150" /></a></p>
<p>มาสร้าง blog ใหม่ โดยเลือกที่ New Blog</p>
<p><a href="http://blog.pupasoft.com/wp-content/uploads/2010/02/fillblog.png"><img class="alignnone size-thumbnail wp-image-3467" title="fillblog" src="http://blog.pupasoft.com/wp-content/uploads/2010/02/fillblog-150x150.png" alt="" width="150" height="150" /></a></p>
<p>ทีนี้เราก็เห็นแล้วผลลัพธ์ของ code ที่เราได้พิมพ์ไปตอนต้น</p>
<p>ลองใส่ข้อความแล้วกด create สิ</p>
<p><a href="http://blog.pupasoft.com/wp-content/uploads/2010/02/show_part.png"><img class="alignnone size-thumbnail wp-image-3468" title="show_part" src="http://blog.pupasoft.com/wp-content/uploads/2010/02/show_part-150x150.png" alt="" width="150" height="150" /></a></p>
<p>ได้ผลลัพธ์หน้าตาอย่างนี้ ที่นี้เพิ่มความเล้าใจมาอีกนิดนึง เราจะมาลองใช้ plug in ที่มีชื่อว่า grails-ui ซึ่งมีความสามารถหลายๆ อย่างไปดูเอาเองนะ แต่มีอย่างนึงคือ Rich Editor ที่เพิ่มอุปกรณืในการตกแต่งข้อความดังตัวอย่างบนสุด เริ่มกันเลย กลับมาที่ project เรา ให้เราคลิกขวาที่ชื่อ project แล้วเลือก Grails Plugins&#8230;</p>
<p><a href="http://blog.pupasoft.com/wp-content/uploads/2010/02/choose_grails_plugin.png"><img class="alignnone size-thumbnail wp-image-3469" title="choose_grails_plugin" src="http://blog.pupasoft.com/wp-content/uploads/2010/02/choose_grails_plugin-150x150.png" alt="" width="150" height="150" /></a></p>
<p>แล้วมันจะขึ้นหน้าต่างใหม่มา ให้เราเลือกแทบ New Plugins มันจะโหลดข้อมูลมาแปปนึง ต่อเน็ทด้วยนะตอนนี้</p>
<p><a href="http://blog.pupasoft.com/wp-content/uploads/2010/02/new_plugins_wait.png"><img class="alignnone size-thumbnail wp-image-3470" title="new_plugins_wait" src="http://blog.pupasoft.com/wp-content/uploads/2010/02/new_plugins_wait-150x150.png" alt="" width="150" height="150" /></a></p>
<p>ทีนี้มันจะมี plugin ให้เราเลือกเต็มเลย</p>
<p><a href="http://blog.pupasoft.com/wp-content/uploads/2010/02/new_plugins_choosse.png"><img class="alignnone size-thumbnail wp-image-3471" title="new_plugins_choosse" src="http://blog.pupasoft.com/wp-content/uploads/2010/02/new_plugins_choosse-150x150.png" alt="" width="150" height="150" /></a></p>
<p>เราจะใช้ grails-ui ก็เลือกมันซะ แล้วกด install จะโหลดข้อมูลมารอซักพักนะ</p>
<p><a href="http://blog.pupasoft.com/wp-content/uploads/2010/02/install_plugin_success.png"><img class="alignnone size-thumbnail wp-image-3472" title="install_plugin_success" src="http://blog.pupasoft.com/wp-content/uploads/2010/02/install_plugin_success-150x150.png" alt="" width="150" height="150" /></a></p>
<p>หลังจากนั้น plugin ก็ถูกนำเข้ามาใส่ใน project เราและ ถ้าสำเร็จก็จะได้เหมือนรูปบนนะ</p>
<p>ทีนี้ไปที่ grails-app/views/blog/create.gps เปิดไฟล์นี้ออกมา ถ้าเป็น NetBeans มันจะ generate code รกรุงรังมั่วตั้วมากมาย ให้เราไปแก้ตรงส่วนนี้นะลองหาดู ตามรูป</p>
<p><a href="http://blog.pupasoft.com/wp-content/uploads/2010/02/before_edit.png"><img class="alignnone size-thumbnail wp-image-3473" title="before_edit" src="http://blog.pupasoft.com/wp-content/uploads/2010/02/before_edit-150x150.png" alt="" width="150" height="150" /></a></p>
<p>ให้แก้ตาม code ต่อไปนี้นะ<br />
<a href="http://blog.pupasoft.com/wp-content/uploads/2010/02/edit_gps.png"><img class="alignnone size-thumbnail wp-image-3478" title="edit_gps" src="http://blog.pupasoft.com/wp-content/uploads/2010/02/edit_gps-150x76.png" alt="" width="150" height="76" /></a><br />
ลองรัน project ดู จะเห็นได้ว่ามี text editor มาให้เราและ ลองเล่นดูนะ</p>
<p><a href="http://blog.pupasoft.com/wp-content/uploads/2010/02/got_text_edit_tool.png"><img class="alignnone size-thumbnail wp-image-3480" title="got_text_edit_tool" src="http://blog.pupasoft.com/wp-content/uploads/2010/02/got_text_edit_tool-150x150.png" alt="" width="150" height="150" /></a></p>
<p>เมื่อเรากด create มันจะเป็น ดังรูป</p>
<p><a href="http://blog.pupasoft.com/wp-content/uploads/2010/02/after_create2.png"><img class="alignnone size-thumbnail wp-image-3484" title="after_create2" src="http://blog.pupasoft.com/wp-content/uploads/2010/02/after_create2-150x150.png" alt="" width="150" height="150" /></a></p>
<p>เวรกรรม tag html ต่างๆ มันมาได้เยี่ยงไร แล้วเราจะแก้ยังไง ง่ายมากครับ ให้เราไปที่ grails-app/views/blog/show.gps แล้วไปดูหาตำแหน่งนี้นะ</p>
<p><a href="http://blog.pupasoft.com/wp-content/uploads/2010/02/edit_position.png"><img class="alignnone size-thumbnail wp-image-3482" title="edit_position" src="http://blog.pupasoft.com/wp-content/uploads/2010/02/edit_position-150x122.png" alt="" width="150" height="122" /></a></p>
<p>แล้วแก้ตามนี้นะครับ</p>
<p>&lt;td&gt;${blogInstance.body}&lt;/td&gt;</p>
<p>แล้วลอง refresh หน้า webpage เราครับ ก็จะได้มาแล้ว</p>
<p><a href="http://blog.pupasoft.com/wp-content/uploads/2010/02/successful.png"><img class="alignnone size-thumbnail wp-image-3485" title="successful" src="http://blog.pupasoft.com/wp-content/uploads/2010/02/successful-150x150.png" alt="" width="150" height="150" /></a></p>
<p>มันยังมีให้แก้อีก 2 3 จุด ลองเข้าไปดูในพวก edit.gsp กับ list.gsp นะ วิธีแก้คล้ายด้านบนอ่ะ</p>
<p>จบ</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pupasoft.com/2010/02/22/create-blog-and-use-rich-editor-in-groovy-on-grails-grails-ui-plugin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>aErOnz`Can&#8217;t convert value ‘0000-00-00 00:00:00′ to TIMESTAMP</title>
		<link>http://blog.pupasoft.com/2010/01/27/aeronzcant-convert-value-%e2%80%980000-00-00-000000%e2%80%b2-to-timestamp/</link>
		<comments>http://blog.pupasoft.com/2010/01/27/aeronzcant-convert-value-%e2%80%980000-00-00-000000%e2%80%b2-to-timestamp/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 09:00:20 +0000</pubDate>
		<dc:creator>aErOnz`</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Programming Tips]]></category>

		<guid isPermaLink="false">http://blog.pupasoft.com/?p=3447</guid>
		<description><![CDATA[
java.sql.SQLException: Cannot convert value &#8216;0000-00-00 00:00:00&#8242; from column 7 to TIMESTAMP.
..

หากใครเคยเจอปัญหานี้ ตามมาทางนี้เลยครับ ผมมีคำตอบ

การแก้ปัญหานี้มีสองวิธีคือ
1. ไปเซ็ตค่า URL ในการติดต่อ database ว่า ?zeroDateTimeBehavior=convertToNull เช่น
jdbc:mysql://localhost/test?zeroDateTimeBehavior=convertToNull
2. ในขณะที่เราเขียนโปรแกรม (ภาษา Java)ในการติดต่อ database ให้เราเซ็ต Connection Properties ดังนี้

Class.forName&#40;driver&#41;.newInstance&#40;&#41;;
connection = &#40;Connection&#41; DriverManager.getConnection&#40;url + dbName, userName, password&#41;;
connection.setZeroDateTimeBehavior&#40;&#34;convertToNull&#34;&#41;;

ทีนี้เมื่อเรารันโค้ด ที่ทำให้เกิด Exception ดังกล่าว

System.out.println&#40;&#34;&#62;&#62;&#62;&#62; this is zero = &#34;+rs.getTimestamp&#40;&#34;finish_date&#34;&#41;&#41;;

จะได้ผลลัพธ์เป็น

>>>> this is zero = null

หรือถ้าเป็น

connection.setZeroDateTimeBehavior&#40;&#34;round&#34;&#41;;

จะได้ผลลัพธ์เป็น 

>>>> this is zero = 0001-01-01 00:00:00.0

ซึ่งการเซ็ต [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>
java.sql.SQLException: Cannot convert value &#8216;0000-00-00 00:00:00&#8242; from column 7 to TIMESTAMP.<br />
..
</p></blockquote>
<p>หากใครเคยเจอปัญหานี้ ตามมาทางนี้เลยครับ ผมมีคำตอบ<br />
<span id="more-3447"></span></p>
<p>การแก้ปัญหานี้มีสองวิธีคือ<br />
1. ไปเซ็ตค่า URL ในการติดต่อ database ว่า ?zeroDateTimeBehavior=convertToNull เช่น</p>
<blockquote><p>jdbc:mysql://localhost/test?zeroDateTimeBehavior=convertToNull</p></blockquote>
<p>2. ในขณะที่เราเขียนโปรแกรม (ภาษา Java)ในการติดต่อ database ให้เราเซ็ต Connection Properties ดังนี้</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">Class</span>.<span style="color: #006633;">forName</span><span style="color: #009900;">&#40;</span>driver<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">newInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
connection <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Connection</span><span style="color: #009900;">&#41;</span> <span style="color: #003399;">DriverManager</span>.<span style="color: #006633;">getConnection</span><span style="color: #009900;">&#40;</span>url <span style="color: #339933;">+</span> dbName, userName, password<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
connection.<span style="color: #006633;">setZeroDateTimeBehavior</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;convertToNull&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>ทีนี้เมื่อเรารันโค้ด ที่ทำให้เกิด Exception ดังกล่าว</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;&gt;&gt;&gt;&gt; this is zero = &quot;</span><span style="color: #339933;">+</span>rs.<span style="color: #006633;">getTimestamp</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;finish_date&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>จะได้ผลลัพธ์เป็น</p>
<blockquote><p>
>>>> this is zero = null
</p></blockquote>
<p>หรือถ้าเป็น</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">connection.<span style="color: #006633;">setZeroDateTimeBehavior</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;round&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>จะได้ผลลัพธ์เป็น </p>
<blockquote><p>
>>>> this is zero = 0001-01-01 00:00:00.0
</p></blockquote>
<p>ซึ่งการเซ็ต zeroDateTimeBahavior สามารถดูรายละเอียดได้ <a href="http://org.ntnu.no/musikkensverden/doc/constant-values.html#com.mysql.jdbc.ConnectionProperties.ZERO_DATETIME_BEHAVIOR_ROUND">ที่นี่</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pupasoft.com/2010/01/27/aeronzcant-convert-value-%e2%80%980000-00-00-000000%e2%80%b2-to-timestamp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>aErOnz`Atomic transaction with ActiveRecord</title>
		<link>http://blog.pupasoft.com/2010/01/21/aeronzatomic-transaction-with-activerecord/</link>
		<comments>http://blog.pupasoft.com/2010/01/21/aeronzatomic-transaction-with-activerecord/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 06:49:09 +0000</pubDate>
		<dc:creator>aErOnz`</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Programming Tips]]></category>
		<category><![CDATA[Ruby On Rails]]></category>
		<category><![CDATA[Web Development]]></category>
<category>Atomic Transaction ActiveRecord</category>
		<guid isPermaLink="false">http://blog.pupasoft.com/?p=3441</guid>
		<description><![CDATA[สวัสดีครับ วันนี้จะมาพูดถึงเรื่อง Transaction ว่ามันคืออะไรกัน แล้วมันสำคัญอย่างไรกับชีวิตนักพัฒนาโปรแกรมของเรากัน
สมมติว่า นาย aeronz มีเงินในบัญชีอยู่ 2000 บาท และต้องการจะโอนเงินให้นาย Porza 500บาท (ในการดำเนินการใดๆ ซึ่งที่นี้คือการโอนเงิน จะเรียกว่า 1 transaction ครับ)
โดยในขณะนั้นบัญชีของนาย Porza มีเงินอยู่ 0 บาท
ขั้นตอนการโอนเงินก็คือ
1. หักเงินจากบัญชีนาย aeronz 500 บาท (เหลือ 1500 บาท)
2. เพิ่มเงินให้นาย Porza 500 บาท (ยอดบัญชีนาย Porza จะเป็น 500 บาท)
จะเกิดอะไรขึ้น ถ้า พอระบบทำขั้นตอนที่ 1 เสร็จสิ้นแล้ว แต่ยังไม่ทันที่จะทำขั้นที่ 2 ระบบเกิดมีปัญหาขึ้นมา
หากไม่ได้รับมือกับปัญหานี้ ผลที่เกิดขึ้น คือ
เงินบัญชีนาย aeronz เหลือ 1500 บาท เงินในบัญชีนาย Porza คือ [...]]]></description>
			<content:encoded><![CDATA[<p>สวัสดีครับ วันนี้จะมาพูดถึงเรื่อง Transaction ว่ามันคืออะไรกัน แล้วมันสำคัญอย่างไรกับชีวิตนักพัฒนาโปรแกรมของเรากัน<br />
สมมติว่า นาย aeronz มีเงินในบัญชีอยู่ 2000 บาท และต้องการจะโอนเงินให้นาย Porza 500บาท (ในการดำเนินการใดๆ ซึ่งที่นี้คือการโอนเงิน จะเรียกว่า 1 transaction ครับ)<br />
โดยในขณะนั้นบัญชีของนาย Porza มีเงินอยู่ 0 บาท<br />
ขั้นตอนการโอนเงินก็คือ<br />
1. หักเงินจากบัญชีนาย aeronz 500 บาท (เหลือ 1500 บาท)<br />
2. เพิ่มเงินให้นาย Porza 500 บาท (ยอดบัญชีนาย Porza จะเป็น 500 บาท)</p>
<p>จะเกิดอะไรขึ้น ถ้า พอระบบทำขั้นตอนที่ 1 เสร็จสิ้นแล้ว แต่ยังไม่ทันที่จะทำขั้นที่ 2 ระบบเกิดมีปัญหาขึ้นมา<br />
หากไม่ได้รับมือกับปัญหานี้ ผลที่เกิดขึ้น คือ<br />
เงินบัญชีนาย aeronz เหลือ 1500 บาท เงินในบัญชีนาย Porza คือ 0 บาท </p>
<p>เราต้องทำยังไงหล่ะ ?<br />
ถ้าใครสนใจก็ตามเข้ามาเลยครับ<br />
<span id="more-3441"></span></p>
<p>จากบัญหาข้างต้น สิ่งที่ดีที่สุดที่เราจะทำก็คือหากเราทำ กระบวนการทั้งหมด (ทั้งข้อ 1 และ 2)ไม่สำเร็จ ระบบก็ควรที่จะไม่เปลี่ยนแปลงอะไรเลย<br />
คือ เงินบัญชีนาย aeronz เหลือ 2000 บาท เงินในบัญชีนาย Porza คือ 0 บาท เหมือนเดิม</p>
<p>เพราะฉะนั้น เวลาเราเขียนโปรแกรม หรือทำระบบที่มีการดำเนินการใดๆ (Transaction) เราต้องคำนึงถึงเรื่องนี้ไว้ด้วยครับ<br />
ในการย้อนกลับหากการดำเนินการไม่สำเร็จ เราจะเรียกว่าการ roll back ครับ ซึ่งใน ActiveRecord ของ ROR ก็มีการเขียนโค้ดเพื่อเตรียมป้องกันเหตุการเหล่านี้ดังนี้ครับ</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">aeronz = Account.<span style="color:#9900CC;">find</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span>
porza = Account.<span style="color:#9900CC;">find</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
Account.<span style="color:#9900CC;">transaction</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  aeronz.<span style="color:#9900CC;">withdrawal</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">500</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  porza.<span style="color:#9900CC;">deposit</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">500</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>หรือ</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">aeronz = Account.<span style="color:#9900CC;">find</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span>
porza = Account.<span style="color:#9900CC;">find</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>.<span style="color:#9900CC;">transaction</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  aeronz.<span style="color:#9900CC;">withdrawal</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">500</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  porza.<span style="color:#9900CC;">deposit</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">500</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>เพราะว่าโมเดลใน RoR มีการสืบทอดมาจาก คลาส ActiveRecord::Base ครับ</p>
<p>ครับ ตอนนี้เราก็ได้ concept ของ Transaction และวิธีการในการ RollBack ข้อมูล เมื่อเกิดปัญหาด้วย ActiveRecord ใน RoR กันแล้วนะครับ<br />
ถ้าใครสนใจ อาจจะไปอ่านเพิ่มเิติมได้ <a href="http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html#M001851">ที่นี่</a> ครับ<br />
ไว้เจอกันใหม่ครับ</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pupasoft.com/2010/01/21/aeronzatomic-transaction-with-activerecord/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>memset ในภาษาซี คืออะไรกันนะ?</title>
		<link>http://blog.pupasoft.com/2010/01/13/what_is_memset_command_in_cpp/</link>
		<comments>http://blog.pupasoft.com/2010/01/13/what_is_memset_command_in_cpp/#comments</comments>
		<pubDate>Wed, 13 Jan 2010 14:40:38 +0000</pubDate>
		<dc:creator>p</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.pupasoft.com/?p=3439</guid>
		<description><![CDATA[เพื่อน ๆ พี่ ๆ น้อง ๆ เคยเบื่อกันใหมครับ เวลาต้อง set ค่าใน array แต่ละทีต้องใช้คำสั่ง แบบนี้
for(int i=0;i&#60;sizeofarray;i++){
array[i] = 0;
}
แถมต้องเซตทุกรอบที่วนกลับมาอีกต่างหาก ต้องวนไม่รู้กี่รอบ
วันนี้ผมจะเสนอวิธีใหม่ นั่นก็คือ การใช้คำสั่ง memset นั่นเอง
คำสั่ง memset อยู่ใน library ของ cstring หรือ string.h นั่นเอง
ซึ่งมีรูปแบบการใช้ดังนี้
memset(pointer to first element of array , value to set , size in bytes of array);
จากตัวอย่างข้างต้น เราจะเขียนง่ายๆ ได้ว่า
memset(array,0,sizeof(array));
เป็นไงครับ เหลือแค่บรรทัดเดียว แถมไม่ต้องเปลือง memory กับตัวแปร i ที่ใช้ในการวนอีกด้วย
]]></description>
			<content:encoded><![CDATA[<p>เพื่อน ๆ พี่ ๆ น้อง ๆ เคยเบื่อกันใหมครับ เวลาต้อง set ค่าใน array แต่ละทีต้องใช้คำสั่ง แบบนี้</p>
<blockquote><p>for(int i=0;i&lt;sizeofarray;i++){<br />
array[i] = 0;<br />
}</p></blockquote>
<p>แถมต้องเซตทุกรอบที่วนกลับมาอีกต่างหาก ต้องวนไม่รู้กี่รอบ<br />
วันนี้ผมจะเสนอวิธีใหม่ นั่นก็คือ การใช้คำสั่ง memset นั่นเอง</p>
<p><span id="more-3439"></span>คำสั่ง memset อยู่ใน library ของ cstring หรือ string.h นั่นเอง<br />
ซึ่งมีรูปแบบการใช้ดังนี้</p>
<p>memset(pointer to first element of array , value to set , size in bytes of array);</p>
<p>จากตัวอย่างข้างต้น เราจะเขียนง่ายๆ ได้ว่า<br />
memset(array,0,sizeof(array));</p>
<p>เป็นไงครับ เหลือแค่บรรทัดเดียว แถมไม่ต้องเปลือง memory กับตัวแปร i ที่ใช้ในการวนอีกด้วย</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pupasoft.com/2010/01/13/what_is_memset_command_in_cpp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dynamic Programming #3 Knapsack Problem in Programming</title>
		<link>http://blog.pupasoft.com/2010/01/07/dynamic-programming_3/</link>
		<comments>http://blog.pupasoft.com/2010/01/07/dynamic-programming_3/#comments</comments>
		<pubDate>Thu, 07 Jan 2010 12:57:46 +0000</pubDate>
		<dc:creator>p</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.pupasoft.com/?p=3353</guid>
		<description><![CDATA[เอาละครับหลังจากอ่านทฤษฎีกันไปเยอะแล้ว เรามาลองของจริงดูบ้างดีกว่า
จากคราวที่แล้ว
สมมติให้ input เป็นดังนี้
5 10
8 3000
3 1600
6 2500
1 600
4 1900
โดยเลข 5 ตัวแรกหมายถึงจำนวน card และ 10 หมายถึงจำนวนดาวสูงสุดที่จะหยิบได้
5 บรรทัดถัดมาจะประกอบด้วย จำนวนดาวและพลังโจมตี ตามลำดับ

วิธีการทำ จะใช้ตารางมาช่วยนะครับ ก่อนอื่นสร้างตารางที่เมื่อไม่มีการ์ดใบใดถูกเลือกเลย

เลขที่อยู่ในแต่ละช่องของตารางก็คือพลังโจมที่ดีที่สุดเมื่อเลือกแล้วนะครับ
เราจะมาเริ่มหยิบการ์ดกันนะครับ
เริ่มทีละ column โดยที่ column แรกจะเป็นการทดลองหยิบการ์ดใบแรก Blue Eyes White Dragon 8 ดาว พลังโจมตี 3000
จะเห็นได้ว่า ช่้อง 1 ดาว หยิบบลูอายส์ไม่ไ้ด้นะครับ เพราะดาวเกิน จะหยิบได้ก็เมื่อถึงช่องแปดดาวแล้ว
ลองทำ column แรกจะได้ตารางแบบนี้

จะเห็นได้ว่า เมื่อเลือกหยิบบลูอายส์ใบเดียวแล้ว
เราจะได้ 1 ดาว 2 ดาว 3 ดาว &#8230;. 7 ดาว ที่มีพลังโจมตีมากที่สุดเป็น 0 เพราะไม่สามารถใส่บลูอายส์ลงไปได้
แต่ที่ช่อง 8 [...]]]></description>
			<content:encoded><![CDATA[<p>เอาละครับหลังจากอ่านทฤษฎีกันไปเยอะแล้ว เรามาลองของจริงดูบ้างดีกว่า</p>
<p>จาก<a href="http://blog.pupasoft.com/2010/01/07/dynamic-programming-2-knapsack-problem/">คราวที่แล้ว</a><br />
สมมติให้ input เป็นดังนี้<br />
5 10<br />
8 3000<br />
3 1600<br />
6 2500<br />
1 600<br />
4 1900</p>
<p>โดยเลข 5 ตัวแรกหมายถึงจำนวน card และ 10 หมายถึงจำนวนดาวสูงสุดที่จะหยิบได้<br />
5 บรรทัดถัดมาจะประกอบด้วย จำนวนดาวและพลังโจมตี ตามลำดับ<br />
<span id="more-3353"></span><br />
วิธีการทำ จะใช้ตารางมาช่วยนะครับ ก่อนอื่นสร้างตารางที่เมื่อไม่มีการ์ดใบใดถูกเลือกเลย<br />
<a href="http://blog.pupasoft.com/wp-content/uploads/2010/01/Dynamic2Table.jpg"></a><a href="http://blog.pupasoft.com/wp-content/uploads/2010/01/Dynamic2Table1.jpg"><img class="alignnone size-full wp-image-3366" title="Dynamic2Table" src="http://blog.pupasoft.com/wp-content/uploads/2010/01/Dynamic2Table1.jpg" alt="" width="567" height="250" /></a></p>
<p>เลขที่อยู่ในแต่ละช่องของตารางก็คือพลังโจมที่ดีที่สุดเมื่อเลือกแล้วนะครับ<br />
เราจะมาเริ่มหยิบการ์ดกันนะครับ<br />
เริ่มทีละ column โดยที่ column แรกจะเป็นการทดลองหยิบการ์ดใบแรก Blue Eyes White Dragon 8 ดาว พลังโจมตี 3000<br />
จะเห็นได้ว่า ช่้อง 1 ดาว หยิบบลูอายส์ไม่ไ้ด้นะครับ เพราะดาวเกิน จะหยิบได้ก็เมื่อถึงช่องแปดดาวแล้ว<br />
ลองทำ column แรกจะได้ตารางแบบนี้<br />
<a href="http://blog.pupasoft.com/wp-content/uploads/2010/01/Dynamic2Table2.jpg"><img class="alignnone size-full wp-image-3368" title="Dynamic2Table2" src="http://blog.pupasoft.com/wp-content/uploads/2010/01/Dynamic2Table2.jpg" alt="" width="449" height="217" /></a></p>
<p>จะเห็นได้ว่า เมื่อเลือกหยิบบลูอายส์ใบเดียวแล้ว<br />
เราจะได้ 1 ดาว 2 ดาว 3 ดาว &#8230;. 7 ดาว ที่มีพลังโจมตีมากที่สุดเป็น 0 เพราะไม่สามารถใส่บลูอายส์ลงไปได้<br />
แต่ที่ช่อง 8 9 10 จะเห็นได้ว่า เราได้เลือกบลูอายส์ ที่มีพลังโจมตี 3000</p>
<p>แล้วทำไมต้องมีเส้นสีน้ำเงิน??<br />
เรามาลองดูกันตอนทำไปสักสองแถวดู จะได้ตารางแบบนี้<br />
<a href="http://blog.pupasoft.com/wp-content/uploads/2010/01/Dynamic2Table3.jpg"><img class="alignnone size-full wp-image-3417" title="Dynamic2Table3" src="http://blog.pupasoft.com/wp-content/uploads/2010/01/Dynamic2Table3.jpg" alt="" width="449" height="217" /></a></p>
<p>พอถึงตอนนี้จะเห็นได้ว่า ถ้าเรามีการ์ดแค่สองใบ แต่ต้องการหยิบให้ได้<br />
ดาว        พลังโจมตีสูงสุด<br />
0             0<br />
1              0<br />
2             0<br />
3             1600<br />
.<br />
.<br />
8             3000<br />
9             3000<br />
10          3000</p>
<p>แล้วเส้นสีน้ำเงินล่ะ??<br />
สมมตินะครับ ถ้าเราต้องการหยิบ ให้ได้ 5 ดาว ที่ได้พลังโจมตีสูงที่สุด แต่การ์ดที่เราจะจับตอนนั้นมีแค่ 3 ดาว<br />
เราก็เอาพลังโจมตีของการ์ดที่เราจะหยิบ + พลังโจมตีที่ดีที่สุดของ 2 ดาว เราก็จะได้ การ์ดรวมห้าดาวที่มีพลังโจมตีสูงสุดแล้วจริงใหมครับ</p>
<p>ในกรณีนี้คือ ช่อง 8 ดาว เราเลือกหยิบบลูอายส์ซึ่งมี 8 ดาว เพราะฉะนั้น เราจะต้องหา 0 ดาวที่มีพลังโจมตีสูงที่สุดมาเติม<br />
(เป็นเหตุผลที่เราต้องตั้งค่าแถวแรกให้เป็นค่า 0 เนื่องจากหากเราเลือก 0 ดาวที่ดีที่สุด ค่าจะต้องเป็น 0)</p>
<p>เช่นเดียวกันกับช่อง 10 ดาว เราเลือกหยิบบลูอายส์ 8 ดาว เพราะฉะนั้น เราจะต้องหา 2 ดาวที่มีพลังโจมตีสูงที่สุดมาเติมแต่ 2 ดาวยังเป็น 0 อยู่เพราะเราเลือกหยิบบลูอายส์เป็นใบแรก<br />
(เป็นเหตุผลที่เราต้องตั้งค่า column แรกให้เป็นค่า 0 ซึ่งเป็นค่าน้อยที่สุดที่เป็นไปได้)</p>
<p>ใน column 2 ก็เช่นเดียวกัน เพียงแต่ที่ช่อง 8 ดาวให้เรานำไปเปรียบเทียบกับค่าพลังโจมตีที่ดีที่สุดอันเก่าแล้วพบว่า ต่อให้เราเอา พลังโจมตีของ ซอมบี้ดราก้อน กับ 5 ดาวที่พลังโจมตีสูงที่สุด (1600+0) ก็ยังน้อยกว่าพลังโจมตี 8 ดาวเก่าที่ได้ที่สุด ดังนั้นเราจึงเลือกพลังโจมตีเก่านั่นเอง</p>
<p>เรามาลองทำจนจบดูนะครับ จะได้ตารางดังนี้<br />
<a href="http://blog.pupasoft.com/wp-content/uploads/2010/01/Dynamic2Table4.jpg"><img class="alignnone size-full wp-image-3428" title="Dynamic2Table4" src="http://blog.pupasoft.com/wp-content/uploads/2010/01/Dynamic2Table4.jpg" alt="" width="449" height="217" /></a></p>
<p>จะเห็นได้ว่า เราสามารถบอกได้หมดเลย ว่า 1 ดาวที่ดีที่สุดพลังโจมตีเท่าไหร่ 2 ดาวที่มีพลังโจมตีสูงที่สุด &#8230;.<br />
จนถึงคำตอบของเรา 10 ดาวที่มีพลังโจมตีสูงที่สุด</p>
<p>บางคนอาจจะยังไม่เข้าใจ ให้ไล่ลองทำดูนะครับ ทีละขั้นตอน ผมจะสรุปขั้นตอนให้ดูง่ายๆ ละกัน<br />
1. สร้างตาราง จำนวนของ(N) x จำนวนสูงสุดของข้อจำกัด(ดาว)<br />
2. ที่ช่อง 0 ทั้งแนวนอนและแนวตั้ง ให้ตั้งค่าเป็นจำนวนที่น้อยที่สุดที่จะเป็นไปได้(ถ้าโจทย์ให้หาค่ามากที่สุดนะ)<br />
3. ที่ช่องใดๆ ถ้าแถวดาว มากกว่า ดาวของการ์ดที่เราหยิบ แปลว่าเราจะสามารถหยิบการ์ดนี้ได้<br />
4. นำพลังโจมตีของการ์ดที่เราหยิบ + ค่าที่(แถวบอกจำนวนดาว &#8211; ดาวของการ์ดที่เราหยิบ) ถ้าได้มากกว่า ค่าที่มากที่สุดของแถวเงื่อนไขนี้ ให้เปลี่ยนเป็นพลังโจมตีนั้นๆแทน<br />
5. ถ้าไม่ ให้เลือกพลังโจมตีที่ดีที่สุดอันเดิม</p>
<p>แหม พอใช้ภาษาพูดแล้วงงๆ ใช่ใหมล่ะ งั้นลองเป็น code ดูนะครับ<br />
<!--[if !mso]><br />
<mce:style><!  v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} p\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} v\:textbox {display:none;} --></p>
<p><!--[endif]--> <a href="http://blog.pupasoft.com/wp-content/uploads/2010/01/Dynamic2Table5.jpg"><img class="alignnone size-full wp-image-3429" title="Dynamic2Table5" src="http://blog.pupasoft.com/wp-content/uploads/2010/01/Dynamic2Table5.jpg" alt="" width="584" height="356" /></a></p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 157px; width: 1px; height: 1px;">
<table style="height: 149px;" dir="ltr" cellspacing="0" cellpadding="0" width="389">
<tbody>
<tr>
<td style="border: 3px solid black;" width="36" height="38">䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü</td>
<td style="border: 3px 1px 3px 3px solid black;" width="36" height="38">
<div style="text-align: center;"><span lang="FR">1</span></div>
</td>
<td style="border: 3px 1px solid black;" width="36" height="38">
<div style="text-align: center;"><span lang="FR">2</span></div>
</td>
<td style="border: 3px 1px solid black;" width="36" height="38">
<div style="text-align: center;"><span lang="FR">3</span></div>
</td>
<td style="border: 3px 1px solid black;" width="36" height="38">
<div style="text-align: center;"><span lang="FR">4</span></div>
</td>
<td style="border: 3px 1px solid black;" width="36" height="38">
<div style="text-align: center;"><span lang="FR">5</span></div>
</td>
<td style="border: 3px 1px solid black;" width="36" height="38">
<div style="text-align: center;"><span lang="FR">6</span></div>
</td>
<td style="border: 3px 1px solid black;" width="36" height="38">
<div style="text-align: center;"><span lang="FR">7</span></div>
</td>
<td style="border: 3px 1px solid black;" width="36" height="38">
<div style="text-align: center;"><span lang="FR">8</span></div>
</td>
<td style="border: 3px 1px solid black;" width="36" height="38">
<div style="text-align: center;"><span lang="FR">9</span></div>
</td>
<td style="border: 3px 3px 3px 1px solid black;" width="36" height="38">
<div style="text-align: center;"><span lang="FR">10</span></div>
</td>
</tr>
<tr>
<td style="border: 3px 3px 1px solid black;" width="36" height="38">
<div style="text-align: center;"><span lang="FR">1</span></div>
</td>
<td style="border: 3px 1px 1px 3px solid black;" width="36" height="38">䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü</td>
<td style="border: 3px 1px 1px solid black;" width="36" height="38">䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü</td>
<td style="border: 3px 1px 1px solid black;" width="36" height="38">䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü</td>
<td style="border: 3px 1px 1px solid black;" width="36" height="38">䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü</td>
<td style="border: 3px 1px 1px solid black;" width="36" height="38">䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü</td>
<td style="border: 3px 1px 1px solid black;" width="36" height="38">䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü</td>
<td style="border: 3px 1px 1px solid black;" width="36" height="38">䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü</td>
<td style="border: 3px 1px 1px solid black;" width="36" height="38">䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü</td>
<td style="border: 3px 1px 1px solid black;" width="36" height="38">䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü</td>
<td style="border: 3px 3px 1px 1px solid black;" width="36" height="38">䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü</td>
</tr>
<tr>
<td style="border: 1px 3px solid black;" width="36" height="38">
<div style="text-align: center;"><span lang="FR">2</span></div>
</td>
<td style="border: 1px 1px 1px 3px solid black;" width="36" height="38">䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü</td>
<td style="border: 1px solid black;" width="36" height="38">䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü</td>
<td style="border: 1px solid black;" width="36" height="38">䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü</td>
<td style="border: 1px solid black;" width="36" height="38">䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü</td>
<td style="border: 1px solid black;" width="36" height="38">䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü</td>
<td style="border: 1px solid black;" width="36" height="38">䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü</td>
<td style="border: 1px solid black;" width="36" height="38">䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü</td>
<td style="border: 1px solid black;" width="36" height="38">䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü</td>
<td style="border: 1px solid black;" width="36" height="38">䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü</td>
<td style="border: 1px 3px 1px 1px solid black;" width="36" height="38">䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü</td>
</tr>
<tr>
<td style="border: 1px 3px 3px solid black;" width="36" height="38">
<div style="text-align: center;"><span lang="FR">3</span></div>
</td>
<td style="border: 1px 1px 3px 3px solid black;" width="36" height="38">䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü</td>
<td style="border: 1px 1px 3px solid black;" width="36" height="38">䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü</td>
<td style="border: 1px 1px 3px solid black;" width="36" height="38">䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü</td>
<td style="border: 1px 1px 3px solid black;" width="36" height="38">䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü</td>
<td style="border: 1px 1px 3px solid black;" width="36" height="38">䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü</td>
<td style="border: 1px 1px 3px solid black;" width="36" height="38">䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü</td>
<td style="border: 1px 1px 3px solid black;" width="36" height="38">䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü</td>
<td style="border: 1px 1px 3px solid black;" width="36" height="38">䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü</td>
<td style="border: 1px 1px 3px solid black;" width="36" height="38">䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü</td>
<td style="border: 1px 3px 3px 1px solid black;" width="36" height="38">䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü</td>
</tr>
</tbody>
</table>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.pupasoft.com/2010/01/07/dynamic-programming_3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ว่าด้วยเรื่องจำนวนและตัวเลข 2</title>
		<link>http://blog.pupasoft.com/2010/01/07/%e0%b8%a7%e0%b9%88%e0%b8%b2%e0%b8%94%e0%b9%89%e0%b8%a7%e0%b8%a2%e0%b9%80%e0%b8%a3%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%87%e0%b8%88%e0%b8%b3%e0%b8%99%e0%b8%a7%e0%b8%99%e0%b9%81%e0%b8%a5%e0%b8%b0%e0%b8%95/</link>
		<comments>http://blog.pupasoft.com/2010/01/07/%e0%b8%a7%e0%b9%88%e0%b8%b2%e0%b8%94%e0%b9%89%e0%b8%a7%e0%b8%a2%e0%b9%80%e0%b8%a3%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%87%e0%b8%88%e0%b8%b3%e0%b8%99%e0%b8%a7%e0%b8%99%e0%b9%81%e0%b8%a5%e0%b8%b0%e0%b8%95/#comments</comments>
		<pubDate>Thu, 07 Jan 2010 12:26:49 +0000</pubDate>
		<dc:creator>mishell</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.pupasoft.com/?p=3420</guid>
		<description><![CDATA[ว่าด้วยเรื่องจำนวนและตัวเลข 2 นะครับ

เก็บข้อมูลตัวแปร float จาก GNU Compiler Collection (GCC) รันบน 32bit Ubuntu based on IEEE 754
0.05;                0-01111010-10011001 10011001 1001101
0.005;              0-01110111-01000111 10101110 0001010
-20.812;           1-10000011-01001100 11111101 1111010
20.1234567;     0-10000011-01000001 11111001 1010111
20.12345678;    0-10000011-01000001 11111001 1010111
1.0;                  0-01111111-00000000 00000000 0000000
2.0;                  0-10000000-00000000 00000000 0000000
10.0;                0-10000010-01000000 00000000 0000000
0.1;         [...]]]></description>
			<content:encoded><![CDATA[<p>ว่าด้วยเรื่องจำนวนและตัวเลข 2 นะครับ</p>
<p><span id="more-3420"></span></p>
<p>เก็บข้อมูลตัวแปร float จาก GNU Compiler Collection (GCC) รันบน 32bit Ubuntu based on IEEE 754</p>
<p>0.05;                0-01111010-10011001 10011001 1001101<br />
0.005;              0-01110111-01000111 10101110 0001010<br />
-20.812;           1-10000011-01001100 11111101 1111010<br />
20.1234567;     0-10000011-01000001 11111001 1010111<br />
20.12345678;    0-10000011-01000001 11111001 1010111<br />
1.0;                  0-01111111-00000000 00000000 0000000<br />
2.0;                  0-10000000-00000000 00000000 0000000<br />
10.0;                0-10000010-01000000 00000000 0000000<br />
0.1;                  0-01111011-10011001 10011001 1001101<br />
0.2;                  0-01111100-10011001 10011001 1001101<br />
0.01;                0-01111000-01000111 10101110 0001010<br />
0.02;                0-01111001-01000111 10101110 0001010<br />
1.01;                0-01111111-00000010 10001111 0101110<br />
1.02;                0-01111111-00000101 00011110 1011100<br />
10.1;                0-10000010-01000011 00110011 0011010<br />
10.2;                0-10000010-01000110 01100110 0110011</p>
<table border="0">
<tbody>
<tr>
<th>Type</th>
<th>Sign</th>
<th>Exponent</th>
<th>Exponent  bias</th>
<th>significand</th>
<th>total</th>
</tr>
<tr>
<td align="center"><a title="Half precision" href="http://en.wikipedia.org/wiki/Half_precision">Half</a> (IEEE 754r)</td>
<td align="center">1</td>
<td align="center">5</td>
<td align="center">15</td>
<td align="center">10</td>
<td align="center">16</td>
</tr>
<tr>
<td align="center">Single</td>
<td align="center">1</td>
<td align="center">8</td>
<td align="center">127</td>
<td align="center">23</td>
<td align="center">32</td>
</tr>
<tr>
<td align="center">Double</td>
<td align="center">1</td>
<td align="center">11</td>
<td align="center">1023</td>
<td align="center">52</td>
<td align="center">64</td>
</tr>
<tr>
<td align="center">Quad</td>
<td align="center">1</td>
<td align="center">15</td>
<td align="center">16383</td>
<td align="center">112</td>
<td align="center">128</td>
</tr>
</tbody>
</table>
<p>ตารางจาก http://en.wikipedia.org/wiki/Floating_point</p>
<p><strong>Floating-Point Representation</strong></p>
<p>ตัวแปร float มีขนาด 4 ไบต์ หรือ 32 บิตจะแบ่งพื้นที่เพื่อเก็บข้อมูลแบบ ทศนิยมดังนี้</p>
<p><img src="http://fourier.eng.hmc.edu/e85/lectures/arithmetic_html/img332.png" border="0" alt="\framebox[0.4in]{S}" width="51" height="46" align="middle" /> <img src="http://fourier.eng.hmc.edu/e85/lectures/arithmetic_html/img333.png" border="0" alt="\framebox[0.8in]{E}" width="97" height="46" align="middle" /> <img src="http://fourier.eng.hmc.edu/e85/lectures/arithmetic_html/img334.png" border="0" alt="\framebox[2in]{M}" width="235" height="46" align="middle" /></p>
<p>S : Sing(1 บิต) เอาไว้เพื่่อบอกว่า ทศนิยมนั้นเป็นเลข ลบ หรือ บวก โดย บิต 0 คือ + , บิต 1 คือ -</p>
<p>E : Exponent(8 บิต) เป็นส่วนที่แสดง เลขยกกำลังเป็นได้ทั้งบวก และ ลบ</p>
<p>M : Mantissa(23 บิต) เป็นส่วนที่อยู่หลังจุดทศนิยม</p>
<p><strong>วิธีการเปลี่ยน ทศนิยม(float) ให้เป็นเลขฐานสอง</strong></p>
<p><strong>1. นำเลขที่ต้องการจะเปลี่ยนมาแปลงเป็นเลขฐานสอง</strong></p>
<p>เช่น 0.005<sub>10</sub> = 0.000000010100011110101110000101000111101011100001010001111011<sub>2</sub></p>
<p>(วิธีการแปลงนั้น ขอยกเป็นบทความถัดไปนะครับ)</p>
<p><strong>2. ทำ Normalization form (คือการทำให้อยู่ในรูป 1.AAA x 2<sup>B</sup>)</strong></p>
<p>จาก  0.005<sub>10</sub> = 0.000000010100011110101110000101000111101011100001010001111011<sub>2</sub></p>
<p>ทำเป็น  Normalization form ได้</p>
<p>1.0100011110101110000101000111101011100001010001111011 x 2<sup>-8</sup></p>
<p><strong>3. เลข Mantissa คือ เลขฐานสองที่อยู่หลังจุดทศนิยม</strong></p>
<p>จาก  1.0100011110101110000101000111101011100001010001111011 x 2<sup>-8</sup></p>
<p>Mantissa คือ  0100011110101110000101000111101011100001010001111011</p>
<p>แบ่งเป็น 8 bits ให้สวยงาม ก็จะได้</p>
<p><strong>01000111 10101110 00010100</strong> 0111101011100001010001111011</p>
<p>Mantissa มีขนาด 23 บิต เพราะฉะนั้น เราสนใจเพียง 24 บิตแรกเท่านั้น</p>
<p>ที่สนใจ 24 บิต ไม่ใช่ 23 บิต ก็เพราะว่า บิตตัวที่ 24 ถ้าเป็นบิต 1 ก็จะปัดขึ้นมา แต่ถ้าเป็นบิต 0 ก็ไม่ปัดนั่นเอง</p>
<p>(วิธีปัดนั้น ก็เหมือนกับการ บวกด้วย 1 แบบเลขฐานสองครับ)</p>
<p>เพราะฉะนั้น</p>
<p><strong>Mantissa =</strong> <strong>01000111 10101110 0001010</strong></p>
<p><strong>4. เลข Exponent คือเลขกำลัง</strong></p>
<p>จาก 1.0100011110101110000101000111101011100001010001111011 x 2<sup>-8</sup></p>
<p>Exponent หาได้จาก bias – true exponent</p>
<p>bias ของ float = 127</p>
<p>true exponent คือ -8 (เลขกำลัง ของ 2 นั่นเอง)</p>
<p>เพราะฉะนั้น จะได้</p>
<p>Exponent = 127<sub>10</sub> + (-8)<sub>10</sub> = 119<sub>10 </sub>ซึ่งเท่ากับ 1110111<sub>2</sub> และเนื่องจาก Exponent มีขนาด 8 บิต</p>
<p>แต่ Exponent ที่เราคำนวนได้นั้น มีเพียง 7 บิต แก้โดยการเติม บิต 0 ไปข้างหน้า จนครบ 8 บิต ดังนั้น</p>
<p>จะได้</p>
<p><strong>Exponent =</strong> <strong>01110111</strong></p>
<p><strong>5. รวม sign, exponent, mantissa เข้าด้วยกัน</strong></p>
<p>sign เป็น <strong>0</strong> เพราะ 0.005 เป็น บวก</p>
<p>exponent เป็น  <strong>01110111</strong></p>
<p>mantissa เป็น  <strong>01000111 10101110 0001010</strong></p>
<p>รวมกันจะได้  <strong>0 </strong><strong>01110111</strong><strong> </strong><strong>01000111 10101110 0001010</strong></p>
<p>อ้างอิงความรู้จาก<cite></cite></p>
<p><cite>www.cs.northwestern.edu/~fabianb/classes/eecs-213-s07/lectures/<strong>04</strong>-<strong>FloatingPoint</strong>.<strong>pps</strong></cite></p>
<p>http://www.cs.northwestern.edu/~fabianb/classes/</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pupasoft.com/2010/01/07/%e0%b8%a7%e0%b9%88%e0%b8%b2%e0%b8%94%e0%b9%89%e0%b8%a7%e0%b8%a2%e0%b9%80%e0%b8%a3%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%87%e0%b8%88%e0%b8%b3%e0%b8%99%e0%b8%a7%e0%b8%99%e0%b9%81%e0%b8%a5%e0%b8%b0%e0%b8%95/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ว่าด้วยเรื่องจำนวนและัตัวเลข 1</title>
		<link>http://blog.pupasoft.com/2010/01/07/3418/</link>
		<comments>http://blog.pupasoft.com/2010/01/07/3418/#comments</comments>
		<pubDate>Thu, 07 Jan 2010 12:25:26 +0000</pubDate>
		<dc:creator>mishell</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.pupasoft.com/2010/01/07/3418/</guid>
		<description><![CDATA[ว่าด้วยเรื่องจำนวนและัตัวเลข 1

ตัวเลขในคอมพิวเตอร์ ล้วนประกอบขึ้นด้วยเลขฐานสอง
เช่น  เลข 010 = 00000000 000000002
110 = 00000000 000000012
210 = 00000000 000000102
310 = 00000000 000000112
ไปจนถึง
6553510 = 11111111 111111112
การผสมกันของบิต 0 กับ 1 รูปแบบข้างบนนี้   เป็นการเก็บตัวเลข ของชนิดข้อมูล unsigned int ใน Turbo C++
ชนิดข้อมูล unsigned int นี้ คือ ชนิดข้อมูลที่เป็นตัวเลข ศูนย์และจำนวนเต็มบวก คือตั้งแต่ 0 จนถึง 65535
แต่ถ้าเป็นชนิดข้อมูลแบบ int จะเป็นชนิดข้อมูลที่เป็นตัวเลข ศูนย์ จำนวนเต็มบวก และจำนวนเต็มลบ คือ ตั้งแต่ -32768 จนถึง 32767
ทั้งข้อมูลชนิด unsigned int และ แบบ int จะสามารถเก็บตัวเลขได้ 65536 กรณีเท่ากัน
นั่นก็เพราะว่า [...]]]></description>
			<content:encoded><![CDATA[<p>ว่าด้วยเรื่องจำนวนและัตัวเลข 1</p>
<p><span id="more-3418"></span></p>
<p>ตัวเลขในคอมพิวเตอร์ ล้วนประกอบขึ้นด้วยเลขฐานสอง</p>
<p>เช่น  เลข 0<sub>10</sub> = 00000000 00000000<sub>2</sub></p>
<p>1<sub>10</sub> = 00000000 00000001<sub>2</sub></p>
<p>2<sub>10</sub> = 00000000 00000010<sub>2</sub></p>
<p>3<sub>10</sub> = 00000000 00000011<sub>2</sub></p>
<p>ไปจนถึง</p>
<p>65535<sub>10</sub> = 11111111 11111111<sub>2</sub></p>
<p>การผสมกันของบิต 0 กับ 1 รูปแบบข้างบนนี้   เป็นการเก็บตัวเลข ของชนิดข้อมูล unsigned int ใน Turbo C++</p>
<p>ชนิดข้อมูล <strong>unsigned int</strong> นี้ คือ ชนิดข้อมูลที่เป็นตัวเลข <strong>ศูนย์และจำนวนเต็มบวก</strong> คือตั้งแต่ 0 จนถึง 65535</p>
<p>แต่ถ้าเป็นชนิดข้อมูลแบบ <strong>int </strong>จะเป็นชนิดข้อมูลที่เป็นตัวเลข <strong>ศูนย์ จำนวนเต็มบวก และจำนวนเต็มลบ</strong> คือ ตั้งแต่ -32768 จนถึง 32767</p>
<p>ทั้งข้อมูลชนิด unsigned int และ แบบ int จะสามารถเก็บตัวเลขได้ 65536 กรณีเท่ากัน</p>
<p>นั่นก็เพราะว่า ชนิดข้อมูล unsigned int และ int ล้วนประกอบด้วย รูปแบบ 16 bits ซึ่งมีขนาด 2 bytes</p>
<p>และจำนวนที่สามารถเก็บข้อมูลไ้ด้ คือ 2<sup>16</sup> = 65536 ตัวเลข(ที่ไม่ซ้ำกัน)</p>
<p>ส่วนกรณีชนิดข้อมูลแบบ int ที่สามารถมีค่าเป็นจำนวน – ได้นั้น คอมพิวเตอร์จะมีวิธีเก็บข้อมูล ต่างจากแบบ unsigned int เล็กน้อย เพราะ บิต 0 และ 1 ไม่สามารถใส่เครื่องหมาย – ลงไปได้ ดังนั้นจึงมีวิธีเก็บข้อมูลแตกต่างออกไป</p>
<p>วิธีการก็มีดังนี้</p>
<p>1. แปลงเลขฐาน 10 ที่ต้องการเก็บ ไปเป็นเลขฐาน 2</p>
<p>2. กลับบิต จาก 0 เป็น 1     และ จาก 1 เป็น 0</p>
<p>3. นำไปบวกด้วย 1 แบบ ไบนารี</p>
<p>เช่น ต้องการเก็บค่า -32 ลงใน ตัวแปรชนิด int</p>
<p>เนื่องจาก 32<sub>10</sub> = 00000000 00100000<sub>2</sub></p>
<p>กลับบิต           -&gt;11111111 11011111<sub>2</sub></p>
<p>บวกด้วย 1       -&gt;11111111 11100000<sub>2</sub></p>
<p>มีค่าเท่ากับ 65504 ในรูปแบบตัวแปร unsigned int</p>
<p>แต่จะมีค่าเท่ากับ -32 ในรูปแบบตัวแปร int</p>
<p>หลักการคือ</p>
<p><strong>1</strong> 1111111     11100000<sub>2 </sub>= -32 (รูปแบบ int)</p>
<p>^ บิตตัวแรกสุด จะทำหน้าที่แยกตัวเลขนั้นๆ ว่า เป็นเครื่องหมาย + หรือ –    โดย ถ้าเป็น 0 คือ + , 1 คือ -</p>
<p>หลักการนี้ เรียกว่า two’s complement</p>
<p>แหล่งข้อมูล http://sot.swu.ac.th/CP341/lesson01/cs2t1.htm</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pupasoft.com/2010/01/07/3418/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to send sms from ror project?</title>
		<link>http://blog.pupasoft.com/2010/01/07/how-to-send-sms-from-ror-project/</link>
		<comments>http://blog.pupasoft.com/2010/01/07/how-to-send-sms-from-ror-project/#comments</comments>
		<pubDate>Thu, 07 Jan 2010 11:48:07 +0000</pubDate>
		<dc:creator>on_the_way</dc:creator>
				<category><![CDATA[Ruby On Rails]]></category>

		<guid isPermaLink="false">http://blog.pupasoft.com/?p=3384</guid>
		<description><![CDATA[วันนี้นำวิธีการส่ง sms แบบชาวโปรแกรมเมอร์มาฝากกันคร๊ะ ก้อคือว่าแทนที่เราจะส่ง sms จากมือถือก้อเปลี่ยนเป้นเขียนโค้ดขึ้นมาเองแล้วส่งหา&#8230;.กันดีกว่ามั๊ยจ๊ะ
ดูเท่ส์ดีว่าป่ะ&#8230;อิอิ
เริ่มจาก&#8230;(เราใช้ ide netbeans น่ะ..มันง่ายดีน่ะ)
1. สมัคร account http://www.clickatell.com/developers/clickatell_api2.php และเพิ่ม http service ใน account ด้วยจากนั้นก้อจะได้ API key เก็บไว้ดีๆล่ะอันนี้สำคัญน่ะค่ะ
2. install gem=> clickatell
3. สร้างโมลเดล sms.rb เพิ่มโค้ดลงดังนี้
require &#8216;clickatell&#8217;
class SMS
  def initialize(config)
    @config = config
  end
  def create(recipient, message_text)
    api.send_message(recipient, message_text)
  end
  private
   [...]]]></description>
			<content:encoded><![CDATA[<p>วันนี้นำวิธีการส่ง sms แบบชาวโปรแกรมเมอร์มาฝากกันคร๊ะ ก้อคือว่าแทนที่เราจะส่ง sms จากมือถือก้อเปลี่ยนเป้นเขียนโค้ดขึ้นมาเองแล้วส่งหา&#8230;.กันดีกว่ามั๊ยจ๊ะ<br />
ดูเท่ส์ดีว่าป่ะ&#8230;อิอิ<span id="more-3384"></span><br />
เริ่มจาก&#8230;(เราใช้ ide netbeans น่ะ..มันง่ายดีน่ะ)<br />
1. สมัคร account http://www.clickatell.com/developers/clickatell_api2.php และเพิ่ม http service ใน account ด้วยจากนั้นก้อจะได้ API key เก็บไว้ดีๆล่ะอันนี้สำคัญน่ะค่ะ<br />
2. install gem=> clickatell<br />
3. สร้างโมลเดล sms.rb เพิ่มโค้ดลงดังนี้<br />
require &#8216;clickatell&#8217;</p>
<p>class SMS<br />
  def initialize(config)<br />
    @config = config<br />
  end</p>
<p>  def create(recipient, message_text)<br />
    api.send_message(recipient, message_text)<br />
  end</p>
<p>  private<br />
    def api<br />
      @api ||= Clickatell::API.authenticate(<br />
        @config[:api_key],<br />
        @config[:username],<br />
        @config[:password]<br />
      )<br />
    end<br />
end<br />
4. configuration=>environments=>product.rb เพิ่มโค้ดดังนี้<br />
CLICKATELL_CONFIG = YAML.load(File.open(File.join(RAILS_ROOT, &#8216;config&#8217;, &#8216;clickatell.yml&#8217;)))<br />
5. configuration=> clickatell.yml เพิ่มโค้ดดังนี้<br />
api_key: xxxxx<br />
username: mai<br />
password: xxxx<br />
6. configuration=> routes.rb เพิ่มโค้ดดังนี้<br />
ActionController::Routing::Routes.draw do |map|<br />
  map.resource :sms<br />
end<br />
7. หน้า view สร้างหน้าเวบที่ต้องการให้ผู้ใช้กรอกข้อมูลเพื่อส่ง sms ถึงผู้รับ<br />
<% form_tag '/sms', :method => :post do -%><br />
  <label>Enter the recipients mobile number:</label><br />
  <%= text_field_tag "recipient" %><br />
  <label>Enter your message:</label><br />
  <%= text_area_tag "message_text" %><br />
  <%= submit_tag "Send SMS" %><br />
<% end %><br />
8. ส่วนของ controller<br />
class SmsController < ApplicationController<br />
  def create<br />
    sms = SMS.new(CLICKATELL_CONFIG)<br />
    sms.create(params[:recipient], params[:message_text])<br />
    flash[:notice] = "Message sent succesfully!"<br />
    redirect_to :back<br />
  rescue Clickatell::API::Error => e<br />
    flash[:error] = &#8220;Clickatell API error: #{e.message}&#8221;<br />
    redirect_to :back<br />
  end<br />
end<br />
9. เสร็จแล้วจ้าา&#8230;<br />
แหล่งที่มา:</p>
<p>http://lukeredpath.co.uk/blog/sending-sms-messages-from-your-rails-application.html</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pupasoft.com/2010/01/07/how-to-send-sms-from-ror-project/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ทำไมสร้าง folder ชื่อ con ไม่ได้อะ??</title>
		<link>http://blog.pupasoft.com/2010/01/07/%e0%b8%97%e0%b8%b3%e0%b9%84%e0%b8%a1%e0%b8%aa%e0%b8%a3%e0%b9%89%e0%b8%b2%e0%b8%87-folder-%e0%b8%8a%e0%b8%b7%e0%b9%88%e0%b8%ad-con-%e0%b9%84%e0%b8%a1%e0%b9%88%e0%b9%84%e0%b8%94%e0%b9%89%e0%b8%ad/</link>
		<comments>http://blog.pupasoft.com/2010/01/07/%e0%b8%97%e0%b8%b3%e0%b9%84%e0%b8%a1%e0%b8%aa%e0%b8%a3%e0%b9%89%e0%b8%b2%e0%b8%87-folder-%e0%b8%8a%e0%b8%b7%e0%b9%88%e0%b8%ad-con-%e0%b9%84%e0%b8%a1%e0%b9%88%e0%b9%84%e0%b8%94%e0%b9%89%e0%b8%ad/#comments</comments>
		<pubDate>Thu, 07 Jan 2010 10:03:28 +0000</pubDate>
		<dc:creator>zephiroth</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[con folder]]></category>

		<guid isPermaLink="false">http://blog.pupasoft.com/?p=3329</guid>
		<description><![CDATA[สงสัยกันรึป่าวครับว่าทำไมเราถึงสร้าง folder ชื่อ con ไม่ได้ เอ๊ะ หรือยังไม่เคยลองสร้าง?? ลองไปสร้างดูสิครับแล้วผมจะรอ . . . . .
อืม . .. .
ลองดูรึยังครับ ไม่ได้ใช่มะ?? งั้นมาดูเหตุผลกัน

นั้นเพราะว่าคำว่า con มันไปตรงกับคำสั่งหนึ่งใน DOS
con=คอนโซล ใช้ประกอบคำสั่ง copy เพื่อเขียน file บนหน้าจอ โดยไม่ต้องใช้ notepad ได้
รูปแบบการใช้
C:\&#62;copy con test.txt
จากนั้นก็พิมข้อความอะไรก็ได้ลงไป
เมื่อเสร็จกด ctrl+z แล้วตามด้วย enter เราก็จะได้ไฟล์ชื่อ test.txt อยู่ที่ C: และจะมีข้อความที่เราเขียนลงไปอยู่ข้างใน
อะ นอกเรื่องไปแล้วเนอะ ที่จริงนอกจากคำว่า con ยังมีอีกหลายตัวที่เราจะใช้ตั้งชื่อไม่ได้นะครับดังนี้
อักษรที่ห้ามใช้ในการตั้งชื่อคือ  &#60; &#62; : &#8221; / \ &#124; ? *
คำที่ห้ามใช้ มีดังนี CON, PRN, [...]]]></description>
			<content:encoded><![CDATA[<p>สงสัยกันรึป่าวครับว่าทำไมเราถึงสร้าง folder ชื่อ con ไม่ได้ เอ๊ะ หรือยังไม่เคยลองสร้าง?? ลองไปสร้างดูสิครับแล้วผมจะรอ . . . . .</p>
<p>อืม . .. .</p>
<p>ลองดูรึยังครับ ไม่ได้ใช่มะ?? งั้นมาดูเหตุผลกัน</p>
<p><span id="more-3329"></span></p>
<p>นั้นเพราะว่าคำว่า con มันไปตรงกับคำสั่งหนึ่งใน DOS</p>
<blockquote><p>con=คอนโซล ใช้ประกอบคำสั่ง copy เพื่อเขียน file บนหน้าจอ โดยไม่ต้องใช้ notepad ได้</p></blockquote>
<p>รูปแบบการใช้</p>
<blockquote><p>C:\&gt;copy con test.txt</p></blockquote>
<p>จากนั้นก็พิมข้อความอะไรก็ได้ลงไป</p>
<p>เมื่อเสร็จกด ctrl+z แล้วตามด้วย enter เราก็จะได้ไฟล์ชื่อ test.txt อยู่ที่ C: และจะมีข้อความที่เราเขียนลงไปอยู่ข้างใน</p>
<p>อะ นอกเรื่องไปแล้วเนอะ ที่จริงนอกจากคำว่า con ยังมีอีกหลายตัวที่เราจะใช้ตั้งชื่อไม่ได้นะครับดังนี้</p>
<blockquote><p>อักษรที่ห้ามใช้ในการตั้งชื่อคือ  &lt; &gt; : &#8221; / \ | ? *</p>
<p>คำที่ห้ามใช้ มีดังนี CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, และ LPT9</p></blockquote>
<p>ซึ่งชื่อเหล่านี้อาจจะไปตรงกับ device name หรือ คำสั่ง อะไรซักอย่างของ DOS ก็เป็นได้</p>
<p>แต่เราก็ยังดันมีวิธีสร้าง folder เหล่านี้ได้อีกนะเนี่ย -*- (จะทำไปทำไมนะ??)</p>
<p>สมมติจะสร้าง folder ชื่อ con นะครับ</p>
<p>ขั้นแรกให้ run cmd ขึ้นมาก่อนและพิมพ์คำสั่งดังนี้</p>
<blockquote><p>mkdir \\.\C:\con</p></blockquote>
<p>เราก็จะได้ folder ชื่อ con มาไว้ในครอบครอง แต่!!</p>
<p>แต่มันดันลบไม่ได้นี่สิ จะลบก็ต้องใช้ command อีกครับผม คำสั่งในการลบก็คือ</p>
<blockquote><p>rmdir \\.\C:\con</p></blockquote>
<p>เรียบร้อย โฟลเดอร์ con ก็หายไปแล้ว ^^</p>
<p>happy มีความสุขครับ</p>
<p style="text-align: center;"><a href="http://blog.pupasoft.com/wp-content/uploads/2010/01/makecon.jpg"><img class="size-medium wp-image-3334 aligncenter" title="makecon" src="http://blog.pupasoft.com/wp-content/uploads/2010/01/makecon-300x94.jpg" alt="" width="300" height="94" /></a></p>
<p style="text-align: center;">
<p style="text-align: left;"><strong>สรุปแล้ว con ไม่ใช่ชื่อพ่อของ bill gates นะครับ ^^</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pupasoft.com/2010/01/07/%e0%b8%97%e0%b8%b3%e0%b9%84%e0%b8%a1%e0%b8%aa%e0%b8%a3%e0%b9%89%e0%b8%b2%e0%b8%87-folder-%e0%b8%8a%e0%b8%b7%e0%b9%88%e0%b8%ad-con-%e0%b9%84%e0%b8%a1%e0%b9%88%e0%b9%84%e0%b8%94%e0%b9%89%e0%b8%ad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dynamic Programming #2 ตอน Knapsack Problem</title>
		<link>http://blog.pupasoft.com/2010/01/07/dynamic-programming-2-knapsack-problem/</link>
		<comments>http://blog.pupasoft.com/2010/01/07/dynamic-programming-2-knapsack-problem/#comments</comments>
		<pubDate>Thu, 07 Jan 2010 10:03:27 +0000</pubDate>
		<dc:creator>p</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Programming Tips]]></category>

		<guid isPermaLink="false">http://blog.pupasoft.com/?p=3317</guid>
		<description><![CDATA[สวัสดีครับ กลับมาพบกันอีกแล้วกับ tips ในการเขียนโปรแกรมยากๆ แต่มีประโยชน์มากมาย กับ Dynamic Programming
จากคราวที่แล้ว ได้เขียนเกี่ยวกับ Dynamic Programming แบบง่ายๆ ที่นี่
วันนี้เราจะมาลองกันแบบ Advance ขึ้นไปอีกขั้น นั่นก็คือ การเขียน Dynamic Programming เพื่อแก้ปัญหาประเภท Knapsack Problem
Knapsack Problem คืออะไร?
สมมติ มีการ์ดยูกิอยู่หลายใบ แต่ละใบจะมี level (ดาว) และพลังโจมตีต่างๆกัน หากให้เลือกการ์ดออกมาให้ครบ 10 ดาว และให้มีพลังโจมตีสูงที่สุด จะเลือกอย่างไร?
ตัวอย่างง่ายๆ
สมมติมีการ์ดอยู่ห้าใบ ดังนี้
Blue Eyes White Dragon 8 ดาว พลังโจมตี 3000
Dragon Zombie 3 ดาว พลังโจมตี 1600
Demon 6 ดาว พลังโจมตี 2500
Kuriboh 1 ดาว พลังโจมตี 600
Bloodwars [...]]]></description>
			<content:encoded><![CDATA[<p>สวัสดีครับ กลับมาพบกันอีกแล้วกับ tips ในการเขียนโปรแกรมยากๆ แต่มีประโยชน์มากมาย กับ Dynamic Programming</p>
<p>จากคราวที่แล้ว ได้เขียนเกี่ยวกับ Dynamic Programming แบบง่ายๆ <a href="http://blog.pupasoft.com/2009/08/20/dynamic-programming/">ที่นี่</a></p>
<p>วันนี้เราจะมาลองกันแบบ Advance ขึ้นไปอีกขั้น นั่นก็คือ การเขียน Dynamic Programming เพื่อแก้ปัญหาประเภท Knapsack Problem<br />
<span id="more-3317"></span>Knapsack Problem คืออะไร?<br />
สมมติ มีการ์ดยูกิอยู่หลายใบ แต่ละใบจะมี level (ดาว) และพลังโจมตีต่างๆกัน หากให้เลือกการ์ดออกมาให้ครบ 10 ดาว และให้มีพลังโจมตีสูงที่สุด จะเลือกอย่างไร?</p>
<p>ตัวอย่างง่ายๆ<br />
สมมติมีการ์ดอยู่ห้าใบ ดังนี้<br />
Blue Eyes White Dragon 8 ดาว พลังโจมตี 3000<br />
Dragon Zombie 3 ดาว พลังโจมตี 1600<br />
Demon 6 ดาว พลังโจมตี 2500<br />
Kuriboh 1 ดาว พลังโจมตี 600<br />
Bloodwars 4 ดาว พลังโจมตี 1900<br />
ให้เลือกอย่างมากได้สิบดาว ให้ได้พลังโจมตีสูงที่สุด จะทำอย่างไร</p>
<p>ยังจำตอนที่แล้วได้มั้ยครับ ที่ว่า ให้มองปัญหาใหญ่ให้กลายเป็นปัญหาย่อยๆ เล็กๆ แล้วก็ย่อยปัญหาเล็กลงไปอีกทีจนเลือกหน่วยที่เล็กที่สุด<br />
จากโจทย์้ข้อนี้ก็เช่นเดียวกันครับ<br />
- หากเราต้องการจะหยิบการ์ดใบสุดท้ายที่มี 4 ดาวแล้ว แสดงว่า การ์ดที่เราหยิบ 6 ดาวก่อนหน้าจะต้องได้พลังโจมตีมากที่สุด<br />
-      หากเราต้องการหยิบการ์ดรองสุดท้ายที่มี 1 ดาวแล้ว แสดงว่า การ์ดที่เราหยิบ 5 ดาวก่อนหน้าจะต้องได้พลังโจมตีมากที่สุด<br />
-      แต่หากเราต้องการหยิบการ์ดรองสุดท้ายที่มี 6 ดาวแล้ว แสดงว่า การ์ดที่เราหยิบ 0 ดาวก่อนหน้าจะต้องได้พลังโจมตีมากที่สุด &#8211; จบ<br />
-      แต่หากเราต้องการหยิบการ์ดรองสุดท้ายที่มี 3 ดาวแล้ว แสดงว่า การ์ดที่เราหยิบ 3 ดาวก่อนหน้าจะต้องได้พลังโจมตีมากที่สุด<br />
&#8230;.</p>
<p>เป็นเช่นนี้ไปเรื่อยๆ..<br />
เป็นไงครับ ดูยากใช่ใหมครับ งั้นลองดูรูปนี้ดู<br />
<a href="http://blog.pupasoft.com/wp-content/uploads/2010/01/DynamicGraph.jpg"><img class="alignnone size-full wp-image-3332" title="DynamicGraph" src="http://blog.pupasoft.com/wp-content/uploads/2010/01/DynamicGraph.jpg" alt="" width="454" height="340" /></a></p>
<p>อาจจะดูง่ายขึ้นนิดหน่อย แต่ก็ยังงงใช่ใหมครับ ว่า มันต่างจากการ Recursion ตรงไหน<br />
นั่นก็เพราะว่า Dynamic Programming จะให้ memory แทนการ run ที่สูญเปล่าไงครับ</p>
<p>อย่างเช่น หากมีการ์ด 4 ดาวในชุดอยู่สองใบ แล้วเราจะเลือกการ์ด 4 ดาวแต่ละใบ เราจำเป็นต้องแต่ recursive ไปทั้งสองทาง<br />
ทั้งที่เป็นการหาการ์ดที่มีดาวรวม 6 ดาว และมีพลังโจมตีเยอะที่สุดเหมือนกันแท้ๆ<br />
<a href="http://blog.pupasoft.com/wp-content/uploads/2010/01/DynamicGraph2.jpg"><img class="alignnone size-full wp-image-3337" title="DynamicGraph2" src="http://blog.pupasoft.com/wp-content/uploads/2010/01/DynamicGraph2.jpg" alt="" width="454" height="340" /></a></p>
<p>พูดถึงตรงนี้ พอมองภาพออกแล้วใช่ใหมครับ นี่ก็เป็นหลักการง่ายๆ (?) ของ Dynamic Programming นั่นเอง<br />
ครั้งหน้าจะพูดถึงเรื่องของ การใช้ Dynamic Programming ในการเขียนโปรแกรมจริงๆ นะครับ</p>
<p>วันนี้ขอลาไปก่อน สวัสดีปีใหม่</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pupasoft.com/2010/01/07/dynamic-programming-2-knapsack-problem/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
