<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:media="http://search.yahoo.com/mrss/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Neokain</title><link>http://neokain.blogspot.com/</link><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/neokain" /><description>นีโอเคน</description><language>en</language><managingEditor>noreply@blogger.com (Phuwanart Larpmark)</managingEditor><lastBuildDate>Mon, 30 Jan 2012 15:40:18 PST</lastBuildDate><generator>Blogger http://www.blogger.com</generator><openSearch:totalResults xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/">44</openSearch:totalResults><openSearch:startIndex xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/">1</openSearch:startIndex><openSearch:itemsPerPage xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/">25</openSearch:itemsPerPage><feedburner:info uri="neokain" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><itunes:owner><itunes:email>noreply@blogger.com</itunes:email></itunes:owner><itunes:explicit>no</itunes:explicit><itunes:subtitle>นีโอเคน</itunes:subtitle><item><title>เริ่มทำ Gem</title><link>http://feedproxy.google.com/~r/neokain/~3/rxps5pddqEM/gem_26.html</link><category>ruby</category><category>rails</category><category>gem</category><author>noreply@blogger.com (Phuwanart Larpmark)</author><pubDate>Wed, 25 Jan 2012 11:48:18 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3687712341834240678.post-3539194051219515130</guid><description>&lt;h2&gt;พัฒนา&lt;/h2&gt;
&lt;p&gt;โครงสร้างของ gem ที่จำเป็นต้องมีจะเป็นดังนี้&lt;/p&gt;
&lt;pre&gt;
$ tree
.
├── lib
│   └── thbrk.rb
└── thbrk.gemspec
&lt;/pre&gt;

&lt;p&gt;โดยที่ไฟล์เราจะเขียนใน &lt;b&gt;lib/&lt;/b&gt; ซึ่งชื่อไฟล์นั้นจะเป็นชื่อเดียวกับชื่อ gem&lt;/p&gt;

&lt;p&gt;เราจะเริ่มเขียน code ภายใน &lt;b&gt;lib/thbrk.rb&lt;/b&gt;&lt;/p&gt;

&lt;pre&gt;
$ cat lib/thbrk.rb 
class Thbrk
  def self.say
    puts "Hello Gem!!!"
  end
end
&lt;/pre&gt;

&lt;p&gt;เอาล่ะ เท่านี้ก็เป็นการทำ gem ขึ้นมาแล้ว ตอนนี้เราก็จะมาถึงขั้นจะทำให้ gem นั้นใช้ได้&lt;/p&gt;

&lt;h2&gt;สร้าง&lt;/h2&gt;
&lt;p&gt;เริ่มด้วยการกำหนด .gemspec ก่อน ตัวอย่างเช่น&lt;/p&gt;
&lt;pre&gt;
$ cat thbrk.gemspec 
Gem::Specification.new do |s|
  s.name        = 'thbrk'
  s.version     = '0.0.0'
  s.date        = '2012-01-25'
  s.summary     = "Thbrk"
  s.description = "Thai word break"
  s.authors     = ["Phuwanart Larpmark"]
  s.email       = 'neokain@gmail.com'
  s.files       = ["lib/thbrk.rb"]
  s.homepage    = 'http://rubygems.org/gems/thbrk'
end
&lt;/pre&gt;

&lt;p&gt;หลังจากนั้นก็ทำการ build&lt;/p&gt;

&lt;pre&gt;
$ gem build thbrk.gemspec
  Successfully built RubyGem
  Name: thbrk
  Version: 0.0.0
  File: thbrk-0.0.0.gem
&lt;/pre&gt;

&lt;p&gt;ซึ่งจะได้ไฟล์ &lt;b&gt;thbrk-0.0.0.gem&lt;/b&gt; ออกมา&lt;/p&gt;

&lt;h2&gt;ติดตั้ง&lt;/h2&gt;
&lt;p&gt;จากนั้นก็ทำการติดตั้ง gem ลงในเครื่อง&lt;/p&gt;
&lt;pre&gt;
$ gem install ./thbrk-0.0.0.gem 
Successfully installed thbrk-0.0.0
1 gem installed
&lt;/pre&gt;

&lt;h2&gt;ทดสอบ&lt;/h2&gt;
&lt;p&gt;และก็ทำการทดสอบว่าใช้งานได้&lt;/p&gt;
&lt;pre&gt;
$ irb -rubygems
 &gt;&gt; require 'thbrk'
 =&gt; true 
 &gt;&gt; Thbrk.say
Hello Gem!!!
&lt;/pre&gt;

&lt;h2&gt;แจกจ่าย&lt;/h2&gt;
&lt;p&gt;ติดตั้งเครื่องกับ rubygems&lt;/p&gt;
&lt;pre&gt;
$ curl -u neokain@gmail.com https://rubygems.org/api/v1/api_key.yaml &gt; ~/.gem/credentials
&lt;/pre&gt;
&lt;p&gt;ส่ง gem ขึ้นไปที่ rubygems&lt;/p&gt;
&lt;pre&gt;
$ gem push thbrk-0.0.0.gem 
Pushing gem to https://rubygems.org...
Successfully registered gem: thbrk (0.0.0)
&lt;/pre&gt;

&lt;p&gt;รอสักพักก็จะสามารถดูได้ว่ามี gem บน rubygems&lt;/p&gt;
&lt;pre&gt;
$ gem list -r thbrk

*** REMOTE GEMS ***

thbrk (0.0.0)
&lt;/pre&gt;

&lt;p&gt;หลังจากนั้นเราก็สามารถที่จะติดตั้ง gem จาก rubygems ได้แล้ว&lt;/p&gt;
&lt;pre&gt;
$ gem install thbrk
Successfully installed thbrk-0.0.0
1 gem installed
&lt;/pre&gt;

&lt;p&gt;ขั้นตอนคร่าวๆ ก็ประมาณนี้ หลังจากนี้ก็แล้วแต่ว่าจะทำอะไรใน gem ตามที่เราต้องการ&lt;/p&gt;

&lt;p&gt;ไปหาอ่านเพิ่มเติมได้ที่ &lt;a href="http://guides.rubygems.org/make-your-own-gem/"&gt;Make your own gem&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3687712341834240678-3539194051219515130?l=neokain.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/MZIf2Twocd7hm495jQv_J1CMRWU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/MZIf2Twocd7hm495jQv_J1CMRWU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/MZIf2Twocd7hm495jQv_J1CMRWU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/MZIf2Twocd7hm495jQv_J1CMRWU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/neokain/~4/rxps5pddqEM" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-26T02:48:18.566+07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://neokain.blogspot.com/2012/01/gem_26.html</feedburner:origLink></item><item><title>ตั้งชื่อ Gem</title><link>http://feedproxy.google.com/~r/neokain/~3/kEuKD8aJG-s/gem.html</link><category>ruby</category><category>rails</category><category>gem</category><author>noreply@blogger.com (Phuwanart Larpmark)</author><pubDate>Wed, 25 Jan 2012 10:19:30 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3687712341834240678.post-8168641090849183803</guid><description>&lt;p&gt;สำหรับการสร้าง gem ขึ้นมาใช้ การตั้งชื่อเป็นเรื่องที่มองข้ามไม่ได้เหมือนกัน โดยที่แนะนำให้ตั้งชื่อจะเป็นดังนี้&lt;/p&gt;

&lt;h2&gt;ใช้ Underscores&lt;/h2&gt;

&lt;ul&gt;
    &lt;li&gt;&lt;a href="https://github.com/thoughtbot/factory_girl"&gt;factory_girl&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="https://github.com/josevalim/inherited_resources"&gt;inherited_resources&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
	ตอนที่กำหนดใน Gemfile จะใช้
&lt;/p&gt;

&lt;pre class="brush: ruby"&gt;
gem 'my_own_gem'
&lt;/pre&gt;

&lt;p&gt;และจะถูกโหลดด้วย&lt;/p&gt;

&lt;pre class="brush: ruby"&gt;
require 'my_own_gem'
&lt;/pre&gt;

&lt;h2&gt;ใช้ Dashes&lt;/h2&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;a href="https://github.com/drbrain/net-http-persistent"&gt;net-http-persistent&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ใน Gemfile จะกำหนดด้วย&lt;/p&gt;

&lt;pre class="brush: ruby"&gt;
gem 'my-own-gem'
&lt;/pre&gt;

&lt;p&gt;ซึ่งจะถูดโหลดด้วย&lt;/p&gt;

&lt;pre class="brush: ruby"&gt;
require 'my-own-gem'
&lt;/pre&gt;


&lt;p&gt;การตั้งชื่อจะส่งผลไปถึงตอนที่สร้างไฟล์ใน gem ด้วย เช่น ใช้ชื่อ gem ว่า 'net-http-persistent' ไฟล์ที่เขียน code  ของ gem จะเป็น 'lib/net/http/persistent.rb' แต่หากไม่เป็นไปตามนี้เราก็สามารถจะกำหนด require เองก็ได้ใน Gemfile หลังชื่อ gem นั้น เช่น &lt;/p&gt;

&lt;pre class="brush: ruby"&gt;
gem 'bcrypt-ruby',  :require =&gt; 'bcrypt'
&lt;/pre&gt;

&lt;p&gt;ที่มา &lt;a href="http://blog.segment7.net/2010/11/15/how-to-name-gems"&gt;How to Name Gems&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3687712341834240678-8168641090849183803?l=neokain.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Bw2e73foWsvykm6ehZBSU8SZnwA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Bw2e73foWsvykm6ehZBSU8SZnwA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Bw2e73foWsvykm6ehZBSU8SZnwA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Bw2e73foWsvykm6ehZBSU8SZnwA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/neokain/~4/kEuKD8aJG-s" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-26T01:19:30.484+07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://neokain.blogspot.com/2012/01/gem.html</feedburner:origLink></item><item><title>เมื่อ log ไหลเร็วจนมองอะไรไม่ทัน</title><link>http://feedproxy.google.com/~r/neokain/~3/PPkHJFlY6XA/log.html</link><category>ruby</category><category>rails</category><author>noreply@blogger.com (Phuwanart Larpmark)</author><pubDate>Thu, 19 Jan 2012 23:06:37 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3687712341834240678.post-46894987479931710</guid><description>&lt;p&gt;ตอนที่กำลังพัฒนา project บางทีก็ต้องการ debug ค่าบางตัว แต่ก็พบว่า log ไหลเร็วเป็นสายน้ำ บางทีย้อนกลับไปก็กว่าจะหาเจอ ก็ทำให้เสียเวลาอ่ะนะ เราแก้ปัญหาเรื่องนี้โดยใช้ tail และ grep ค่าที่ต้องการดูออกมา&lt;/p&gt;

&lt;pre class="brush: bash"&gt;
$ tail -f log/development.log | grep 'ค่าที่ต้องการดู'
&lt;/pre&gt;

&lt;p&gt;โดยใน project เราก็ใส่&lt;/p&gt;

&lt;pre class="brush: ruby"&gt;
puts "ค่าที่ต้องการดู"

# or

logger.debug "ค่าที่ต้องการดู"
&lt;/pre&gt;

