<?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>Sikachu!&#039;s Blog &#187; My Project</title>
	<atom:link href="http://sikachu.com/category/my-project/feed/" rel="self" type="application/rss+xml" />
	<link>http://sikachu.com</link>
	<description>I&#039;m a Ruby on Rails / jQuery web developer. Follow me at @sikachu</description>
	<lastBuildDate>Sun, 22 Aug 2010 04:07:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>I&#8217;m on the list of Rails Contributors!</title>
		<link>http://sikachu.com/2010/06/rails-contributors/</link>
		<comments>http://sikachu.com/2010/06/rails-contributors/#comments</comments>
		<pubDate>Sun, 06 Jun 2010 05:14:24 +0000</pubDate>
		<dc:creator>Sikachu!</dc:creator>
				<category><![CDATA[My Life]]></category>
		<category><![CDATA[My Project]]></category>
		<category><![CDATA[contribute]]></category>
		<category><![CDATA[patch]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Rails 3]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://sikachu.com/?p=505</guid>
		<description><![CDATA[I just realize that Ruby on Rails has a page that listed all contributors on Rails project. So, I looked up my name and feel so great that my name is in there. All I can say is, I&#8217;m so happy that I have contributed to the framework that I loved. Also, this is the [...]]]></description>
			<content:encoded><![CDATA[<p>I just realize that Ruby on Rails has a page that listed all contributors on Rails project. So, I looked up my name and feel so great that my name is in there.</p>
<p><img src="http://sikachu.com/wp-content/uploads/2010/06/Screen-shot-2553-06-05-at-22.14.29.png" alt="Screen shot 2553-06-05 at 22.14.29.png" border="0" width="500" height="85" /></p>
<p>All I can say is, I&#8217;m so happy that I have contributed to the framework that I loved. Also, this is the reason that I love open-source; When you find something is wrong, then you can go and fix it.</p>
<p>So do you love Ruby on Rails? Then you can help to make it better. Get started at <a href="http://guides.rails.info/contributing_to_rails.html" target="_blank">here</a> and let me know when you get your first ticket in!</p>
<p>My goal? I want to get at least 100 commits into Ruby on Rails core before the end of the year. I&#8217;ll let you know when I archive that <img src='http://sikachu.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>By the way, you can view all the commits I have made here: <a href="http://contributors.rubyonrails.org/contributors/prem-sichanugrist/commits" target="_blank">http://contributors.rubyonrails.org/contributors/prem-sichanugrist/commits</a></p>
]]></content:encoded>
			<wfw:commentRss>http://sikachu.com/2010/06/rails-contributors/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ADSL2+ กับ Negative Upstream</title>
		<link>http://sikachu.com/2009/10/adsl2-%e0%b8%81%e0%b8%b1%e0%b8%9a-negative-upstream/</link>
		<comments>http://sikachu.com/2009/10/adsl2-%e0%b8%81%e0%b8%b1%e0%b8%9a-negative-upstream/#comments</comments>
		<pubDate>Thu, 01 Oct 2009 06:47:00 +0000</pubDate>
		<dc:creator>Sikachu!</dc:creator>
				<category><![CDATA[My Life]]></category>
		<category><![CDATA[My Project]]></category>
		<category><![CDATA[adsl]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[true]]></category>
		<category><![CDATA[true internet]]></category>

		<guid isPermaLink="false">http://sikachu.com/?p=363</guid>
		<description><![CDATA[เมื่อนานมาแล้ว Internet ของที่บริษัท Infogination นั้น สมัคร Package ไว้ที่ความเร็ว 2048/512 เท่านั้น เพราะว่าคนน้อย และมีคนใช้อินเตอร์เน็ตน้อย ไม่ต้องการความเร็วมาก แต่ปรากฎว่าหลังจากที่ @hunt และ @sikachu ย้ายเข้ามา &#8230; ความต้องการใช้อินเตอร์เน็ตมากขึ้น และตอนนั้น True เพิ่งออก Package ใหม่คือ 8192/512 &#8230; ก็เลยตัดสินใจเปลี่ยนมันซะ !! คราวนี้ หลังจากเปลี่ยนเรียบร้อย ก็ปรากฎว่า อินเตอร์เน็ตติดๆ ดับๆ -*- ด้วยความที่ hardware ตัวเก่า (modem ของ Billion) มันมีอายุนานมากแล้ว ก็เลยคิดว่ามันเป็นต้นเหตุของอินเตอร์เน็ตหลุด เลยจัดการซื้อ modem ใหม่มาเปลี่ยน มันก็ไม่หาย &#8230; เลยลองตรวจสอบสาเหตุของมัน ปรากฎว่า &#8230; SNR Margin ของ Upstream [...]]]></description>
			<content:encoded><![CDATA[<p>เมื่อนานมาแล้ว Internet ของที่บริษัท <a href="http://www.infogination.com">Infogination</a> นั้น สมัคร Package ไว้ที่ความเร็ว 2048/512 เท่านั้น เพราะว่าคนน้อย และมีคนใช้อินเตอร์เน็ตน้อย ไม่ต้องการความเร็วมาก</p>
<p>แต่ปรากฎว่าหลังจากที่ <a href="http://hunt.desi2n.com">@hunt</a> และ <a href="http://twitter.com/sikachu">@sikachu</a> ย้ายเข้ามา &#8230; ความต้องการใช้อินเตอร์เน็ตมากขึ้น และตอนนั้น True เพิ่งออก Package ใหม่คือ 8192/512 &#8230; ก็เลยตัดสินใจเปลี่ยนมันซะ !!</p>
<p>คราวนี้ หลังจากเปลี่ยนเรียบร้อย ก็ปรากฎว่า อินเตอร์เน็ตติดๆ ดับๆ -*-</p>
<p>ด้วยความที่ hardware ตัวเก่า (modem ของ Billion) มันมีอายุนานมากแล้ว ก็เลยคิดว่ามันเป็นต้นเหตุของอินเตอร์เน็ตหลุด เลยจัดการซื้อ modem ใหม่มาเปลี่ยน มันก็ไม่หาย &#8230; เลยลองตรวจสอบสาเหตุของมัน ปรากฎว่า &#8230;</p>
<p>SNR Margin ของ Upstream ติดลบครับ !!</p>
<p><img src="http://sikachu.com/wp-content/uploads/2009/10/Screen-shot-2552-09-04-at-11.33.43.png" alt="Screen shot 2552-09-04 at 11.33.43.png" border="0" width="305" height="183" /></p>
<p>ลองสอบถามช่างทรู เรียกมาตรวจสอบถึงที่ออฟฟิตแล้ว ก็ไม่ได้คำตอบเป็นที่พอใจ &#8230; เพราะว่าพนักงานไม่เข้าใจว่า Margin ติดลบมันหมายความว่ายังไง</p>
<p>มันหมายความว่า Noise มากกว่า Signal ไงครับ! เข้าใจมั้ยยยยยยยย ~!!</p>
<p>สุดท้าย ต้องยอมเปลี่ยนเป็น G.dmt เพื่อให้เน็ตเสถียรขึ้น (เพิ่งรู้ว่า G.dmt connect ที่ 12M ได้)</p>
<p><img src="http://sikachu.com/wp-content/uploads/2009/10/Screen-shot-2552-09-04-at-11.27.44.png" alt="Screen shot 2552-09-04 at 11.27.44.png" border="0" width="279" height="181" /></p>
<p>แล้วก็ต้องใช้มันต่อไป &#8230; คาดว่าถ้าไม่ไหวอีกรอบ ก็คงโทรไปโวยอีก เห้อออ -*-</p>
]]></content:encoded>
			<wfw:commentRss>http://sikachu.com/2009/10/adsl2-%e0%b8%81%e0%b8%b1%e0%b8%9a-negative-upstream/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Optimize database query ด้วย :include</title>
		<link>http://sikachu.com/2009/08/optimize-database-query-%e0%b8%94%e0%b9%89%e0%b8%a7%e0%b8%a2-include/</link>
		<comments>http://sikachu.com/2009/08/optimize-database-query-%e0%b8%94%e0%b9%89%e0%b8%a7%e0%b8%a2-include/#comments</comments>
		<pubDate>Fri, 07 Aug 2009 06:14:57 +0000</pubDate>
		<dc:creator>Sikachu!</dc:creator>
				<category><![CDATA[My Project]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[ActiveRecord]]></category>

		<guid isPermaLink="false">http://sikachu.com/?p=347</guid>
		<description><![CDATA[ในการเขียนโปรแกรมบน Ruby on Rails นั้น เรามักที่จะใช้ ActiveRecord ในการทำหน้าที่เป็น ORM ระหว่างตัว Application กับ database ซื่งทำให้การเรียก Record นั้น สามารถทำได้อย่างง่ายดาย เช่น ถ้าผมจะเรียกดู post ทั้งหมดที่มีอยู่ในระบบ ผมแค่สั่ง Post.find&#40;:all&#41; # หรือว่า Post.all ก็ได้ ใน Rails 2.x ซึ่งตรงนี้ ถ้าเราไปดูใน Log file จะพบว่า ActiveRecord นั้น จะใช้คำสั่งค้นหาข้อมูลประมาณนี้ครับ Post Load (0.1ms) SELECT * FROM &#34;posts&#34; (ผมใช่ sqlite3 เพราะฉะนั้น table name/field name จะถูกใส่ไว้ใน quote ครับ) ถ้าสมมุติในโปรแกรมนั้น [...]]]></description>
			<content:encoded><![CDATA[<p>ในการเขียนโปรแกรมบน <a href="http://rubyonrails.org/">Ruby on Rails</a> นั้น เรามักที่จะใช้ <a href="http://api.rubyonrails.org/classes/ActiveRecord/Base.html">ActiveRecord</a> ในการทำหน้าที่เป็น ORM ระหว่างตัว Application กับ database ซื่งทำให้การเรียก Record นั้น สามารถทำได้อย่างง่ายดาย เช่น ถ้าผมจะเรียกดู post ทั้งหมดที่มีอยู่ในระบบ ผมแค่สั่ง</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">Post.<span style="color:#9900CC;">find</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:all</span><span style="color:#006600; font-weight:bold;">&#41;</span>    <span style="color:#008000; font-style:italic;"># หรือว่า Post.all ก็ได้ ใน Rails 2.x</span></pre></div></div>

<p>ซึ่งตรงนี้ ถ้าเราไปดูใน Log file จะพบว่า ActiveRecord นั้น จะใช้คำสั่งค้นหาข้อมูลประมาณนี้ครับ</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">  Post Load (0.1ms)   SELECT * FROM &quot;posts&quot;</pre></div></div>

<p>(ผมใช่ sqlite3 เพราะฉะนั้น table name/field name จะถูกใส่ไว้ใน quote ครับ)</p>
<p>ถ้าสมมุติในโปรแกรมนั้น เราได้ทำ <a href="http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html">Association</a> ระหว่าง Post และ Comment (Post has many comments) และระหว่าง Comment กับ User (comment belongs to user)</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Post <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  has_many <span style="color:#ff3333; font-weight:bold;">:comments</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># ...</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> Comment <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  belongs_to <span style="color:#ff3333; font-weight:bold;">:post</span>
  belongs_to <span style="color:#ff3333; font-weight:bold;">:user</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># ...</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>ถ้าเราต้องการจะแสดงผล comment แต่ละอันด้วย เราก็สามารถทำได้โดยเรียกเมธอด <code>#comments</code> ที่ถูกสร้างขึ้นมาอัตโนมัติโดยการทำ association และเช่นเดียวกัน ถ้าเราต้องการแสดงด้วยว่า comment นั้นถูกเขียนโดยใคร เราก็สามารถเรียกเมธอด <code>#user</code> บน comment เช่นกัน</p>

<div class="wp_syntax"><div class="code"><pre class="rails" style="font-family:monospace;"><span style="color:#006600; font-weight:bold;">&lt;%</span> Post.<span style="color:#9900CC;">find</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:all</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#5A0A0A; font-weight:bold;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>post<span style="color:#006600; font-weight:bold;">|</span> <span style="color:#006600; font-weight:bold;">%&gt;</span>
  &lt;!-- display post --&gt;
  <span style="color:#006600; font-weight:bold;">&lt;%</span> post.<span style="color:#9900CC;">comments</span>.<span style="color:#5A0A0A; font-weight:bold;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>comment<span style="color:#006600; font-weight:bold;">|</span> <span style="color:#006600; font-weight:bold;">%&gt;</span>
    By: <span style="color:#006600; font-weight:bold;">&lt;%</span>= comment.<span style="color:#9900CC;">user</span>.<span style="color:#9900CC;">username</span> <span style="color:#006600; font-weight:bold;">%&gt;</span>
    &lt;!-- display comments --&gt;
  <span style="color:#006600; font-weight:bold;">&lt;%</span> <span style="color:#9966CC; font-weight:bold;">end</span> <span style="color:#006600; font-weight:bold;">%&gt;</span>
<span style="color:#006600; font-weight:bold;">&lt;%</span> <span style="color:#9966CC; font-weight:bold;">end</span> <span style="color:#006600; font-weight:bold;">%&gt;</span></pre></div></div>

<p>คราวนี้ สมมุติว่าบล็อกเรามีทั้งหมด 10 Post แล้วแต่ละอันมี 5 comment &#8230; SQL ที่ออกมานั้น จะเป็นประมาณนี้ครับ</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">  Post Load (0.1ms)   SELECT * FROM &quot;posts&quot;
  Comment Load (0.5ms)   SELECT * FROM &quot;comments&quot; WHERE (&quot;comments&quot;.
&quot;post_id&quot; = '1')
  User Load (0.2ms)   SELECT * FROM &quot;users&quot; WHERE (&quot;user&quot;.&quot;id&quot; = '5')
  User Load (0.2ms)   SELECT * FROM &quot;users&quot; WHERE (&quot;user&quot;.&quot;id&quot; = '24')
  User Load (0.2ms)   SELECT * FROM &quot;users&quot; WHERE (&quot;user&quot;.&quot;id&quot; = '30')
  User Load (0.2ms)   SELECT * FROM &quot;users&quot; WHERE (&quot;user&quot;.&quot;id&quot; = '4')
  CACHE (0.0ms)   SELECT * FROM &quot;users&quot; WHERE (&quot;user&quot;.&quot;id&quot; = '5')
  Comment Load (0.3ms)   SELECT * FROM &quot;comments&quot; WHERE (&quot;comments&quot;.
&quot;post_id&quot; = '2')
  User Load (0.2ms)   SELECT * FROM &quot;users&quot; WHERE (&quot;user&quot;.&quot;id&quot; = '38')
  User Load (0.2ms)   SELECT * FROM &quot;users&quot; WHERE (&quot;user&quot;.&quot;id&quot; = '14')
  User Load (0.2ms)   SELECT * FROM &quot;users&quot; WHERE (&quot;user&quot;.&quot;id&quot; = '40')
  User Load (0.2ms)   SELECT * FROM &quot;users&quot; WHERE (&quot;user&quot;.&quot;id&quot; = '2')
  User Load (0.2ms)   SELECT * FROM &quot;users&quot; WHERE (&quot;user&quot;.&quot;id&quot; = '9')
  ...</pre></div></div>

<p>จะเห็นได้ว่า ในสถานการณ์ที่แย่ที่สุดนั้น (user ที่มา comment แต่ละ post นั้น ไม่ตรงกันเลย เป็นต้น) ActiveRecord จำเป็นต้องทำการ Query ทั้งหมด <code>1 + 10 + (10 * 5)  = 61</code> ครั้ง ซึ่งไม่มีประสิทธิภาพเลยครับ เพราะเปลือง Query มากมาย</p>
<p>ดังนั้น เพื่อให้ Query ทั้งหมดนี่มีประสิทธิภาพมากขึ้น ActiveRecord จึงมี key หนึ่งชื่อว่า <code><a href="http://api.rubyonrails.org/classes/ActiveRecord/Base.html">:include</a></code> เอาไว้สำหรับสั่งว่าให้ ActiveRecord นั้นทำการโหลด Model ที่ associates กับ object นี้ขึ้นมาด้วยพร้อมๆ กันเลย เพื่อประหยัด Query ครับ เพราะฉะนั้นโค้ดในการค้นหาของเราจะเปลี่ยนเป็น</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">Post.find(:all, :include =&gt; {:comments =&gt; :user}).each do |post|
  # ... display post
  post.comments.each do |comment|
    By: <span style="color:#006600; font-weight:bold;">&lt;%</span>= comment.<span style="color:#9900CC;">user</span>.<span style="color:#9900CC;">username</span> <span style="color:#006600; font-weight:bold;">%&gt;</span>
    # ... display comments
  end
end</pre></div></div>

<p>แล้วผลของมันน่ะหรอครับ? 61 query -> 3 queries ครับ!</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">  Post Load (0.1ms)   SELECT * FROM &quot;posts&quot;
  Comment Load (0.3ms)   SELECT * FROM &quot;comments&quot; WHERE (&quot;comments&quot;.
&quot;post_id&quot; IN (1, 2, 3, 4, 5))
  User Load (1.3ms)   SELECT * FROM &quot;users&quot; WHERE (&quot;user&quot;.&quot;id&quot; IN (5, 24,
30, 4, 2, 38, 14, 40, 2, 9, 23, 41, 48, 50, 32, 10, 48)</pre></div></div>

<p>เพราะฉะนั้นการใช้ <code>:include</code> นั้น เป็นการ optimize query อย่างได้ผลทีเดียวละครับ โดยจะเห็นได้ว่าเรายังสามารถโหลด model แบบ nested ได้โดยการใช้ Hash และโหลดโมเดลหลายๆ อันพร้อมกันโดยใช้ Array ครับ อย่างเช่นถ้าเราต้องการโหลด Attachments จาก Comment และโหลด Tags จาก Post ด้วย เราก็สามารถใช้คำสั่งอย่างนี้ได้ครับ</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">Post.<span style="color:#9900CC;">find</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:all</span>, <span style="color:#ff3333; font-weight:bold;">:include</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#123;</span>:comments <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:user</span>, <span style="color:#ff3333; font-weight:bold;">:attachments</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#125;</span>, 
<span style="color:#ff3333; font-weight:bold;">:tags</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p><strong>คำเตือน: Use it, but don&#8217;t abuse it!</strong></p>
<p>ในบางครั้ง การใช้ <code>:include</code> นั้น อาจจะทำให้เวลาในการ query นั้นลดลงได้ถ้าเทียบกับการ query object เล็กๆ หลายๆ ครั้งแทน เพราะฉะนั้นมันไม่ใช่สิ่งที่เวิร์คที่สุดครับ ต้องปรับใช้ให้เข้ากับงานซะมากกว่า โดยที่ผมแนะนำให้<strong>ใช้ <code>#find</code> method ตามปกติก่อน แล้วจึงค่อยเพิ่ม <code>:include</code> เข้าไปถ้าเราเห็นว่ามีการ query record จำนวนมากๆ</strong>ครับ &#8230; ถือซะว่าการใช้ <code>:include</code> นั้นเป็นการ refactor code ครับ และไม่ใช่สิ่งที่ต้องมาคิดตั้งแต่แรกว่าตรงนี้ต้องใช้มันหรือไม่ <img src='http://sikachu.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://sikachu.com/2009/08/optimize-database-query-%e0%b8%94%e0%b9%89%e0%b8%a7%e0%b8%a2-include/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Thin Rolling Restart Patch</title>
		<link>http://sikachu.com/2009/08/thin-rolling-restart-patch/</link>
		<comments>http://sikachu.com/2009/08/thin-rolling-restart-patch/#comments</comments>
		<pubDate>Sun, 02 Aug 2009 13:04:13 +0000</pubDate>
		<dc:creator>Sikachu!</dc:creator>
				<category><![CDATA[My Project]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[thin]]></category>

		<guid isPermaLink="false">http://sikachu.com/?p=335</guid>
		<description><![CDATA[I wrote a patch for Thin web server to do a rolling restart (i.e. restart the server one at a time) when I was working for my final thesis, Localmapia. I put my source on Github, and already inform the developer of Thin. However, seems like he forgot about it. Anyway, I just updated my [...]]]></description>
			<content:encoded><![CDATA[<p>I wrote a patch for <a href="http://code.macournoyer.com/thin/">Thin</a> web server to do a rolling restart (i.e. restart the server one at a time) when I was working for my final thesis, Localmapia. I put my source on <a href="http://github.com">Github</a>, and already inform the developer of <a href="http://code.macournoyer.com/thin/">Thin</a>. However, seems like he forgot about it.</p>
<p>Anyway, I just updated my code to reflect the edge version of Thin. You can checkout my code from:</p>
<p><a href="http://github.com/sikachu/thin">http://github.com/sikachu/thin</a></p>
<p>Also, if you want to install my version of Thin, just do this command to install from source:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">git clone git:<span style="color: #000000; font-weight: bold;">//</span>github.com<span style="color: #000000; font-weight: bold;">/</span>sikachu<span style="color: #000000; font-weight: bold;">/</span>thin.git
<span style="color: #7a0874; font-weight: bold;">cd</span> thin
rake <span style="color: #c20cb9; font-weight: bold;">install</span></pre></div></div>

<p>So, to use this feature, you just add <code>onebyone: true</code> into your thin cluster file, or use the flag <code>-O</code> or <code>--onebyone</code> when you&#8217;re issue restart command.</p>
<p>I still wishing this would be merged into the main branch. <img src='http://sikachu.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>(If you don&#8217;t know about Thin, it&#8217;s a web server purely written in Ruby. It uses very small memory, very lightweight, yet very powerful. Usually people will use it with Nginx acting as reverse proxy. I wrote this patch because during normal restart Nginx would display 501 gateway error, which this patch solves the problem by having at least 1 old-version running at the time of restart.)</p>
]]></content:encoded>
			<wfw:commentRss>http://sikachu.com/2009/08/thin-rolling-restart-patch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Object#try ใน Rails 2.3</title>
		<link>http://sikachu.com/2009/08/objecttry-%e0%b9%83%e0%b8%99-rails-2-3/</link>
		<comments>http://sikachu.com/2009/08/objecttry-%e0%b9%83%e0%b8%99-rails-2-3/#comments</comments>
		<pubDate>Sun, 02 Aug 2009 12:16:52 +0000</pubDate>
		<dc:creator>Sikachu!</dc:creator>
				<category><![CDATA[My Project]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Ruby 1.9]]></category>

		<guid isPermaLink="false">http://sikachu.com/?p=320</guid>
		<description><![CDATA[เคยเจอปัญหาบ้างไหมครับ กับการที่บางครั้ง object ที่เราเรียก method ไปเนี่ย มันกลายเป็น nil ขึ้นมา ทำให้เกิด exception ขึ้นมา &#62;&#62; @user.username NoMethodError: You have a nil object when you didn't expect it! The error occurred while evaluating nil.username from (irb):1 ซึ่งตรงนี้ เพื่อที่จะหลบ exception ในบางครั้งทำให้ Developer ต้องทำการเช็คก่อนว่า object นั้นเป็น nil หรือไม่ เช่น &#62;&#62; &#40;@user ? @user.usename : &#34;Guest&#34;&#41; =&#62; &#34;Guest&#34; ซึ่งตรงนี้ทำให้โค้ดนั้นดูุวุ่นวายมากขึ้น และทำให้โค้ดนั้นดูไม่ค่อยเหมือน Ruby [...]]]></description>
			<content:encoded><![CDATA[<p>เคยเจอปัญหาบ้างไหมครับ กับการที่บางครั้ง object ที่เราเรียก method ไปเนี่ย มันกลายเป็น nil ขึ้นมา ทำให้เกิด exception ขึ้นมา</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#006600; font-weight:bold;">&gt;&gt;</span> <span style="color:#0066ff; font-weight:bold;">@user</span>.<span style="color:#9900CC;">username</span>
<span style="color:#CC00FF; font-weight:bold;">NoMethodError</span>: You have a <span style="color:#0000FF; font-weight:bold;">nil</span> object <span style="color:#9966CC; font-weight:bold;">when</span> you didn<span style="color:#996600;">'t expect it!
The error occurred while evaluating nil.username
	from (irb):1</span></pre></div></div>

<p>ซึ่งตรงนี้ เพื่อที่จะหลบ exception ในบางครั้งทำให้ Developer ต้องทำการเช็คก่อนว่า object นั้นเป็น nil หรือไม่ เช่น</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#006600; font-weight:bold;">&gt;&gt;</span> <span style="color:#006600; font-weight:bold;">&#40;</span>@user ? <span style="color:#0066ff; font-weight:bold;">@user</span>.<span style="color:#9900CC;">usename</span> : <span style="color:#996600;">&quot;Guest&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;Guest&quot;</span></pre></div></div>

<p>ซึ่งตรงนี้ทำให้โค้ดนั้นดูุวุ่นวายมากขึ้น และทำให้โค้ดนั้นดูไม่ค่อยเหมือน Ruby สักเท่าไร (ซึ่งผมก็เห็นด้วยว่า &lt;cond&gt; ? &lt;if-true&gt; : &lt;if-false&gt; นั้น มันดูแปลกๆ) จึงทำให้มีคนคิด <a href="http://ozmm.org/posts/try.html">Object#try</a> ออกมา แล้วทางทีมผู้พัฒนา Ruby on Rails ถึงเอาเข้าไปเพิ่มใน Rails 2.3 ระหว่างที่ Ruby กำลังรอเพิ่ม method นี้เข้าไปอยู่</p>
<p>เพราะฉะนั้นหลังจากการเพิ่ม method นี้ ทำให้เราสามารถที่จะทำอย่างนี้ได้</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#006600; font-weight:bold;">&gt;&gt;</span> <span style="color:#0066ff; font-weight:bold;">@user</span>.<span style="color:#9900CC;">try</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:username</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">nil</span>
<span style="color:#006600; font-weight:bold;">&gt;&gt;</span> <span style="color:#0066ff; font-weight:bold;">@user</span>.<span style="color:#9900CC;">try</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:username</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">||</span> <span style="color:#996600;">&quot;Guest&quot;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;Guest&quot;</span></pre></div></div>

<p>แล้วยังทำให้ เราสามารถทำ method chaining ได้ด้วย (เพราะทุกอย่างมี #try)</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#006600; font-weight:bold;">&gt;&gt;</span> <span style="color:#0066ff; font-weight:bold;">@user</span>.<span style="color:#9900CC;">try</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:username</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">try</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:capitalize</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">nil</span>
<span style="color:#006600; font-weight:bold;">&gt;&gt;</span> <span style="color:#008000; font-style:italic;"># Fetch @user from record</span>
?<span style="color:#006600; font-weight:bold;">&gt;</span> <span style="color:#0066ff; font-weight:bold;">@user</span> = User.<span style="color:#9900CC;">first</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#008000; font-style:italic;">#&lt;User id: 1, email: &quot;test@test.com&quot;, usename: &quot;test&quot;, persistence_token: &quot;95908c3801d55ce389af90f0909192cbda4e37c632afd6b50c2...&quot;, created_at: &quot;2009-06-30 05:44:43&quot;, updated_at: &quot;2009-07-16 08:56:46&quot;, crypted_password: &quot;f37c87cb2d731c0c0710ae9c2b9721d352f6336e38e988bb907...&quot;, password_salt: &quot;UIENYMKzDjJYgy2E89Qn&quot;, status: nil&gt;</span>
<span style="color:#006600; font-weight:bold;">&gt;&gt;</span> <span style="color:#0066ff; font-weight:bold;">@user</span>.<span style="color:#9900CC;">try</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:username</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">try</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:capitalize</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;Test&quot;</span></pre></div></div>

<p>ลองปรับไปใช้กับ Application กันนะครับ คิดว่าส่วนนี้น่าจะช่วยให้ debug กันง่ายขึ้นเยอะเลย <img src='http://sikachu.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://sikachu.com/2009/08/objecttry-%e0%b9%83%e0%b8%99-rails-2-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ruby และ active_support/whiny_nil</title>
		<link>http://sikachu.com/2009/06/ruby-%e0%b9%81%e0%b8%a5%e0%b8%b0-active_supportwhiny_nil/</link>
		<comments>http://sikachu.com/2009/06/ruby-%e0%b9%81%e0%b8%a5%e0%b8%b0-active_supportwhiny_nil/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 15:12:34 +0000</pubDate>
		<dc:creator>Sikachu!</dc:creator>
				<category><![CDATA[My Project]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[active_support]]></category>
		<category><![CDATA[nil]]></category>
		<category><![CDATA[Ruby 1.8]]></category>

		<guid isPermaLink="false">http://sikachu.com/?p=303</guid>
		<description><![CDATA[สำหรับนักพัฒนาส่วนใหญ่ที่เริ่มเขียน Ruby on Rails คาดว่าตอนนี้ในเครื่องของทุกๆ คน น่าจะลง Ruby 1.8 อยู่ เนื่องจากยังคงมี Gem หลายๆ ตัว ที่ยังไม่รองรับ Ruby 1.9 และทำให้เกิดปัญหาทางด้านความเข้ากันได้อยู่บ้าง ฉะนั้นผมเลยอยากพูดถึงหลุมพรางที่ Ruby 1.8 ได้ทิ้งเอาไว้ และทำให้หลายๆ คนนั้นพลาดตกหลุมกันไปบ้างครับ ผมขอสมมุติเอาไว้ว่า ผมได้สร้างระบบ Blog แห่งหนึ่ง โดยที่มี Model สามตัวคือ Post เอาไว้เก็บข้อความ Comment เอาไว้เก็บความคิดเห็น และ User เอาไว้เก็บชื่อผู้ใช้ ที่สามารถแก้ไขข้อความได้ครับ สมมุติว่า User ที่สามารถเข้ามาแก้ไขได้นี้ มี id = 4 ผมก็เลยทำการ hard-coded เอาไว้ในโปรแกรมเลย เป็น filter ว่า class PostController &#60; [...]]]></description>
			<content:encoded><![CDATA[<p>สำหรับนักพัฒนาส่วนใหญ่ที่เริ่มเขียน Ruby on Rails คาดว่าตอนนี้ในเครื่องของทุกๆ คน น่าจะลง Ruby 1.8 อยู่ เนื่องจากยังคงมี Gem หลายๆ ตัว ที่ยังไม่รองรับ Ruby 1.9 และทำให้เกิดปัญหาทางด้านความเข้ากันได้อยู่บ้าง ฉะนั้นผมเลยอยากพูดถึงหลุมพรางที่ Ruby 1.8 ได้ทิ้งเอาไว้ และทำให้หลายๆ คนนั้นพลาดตกหลุมกันไปบ้างครับ</p>
<p>ผมขอสมมุติเอาไว้ว่า ผมได้สร้างระบบ Blog แห่งหนึ่ง โดยที่มี Model สามตัวคือ <strong>Post</strong> เอาไว้เก็บข้อความ <strong>Comment</strong> เอาไว้เก็บความคิดเห็น และ <strong>User</strong> เอาไว้เก็บชื่อผู้ใช้ ที่สามารถแก้ไขข้อความได้ครับ</p>
<p>สมมุติว่า User ที่สามารถเข้ามาแก้ไขได้นี้ มี id = 4 ผมก็เลยทำการ hard-coded เอาไว้ในโปรแกรมเลย เป็น filter ว่า</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> PostController <span style="color:#006600; font-weight:bold;">&lt;</span> ApplicationController
  before_filter <span style="color:#ff3333; font-weight:bold;">:load_user</span>
  before_filter <span style="color:#ff3333; font-weight:bold;">:check_authorization</span>!, <span style="color:#ff3333; font-weight:bold;">:except</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:show</span>, <span style="color:#ff3333; font-weight:bold;">:index</span><span style="color:#006600; font-weight:bold;">&#93;</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># ... controller actions</span>
&nbsp;
  private
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> check_authorization!
    render <span style="color:#ff3333; font-weight:bold;">:text</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;Unauthorized!&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:status</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">401</span> <span style="color:#9966CC; font-weight:bold;">unless</span> <span style="color:#0066ff; font-weight:bold;">@user</span>.<span style="color:#9900CC;">id</span> == <span style="color:#006666;">4</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>คราวนี้ผมก็ลองรันดู ปรากฎว่าเจอปัญหาว่าถ้าคนที่ไม่ได้เป็นสมาชิกเข้ามาที่บล็อก มันจะเกิด exception ขึ้นมา เพราะผมไปเรียก id method บน nil object ผมก็เลยจัดการ catch exception อย่างนี้ครับ</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">  <span style="color:#9966CC; font-weight:bold;">def</span> check_authorization!
    render <span style="color:#ff3333; font-weight:bold;">:text</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;Unauthorized!&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:status</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">401</span> <span style="color:#9966CC; font-weight:bold;">unless</span> <span style="color:#006600; font-weight:bold;">&#40;</span>@user.<span style="color:#9900CC;">id</span> == <span style="color:#006666;">4</span> <span style="color:#9966CC; font-weight:bold;">rescue</span> <span style="color:#0000FF; font-weight:bold;">false</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>โออ คราวนี้โปรแกรมผมหล่อกิ๊งเลย ไม่พบว่าเกิดปัญหาอะไร ผมก็เลยจัดการ deploy ขึ้นไปบนเว็บเสร็จสรรพ สร้าง user ให้เหมือนกับบนเครื่อง Development ทุกประการ และให้ User ที่มี id = 4 สามารถแก้ไขโพสได้เป็นคนเดียวเช่นเคย</p>
<p>แต่ปรากฎว่า การเขียนโปรแกรมของผมนั้นทิ้งช่องโหว่เอาไว้ใหญ่โตเลยครับ เพราะกลายเป็นว่าคนที่ไม่ได้เป็นสมาชิกสามารถแก้ไข และลบข้อความทั้งหมดของผมได้เลย !!</p>
<p>หลังจากการตามหาบักมานานแสนนาน .. ผมก็ขอเข้าเรื่องของ whiny_nil เลยละกันครับ</p>
<p>ในตัว active_support ที่ติดมากับ Ruby on Rails นั้น มีไฟล์อยู่อันหนึ่งชื่อว่า whiny_nil.rb ซึ่งไฟล์นี้เป็นส่วนของ Core Extension ซึ่งทำให้การเรียกใช้เมธอด #id บน object ที่เป็น nil นั้น จะมีการโยน RuntimeError ออกมาบอกว่าเรากำลังทำการเรียกใช้ #id บน nil อยู่</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">Sikachus-Notebook:rails sikachu$ script<span style="color: #000000; font-weight: bold;">/</span>console
Loading development environment <span style="color: #7a0874; font-weight: bold;">&#40;</span>Rails 2.3.2<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&gt;&gt;</span> nil.id
RuntimeError: Called <span style="color: #c20cb9; font-weight: bold;">id</span> <span style="color: #000000; font-weight: bold;">for</span> nil, <span style="color: #c20cb9; font-weight: bold;">which</span> would mistakenly be <span style="color: #000000;">4</span> <span style="color: #660033;">--</span> <span style="color: #000000; font-weight: bold;">if</span> you really wanted the <span style="color: #c20cb9; font-weight: bold;">id</span> of nil, use object_id
	from <span style="color: #7a0874; font-weight: bold;">&#40;</span>irb<span style="color: #7a0874; font-weight: bold;">&#41;</span>:<span style="color: #000000;">1</span>
<span style="color: #000000; font-weight: bold;">&gt;&gt;</span></pre></div></div>

<p>ซึ่งตรงนี้ นักพัฒนาบางคนก็จะใช้วิธีการ rescue RuntimeError ไป เพราะคิดเอาว่าถ้าเผลอไปเรียก #id บน object ที่เป็น nil จริง มันก็ต้องโยน RuntimeError ออกมาบอกเรา ถูกไหมครับ</p>
<p>คำตอบคือ <strong>ผิดถนัด</strong> ครับ เพราะบน Production environment นั้น เจ้าตัว whiny_nil นั้นจะไม่ถูกเปิดใช้ครับ แล้วผลของการไม่ได้เปิดใช้หรอครับ?</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">Sikachus-Notebook:~ sikachu$ irb
irb<span style="color: #7a0874; font-weight: bold;">&#40;</span>main<span style="color: #7a0874; font-weight: bold;">&#41;</span>:001:<span style="color: #000000;">0</span><span style="color: #000000; font-weight: bold;">&gt;</span> nil.id
<span style="color: #7a0874; font-weight: bold;">&#40;</span>irb<span style="color: #7a0874; font-weight: bold;">&#41;</span>:<span style="color: #000000;">1</span>: warning: Object<span style="color: #666666; font-style: italic;">#id will be deprecated; use Object#object_id</span>
=<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000;">4</span></pre></div></div>

<p>นั่นแหละครับ! การที่เรียกเมธอด #id บน nil นั้น Ruby จะคืนค่าเป็น 4 ครับ เพราะว่า nil นั้นมี id ของตัวมันเองคือ 4 ครับ <img src='http://sikachu.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>เพราะฉะนั้นคงเดาออกใช่ไหมครับว่าทำไมคนที่ไม่ได้ล็อกอินทุกคน ถึงสามารถเข้าไปแก้ไขบล็อกของผมได้? ก็เพราะว่า @user.id ของเขา คืนค่าเป็น 4 กันทุกคนเลยครับ ไม่ได้มีการโยน RuntimeError แต่อย่างใด</p>
<p>ปัญหานี้ใช่ว่าไม่มีทางแก้ครับ แต่ผมจะไม่ขอเจาะลึกลงไปแล้วกันครับ เพราะว่าปัญหานี้หายไปแล้วใน Ruby 1.9.1 (object#id deprecated ไปแล้วครับ) ก็ต้องรอให้มันถูกใช้แพร่หลายเท่านั้นล่ะครับ ซึ่งตอนนี้วิธีการแก้ก็คงเป็น</p>
<ul>
<li>เปิดการใช้งาน config.whiny_nil ใน production.rb</li>
<li>ใช้ object.try(:id) ที่จะคืนค่ามาเป็น nil หากว่า object เป็น nil</li>
<li>เขียนโค้ดใหม่โดยพยายามไม่เช็คจาก #id</li>
</ul>
<p>หวังว่าโพสนี้จะทำให้หลายคนหายข้องใจได้บ้างนะครับ</p>
<p>ปล. บางท่านคงสงสัยใช้ไหมครับว่าแล้วทำไม nil.id หรือ nil.object_id มันถึง return เป็น 4 &#8230; เพราะว่า Ruby ทุกอย่างมันเป็น object ครับ ไม่เว้นแม่กระทั่ง nil! ไม่เชื่อลองดูนี่นะครับ</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">irb<span style="color:#006600; font-weight:bold;">&#40;</span>main<span style="color:#006600; font-weight:bold;">&#41;</span>:002:<span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&gt;</span> <span style="color:#0000FF; font-weight:bold;">nil</span>.<span style="color:#9900CC;">object_id</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">4</span>
irb<span style="color:#006600; font-weight:bold;">&#40;</span>main<span style="color:#006600; font-weight:bold;">&#41;</span>:003:<span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&gt;</span> <span style="color:#0000FF; font-weight:bold;">nil</span>.<span style="color:#9966CC; font-weight:bold;">class</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#CC00FF; font-weight:bold;">NilClass</span>
irb<span style="color:#006600; font-weight:bold;">&#40;</span>main<span style="color:#006600; font-weight:bold;">&#41;</span>:004:<span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&gt;</span> 100.<span style="color:#9966CC; font-weight:bold;">class</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#CC00FF; font-weight:bold;">Fixnum</span></pre></div></div>

<p>ใครจะชอบไม่ชอบผมไม่รู้ แต่ขอเอวังด้วยประกาลฉะนี้ <img src='http://sikachu.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://sikachu.com/2009/06/ruby-%e0%b9%81%e0%b8%a5%e0%b8%b0-active_supportwhiny_nil/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Battery ใหม่กิ๊ง ~</title>
		<link>http://sikachu.com/2009/06/battery-%e0%b9%83%e0%b8%ab%e0%b8%a1%e0%b9%88%e0%b8%81%e0%b8%b4%e0%b9%8a%e0%b8%87/</link>
		<comments>http://sikachu.com/2009/06/battery-%e0%b9%83%e0%b8%ab%e0%b8%a1%e0%b9%88%e0%b8%81%e0%b8%b4%e0%b9%8a%e0%b8%87/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 14:13:12 +0000</pubDate>
		<dc:creator>Sikachu!</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[My Project]]></category>
		<category><![CDATA[battery]]></category>
		<category><![CDATA[Macbook]]></category>
		<category><![CDATA[Macbook Pro]]></category>

		<guid isPermaLink="false">http://sikachu.com/?p=301</guid>
		<description><![CDATA[หลังจากที่รอมานานแสนนาน ที่จะเก็บเงินซื้อ Battery ใหม่ ของ Macbook Pro 15&#8221; ซึ่งยังงั้ยยังไง ก็ไม่สามารถตัดใจซื้อได้สักที เพราะด้วยราคามหาโหด (6,xxx บาท) .. ทำให้โปรแกรมเมอร์น้อยๆ ได้แต่ทนใช้ battery ก้อนเก่าไป (ซึ่งจริงๆ ก็เป็นของ @lukeinth ซะด้วย &#8211; -&#8221;) แต่แล้วคุณเจ้านาย (@trawut) ก็ได้โปรดเมตตา ซื้อแบตก้อนใหม่มาให้เป็นของขวัญ !! (แต่รู้สึกว่าจะไม่เนียนเลยนะครับของขวัญนี่ &#8230; เพราะตอนแรก @hunt บอกว่า @trawut ซื้อมาให้เพราะบีฝากซื้อ จนตอนกลางคืนถึงบอกว่าไม่ได้ซื้อมาฝาก ทำอกสั่นขวัญแขวน กลัวเสียเงินไปใหญ่ -*-) ไหนๆ ก็ได้แบตก้อนใหม่แล้ว เลยเอามาให้ดูก่อนการ Calibrate คร๊าบบ เวลาเห็น Coconut Battery รายงานว่า 100% แล้วรู้สึกดีพิลึก! ลองเล่นดู ปรากฎว่าได้ระยะเวลาประมาณ 3 ชม. [...]]]></description>
			<content:encoded><![CDATA[<p>หลังจากที่รอมานานแสนนาน ที่จะเก็บเงินซื้อ Battery ใหม่ ของ Macbook Pro 15&#8221; ซึ่งยังงั้ยยังไง ก็ไม่สามารถตัดใจซื้อได้สักที เพราะด้วยราคามหาโหด (6,xxx บาท) .. ทำให้โปรแกรมเมอร์น้อยๆ ได้แต่ทนใช้ battery ก้อนเก่าไป (ซึ่งจริงๆ ก็เป็นของ <a href="http://twitter.com/lukeinth">@lukeinth</a> ซะด้วย &#8211; -&#8221;)</p>
<p>แต่แล้วคุณเจ้านาย (<a href="http://twitter.com/trawut">@trawut</a>) ก็ได้โปรดเมตตา ซื้อแบตก้อนใหม่มาให้เป็นของขวัญ !!</p>
<p>(แต่รู้สึกว่าจะไม่เนียนเลยนะครับของขวัญนี่ &#8230; เพราะตอนแรก <a href="http://twitter.com/hunt">@hunt</a> บอกว่า <a href="http://twitter.com/trawut">@trawut</a> ซื้อมาให้เพราะบีฝากซื้อ จนตอนกลางคืนถึงบอกว่าไม่ได้ซื้อมาฝาก ทำอกสั่นขวัญแขวน กลัวเสียเงินไปใหญ่ -*-)</p>
<p>ไหนๆ ก็ได้แบตก้อนใหม่แล้ว เลยเอามาให้ดูก่อนการ Calibrate คร๊าบบ</p>
<p><img src="http://sikachu.com/wp-content/uploads/2009/06/before.png" alt="before.png" border="0" width="117" height="112" /></p>
<p><img src="http://sikachu.com/wp-content/uploads/2009/06/after.png" alt="after.png" border="0" width="117" height="114" /></p>
<p><img src="http://sikachu.com/wp-content/uploads/2009/06/coco.png" alt="coco.png" border="0" width="276" height="426" /></p>
<p>เวลาเห็น Coconut Battery รายงานว่า 100% แล้วรู้สึกดีพิลึก!</p>
<p>ลองเล่นดู ปรากฎว่าได้ระยะเวลาประมาณ 3 ชม. กว่าๆ ซึ่งก็ถือว่าเยอะแล้วนะครับสำหรับเครื่องรุ่นนี้ ก็แปลว่ารับได้ละกัน ๕๕๕๕</p>
<p>ขอบคุณคุง <a href="http://twitter.com/trawut">@trawut</a> มากนะขอรับ ๕๕๕๕</p>
]]></content:encoded>
			<wfw:commentRss>http://sikachu.com/2009/06/battery-%e0%b9%83%e0%b8%ab%e0%b8%a1%e0%b9%88%e0%b8%81%e0%b8%b4%e0%b9%8a%e0%b8%87/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Login เข้า server ผ่าน SSH แบบเนียนๆ</title>
		<link>http://sikachu.com/2009/04/login-%e0%b9%80%e0%b8%82%e0%b9%89%e0%b8%b2-server-%e0%b8%9c%e0%b9%88%e0%b8%b2%e0%b8%99-ssh-%e0%b9%81%e0%b8%9a%e0%b8%9a%e0%b9%80%e0%b8%99%e0%b8%b5%e0%b8%a2%e0%b8%99%e0%b9%86/</link>
		<comments>http://sikachu.com/2009/04/login-%e0%b9%80%e0%b8%82%e0%b9%89%e0%b8%b2-server-%e0%b8%9c%e0%b9%88%e0%b8%b2%e0%b8%99-ssh-%e0%b9%81%e0%b8%9a%e0%b8%9a%e0%b9%80%e0%b8%99%e0%b8%b5%e0%b8%a2%e0%b8%99%e0%b9%86/#comments</comments>
		<pubDate>Wed, 01 Apr 2009 16:12:54 +0000</pubDate>
		<dc:creator>Sikachu!</dc:creator>
				<category><![CDATA[My Project]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[authentication]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[public key]]></category>
		<category><![CDATA[rsa]]></category>
		<category><![CDATA[scp]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://sikachu.com/?p=257</guid>
		<description><![CDATA[เคยบ้างไหมครับ กับที่ต้องมานั่งคอยใส่รหัสผ่านวันละหลายๆ ครั้ง เวลาที่ต้องการจะเข้าไปทำงานบนเครื่อง Server ผ่านทาง SSH .. ผมละเป็นคนนึงครับที่มักจะมีปัญหาในเรื่องตรงนี้ เพราะว่าบางครั้งต้องล๊อคอินเข้าไปหลายๆ Server ในแต่ละวัน ทำให้พิมพ์รหัสผ่านกันมือหงิกเลยครับ หลังจากที่ได้ลองค้นหาข้อมูล ก็ไปเจอวิธีการอันหนึ่งครับ ที่ใช้วิธีการล๊อกอินเข้าไปโดยการใช้ RSA key pair โดยหลักการของมันก็คือ ให้เราเอา public key ของเราไปใส่ไว้บน server แล้วในตอนที่มันทำการ authenticate นี้ มันก็จะใช้ public key บน server กับ private key ที่เก็บอยู่ในเครื่องของเรา เอามายืนยันกันว่าเป็นตัวเราจริงๆ แทนที่จะต้องใช้รหัสผ่านครับ สำหรับวิธีการทำนั้นก็ง่ายแสนง่าย แต่ต้องเตือนไว้ก่อนนะครับว่าเทคนิคนี้ควรจะทำบนเครื่องคอมพิวเตอร์ของตัวเอง ที่มีการรักษารหัสผ่านเอาไว้ในระดับนึง ไม่เช่นนั้นถ้าโดนแฮกคอมพิวเตอร์ของเราทีนึงนี่ เท่ากับว่าแฮกเกอร์สามารถเข้าถึง server เครื่องอื่นๆ ของเราได้เลยนะครับ ก่อนอื่น ต้องทำการสร้าง RSA key pair ก่อนครับ โดยใช้คำสั่ง ssh-keygen [...]]]></description>
			<content:encoded><![CDATA[<p>เคยบ้างไหมครับ กับที่ต้องมานั่งคอยใส่รหัสผ่านวันละหลายๆ ครั้ง เวลาที่ต้องการจะเข้าไปทำงานบนเครื่อง Server ผ่านทาง SSH .. ผมละเป็นคนนึงครับที่มักจะมีปัญหาในเรื่องตรงนี้ เพราะว่าบางครั้งต้องล๊อคอินเข้าไปหลายๆ Server ในแต่ละวัน ทำให้พิมพ์รหัสผ่านกันมือหงิกเลยครับ</p>
<p>หลังจากที่ได้ลองค้นหาข้อมูล ก็ไปเจอวิธีการอันหนึ่งครับ ที่ใช้วิธีการล๊อกอินเข้าไปโดยการใช้ RSA key pair โดยหลักการของมันก็คือ ให้เราเอา public key ของเราไปใส่ไว้บน server แล้วในตอนที่มันทำการ authenticate นี้ มันก็จะใช้ public key บน server กับ private key ที่เก็บอยู่ในเครื่องของเรา เอามายืนยันกันว่าเป็นตัวเราจริงๆ แทนที่จะต้องใช้รหัสผ่านครับ</p>
<p>สำหรับวิธีการทำนั้นก็ง่ายแสนง่าย แต่ต้องเตือนไว้ก่อนนะครับว่าเทคนิคนี้ควรจะทำ<strong>บนเครื่องคอมพิวเตอร์ของตัวเอง ที่มีการรักษารหัสผ่านเอาไว้ในระดับนึง</strong> ไม่เช่นนั้นถ้าโดนแฮกคอมพิวเตอร์ของเราทีนึงนี่ เท่ากับว่าแฮกเกอร์สามารถเข้าถึง server เครื่องอื่นๆ ของเราได้เลยนะครับ</p>
<p>ก่อนอื่น ต้องทำการสร้าง RSA key pair ก่อนครับ โดยใช้คำสั่ง ssh-keygen</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">Sikachus-Notebook:~ sikachu$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/sikachu/.ssh/id_rsa): [Enter]
Enter passphrase (empty for no passphrase): [ใส่รหัสผ่าน หรือกด Enter ผ่านไป]
Enter same passphrase again: [ใส่รหัสผ่านอีกครั้ง หรือกด Enter ผ่านไป]
Your identification has been saved in /Users/sikachu/.ssh/id_rsa.
Your public key has been saved in /Users/sikachu/.ssh/id_rsa.pub.
The key fingerprint is:
3f:92:85:eb:d8:5c:f4:52:8e:88:16:db:7d:ac:49:2c sikachu@Sikachus-Notebook.local
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|                 |
|         .       |
|      . S o .    |
|       = X *     |
|      + E X =    |
|     . = = *     |
|      . + o      |
+-----------------+
Sikachus-Notebook:~ sikachu$</pre></div></div>

<p>แล้วต่อจากนั้น เราก็จะได้ public key ของเราอยู่ที่ ~/.ssh/id_rsa.pub และ private key ที่ ~/.ssh/id_rsa ซึ่งตัว private key นี้จำเป็นอย่างยิ่งที่เราจะต้องเก็บซ่อนให้มิดชิดครับ <img src='http://sikachu.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>ต่อจากนั้น ขั้นตอนต่อไป เราก็ทำการ scp public key ของเราไปยัง server ซะ .. แต่ว่าเอาไปไว้ใน home directory ของเราก่อนนะครับ เดี๋ยวค่อยย้ายไปที่ของมัน</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">Sikachus-Notebook:~ sikachu$ scp ~/.ssh/id_rsa.pub hamburger.sikachu.com:~
sikachu@ hamburger.sikachu.com's password: [พิมพ์รหัสผ่านของคุณลงไป]
id_rsa.pub                                    100%  413     0.4KB/s   00:00    
Sikachus-Notebook:~ sikachu$</pre></div></div>

<p>ต่อจากนั้นก็ทำการ ssh เข้าไปยัง server ของคุณ ทำการสร้าง folder .ssh ใน home directory และย้ายไฟล์ public key ของคุณเข้าไป พร้อมทั้งเปลี่ยนชื่อมันให้เป็น authorized_keys</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">sikachu@hamburger:~$ mkdir -m 700 ~/.ssh
sikachu@hamburger:~$ mv id_rsa.pub ~/.ssh/authorized_keys
sikachu@hamburger:~$ chmod 0600 ~/.ssh/authorized_keys
sikachu@hamburger:~$</pre></div></div>

<p>ที่บรรทัดสุดท้าย ผมแก้ permission ของ authorized_keys ให้เป็น 600 ด้วย เพื่อความปลอดภัย ไม่ให้ใครสามารถมาเพิ่ม key ลงไปได้</p>
<p>เรียบร้อยแล้วละครับ ต่อจากนี้ถ้าเราทำการ login ผ่านทาง ssh หรือคัดลอกไฟล์ผ่านทาง scp เราก็ไม่จำเป็นต้องใส่รหัสผ่านแล้ว และเรายังสามารถที่จะทำการตั้งค่าบน server ได้ด้วยครับว่าเราต้องการจะให้ login โดยใช้ RSA key pair อย่างเดียว และไม่รับรหัสผ่าน เพื่อเพิ่มความปลอดภัยให้กับ server อีกชั้นหนึ่ง (ก็คือต้อง login โดยใช้เครื่องของเราเท่านั้นละครับ)</p>
<p>ไว้คราวหน้าเดี๋ยวจะมาใหม่กับ tips ดีๆ ครับ <img src='http://sikachu.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://sikachu.com/2009/04/login-%e0%b9%80%e0%b8%82%e0%b9%89%e0%b8%b2-server-%e0%b8%9c%e0%b9%88%e0%b8%b2%e0%b8%99-ssh-%e0%b9%81%e0%b8%9a%e0%b8%9a%e0%b9%80%e0%b8%99%e0%b8%b5%e0%b8%a2%e0%b8%99%e0%b9%86/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>แอบโดน !!</title>
		<link>http://sikachu.com/2009/03/%e0%b9%81%e0%b8%ad%e0%b8%9a%e0%b9%82%e0%b8%94%e0%b8%99/</link>
		<comments>http://sikachu.com/2009/03/%e0%b9%81%e0%b8%ad%e0%b8%9a%e0%b9%82%e0%b8%94%e0%b8%99/#comments</comments>
		<pubDate>Thu, 12 Mar 2009 19:12:42 +0000</pubDate>
		<dc:creator>Sikachu!</dc:creator>
				<category><![CDATA[Garbage]]></category>
		<category><![CDATA[My Idea]]></category>
		<category><![CDATA[My Project]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[ie]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[web develoment]]></category>

		<guid isPermaLink="false">http://sikachu.com/?p=237</guid>
		<description><![CDATA[ปกติไม่ใช่สาวก Firefox หรืออะไรนะครับ เพราะผมก็ใช้ Safari อยู่แล้ว แต่ว่าที่เจอปัญหาบ่อยๆ ในการพัฒนาเว็บไซต์นี่ก็คือว่า IE นี่มัน Double Standard มากๆ เลยครับ .. ทำ CSS ทีไรหลุดทุกที ยังไงก็ต้องมีปัญหามานั่งแก้บน IE อีกรอบ ไม่ว่าจะกี่งานกี่งาน พอดีวันนี้ไปเจอช่ือท้ายของคุณลิ่ว ชอบใจดี เลยเอามาฝากครับ เพราะฉะนั้น .. เห็นใจ web developer เถอะครับ ใช้ Firefox กันเถิด คนทำงานจะได้มีเวลาไปพัฒนาอะไรใหม่ๆ กันนะ]]></description>
			<content:encoded><![CDATA[<p>ปกติไม่ใช่สาวก Firefox หรืออะไรนะครับ เพราะผมก็ใช้ Safari อยู่แล้ว แต่ว่าที่เจอปัญหาบ่อยๆ ในการพัฒนาเว็บไซต์นี่ก็คือว่า IE นี่มัน Double Standard มากๆ เลยครับ .. ทำ CSS ทีไรหลุดทุกที ยังไงก็ต้องมีปัญหามานั่งแก้บน IE อีกรอบ ไม่ว่าจะกี่งานกี่งาน</p>
<p>พอดีวันนี้ไปเจอช่ือท้ายของคุณลิ่ว ชอบใจดี เลยเอามาฝากครับ</p>
<p><img class="alignnone size-full wp-image-238" title="picture-5" src="http://sikachu.com/wp-content/uploads/2009/03/picture-5.jpg" alt="picture-5" width="314" height="146" /></p>
<p>เพราะฉะนั้น .. เห็นใจ web developer เถอะครับ ใช้ Firefox กันเถิด คนทำงานจะได้มีเวลาไปพัฒนาอะไรใหม่ๆ กันนะ <img src='http://sikachu.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://sikachu.com/2009/03/%e0%b9%81%e0%b8%ad%e0%b8%9a%e0%b9%82%e0%b8%94%e0%b8%99/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Thai Comic Update feed :)</title>
		<link>http://sikachu.com/2008/12/thai-comic-update-feed/</link>
		<comments>http://sikachu.com/2008/12/thai-comic-update-feed/#comments</comments>
		<pubDate>Thu, 11 Dec 2008 04:36:29 +0000</pubDate>
		<dc:creator>Sikachu!</dc:creator>
				<category><![CDATA[My Project]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Comic]]></category>
		<category><![CDATA[comtoon]]></category>
		<category><![CDATA[feed]]></category>
		<category><![CDATA[hunter x hunter]]></category>
		<category><![CDATA[การ์ตูน]]></category>

		<guid isPermaLink="false">http://sikachu.com/?p=218</guid>
		<description><![CDATA[หลังจากที่ต้องทนเปิดหน้าเว็บไซต์ Comtoon.com ตั้งหลายครั้ง เข้าไปแต่ละครั้งก็ scroll ไปดูตรง new release ที่ไม่สามารถจะเลื่อนขึ้นลงได้ (เพราะว่าใช้ Safari มันไม่ support) สุดท้ายก็เลยลองทำ feed ออกมาจากข้อมูลของทาง Comtoon ดู http://feedproxy.google.com/ThaiComicUpdate คิดว่าอันนี้น่าจะเป็นประโยชน์สำหรับคนที่มักจะอ่าน feed เป็นประจำ และชอบอ่านการ์ตูนนะครับ จะได้ไม่ต้องคอยแวะร้านการ์ตูนเพื่อดูว่ามีเล่มใหม่ออกหรือยัง ดูจาก feed เอาเลย ถ้าเจอปัญหา หรือเจอว่า Feed ไม่อัพเดทนานเข้าๆ บอกผมนะครับ .. ผมไม่รู้ว่าเขาจะปิด feature ที่เราไปดึงข้อมูลมานี่เมื่อไร T_T&#8221; &#8216; ปล. เมื่อไร Hunter x Hunter จะออกใหม่นี่ .. ต้องอ่าน scanlation ไปอีกนานเท่าไร &#8211; -&#8221;]]></description>
			<content:encoded><![CDATA[<p>หลังจากที่ต้องทนเปิดหน้าเว็บไซต์ <a href="http://www.comtoon.com">Comtoon.com</a> ตั้งหลายครั้ง เข้าไปแต่ละครั้งก็ scroll ไปดูตรง new release ที่ไม่สามารถจะเลื่อนขึ้นลงได้ (เพราะว่าใช้ Safari มันไม่ support) สุดท้ายก็เลยลองทำ feed ออกมาจากข้อมูลของทาง Comtoon ดู</p>
<p><a href="http://feedproxy.google.com/ThaiComicUpdate">http://feedproxy.google.com/ThaiComicUpdate</a></p>
<p>คิดว่าอันนี้น่าจะเป็นประโยชน์สำหรับคนที่มักจะอ่าน feed เป็นประจำ และชอบอ่านการ์ตูนนะครับ จะได้ไม่ต้องคอยแวะร้านการ์ตูนเพื่อดูว่ามีเล่มใหม่ออกหรือยัง ดูจาก feed เอาเลย <img src='http://sikachu.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>ถ้าเจอปัญหา หรือเจอว่า Feed ไม่อัพเดทนานเข้าๆ บอกผมนะครับ .. ผมไม่รู้ว่าเขาจะปิด feature ที่เราไปดึงข้อมูลมานี่เมื่อไร T_T&#8221; &#8216;</p>
<p>ปล. เมื่อไร Hunter x Hunter จะออกใหม่นี่ .. ต้องอ่าน scanlation ไปอีกนานเท่าไร &#8211; -&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://sikachu.com/2008/12/thai-comic-update-feed/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