&lt;p&gt;จงอย่าเสียเวลาไล่ดู ☺ &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3687712341834240678-46894987479931710?l=neokain.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Xar4WXgf01kyy7lXYKSVZM18C48/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Xar4WXgf01kyy7lXYKSVZM18C48/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Xar4WXgf01kyy7lXYKSVZM18C48/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Xar4WXgf01kyy7lXYKSVZM18C48/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/neokain/~4/PPkHJFlY6XA" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-20T14:06:37.427+07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://neokain.blogspot.com/2012/01/log.html</feedburner:origLink></item><item><title>Emacs Style Tabs in Textmate (Mac only)</title><link>http://feedproxy.google.com/~r/neokain/~3/_AbJLZMxDJg/emacs-style-tabs-in-textmate-mac-only.html</link><category>textmate</category><author>noreply@blogger.com (Phuwanart Larpmark)</author><pubDate>Tue, 24 Jan 2012 01:02:26 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3687712341834240678.post-5144078920275775057</guid><description>&lt;p&gt;&lt;a href="http://tumblelog.motivism.com/post/32458904/emacs-style-tabs-in-textmate-mac-only" class="tumblr_blog"&gt;sahil&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;A few weeks ago I found a way to add emacs style tabbing to Textmate.  Just do the following: &lt;/p&gt; &lt;ul&gt;&lt;li&gt;Start a new macro (apple+option+m)&lt;/li&gt;&lt;li&gt;press: apple+option+[&lt;/li&gt;&lt;li&gt;Stop the Macro (apple+option+m)&lt;/li&gt;&lt;li&gt;Save the macro (apple+ctrl+m)&lt;/li&gt;&lt;li&gt;Assign Activation to “Key Equivalent” and click in the box and hit the Tab key.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Now you have the awesome power of emacs in your favourite text editor!&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3687712341834240678-5144078920275775057?l=neokain.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/cIOepD8MvjB3nSJg3W8_iEuJh8s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cIOepD8MvjB3nSJg3W8_iEuJh8s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/cIOepD8MvjB3nSJg3W8_iEuJh8s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cIOepD8MvjB3nSJg3W8_iEuJh8s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/neokain/~4/_AbJLZMxDJg" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-24T16:02:26.377+07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://neokain.blogspot.com/2012/01/emacs-style-tabs-in-textmate-mac-only.html</feedburner:origLink></item><item><title>uninitialized constant Delayed::Job</title><link>http://feedproxy.google.com/~r/neokain/~3/rXn1VR3jh_8/uninitialized-constant-delayedjob.html</link><category>ruby</category><category>rails</category><author>noreply@blogger.com (Phuwanart Larpmark)</author><pubDate>Fri, 06 Jan 2012 00:24:15 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3687712341834240678.post-7657795074483720246</guid><description>&lt;p&gt;หลังจากที่อัพเดทมาใช้ &lt;code&gt;delayed_job (3.0.0)&lt;/code&gt; ปรากฏว่าเมื่อสั่ง &lt;code&gt;rake jobs:work&lt;/code&gt; จะไม่สามารถทำงานได้ โดยจะมี error ว่า&lt;/p&gt;

&lt;pre class="brush: bash"&gt;
uninitialized constant Delayed::Job
&lt;/pre&gt;

&lt;p&gt;หลังจากที่หาอยู่พักใหญ่ๆ พบว่าต้องลง gem บางตัวเพิ่ม คือ&lt;/p&gt;

&lt;pre class="brush: ruby"&gt;
gem 'delayed_job_active_record'
&lt;/pre&gt;

&lt;p&gt;ซึ่งเราก็เอาไปแทนที่ &lt;code&gt;gem 'delayed_job'&lt;/code&gt; เก่าได้เลย เดี๋ยวมันจะไปลาก &lt;code&gt;delayed_job (3.0.0)&lt;/code&gt; มาลงให้เอง&lt;/p&gt;

&lt;p&gt;ที่ที่ไปเจอมา &lt;a href="https://github.com/collectiveidea/delayed_job/issues/314"&gt;github.com&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3687712341834240678-7657795074483720246?l=neokain.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/PXYniuMpRE91VU8fggR6H7N3e6k/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PXYniuMpRE91VU8fggR6H7N3e6k/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/PXYniuMpRE91VU8fggR6H7N3e6k/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PXYniuMpRE91VU8fggR6H7N3e6k/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/neokain/~4/rXn1VR3jh_8" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-06T15:24:15.717+07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://neokain.blogspot.com/2012/01/uninitialized-constant-delayedjob.html</feedburner:origLink></item><item><title>TextMate : Tabs to Spaces</title><link>http://feedproxy.google.com/~r/neokain/~3/UymwDew6zUk/textmate-tabs-to-spaces.html</link><category>textmate</category><author>noreply@blogger.com (Phuwanart Larpmark)</author><pubDate>Tue, 24 Jan 2012 01:02:10 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3687712341834240678.post-7041767675058734068</guid><description>&lt;!-- Start ScreenSteps Content --&gt;
สำหรับคนที่ใช้ TextMate คงจะเคยเจอมาบ้าง อย่างตอนที่เราทำงานกับ haml เราไม่ต้องการ tab ซึ่งเราจะกำจัด tab ออกไป ธรรมดาก็จะให้ "Tabs to Spaces"
	&lt;div class="LessonContent"&gt;
		
		
			&lt;div class="LessonStep top"&gt;
	    
		&lt;div class="StepImage" style="margin:10px 0px;"&gt;
&lt;img style="padding:3px; border: 1px solid #ccc;" src="http://lh4.ggpht.com/-kLJcHKiMiEE/TwU81bUt7eI/AAAAAAAALTc/Oi4kfiA8N9k/media_1325743206436.png" width="473" height="306" alt="media_1325743206436.png" /&gt;
&lt;/div&gt; 
	&lt;/div&gt;
ที่นี้เราจะรำคาญว่า ทำไมต้องทำทุกครั้งเลย ก็ถ้าไม่อยากทำทุกครั้งก็ไปเลือก "Soft Tabs (Spaces)" เท่านี้ก็จบเรื่อง
	&lt;div class="LessonStep top"&gt;
	    
		&lt;div class="StepImage" style="margin:10px 0px;"&gt;
&lt;img style="padding:3px; border: 1px solid #ccc;" src="http://lh6.ggpht.com/-nv9w5Bf9RAo/TwU8151tL3I/AAAAAAAALTg/SY95YSuudRk/media_1325743271643.png" width="165" height="152" alt="media_1325743271643.png" /&gt;
&lt;/div&gt; 
	&lt;/div&gt;

	&lt;/div&gt;
เขียนไว้กันลืม ไม่มีอะไรมาก เพราะจำได้ว่าเคยหาไปแล้วทีนึง
&lt;!-- End ScreenSteps Content --&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3687712341834240678-7041767675058734068?l=neokain.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/S5MbzN9Ky9MRQFcL9h9vOFDkDNk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/S5MbzN9Ky9MRQFcL9h9vOFDkDNk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/S5MbzN9Ky9MRQFcL9h9vOFDkDNk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/S5MbzN9Ky9MRQFcL9h9vOFDkDNk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/neokain/~4/UymwDew6zUk" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-24T16:02:10.150+07:00</app:edited><media:thumbnail url="http://lh4.ggpht.com/-kLJcHKiMiEE/TwU81bUt7eI/AAAAAAAALTc/Oi4kfiA8N9k/s72-c/media_1325743206436.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://neokain.blogspot.com/2012/01/textmate-tabs-to-spaces.html</feedburner:origLink></item><item><title>การตัดคำภาษาไทยด้วย libthai4r</title><link>http://feedproxy.google.com/~r/neokain/~3/YGuZEbBssps/libthai4r.html</link><category>ruby</category><author>noreply@blogger.com (Phuwanart Larpmark)</author><pubDate>Mon, 26 Dec 2011 02:55:14 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3687712341834240678.post-1339595944914427103</guid><description>&lt;a href="https://github.com/neokain/libthai4r"&gt;libthai4r&lt;/a&gt; เป็น library ง่ายๆ ไม่มีอะไรมาก แค่ตัดคำภาษาไทยได้ ซึ่งต้นฉบับเป็นของ&lt;a href="http://veer66.wordpress.com/about/"&gt;คุณวีร์ สัตยมาศ&lt;/a&gt; (&lt;a href="https://twitter.com/vpublic"&gt;@vpublic&lt;/a&gt;) ซึ่งที่ผมเอามาแก้ไขก็คือให้ compile ด้วย Ruby 1.9.x ได้ และก็หาวิธี compile บน Linux โดยไปอ่านได้ที่ &lt;a href="https://github.com/neokain/libthai4r/blob/master/README.md"&gt;README&lt;/a&gt; ซึ่งอันใหม่ของผมได้เอาขึ้นไว้ที่ github ให้แล้ว&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3687712341834240678-1339595944914427103?l=neokain.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/5-AruEseczpZ5ISeU8KCo0hYBIM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5-AruEseczpZ5ISeU8KCo0hYBIM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/5-AruEseczpZ5ISeU8KCo0hYBIM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5-AruEseczpZ5ISeU8KCo0hYBIM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/neokain/~4/YGuZEbBssps" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-26T17:55:14.335+07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://neokain.blogspot.com/2011/12/libthai4r.html</feedburner:origLink></item><item><title>ไม่ให้แสดง assets ใน log</title><link>http://feedproxy.google.com/~r/neokain/~3/x68LDX57Fq8/assets-log.html</link><category>rails</category><author>noreply@blogger.com (Phuwanart Larpmark)</author><pubDate>Thu, 08 Dec 2011 10:09:20 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3687712341834240678.post-698173569745003383</guid><description>&lt;p&gt;ตั้งแต่เป็น Rails 3.1 มา ใน log จะแสดง assets ทำให้เวลาเราอ่านหรือต้องการจะดู log ก็มักจะมองไม่ทัน&lt;/p&gt;	
&lt;!-- Start ScreenSteps Content --&gt;
	&lt;div class="LessonContent"&gt;
		
		
			&lt;div class="LessonStep top"&gt;
	    
		&lt;div class="StepImage" style="margin:10px 0px;"&gt;
&lt;img style="padding:3px; border: 1px solid #ccc;" src="http://lh4.ggpht.com/-zXYZiWMERi4/TuD7WoAF_5I/AAAAAAAAKd0/o0kqOxDa66Q/media_1323367108549.png" width="532" height="186" alt="media_1323367108549.png" /&gt;
&lt;/div&gt; 
	&lt;/div&gt;

	&lt;/div&gt;
&lt;!-- End ScreenSteps Content --&gt;

&lt;p&gt;ให้เอา code นี้ไปไว้ที่ &lt;span&gt;config/initializers&lt;/span&gt;&lt;/p&gt;
&lt;script src="https://gist.github.com/1447860.js"&gt;&lt;/script&gt;

&lt;p&gt;ที่มา: &lt;a href="http://stackoverflow.com/questions/6312448/how-to-disable-logging-of-asset-pipeline-sprockets-messages-in-rails-3-1"&gt;How to disable logging of asset pipeline (sprockets) messages in Rails 3.1?&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3687712341834240678-698173569745003383?l=neokain.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/eLsxhG0LTpRevu-BGqQ5HVwdEEw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eLsxhG0LTpRevu-BGqQ5HVwdEEw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/eLsxhG0LTpRevu-BGqQ5HVwdEEw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eLsxhG0LTpRevu-BGqQ5HVwdEEw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/neokain/~4/x68LDX57Fq8" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-09T01:09:20.953+07:00</app:edited><media:thumbnail url="http://lh4.ggpht.com/-zXYZiWMERi4/TuD7WoAF_5I/AAAAAAAAKd0/o0kqOxDa66Q/s72-c/media_1323367108549.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://neokain.blogspot.com/2011/12/assets-log.html</feedburner:origLink></item><item><title>มาทำให้ log ของ rails server มันอ่านรู้เรื่อง</title><link>http://feedproxy.google.com/~r/neokain/~3/d-s_NewtuNk/log-rails-server.html</link><category>rails</category><author>noreply@blogger.com (Phuwanart Larpmark)</author><pubDate>Wed, 11 Jan 2012 21:18:18 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3687712341834240678.post-4462791226561674737</guid><description>&lt;p&gt;หน้าตาของ log ที่เราคุ้นเคยกัน&lt;/p&gt;
&lt;div class="StepImage" style="margin:10px 0px;"&gt;
&lt;img style="padding:3px; border: 1px solid #ccc;" src="http://lh4.ggpht.com/-kzIeErK-W5c/TuD0CVdWz1I/AAAAAAAAKdk/_brMPqllgqo/media_1323365159624.png" width="532" height="208" alt="media_1323365159624.png" /&gt;
&lt;/div&gt; 

&lt;p&gt;ให้เอา code นี้ใส่ใน config/initializers จากนั้นก็ restart server&lt;/p&gt;
&lt;script src="https://gist.github.com/1447728.js"&gt; &lt;/script&gt;

&lt;p&gt;หน้าตาใหม่ของ log ไม่รู้ว่าจะอ่านได้รู้เรื่องขึ้นหรือเปล่า :P&lt;/p&gt;
&lt;div class="StepImage" style="margin:10px 0px;"&gt;
&lt;img style="padding:3px; border: 1px solid #ccc;" src="http://lh4.ggpht.com/-Nk34dhdlutI/TuD0DC9_CiI/AAAAAAAAKdo/2689-pbaAOw/media_1323365274152.png" width="532" height="109" alt="media_1323365274152.png" /&gt;
&lt;/div&gt; 

&lt;p&gt;ที่มา: &lt;a href="http://cbpowell.wordpress.com/2011/12/08/humorously-informative-rails-logging/"&gt;Humorously informative Rails logging&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3687712341834240678-4462791226561674737?l=neokain.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/7sGemwlc0sTu_smACGUWUXVnLbk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7sGemwlc0sTu_smACGUWUXVnLbk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/7sGemwlc0sTu_smACGUWUXVnLbk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7sGemwlc0sTu_smACGUWUXVnLbk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/neokain/~4/d-s_NewtuNk" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-12T12:18:18.333+07:00</app:edited><media:thumbnail url="http://lh4.ggpht.com/-kzIeErK-W5c/TuD0CVdWz1I/AAAAAAAAKdk/_brMPqllgqo/s72-c/media_1323365159624.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://neokain.blogspot.com/2011/12/log-rails-server.html</feedburner:origLink></item><item><title>MagicalRecord สำหรับคนที่เจ็บปวดกับ Core Data</title><link>http://feedproxy.google.com/~r/neokain/~3/3f2wcearnDs/magicalrecord-core-data.html</link><category>iOS</category><author>noreply@blogger.com (Phuwanart Larpmark)</author><pubDate>Mon, 12 Dec 2011 22:56:24 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3687712341834240678.post-2878752341685318284</guid><description>&lt;p&gt;กับผมแล้วคิดว่าเรื่อง Core Data เป็นเรื่องที่ค่อนข้างจะยาก เพราะต้องทำอะไรมากมายกว่าจะใช้งานได้และวิธีการใช้งานก็ใช้ว่าผมจะเข้าใจมันดีเท่าไรนัก ก็โชคดีที่มีคนใจดีทำ &lt;a href="https://github.com/magicalpanda/MagicalRecord"&gt;MagicalRecord&lt;/a&gt; ไว้ให้ ทำให้การใช้งาน Core Data บน iOS ง่ายขึ้น&lt;/p&gt;
&lt;h2 class="StepImage" style="margin: 10px 0px;"&gt;Install&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;ให้โคลน MagicalRecord จาก github ลงมาก่อน&lt;/li&gt;
&lt;pre class="brush: bash"&gt;git clone https://github.com/magicalpanda/MagicalRecord.git&lt;/pre&gt;
&lt;li&gt;ต่อจากนั้นให้เราลากโค๊ดที่อยู่ใน Source ลง Xcode ใน project ที่เราต้องการ&lt;/li&gt;
&lt;div class="LessonContent"&gt;
&lt;div class="StepImage" style="margin: 10px 0px;"&gt;&lt;img style="border: 1px solid #ccc; padding: 3px;" src="http://lh3.ggpht.com/-93LeILfmKVw/Tt9xAR26a4I/AAAAAAAAKdc/_iDmN9HWEjE/s512/media_1323266013137.png" alt="media_1323266013137.png" width="532" height="200" /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;li&gt;จากนั้นให้ Import &lt;em&gt;CoreData+MagicalRecord.h&lt;/em&gt; ที่ AppDelegate เป็นอันเสร็จสิ้นการติดตั้ง&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 class="StepImage" style="margin: 10px 0px;"&gt;Setting&lt;/h2&gt;
&lt;p&gt;ขั้นนี้ถ้าไปอ่าน README ของ MagicalRecord ก็จะทราบว่ามีอะไรให้ใช้บ้าง แต่ที่ผมเลือกใช้คือ&lt;/p&gt;
&lt;pre class="brush: cpp"&gt;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    ...
    [MagicalRecordHelpers setupCoreDataStack];
    [MagicalRecordHelpers cleanUp];
    ...
}
&lt;/pre&gt;
&lt;h3&gt;Default Managed Object Context&lt;/h3&gt;
&lt;p&gt;อันนี้ก็มีใน README อธิบายไว้ ซึ่งเค้าได้เสมอการทำไว้หลายอย่างอยู่เหมือนกัน แต่ที่ผมเลือกใช้&lt;/p&gt;
&lt;pre class="brush: cpp"&gt;
[NSManagedObjectContext MR_setDefaultContext:[NSManagedObjectContext MR_context]];
&lt;/pre&gt;
&lt;p&gt;ซึ่งส่วนนี้จะอยู่ต่อจาก &lt;em&gt;cleanUp&lt;/em&gt;&lt;/p&gt;
&lt;h2 class="StepImage" style="margin: 10px 0px;"&gt;CRUD&lt;/h2&gt;
&lt;p&gt;ต่อไปก็มาถึงการใช้ ซึ่งจะแบ่งเป็น 4 แบบคือ Create, Read, Update, Delete&lt;/p&gt;

&lt;h3&gt;Read&lt;/h3&gt;
&lt;p&gt;ถ้าสมมุติว่ามี Entity ชื่อ Document การจะอ่านข้อมูลมาจะทำได้โดย&lt;/p&gt;
&lt;pre class="brush: cpp"&gt;
NSArray *documents = [Document MR_findAll];
&lt;/pre&gt;
&lt;p&gt;ซึ่งผลลัพธ์จะถูกส่งกลับมาเป็น Array ซึ่งอันนี้เป็นพื้นๆ อย่างง่ายๆ ถ้าอยากรู้เพิ่มก็ไปอ่านใน README&lt;/p&gt;

&lt;h3&gt;Create&lt;/h3&gt;
&lt;p&gt;การสร้างข้อมูลก็ทำได้แบบนี้&lt;/p&gt;
&lt;pre class="brush: cpp"&gt;
Document *doc = [Document MR_createEntity];
&lt;/pre&gt;
&lt;p&gt;หลังจากนั้นเราก็กำหนดค่าต่างให้ &lt;em&gt;doc&lt;/em&gt; หลังจากนั้นก็ &lt;em&gt;save&lt;/em&gt; ก็เสร็จ&lt;/p&gt;
&lt;pre class="brush: cpp"&gt;
NSError *error = nil;
if (![doc.managedObjectContext save:&amp;error]) {
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}
&lt;/pre&gt;

&lt;h3&gt;Update&lt;/h3&gt;
&lt;p&gt;ส่วนการ update ข้อมูลที่ต้องการ ก็ให้ดัดแปลงเอาจาก การอ่านข้อมูลตัวที่ต้องการให้ได้ จากนั้นก็เปลี่ยนเปลงค่า แล้วก็ &lt;em&gt;save&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;Delete&lt;/h3&gt;
&lt;p&gt;การลบก็ไม่ให้เลือกข้อมูลตัวที่ต้องการลบ แล้วก็สั่งลบได้ตามนี้&lt;/p&gt;
&lt;pre class="brush: cpp"&gt;
Document *doc = ...;
[doc  MR_deleteEntity];
&lt;/pre&gt;

&lt;p&gt;ที่เหลือก็ไปหาอ่านได้จาก README แต่เท่าที่ใช้สำหรับผมก็เท่านี้แหละ :P&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3687712341834240678-2878752341685318284?l=neokain.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/F9VgIYd7RioHshq81ny9lQmlR0o/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/F9VgIYd7RioHshq81ny9lQmlR0o/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/F9VgIYd7RioHshq81ny9lQmlR0o/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/F9VgIYd7RioHshq81ny9lQmlR0o/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/neokain/~4/3f2wcearnDs" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-13T13:56:24.693+07:00</app:edited><media:thumbnail url="http://lh3.ggpht.com/-93LeILfmKVw/Tt9xAR26a4I/AAAAAAAAKdc/_iDmN9HWEjE/s72-c/media_1323266013137.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://neokain.blogspot.com/2011/12/magicalrecord-core-data.html</feedburner:origLink></item><item><title>ActiveAdmin บน Heroku</title><link>http://feedproxy.google.com/~r/neokain/~3/8KuTYukJkNc/activeadmin-heroku.html</link><category>rails</category><category>heroku</category><author>noreply@blogger.com (Phuwanart Larpmark)</author><pubDate>Wed, 07 Dec 2011 01:20:25 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3687712341834240678.post-5012776632985985434</guid><description>&lt;p&gt;เหมือนจะเป็นเรื่องง่ายๆ และไม่มีอะไรมากมาย กับการที่จะใช้ &lt;a href="http://activeadmin.info/"&gt;ActiveAdmin&lt;/a&gt; บน &lt;a href="http://www.heroku.com/"&gt;Heroku&lt;/a&gt; แต่ตั้งแต่ Rails 3.1 ที่ได้มีรวมเอา image, js, css มารวมไว้เป็น assets นั้น ก็ทำให้มีปัญหากับ Heroku นิดหน่อย&lt;/p&gt;

&lt;p&gt;ลง gem ที่จำเป็นสำหรับ ActiveAdmin&lt;/p&gt;
&lt;pre class="brush: rails"&gt;
# Gemfile
gem 'haml'
gem 'sass'
gem 'sass-rails'
gem 'activeadmin'
&lt;/pre&gt;

&lt;p&gt;ลง gem ที่ต้องใช้บน Heroku&lt;/p&gt;
&lt;pre class="brush: rails"&gt;
# Gemfile
group :production do
  gem 'pg'
  gem 'therubyracer'
  gem 'dalli'
end
&lt;/pre&gt;

&lt;p&gt;จากนั้นก็แก้ environment ของ production&lt;/p&gt;
&lt;pre class="brush: rails"&gt;  
# config/environments/production.rb
config.assets.compile = true
config.assets.initialize_on_precompile = false
&lt;/pre&gt;

&lt;p&gt;เพิ่ม initializer สำหรับ ActiveAdmin บน Heroku&lt;/p&gt;
&lt;pre class="brush: rails"&gt;
# config/initializers/active_admin_heroku.rb
if Rails.env.production?
  require 'fileutils'
  FileUtils.mkdir_p(Rails.root.join("tmp", "stylesheets", "admin"))

  template_path_one = "#{Gem.loaded_specs['activeadmin'].full_gem_path}/app/assets/stylesheets"
  template_path_two = "#{Gem.loaded_specs['activeadmin'].full_gem_path}/lib/active_admin/sass"
  old_compile_path = "#{Rails.root}/public/assets/admin"
  new_compile_path = "#{Rails.root}/tmp/assets/admin"

  Sass::Plugin::remove_template_location template_path_one
  Sass::Plugin::add_template_location template_path_one, new_compile_path

  Sass::Plugin::remove_template_location template_path_two
  Sass::Plugin::add_template_location template_path_two, new_compile_path
end
&lt;/pre&gt;

&lt;p&gt;ตามนี้ก็เป็นอันว่าเรียบร้อย ที่นี้ก็ใช้งานได้ล่ะ &lt;a href="http://iadmin.heroku.com/admin"&gt;Demo&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3687712341834240678-5012776632985985434?l=neokain.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4N8yJ5VDRF_6BN9M4xt4zPUA8CE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4N8yJ5VDRF_6BN9M4xt4zPUA8CE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4N8yJ5VDRF_6BN9M4xt4zPUA8CE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4N8yJ5VDRF_6BN9M4xt4zPUA8CE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/neokain/~4/8KuTYukJkNc" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-07T16:20:25.260+07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://neokain.blogspot.com/2011/11/activeadmin-heroku.html</feedburner:origLink></item><item><title>สร้างแอพฯ ของตัวเองบน Smart Phone แบบไวๆ</title><link>http://feedproxy.google.com/~r/neokain/~3/Q6sOIE0_Kr0/smart-phone.html</link><category>iOS</category><author>noreply@blogger.com (Phuwanart Larpmark)</author><pubDate>Mon, 08 Aug 2011 23:43:20 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3687712341834240678.post-5787013798332206081</guid><description>&lt;p&gt;ตอนนี้ไม่ว่าใครๆ ก็อยากจะมีแอฟฯ ของตัวเองที่อยู่บน Smart Phone สำหรับ &lt;a href="http://www.appmakr.com/"&gt;AppMakr&lt;/a&gt; นี้ก็ทำให้เราสามารถทำแอฟฯ โง่ๆ ง่ายๆ ที่ไม่ได้ต้องการอะไรมาก นอกจากการเอาไว้ดูเนื้อหาที่ต่างๆ ที่เป็นของเรา เช่น RSS, Twitter&lt;/p&gt;
&lt;p&gt;ที่นี้ถ้าจะเอามาใช้สำหรับองกรณ์หรือหน่วยงานที่มีเนื้อหาต่างๆ อยู่แล้ว แต่ต้องการเพิ่มช่องทางในการนำเสนอนั้น ตัวนี้ก็น่าสนใจเอามาใช้งานได้เลย แต่หากว่าเราจะลองโคลนระบบนี้ดูแล้วก็คงไม่น่ายาก แต่อาจจะใช้เวลาพอสมควร&lt;/p&gt;
&lt;p&gt;เอาเป็นว่า ตอนนี้ใช้ตัวนี้ไปก่อนก็แล้วกัน :)&lt;/p&gt;
&lt;p&gt;&lt;iframe src="http://www.youtube.com/embed/CHA30A8TLOQ?fs=1" width="480" height="295" frameborder="0"&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;*ผู้แนะนำ @&lt;a href="http://twitter.com/apirak"&gt;apirak&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3687712341834240678-5787013798332206081?l=neokain.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/NWbAB1fVWmMclka3M4bZl954YoQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NWbAB1fVWmMclka3M4bZl954YoQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/NWbAB1fVWmMclka3M4bZl954YoQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NWbAB1fVWmMclka3M4bZl954YoQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/neokain/~4/Q6sOIE0_Kr0" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-09T13:43:20.818+07:00</app:edited><media:thumbnail url="http://img.youtube.com/vi/CHA30A8TLOQ/default.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://neokain.blogspot.com/2011/07/smart-phone.html</feedburner:origLink></item><item><title>จะทำ gem เป็นของตัวเอง?</title><link>http://feedproxy.google.com/~r/neokain/~3/UvsNH5v8dvg/gem.html</link><category>ruby</category><category>rails</category><category>gem</category><author>noreply@blogger.com (Phuwanart Larpmark)</author><pubDate>Mon, 18 Jul 2011 02:59:41 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3687712341834240678.post-1688806400831767613</guid><description>&lt;p&gt;จากแต่ก่อนที่เราจะทำ plugin เพื่อเสริมการทำงานให้ใน project ของเรา ต่อมาเค้าก็นิยมทำเป็น gems กัน เพื่อให้สามารถเอามาใช้และจัดการได้ง่ายๆ ซึ่งวิธีที่จะทำสามารถไปดูได้ที่ &lt;a href="http://guides.rubygems.org/make-your-own-gem/"&gt;Make your own gem - RubyGems Guides&lt;/a&gt; และถ้า gem ของเราเจ๋งจริงก็อาจจะถูกเอาไปรวมใน frameworke ด้วยก็ได้ :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3687712341834240678-1688806400831767613?l=neokain.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/aH9uDK1tWnbRcywe6JPimzfXPfQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aH9uDK1tWnbRcywe6JPimzfXPfQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/aH9uDK1tWnbRcywe6JPimzfXPfQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aH9uDK1tWnbRcywe6JPimzfXPfQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/neokain/~4/UvsNH5v8dvg" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-18T16:59:41.467+07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://neokain.blogspot.com/2011/07/gem.html</feedburner:origLink></item><item><title>ทำ Grid View บน iOS ด้วย AQGridView</title><link>http://feedproxy.google.com/~r/neokain/~3/ISKo2NgG2y4/grid-view-ios-aqgridview.html</link><category>iOS</category><author>noreply@blogger.com (Phuwanart Larpmark)</author><pubDate>Wed, 03 Aug 2011 01:14:35 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3687712341834240678.post-4535573366748481616</guid><description>&lt;p&gt;ก็ถ้าใครคิดอยากจะทำ app ที่มีการเรียงข้อมูลเป็น grid อย่างเช่น เรียงรูปภาพแบบเป็น grid ก็คงจะเจอว่ามันไม่ได้ทำกันง่ายๆ แต่ก็โชคดีที่มีคนทำเป็น open souece เอาไว้ให้แล้ว ซึ่งก็คือ&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/AlanQuatermain/AQGridView"&gt;AQGridView&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ซึ่งการใช้งานก็ไม่ยากเย็นอะไร เริ่มจากไป clone จาก github&lt;/p&gt;
&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" title="Screen Shot 2554-07-29 at 1.54.17 PM.png" src="http://lh4.ggpht.com/-LSSpvm6UWSA/TjJZPpkTl1I/AAAAAAAAKXQ/sfoarj_cpIo/Screen%252520Shot%2525202554-07-29%252520at%2525201.54.17%252520PM.png?imgmax=800" border="0" alt="Screen Shot 2554 07 29 at 1 54 17 PM" width="410" height="451" /&gt;&lt;/p&gt;
&lt;p&gt;source ที่เราต้องการใช้จะอยู่ใน Class จากนั้นก็ลากไปลง Project ที่เราต้องการจะใช้&lt;/p&gt;
&lt;p&gt;ที่สำคัญคืออย่าลืมเอา QuartzCore.frameword เข้ามาด้วย&lt;/p&gt;
&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" title="LittleSnapper1.png" src="http://lh6.ggpht.com/-qAFDy2gf8Os/TjJaGTZOQwI/AAAAAAAAKXc/1O0NPc0xv88/LittleSnapper1.png?imgmax=800" border="0" alt="LittleSnapper1" width="500" height="142" /&gt;&lt;/p&gt;
&lt;p&gt;ที่เหลือก็ดูได้จากตัวอย่างที่เค้าทำไว้&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3687712341834240678-4535573366748481616?l=neokain.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/SADNYDtDs6R1Feov3iSvOD6u6vI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SADNYDtDs6R1Feov3iSvOD6u6vI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/SADNYDtDs6R1Feov3iSvOD6u6vI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SADNYDtDs6R1Feov3iSvOD6u6vI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/neokain/~4/ISKo2NgG2y4" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-03T15:14:35.735+07:00</app:edited><media:thumbnail url="http://lh4.ggpht.com/-LSSpvm6UWSA/TjJZPpkTl1I/AAAAAAAAKXQ/sfoarj_cpIo/s72-c/Screen%252520Shot%2525202554-07-29%252520at%2525201.54.17%252520PM.png?imgmax=800" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://neokain.blogspot.com/2011/07/grid-view-ios-aqgridview.html</feedburner:origLink></item><item><title>Open Source: Library For Easy Data Saving/Loading</title><link>http://feedproxy.google.com/~r/neokain/~3/Rczfo9x8-tc/open-source-library-for-easy-data.html</link><category>iOS</category><author>noreply@blogger.com (Phuwanart Larpmark)</author><pubDate>Mon, 11 Jul 2011 02:08:44 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3687712341834240678.post-7646817370627382853</guid><description>&lt;div class="posterous_autopost"&gt;&lt;div class="posterous_bookmarklet_entry"&gt;&lt;blockquote&gt;&lt;div&gt;&lt;p&gt;There are many ways to save data on iOS devices.  Some like a database are likely overkill for a game, and other methods like serialization are great, but things could still be easier.&lt;/p&gt;&lt;p&gt;I’ve found a very cool time saving library that allows you to easily save and load ints, floats, and NSString’s to an automatically created .PLIST file.  No fuss at all just one line of code to save, or one line to load each of these datatypes.  A nice simple quick solution if you want to install some simple data saving into an app.  If you need to save a few floats of game data it is an ideal solution.&lt;/p&gt;&lt;p&gt;The library is ABLFXSaveSystem from Alexander Blunck and can be found on Github here:   &lt;a href="https://github.com/ablfx/ABLFXSaveSystem" target="_blank"&gt;https://github.com/ablfx/ABLFXSaveSystem&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="https://github.com/ablfx/ABLFXSaveSystem" target="_blank"&gt;&lt;/a&gt;A cool example of a simple, but useful open source library.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div class="posterous_quote_citation"&gt;via &lt;a href="http://feedproxy.google.com/~r/maniacdev/~3/4ULxrvp9ON8/"&gt;feedproxy.google.com&lt;/a&gt;&lt;/div&gt;&lt;p&gt;ท่าทางจะเอามาใช้แทน plist ได้&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3687712341834240678-7646817370627382853?l=neokain.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/zwADeX1JgiESZB4Ef8rQqZ8gUpc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zwADeX1JgiESZB4Ef8rQqZ8gUpc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/zwADeX1JgiESZB4Ef8rQqZ8gUpc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zwADeX1JgiESZB4Ef8rQqZ8gUpc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/neokain/~4/Rczfo9x8-tc" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-11T16:08:44.460+07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://neokain.blogspot.com/2011/07/open-source-library-for-easy-data.html</feedburner:origLink></item><item><title>Open Source: Lightweight Asynchronous Networking Library For Easy Communication With Web Services</title><link>http://feedproxy.google.com/~r/neokain/~3/Yd9UBFyZBiY/open-source-lightweight-asynchronous.html</link><category>iOS</category><author>noreply@blogger.com (Phuwanart Larpmark)</author><pubDate>Mon, 11 Jul 2011 02:08:55 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3687712341834240678.post-1723881153589303053</guid><description>&lt;div class="posterous_autopost"&gt;&lt;div class="posterous_bookmarklet_entry"&gt;&lt;blockquote&gt;&lt;div&gt;&lt;p&gt;There are many networking libraries available.  Some are extremely complicated with a vast number of features.  This library is somewhat different and is extremely lightweight.&lt;/p&gt;&lt;p&gt;What I really like about this library is how efficient it is to code.  By taking full advantage of Objective-C blocks introduced in iOS 4 you can create fairly complex networking interactions with very little code, and perform multiple requests asynchronously with ease.  With the library you can easily download and parse json code, download images, communicate with REST services, and more.&lt;/p&gt;&lt;p&gt;The library is AFNetworking  from Scott Raymond and Matt Thompson, and included with the library is an excellent sample project demonstrating usage of the library by gathering nearby spots from the Gowalla social network.&lt;/p&gt;&lt;p&gt;You can find the Github project here:   &lt;a href="https://github.com/gowalla/AFNetworking"&gt;https://github.com/gowalla/AFNetworking&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Looks like a great library if you want to communicate with web services, but don’t need to do anything overly complex.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div class="posterous_quote_citation"&gt;via &lt;a href="http://maniacdev.com/2011/07/open-source-lightweight-asynchronous-networking-library-web-services/"&gt;maniacdev.com&lt;/a&gt;&lt;/div&gt;&lt;p&gt;น่าจะช่วยให้เราทำพวก Web Services ได้ง่ายๆ นะ ก็เป็นทางเลือกไว้ก่อน&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3687712341834240678-1723881153589303053?l=neokain.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/NyiC5O1RbLndsbid0aVXyR8K8Fw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NyiC5O1RbLndsbid0aVXyR8K8Fw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/NyiC5O1RbLndsbid0aVXyR8K8Fw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NyiC5O1RbLndsbid0aVXyR8K8Fw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/neokain/~4/Yd9UBFyZBiY" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-11T16:08:55.277+07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://neokain.blogspot.com/2011/07/open-source-lightweight-asynchronous.html</feedburner:origLink></item><item><title>Synchronizing Core Data With Rails</title><link>http://feedproxy.google.com/~r/neokain/~3/XtUTlNwOxW8/synchronizing-core-data-with-rails-view.html</link><category>rails</category><category>iOS</category><author>noreply@blogger.com (Phuwanart Larpmark)</author><pubDate>Mon, 23 May 2011 00:12:16 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3687712341834240678.post-1966276762796098109</guid><description>&lt;p&gt;จริงๆ แล้ว เรื่องนี้มี presentation มาตั้งนานแล้วล่ะ และก็คิดว่าต่อไปมันจะได้ใช้มากขึ้น เพราะว่าเดี๋ยวนี้ app บน iOS นั้นมีหลายตัวที่ไม่ได้เก็บข้อมูลไว้บนเครื่องแต่ใช้ข้อมูลจาก server ข้อมูล เพราะงั้นจึงเห็นว่า ตัวเราน่าจะศึกษาเรื่องนี้ให้จริงๆ จังๆ ได้แล้ว :)&lt;img style="visibility: hidden; width: 0px; height: 0px;" src="http://c.gigcount.com/wildfire/IMP/CXNID=2000002.0NXC/bHQ9MTMwNjEzNDE3OTA4MCZwdD*xMzA2MTM*MjA2MTc3JnA9MTAxOTEmZD*mbj1ibG9nZ2VyJmc9MSZvPTBmZDRhY2U5M2EwZDQw/MTU5NzY*NDU5OTkxZTJjODAwJm9mPTA=.gif" border="0" alt="" width="0" height="0" /&gt;&lt;/p&gt;&lt;div id="__ss_3143799" style="width: 425px;"&gt;&lt;strong style="display: block; margin: 12px 0 4px;"&gt;&lt;a title="Synchronizing Core Data With Rails" href="http://www.slideshare.net/metaskills/synchronizing-core-data-with-rails"&gt;Synchronizing Core Data With Rails&lt;/a&gt;&lt;/strong&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=synchronizingcoredatawithrailswebapplications-100211204432-phpapp01&amp;amp;stripped_title=synchronizing-core-data-with-rails&amp;amp;userName=metaskills" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=synchronizingcoredatawithrailswebapplications-100211204432-phpapp01&amp;amp;stripped_title=synchronizing-core-data-with-rails&amp;amp;userName=metaskills" name="__sse3143799" allowscriptaccess="always" allowfullscreen="true" flashvars="gig_lt=1306134179080&amp;amp;gig_pt=1306134206177&amp;amp;gig_g=1&amp;amp;gig_n=blogger"&gt;&lt;/embed&gt;&lt;param name="FlashVars" value="gig_lt=1306134179080&amp;amp;gig_pt=1306134206177&amp;amp;gig_g=1&amp;amp;gig_n=blogger" /&gt;&lt;/object&gt;&lt;div style="padding: 5px 0 12px;"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/metaskills"&gt;Ken Collins&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3687712341834240678-1966276762796098109?l=neokain.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ScCnKdgPAt77WqQDZh_4NzzVTLw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ScCnKdgPAt77WqQDZh_4NzzVTLw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ScCnKdgPAt77WqQDZh_4NzzVTLw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ScCnKdgPAt77WqQDZh_4NzzVTLw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/neokain/~4/XtUTlNwOxW8" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-23T14:12:16.186+07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><media:content url="http://feedproxy.google.com/~r/neokain/~5/Qt8aTBqJwio/ssplayer2.swf" fileSize="113234" type="application/x-shockwave-flash" /><itunes:explicit>no</itunes:explicit><itunes:subtitle> จริงๆ แล้ว เรื่องนี้มี presentation มาตั้งนานแล้วล่ะ และก็คิดว่าต่อไปมันจะได้ใช้มากขึ้น เพราะว่าเดี๋ยวนี้ app บน iOS นั้นมีหลายตัวที่ไม่ได้เก็บข้อมูลไว้บนเครื่องแต่ใช้ข้อมูลจาก server ข้อมูล เพราะงั้นจึงเห็นว่า ตัวเราน่าจะศึกษาเรื่องนี้ให้จริงๆ จังๆ ได้แ</itunes:subtitle><itunes:author>noreply@blogger.com (Phuwanart Larpmark)</itunes:author><itunes:summary> จริงๆ แล้ว เรื่องนี้มี presentation มาตั้งนานแล้วล่ะ และก็คิดว่าต่อไปมันจะได้ใช้มากขึ้น เพราะว่าเดี๋ยวนี้ app บน iOS นั้นมีหลายตัวที่ไม่ได้เก็บข้อมูลไว้บนเครื่องแต่ใช้ข้อมูลจาก server ข้อมูล เพราะงั้นจึงเห็นว่า ตัวเราน่าจะศึกษาเรื่องนี้ให้จริงๆ จังๆ ได้แล้ว :)Synchronizing Core Data With RailsView more presentations from Ken Collins</itunes:summary><itunes:keywords>rails, iOS</itunes:keywords><feedburner:origLink>http://neokain.blogspot.com/2011/05/synchronizing-core-data-with-rails-view.html</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/neokain/~5/Qt8aTBqJwio/ssplayer2.swf" length="113234" type="application/x-shockwave-flash" /><feedburner:origEnclosureLink>http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=synchronizingcoredatawithrailswebapplications-100211204432-phpapp01&amp;amp;stripped_title=synchronizing-core-data-with-rails&amp;amp;userName=metaskills</feedburner:origEnclosureLink></item><item><title>ทำ Host Git Repository โดยใช้ Gitosis บน Mac OS X</title><link>http://feedproxy.google.com/~r/neokain/~3/Cl64pA9OaUA/host-git-repository-gitosis-mac-os-x.html</link><category>git</category><category>gitosis</category><author>noreply@blogger.com (Phuwanart Larpmark)</author><pubDate>Mon, 24 Oct 2011 01:07:12 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3687712341834240678.post-5435669662742569694</guid><description>&lt;p&gt;Gitosis เป็นตัวที่ไว้ทำ host ของ git repository อย่างง่ายๆ ก็ในกรณีที่เราอยากจะตั้ง host ขึ้นมาเอง โดยที่ไม่ต้องไปพึง githup หรือ host git ที่อื่นๆ ซึ่งการทำ host โดยใช้ gitosis นั้นก็มีคนเขียนเอาไว้ให้อ่านแล้ว (&lt;a href="http://scie.nti.st/2007/11/14/hosting-git-repositories-the-easy-and-secure-way"&gt;Hosting Git repositories, The Easy (and Secure) Way&lt;/a&gt;) ก็สามารถทำตามได้ แต่ในที่นี้จะเป็นการติดตั้ง host ของ git บน Mac OS X ซึ่งเครื่องที่เอามาใช้ ก็เป็น Mac ธรรมดา&lt;/p&gt;
&lt;p&gt;ก่อนที่จะเริ่มกัน ก็ให้ลง git บน Mac OS X ให้เป็นที่เรียบร้อยซะก่อน ปกติก็ไปหา .dmg มาลง หรือไม่ก็ใช้ MacPorts&lt;/p&gt;
&lt;h2&gt;Install gitosis&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1) &lt;/strong&gt;ให้ทำการ clone gitosis ลงมาก่อน จากนั้นก็ทำการคิดตั้ง ซึ่งมันเป็น python ก็แปลว่าก็ต้องมี python ซึ่ง Mac OS X จะมีมาให้แล้ว&lt;/p&gt;
&lt;pre class="brush: bash"&gt;$ git clone git://eagain.net/gitosis.git
$ sudo python setup.py install
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;2) &lt;/strong&gt;จากนั้นให้ทำการสร้าง account ขึ้นมาใหม่ ให้ไปที่ System Preferences &amp;gt; Accounts และ add user เข้าไป โดยจะให้ชื่อ Account name: ว่า 'git' และไม่ต้องมี password&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3)&lt;/strong&gt; จากนั้นให้เรา log in เข้าไปที่ user git ที่สร้างขึ้นใหม่นี้ ให้สร้าง .bashrc และเพิ่มบรรทัดนี้ลงไป&lt;/p&gt;
&lt;pre class="brush: bash"&gt;PATH=/usr/local/bin:/usr/local/git/bin:$PATH&lt;/pre&gt;
&lt;p&gt;จากนั้นก็ให้เปิด Remote Login (System Preferences &amp;gt; Sharing) เพื่อให้สามารถ ssh เข้ามาที่ user git ได้&lt;/p&gt;
&lt;p&gt;จากนั้นก็ log out ออกไปและ log in เข้า user ปกติ (Admin)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4)&lt;/strong&gt; ให้สร้าง SSH key โดยใช้คำสั่งนี้&lt;/p&gt;
&lt;pre class="brush: bash"&gt;$ ssh-keygen -t rsa&lt;/pre&gt;
&lt;p&gt;เมื่อสร้างแล้ว key จะถูกเก็บไว้ที่ ~/.ssh จากนั้นก็ให้สั่ง&lt;/p&gt;
&lt;pre class="brush: bash"&gt;$ sudo -H -u git gitosis-init &amp;lt; [path of your id_rsa.pub]&lt;/pre&gt;
&lt;p&gt;ซึ่งจะได้ผลประมาณนี้&lt;/p&gt;
&lt;pre class="brush: bash"&gt;Initialized empty Git repository in /Users/git/repositories/gitosis-admin.git/
Initialized empty Git repository in /Users/git/repositories/gitosis-admin.git/&lt;/pre&gt;
&lt;p&gt;เมื่อผ่านตรงนี้ไปแล้วจะได้โฟลเดอร์ reposistories ที่ account 'git' จากนั้นให้เราทำคำสั่งนี้ต่อ&lt;/p&gt;
&lt;pre class="brush: bash"&gt;$ sudo chmod 755 /Users/git/repositories/gitosis-admin.git/hooks/post-update&lt;/pre&gt;
&lt;p&gt;จากนั้นให้ลอง clone gitosis-admin ลงมา โดยที่ YOUR_SERVER_HOSTNAME ก็เป็น ip ของเครื่อง Mac&lt;/p&gt;
&lt;pre class="brush: bash"&gt;$ git clone git@YOUR_SERVER_HOSTNAME:gitosis-admin.git
$ cd gitosis-admin&lt;/pre&gt;
&lt;p&gt;ซึ่งสิ่งที่ได้ก็จะมี&lt;/p&gt;
&lt;pre class="brush: bash"&gt;~/gitosis-admin (master) $ ls -l
total 8
-rw-r--r--  1 phuwanart  staff   87 May 14 14:30 gitosis.conf
drwxr-xr-x  3 phuwanart  staff  102 May 14 14:30 keydir&lt;/pre&gt;
&lt;p&gt;ขั้นตอนในการติดตั้ง gitosis ก็คงมีประมาณนี้ ต่อไปการใช้งาน การเพิ่มผู้ใช้ การโปรเจ็กต์ สามารถไปดูต่อไปที่ &lt;a href="http://scie.nti.st/2007/11/14/hosting-git-repositories-the-easy-and-secure-way"&gt;Hosting Git repositories, The Easy (and Secure) Way&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3687712341834240678-5435669662742569694?l=neokain.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/335xKG-Z-iSUSFwDixubA38WkHQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/335xKG-Z-iSUSFwDixubA38WkHQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/335xKG-Z-iSUSFwDixubA38WkHQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/335xKG-Z-iSUSFwDixubA38WkHQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/neokain/~4/Cl64pA9OaUA" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-24T15:07:12.166+07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://neokain.blogspot.com/2011/05/host-git-repository-gitosis-mac-os-x.html</feedburner:origLink></item><item><title>ปัญหา RubyGems Warning หลังจากอัพเกรด</title><link>http://feedproxy.google.com/~r/neokain/~3/PYSsMKlaY2g/rubygems-warning.html</link><category>ruby</category><category>gem</category><author>noreply@blogger.com (Phuwanart Larpmark)</author><pubDate>Fri, 13 May 2011 19:28:32 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3687712341834240678.post-6251465209574868838</guid><description>&lt;p&gt;หลังจากที่อัพเกรด ruby gem เป็นเวอร์ชั่นล่าสุด (1.8.2) ปรากฎว่ารันโปรเจ็กต์จะมีแจ้งเตือนว่า&lt;/p&gt;&lt;pre class="brush: bash"&gt;NOTE: Gem::Specification#default_executable= is deprecated with no replacement. It will be removed on or after 2011-10-01.
Gem::Specification#default_executable= called from /Users/phuwanart/.rvm/gems/ruby-1.9.2-p180@global/specifications/rake-0.8.7.gemspec:10.
&lt;/pre&gt;&lt;p&gt;ซึ่งมันจะยาวมาก วิธีการแก้ไขก็คือให้กลับไปใช้ gem รุ่นเก่าก่อน&lt;/p&gt;&lt;pre class="brush: bash"&gt;$ gem update --system 1.7.2
&lt;/pre&gt;&lt;p&gt;แต่เราไม่ต้องตกใจไป เราสามารถอัพเกรด gem ของเราได้ แต่เพียงว่าตอนนี้ยังไม่แนะนำ&lt;/p&gt;&lt;p&gt;ที่มา: &lt;a href="http://pivotallabs.com/users/alex/blog/articles/1687-rubygems-warningitis-outbreak"&gt;RubyGems Warningitis Outbreak&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3687712341834240678-6251465209574868838?l=neokain.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/QEF9le2uVyhcv83zJvdaAuUB-l0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QEF9le2uVyhcv83zJvdaAuUB-l0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/QEF9le2uVyhcv83zJvdaAuUB-l0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QEF9le2uVyhcv83zJvdaAuUB-l0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/neokain/~4/PYSsMKlaY2g" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-14T09:28:32.032+07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://neokain.blogspot.com/2011/05/rubygems-warning.html</feedburner:origLink></item><item><title>Currency Number Formatter</title><link>http://feedproxy.google.com/~r/neokain/~3/9NDrawU1W44/currency-number-formatter.html</link><category>iOS</category><author>noreply@blogger.com (Phuwanart Larpmark)</author><pubDate>Tue, 10 May 2011 23:12:13 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3687712341834240678.post-661808636497159566</guid><description>&lt;p&gt;ก็ไม่มีอะไรมาก็ตามหัวข้อ มีตัวเลขที่เก็บไว้เป็น decimal ต้องการจะแสดงให้เป็นหน่วยเงิน นั่นคือคั่นด้วยเครื่องหมาย , และเป็นทศนิยม 2 ตำแหน่ง&lt;/p&gt;&lt;pre class="sunburst" style="font-family: 'Bitstream Vera Sans Mono', Monaco, Consolas, 'Courier New', monospace; font-size: 9pt; line-height: 1.3em; margin-top: 0em;"&gt;&lt;span class="support support_class support_class_cocoa" style="padding-top: 0.2em; padding-bottom: 0.1em; color: #6d79de; font-weight: bold;"&gt;NSDecimalNumber&lt;/span&gt; *decimalNumber = ...;

&lt;span class="support support_class support_class_cocoa" style="padding-top: 0.2em; padding-bottom: 0.1em; color: #6d79de; font-weight: bold;"&gt;NSNumberFormatter&lt;/span&gt; *formatter = &lt;span class="meta meta_bracketed meta_bracketed_objc" style="padding-top: 0.2em; padding-bottom: 0.1em;"&gt;[&lt;span class="meta meta_bracketed meta_bracketed_objc" style="padding-top: 0.2em; padding-bottom: 0.1em;"&gt;[&lt;span class="support support_class support_class_cocoa" style="padding-top: 0.2em; padding-bottom: 0.1em; color: #6d79de; font-weight: bold;"&gt;NSNumberFormatter&lt;/span&gt;&lt;span class="meta meta_function-call meta_function-call_objc" style="padding-top: 0.2em; padding-bottom: 0.1em;"&gt;&lt;span class="support support_function support_function_any-method support_function_any-method_objc" style="padding-top: 0.2em; padding-bottom: 0.1em; color: #3c4c72; font-weight: bold;"&gt;alloc&lt;/span&gt;&lt;/span&gt;]&lt;/span&gt;&lt;span class="meta meta_function-call meta_function-call_objc" style="padding-top: 0.2em; padding-bottom: 0.1em;"&gt;&lt;span class="support support_function support_function_any-method support_function_any-method_objc" style="padding-top: 0.2em; padding-bottom: 0.1em; color: #3c4c72; font-weight: bold;"&gt;init&lt;/span&gt;&lt;/span&gt;]&lt;/span&gt;;
&lt;span class="meta meta_bracketed meta_bracketed_objc" style="padding-top: 0.2em; padding-bottom: 0.1em;"&gt;[formatter &lt;span class="meta meta_function-call meta_function-call_objc" style="padding-top: 0.2em; padding-bottom: 0.1em;"&gt;&lt;span class="support support_function support_function_any-method support_function_any-method_objc" style="padding-top: 0.2em; padding-bottom: 0.1em; color: #3c4c72; font-weight: bold;"&gt;setFormatterBehavior:&lt;/span&gt;NSNumberFormatterBehavior10_4&lt;/span&gt;]&lt;/span&gt;;
&lt;span class="meta meta_bracketed meta_bracketed_objc" style="padding-top: 0.2em; padding-bottom: 0.1em;"&gt;[formatter &lt;span class="meta meta_function-call meta_function-call_objc" style="padding-top: 0.2em; padding-bottom: 0.1em;"&gt;&lt;span class="support support_function support_function_any-method support_function_any-method_objc" style="padding-top: 0.2em; padding-bottom: 0.1em; color: #3c4c72; font-weight: bold;"&gt;setNumberStyle:&lt;/span&gt;&lt;span class="support support_constant support_constant_cocoa" style="padding-top: 0.2em; padding-bottom: 0.1em; color: #06960e; font-weight: bold;"&gt;NSNumberFormatterDecimalStyle&lt;/span&gt;&lt;/span&gt;]&lt;/span&gt;;
&lt;span class="meta meta_bracketed meta_bracketed_objc" style="padding-top: 0.2em; padding-bottom: 0.1em;"&gt;[formatter &lt;span class="meta meta_function-call meta_function-call_objc" style="padding-top: 0.2em; padding-bottom: 0.1em;"&gt;&lt;span class="support support_function support_function_any-method support_function_any-method_objc" style="padding-top: 0.2em; padding-bottom: 0.1em; color: #3c4c72; font-weight: bold;"&gt;setPositiveFormat:&lt;/span&gt;&lt;span class="string string_quoted string_quoted_double string_quoted_double_objc" style="padding-top: 0.2em; padding-bottom: 0.1em; color: #036a07;"&gt;@"#,##0.00"&lt;/span&gt;&lt;/span&gt;]&lt;/span&gt;;

&lt;span class="support support_function support_function_cocoa" style="padding-top: 0.2em; padding-bottom: 0.1em; color: #3c4c72; font-weight: bold;"&gt;NSLog&lt;/span&gt;(&lt;span class="string string_quoted string_quoted_double string_quoted_double_objc" style="padding-top: 0.2em; padding-bottom: 0.1em; color: #036a07;"&gt;@"%@"&lt;/span&gt;, &lt;span class="meta meta_bracketed meta_bracketed_objc" style="padding-top: 0.2em; padding-bottom: 0.1em;"&gt;[&lt;span class="meta meta_bracketed meta_bracketed_objc" style="padding-top: 0.2em; padding-bottom: 0.1em;"&gt;[formatter &lt;span class="meta meta_function-call meta_function-call_objc" style="padding-top: 0.2em; padding-bottom: 0.1em;"&gt;&lt;span class="support support_function support_function_any-method support_function_any-method_objc" style="padding-top: 0.2em; padding-bottom: 0.1em; color: #3c4c72; font-weight: bold;"&gt;stringFromNumber:&lt;/span&gt;decimalNumber&lt;/span&gt;]&lt;/span&gt;&lt;span class="meta meta_function-call meta_function-call_objc" style="padding-top: 0.2em; padding-bottom: 0.1em;"&gt;&lt;span class="support support_function support_function_any-method support_function_any-method_objc" style="padding-top: 0.2em; padding-bottom: 0.1em; color: #3c4c72; font-weight: bold;"&gt;description&lt;/span&gt;&lt;/span&gt;]&lt;/span&gt;);&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3687712341834240678-661808636497159566?l=neokain.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8uJBeu7TA3w4R8WeoA6npYHMpuo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8uJBeu7TA3w4R8WeoA6npYHMpuo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8uJBeu7TA3w4R8WeoA6npYHMpuo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8uJBeu7TA3w4R8WeoA6npYHMpuo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/neokain/~4/9NDrawU1W44" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-11T13:12:13.745+07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://neokain.blogspot.com/2011/05/currency-number-formatter.html</feedburner:origLink></item><item><title>เริ่มแต่ง UITableViewCell กัน</title><link>http://feedproxy.google.com/~r/neokain/~3/9PFQYLnzL4M/uitableviewcell.html</link><category>iOS</category><author>noreply@blogger.com (Phuwanart Larpmark)</author><pubDate>Mon, 24 Oct 2011 01:13:11 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3687712341834240678.post-1828367210784793641</guid><description>&lt;p&gt;&lt;strong&gt;เริ่มต้น&lt;/strong&gt; ให้สร้าง project ที่เป็น table view ซึ่งเอาสะดวกๆ ก็เลือก Navigation-based Application ก็ได้ ซึ่งปกติแล้วแต่ละแถวก็จะมีรูปแบบที่ sdk เค้ามีมาให้อยู่แล้ว แต่หากว่าต้องการการแสดงผลในแต่ละแถวที่นอกจากที่มีให้ก็สามารถทำได้ ซึ่งขึ้นตอนที่ทำนี้เป็นขึ้นตอนแบบพื้นฐานทั่วๆ ไป อาจจะมีวิธีอื่นที่ดีกว่าก็ได้&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; ให้ New File... เพิ่มเข้าไปใน project โดยให้เลือก Objective-C class&lt;/p&gt;
&lt;p&gt;โดยที่ให้เราใช้ subclass เป็น UITableViewCell&lt;/p&gt;
&lt;p&gt;จากนั้นก็ตั้งชื่อของ class ตามต้องการ ในที่นี้จะใช้ MyCell ซึ่งเมื่อสร้างเสร็จจะได้ไฟล์มา 2 ไฟล์คือ MyCell.h และ MyCell.m ไว้ใน project&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; สร้าง cell ที่เราต้องการ โดยจะสร้าง Interface Builder เพื่อใช้ในการออกแบบ ซึ่งในที่นี้ทำได้โดย ให้เรา New File... ลงใน project แล้วเลือก User Interface เป็น Empty&lt;/p&gt;
&lt;p&gt;จากนั้นก็เลือกว่า IB ที่จะสร้างจะใช้กับอะไร&lt;/p&gt;
&lt;p&gt;และก็ตั้งชื่อ ในที่นี้ใช้ชื่อว่า MyCell เช่นกัน เมื่อสร้างเสร็จแล้วจะได้ MyCell.xib&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; ต่อไปเราจะทำการสร้าง cell ที่เราต้องการ โดยในที่นี้จะออกแบบให้ cell มี label หนึ่งอันอยู่ตรงกลาง&lt;/p&gt;
&lt;p&gt;ที่ MyCell.h เราจะเพิ่ม UILabel ลงไป ซึ่งในที่นี้จะให้ชื่อว่า myLabel&lt;/p&gt;
&lt;pre class="brush: cpp"&gt;//  MyCell.h

#import &amp;lt; UIKit/UIKit.h &amp;gt;


@interface MyCell : UITableViewCell {
    UILabel *myLabel;
}

@property (nonatomic, retain) IBOutlet UILabel *myLabel;

@end
&lt;/pre&gt;
&lt;p&gt;และก็ implement ตามปกติ&lt;/p&gt;
&lt;pre class="brush: cpp"&gt;//  MyCell.m

#import "MyCell.h"


@implementation MyCell

@synthesize myLabel;

...

- (void)dealloc
{
    [myLabel release];
    [super dealloc];
}

@end
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; จากนั้นเราจะเริ่มไปออกแบบ cell ใน IB ให้ลาก Table View Cell ลงมา และลาก Label อันนึงมาไว้ที่ตรงกลาง cell&lt;/p&gt;
&lt;p&gt;กำหนด class ให้กับ Table View Cell ที่ตรงการกำหนด Identity&lt;/p&gt;
&lt;p&gt;และที่แท็บ Connections ให้ลาก myLabel มาเชื่อมกับ Label&lt;/p&gt;
&lt;p&gt;พอเสร็จจากตรงนี้ cell ที่เราสร้างก็พร้อมใช้&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 5:&lt;/strong&gt; ที่ RootViewController จะเป็นที่ที่จะเอา cell ไปใช้ โดยทำได้ดังนี้&lt;/p&gt;
&lt;p&gt;import class และสร้าง myCell&lt;/p&gt;
&lt;pre class="brush: cpp"&gt;//  RootViewController.h

#import &amp;lt; UIKit/UIKit.h &amp;gt;
#import "MyCell.h"

@interface RootViewController : UITableViewController {
    MyCell *myCell;
}

@property (nonatomic, retain) IBOutlet MyCell *myCell;

@end
&lt;/pre&gt;
&lt;p&gt;implement ตามปกติ&lt;/p&gt;
&lt;pre class="brush: cpp"&gt;//  RootViewController.m

#import "RootViewController.h"

@implementation RootViewController

@synthesize myCell;

...

- (void)dealloc
{
    [myCell dealloc];
    [super dealloc];
}

@end
&lt;/pre&gt;
&lt;p&gt;จากนั้นก็สร้าง cell ที่เราต้องการจาก MyCell class และในแต่ละแถวเราจะได้แสดงผลเป็นตัวเลขแถว โดยเราจะกำหนดใน myLabel ของแต่ล่ะ cell&lt;/p&gt;
&lt;pre class="brush: cpp"&gt;// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"MyCellIdentifier";
    
    MyCell *cell = (MyCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        [[NSBundle mainBundle] loadNibNamed:@"MyCell"
                                      owner:self
                                    options:nil];
        cell = myCell;
		self.myCell = nil;
    }

    // Configure the cell.
    cell.myLabel.text = [NSString stringWithFormat:@"Row %i", indexPath.row+1];
    return cell;
}
&lt;/pre&gt;
&lt;p&gt;ในตัวอย่างนี้จะให้มีข้อมูลสัก 9 แถว&lt;/p&gt;
&lt;pre class="brush: cpp"&gt;- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 9;
}
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Step 6:&lt;/strong&gt; กลับมาที่ MyCell.xib ให้เลือก File's Owner และในแท็ป Identity ให้กำหนดชื่อ class เป็น RootViewController ซึ่งเป็น controller ที่จะเอา cell นี้ไปใช้&lt;/p&gt;
&lt;p&gt;และที่แท็บ Connections ให้ลาง myCell มาเชื่อต่อกับ cell ที่เราออกแบบไว้&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 7:&lt;/strong&gt; จาก Table View Cell ที่เราสร้าง เราจะต้องกำหนด Identifier ให้กับ cell ด้วย โดยที่ที่จะต้องกำหนดจะอยู่ในแท็บ Attributes ซึ่งชื่อ Identifier ที่กำหนดเป็นอันเดียวกับ *CellIdentifier ใน method ชื่อ -tableView:cellForRowAtIndexPath: ที่ต้องกำหนด Identifier ก็เพื่อจะได้มีการ reuse cell ได้ตามแบบของ UITableView&lt;/p&gt;
&lt;p&gt;หลังจากนี้ก็ลองรับดู ก็จะได้ผลอย่างที่ต้องการ&lt;/p&gt;
&lt;p&gt;โดยคร่าวๆ แล้วก็จะมีขั้นตอนแบบนี้ ที่ต่อยอดจากนี้ก็แล้วแต่ว่างานนั้นจะต้องการหน้าตาของ Cell เป็นยังไง&lt;/p&gt;
&lt;p&gt;จริงๆ แล้วเหมือนจะง่าย แต่ตัวผมเองใช้เวลานานกว่าจะได้แบบนี้ ก็เลย blog ไว้สักหน่อยกันลืม :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3687712341834240678-1828367210784793641?l=neokain.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2LjMMVAo_a9cFE0b2msWclrulO4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2LjMMVAo_a9cFE0b2msWclrulO4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/2LjMMVAo_a9cFE0b2msWclrulO4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2LjMMVAo_a9cFE0b2msWclrulO4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/neokain/~4/9PFQYLnzL4M" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-24T15:13:11.531+07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://neokain.blogspot.com/2011/05/uitableviewcell.html</feedburner:origLink></item><item><title>#import กับ @class</title><link>http://feedproxy.google.com/~r/neokain/~3/xwnu5in-mpc/import-class.html</link><category>iOS</category><author>noreply@blogger.com (Phuwanart Larpmark)</author><pubDate>Sun, 08 May 2011 21:17:17 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3687712341834240678.post-6195556622794988966</guid><description>&lt;p&gt;ก็สงสัยว่ามันต่างกันยัง ก็ได้รับความรู้จาก &lt;a href="http://twitter.com/onoaonoa"&gt;@onoaonoa&lt;/a&gt; มาอย่างนี้&lt;/p&gt;&lt;blockquote&gt;@class เป็น forward declaration แค่บอกว่าจะมี instant class นี้ยังไม่ได้ระบุว่าเป็นยังไง #import จะรู้จักลักษณะของ class นั้นด้วย -- &lt;a href="http://twitter.com/#!/onoaonoa/status/66654590229164032"&gt;tweet&lt;/a&gt;&lt;/blockquote&gt;&lt;blockquote&gt;ผลที่ได้คือ @class ใน .h จะ compile เร็วกว่าใช้ #import ใน .h เพราะมันลดการไปอ่านไฟล์ที่เรา import เข้าไป -- &lt;a href="http://twitter.com/#!/onoaonoa/status/66656388461502464"&gt;tweet&lt;/a&gt;&lt;/blockquote&gt;&lt;p&gt;ก็เลยเอามา blog ไว้สักหน่อย กันลืม&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3687712341834240678-6195556622794988966?l=neokain.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/wXjdMkEn3uPGiF9VVNkeRPezCTQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wXjdMkEn3uPGiF9VVNkeRPezCTQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/wXjdMkEn3uPGiF9VVNkeRPezCTQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wXjdMkEn3uPGiF9VVNkeRPezCTQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/neokain/~4/xwnu5in-mpc" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-09T11:17:17.275+07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://neokain.blogspot.com/2011/05/import-class.html</feedburner:origLink></item><item><title>ทำฟอร์มกรอกข้อมูลบน iOS ด้วย ELCTextfieldCell</title><link>http://feedproxy.google.com/~r/neokain/~3/pT7nwx3OQkY/ios-elctextfieldcell.html</link><category>iOS</category><author>noreply@blogger.com (Phuwanart Larpmark)</author><pubDate>Mon, 24 Oct 2011 01:10:16 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3687712341834240678.post-4786511252935931789</guid><description>&lt;p&gt;เป็นปัญหาพอสมควรสำหรับการทำช่องกรอกข้อมูลบน iOS โดยที่พื้นๆ จะทำการลาก text field มาวางบน view แต่การทำแบบนี้จะมีปัญหาหลายอย่างเช่น&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;หากมี text field วางเยอะๆ เมื่อเลือกสัก field นึงแล้วคีย์บอร์ดจะโผล่ขึ้นมาซึ่งจะไปบัง field อื่นได้&lt;/li&gt;
&lt;li&gt;ไม่สามารถไปยัง field อื่นได้ในลักษณะเหมือนกด next&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ก็โชคดีที่มีคนทำของดีๆ ออกมาคือ &lt;a href="https://github.com/elc/ELCTextFieldCell"&gt; ELCTextFieldCell&lt;/a&gt; โดยจะเป็นการทำให้ TableView เป็นฟอร์มข้อมูล วิธีการในการใช้ก็มีดังนี้&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; สร้าง Project ขึ้นมาใหม่โดยในที่นี้จะเลือกใช้ Navigation-based Application&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; ตั้งชื่อ Project&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; ให้ clone &lt;a href="https://github.com/elc/ELCTextFieldCell"&gt;ELCTextfieldCell&lt;/a&gt; มาจาก github&lt;/p&gt;
&lt;pre class="brush: bash"&gt;$ git clone https://github.com/elc/ELCTextFieldCell.git
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; ที่โฟลเดอร์ที่ clone ลงมา ในโฟลเดอร์ Classes ให้ลากไฟล์ ELCTextfieldCell.h และ ELCTextfieldCell.m ไปใส่ใน project ให้ copy ลงไปไว้&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 5:&lt;/strong&gt; ให้ import ELCTextfieldCell.h เข้ามาใน RootViewController.h โดยในที่นี้จะให้กำหนดตัวแปร 2 ตัวคือ labels และ placeholders โดยให้เป็น NSArray&lt;/p&gt;
&lt;pre class="brush: cpp"&gt;//  RootViewController.h

#import "ELCTextfieldCell.h"

@interface RootViewController : UITableViewController {
	NSArray *labels;
	NSArray *placeholders;
}
@property (nonatomic, retain) NSArray *labels;
@property (nonatomic, retain) NSArray *placeholders;
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Step 6:&lt;/strong&gt; จากนั้นไปที่ RootViewController.m ทำการ @synthesize ตัวแปรตามปกติ&lt;/p&gt;
&lt;pre class="brush: cpp"&gt;//  RootViewController.m

#import "RootViewController.h"

@implementation RootViewController

@synthesize labels;
@synthesize placeholders;
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Step 7:&lt;/strong&gt; ที่ viewDidLoad ให้กำหนดชื่อฟิลด์ที่ต้องการลงใน labels และใส่คำอธิบายลงใน placeholders&lt;/p&gt;
&lt;pre class="brush: bash"&gt;//  RootViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.labels = [NSArray arrayWithObjects:@"First Name",
                   @"Last Name",
                   @"Email",
                   @"Phone Number",
                   nil];
	
	self.placeholders = [NSArray arrayWithObjects:@"Enter First Name",
                         @"Enter Last Name",
                         @"Enter Email",
                         @"Phone Number (Optional)",
                         nil];
}
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Step 8:&lt;/strong&gt; จากนั้นใส่จำนวน row ที่ต้องการ โดยในที่นี้จะให้หาจำนวนจาก labels&lt;/p&gt;
&lt;pre class="brush: cpp"&gt;- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [labels count];
}
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Step 9:&lt;/strong&gt; ที่ cellForRowAtIndexPath ให้ทำการแก้ไขจากของเดิมดังนี้&lt;/p&gt;
&lt;pre class="brush: cpp"&gt;// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    
    ELCTextfieldCell *cell = (ELCTextfieldCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
//  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[ELCTextfieldCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
//      cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    // Configure the cell.
    [self configureCell:cell atIndexPath:indexPath];
    return cell;
}
&lt;/pre&gt;
&lt;p&gt;ซึ่ง [self configureCell:cell atIndexPath:indexPath] จะแยกไปเขียนเป็น method ไว้เป็นดังนี้&lt;/p&gt;
&lt;pre class="brush: cpp"&gt;- (void)configureCell:(ELCTextfieldCell *)cell atIndexPath:(NSIndexPath *)indexPath {
	
	cell.leftLabel.text = [self.labels objectAtIndex:indexPath.row];
	cell.rightTextField.placeholder = [self.placeholders objectAtIndex:indexPath.row];
	cell.indexPath = indexPath;
	cell.delegate = self;
	
	if(indexPath.row == 3) {
		[cell.rightTextField setKeyboardType:UIKeyboardTypeNumberPad];
	}
}
&lt;/pre&gt;
&lt;p&gt;หลังจากนั้นก็ให้ทำการ Run จะได้ผลประมาณนนี้&lt;/p&gt;
&lt;p&gt;ให้ลองใส่ข้อมูลต่างๆ ดู&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 10:&lt;/strong&gt; ทำการเพิ่ม ELCTextFieldDelegate เพื่อให้ใช้ปุ่ม Return (Done) เพื่อไปช่องใส่ข้อมูลถัดไป&lt;/p&gt;
&lt;pre class="brush: cpp"&gt;//  RootViewController.h

@interface RootViewController : UITableViewController &amp;lt; ELCTextFieldDelegate &amp;gt; {
    ...
}
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Step 11:&lt;/strong&gt; จากนั้นก็ไป implement delegate method 'textFieldDidReturnWithIndexPath' เพื่อกำหลดว่าเมื่อกด Done แล้วจะให้ทำอะไร&lt;/p&gt;
&lt;pre class="brush: cpp"&gt;//  RootViewController.m

#pragma mark ELCTextFieldCellDelegate Methods

-(void)textFieldDidReturnWithIndexPath:(NSIndexPath*)indexPath {
    
	if(indexPath.row &amp;lt; [labels count]-1) {
		NSIndexPath *path = [NSIndexPath indexPathForRow:indexPath.row+1 inSection:indexPath.section];
		[[(ELCTextfieldCell*)[self.tableView cellForRowAtIndexPath:path] rightTextField] becomeFirstResponder];
		[self.tableView scrollToRowAtIndexPath:path atScrollPosition:UITableViewScrollPositionTop animated:YES];
	}
	
	else {
        
		[[(ELCTextfieldCell*)[self.tableView cellForRowAtIndexPath:indexPath] rightTextField] resignFirstResponder];
	}
}
&lt;/pre&gt;
&lt;p&gt;และ 'updateTextLabelAtIndexPath' เพื่อกำหนดว่าถ้ามีการเปลี่ยนข้อมูลในช่องจะให้ทำอะไร&lt;/p&gt;
&lt;pre class="brush: bash"&gt;- (void)updateTextLabelAtIndexPath:(NSIndexPath*)indexPath string:(NSString*)string {
	NSLog(@"See input: %@ from section: %d row: %d, should update models appropriately", string, indexPath.section, indexPath.row);
}
&lt;/pre&gt;
&lt;p&gt;จากนั้นก็ Run และลองดู log&lt;/p&gt;
&lt;p&gt;ขั้นตอนอย่างง่ายก็ประมาณนี้ ซึ่งการจะเอาไปให้ก็ไม่จำเป็นต้องเป็น Navigation-based ก็ได้ จริงๆ แล้วขอให้มี TableView ก็พอแล้ว สุดท้ายก็แล้วแต่ล่ะคนจะเอาไปประยุกต์เอาเอง&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3687712341834240678-4786511252935931789?l=neokain.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/bguDbU6hHUEmS03b7hHN_grGHac/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bguDbU6hHUEmS03b7hHN_grGHac/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/bguDbU6hHUEmS03b7hHN_grGHac/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bguDbU6hHUEmS03b7hHN_grGHac/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/neokain/~4/pT7nwx3OQkY" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-24T15:10:16.549+07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://neokain.blogspot.com/2011/05/ios-elctextfieldcell.html</feedburner:origLink></item><item><title>Error: gem install activerecord-mysql2-adapter</title><link>http://feedproxy.google.com/~r/neokain/~3/qiR9rYM2R7M/error-gem-install-activerecord-mysql2.html</link><category>ruby</category><category>rails</category><author>noreply@blogger.com (Phuwanart Larpmark)</author><pubDate>Tue, 03 May 2011 03:31:09 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3687712341834240678.post-8335507061176349060</guid><description>&lt;p&gt;หลังจาก `gem update` ไปวันนี้แล้วมีการอัฟเดท mysql2 จาก 0.2.x เป็น 0.3.x ซึ่งเป็นผลให้ตอนที่รัน `$ rails server` จะมีการแจ้งเตือน&lt;/p&gt;&lt;pre class="brush: bash"&gt;
WARNING: This version of mysql2 (0.3.2) doesn't ship with the ActiveRecord adapter bundled anymore as it's now part of Rails 3.1
WARNING: Please use the 0.2.x releases if you plan on using it in Rails &lt;= 3.0.x
&lt;/pre&gt;&lt;p&gt;จากนั้นก็จะมี error ตามมาประมาณนี้&lt;/p&gt;&lt;pre class="brush: bash"&gt;/Users/phuwanart/.rvm/gems/ruby-1.9.2-p180/gems/activerecord-3.0.7/lib/active_record/connection_adapters/abstract/connection_specification.rb:71:in `rescue in establish_connection': Please install the mysql2 adapter: `gem install activerecord-mysql2-adapter` (no such file to load -- active_record/connection_adapters/mysql2_adapter) (RuntimeError)&lt;/pre&gt;&lt;p&gt;ก็เดาว่า mysql2 เวอร์ชั่น 0.3.x ต้องรอใช้กับ Rails 3.1&lt;/p&gt;&lt;p&gt;วิธีแก้ง่ายก็คือไปกำหนดเวอร์ชั่นของ mysql2 เป็น 0.2.x &lt;/p&gt;&lt;pre class="brush: bash"&gt;gem "mysql2", '0.2.6'&lt;/pre&gt;

แล้วให้สั่ง

&lt;pre class="brush: bash"&gt;$ bundle install&lt;/pre&gt;&lt;p&gt;ก็ทำแบบนี้แล้ว error ก็หายนะครับ สามารถ `$ rails server` ได้ตามเดิม&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3687712341834240678-8335507061176349060?l=neokain.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/JfvGE-XeQU0ZilqLZGiyNgxPHW0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JfvGE-XeQU0ZilqLZGiyNgxPHW0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/JfvGE-XeQU0ZilqLZGiyNgxPHW0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JfvGE-XeQU0ZilqLZGiyNgxPHW0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/neokain/~4/qiR9rYM2R7M" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-03T17:31:09.382+07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://neokain.blogspot.com/2011/05/error-gem-install-activerecord-mysql2.html</feedburner:origLink></item><item><title>ลง RVM บน Mac OS X Snow Leopard</title><link>http://feedproxy.google.com/~r/neokain/~3/Ql-MLprwp-g/rvm-mac-os-x-snow-leopard.html</link><category>ruby</category><category>rvm</category><category>Mac OS X</category><author>noreply@blogger.com (Phuwanart Larpmark)</author><pubDate>Thu, 04 Aug 2011 21:15:45 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3687712341834240678.post-299982744306255556</guid><description>&lt;p&gt;เนื่องด้วยว่า rails2 และ rails3 ใช้ ruby คนละ version และถึงแม้ว่า rails3 จะยังใช้ได้กับ ruby 1.8.x แต่ก็มี gem บางตัวที่ต้องการ ruby 1.9.x เป็นผลว่าทำให้ต้องมี ruby หลาย version ในเครื่องเดียวกัน ซึ่งในที่นี้เราจะใช้ &lt;a href="https://rvm.beginrescueend.com/"&gt;RMV&lt;/a&gt; ช่วยจัดการ ruby ที่อยู่ในเครื่องของเรา&lt;/p&gt;
&lt;h2&gt;ติดตั้ง RVM&lt;/h2&gt;
&lt;p&gt;เปิด Terminal แล้วพิมพ์คำสั่งนี้&lt;/p&gt;
&lt;pre class="brush: bash"&gt;$ bash &amp;lt; &amp;lt;(curl -s https://rvm.beginrescueend.com/install/rvm)&lt;/pre&gt;
&lt;p&gt;จากนั้นให้เพิ่มบรรทัดนี้ลงไปใน .bash_profile&lt;/p&gt;
&lt;pre class="brush: bash"&gt;[[ -s "$HOME/.rvm/scripts/rvm" ]] &amp;amp;&amp;amp; source "$HOME/.rvm/scripts/rvm" # This loads RVM into a shell session.&lt;/pre&gt;
&lt;p&gt;ทดสอบว่าลง RVM สำเร็จโดยสั่ง&lt;/p&gt;
&lt;pre class="brush: bash"&gt;$ type rvm | head -1&lt;/pre&gt;
&lt;p&gt;ซึ่งจะได้ผลออกมาดังนี้&lt;/p&gt;
&lt;pre class="brush: bash"&gt;rvm is a function&lt;/pre&gt;
&lt;h2&gt;ติดตั้ง Ruby&lt;/h2&gt;
&lt;p&gt;ติดตั้ง ruby 1.8.7 โดยพิมพ์คำสั่งนี้ลงบน terminal&lt;/p&gt;
&lt;pre class="brush: bash"&gt;$ rvm install 1.8.7&lt;/pre&gt;
&lt;p&gt;ติดตั้ง ruby 1.9.2 ก็ทำเช่นเดียวกัน&lt;/p&gt;
&lt;pre class="brush: bash"&gt;$rvm install 1.9.2&lt;/pre&gt;
&lt;h2&gt;ใช้งาน Ruby&lt;/h2&gt;
&lt;p&gt;เมื่อต้องการจะใช้ ruby 1.8.7 ก็ให้พิมพ์คำสั่งนี้ลง terminal&lt;/p&gt;
&lt;pre class="brush: bash"&gt;$ rvm use 1.8.7&lt;/pre&gt;
&lt;p&gt;หากต้องการใช้อีก ruby อีก version ก็ทำเช่นเดิม&lt;/p&gt;
&lt;pre class="brush: bash"&gt;$ rvm use 1.9.2&lt;/pre&gt;
&lt;p&gt;หากต้องการให้ version เป็น default ก็ใช้ --default ตามลงไป&lt;/p&gt;
&lt;pre class="brush: bash"&gt;$ rvm use 1.9.2 --default&lt;/pre&gt;
&lt;p&gt;เมื่อสลับ ruby ในแต่ละ version แล้ว gem ก็จะเปลี่ยนไปด้วย ทั้งหมดจะถูกแยกตามการลงในแต่ละ version&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3687712341834240678-299982744306255556?l=neokain.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/kC05LFxoK-CEgAsBTs7-AAfL8UI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kC05LFxoK-CEgAsBTs7-AAfL8UI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/kC05LFxoK-CEgAsBTs7-AAfL8UI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kC05LFxoK-CEgAsBTs7-AAfL8UI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/neokain/~4/Ql-MLprwp-g" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-05T11:15:45.885+07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://neokain.blogspot.com/2011/05/rvm-mac-os-x-snow-leopard.html</feedburner:origLink></item><media:rating>nonadult</media:rating></channel></rss>

