<?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>PunNeng, another Grean</title>
	<atom:link href="http://weblog.punneng.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://weblog.punneng.net</link>
	<description>Hacking, playing and shooting</description>
	<lastBuildDate>Sun, 06 Feb 2011 06:09:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.2</generator>
		<item>
		<title>Fix the handsfree/speaker &#8216;no sound&#8217; issue</title>
		<link>http://weblog.punneng.net/2011/02/fix-the-earphone-speaker-no-sound-issue/</link>
		<comments>http://weblog.punneng.net/2011/02/fix-the-earphone-speaker-no-sound-issue/#comments</comments>
		<pubDate>Sun, 06 Feb 2011 05:52:37 +0000</pubDate>
		<dc:creator>PunNeng</dc:creator>
				<category><![CDATA[Utilities]]></category>
		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://weblog.punneng.net/?p=63</guid>
		<description><![CDATA[iPhone กากครับ ปัญหาคือ มันดันจำไว้ว่าตอนนี้ยังเสียบ handsfree อยู่ ทั้งๆ ที่ถอดมันออกมาแล้ว เครืองผมเองก็เคยเป็น จำได้ว่าแก้ปัญหานี้ด้วยการเสียบเข้าเสียบออก แล้วมันก็หายเอง พอมาดู video นี้ก็คิดว่าเป็นไปได้ที่การเสียบเข้าเสียบออกจะไปโดนฝุ่นที่เกาะตัว sensor สำหรับ handsfree หรือถ้าไม่หาย ก็ลองวิธีนี้(ตอนหลังของ video) ปล. หากไม่มีน้ำยาที่ไว้เช็ดอุปกรณ์อิเล็กทรอนิกส์ ใช้แอลกอฮอล์เช็ดแผลแทนก็ได้ คำเตือน.. ห้ามกิน]]></description>
			<content:encoded><![CDATA[<p>iPhone กากครับ<br />
ปัญหาคือ มันดันจำไว้ว่าตอนนี้ยังเสียบ handsfree อยู่ ทั้งๆ ที่ถอดมันออกมาแล้ว<br />
เครืองผมเองก็เคยเป็น จำได้ว่าแก้ปัญหานี้ด้วยการเสียบเข้าเสียบออก แล้วมันก็หายเอง<br />
พอมาดู video นี้ก็คิดว่าเป็นไปได้ที่การเสียบเข้าเสียบออกจะไปโดนฝุ่นที่เกาะตัว sensor สำหรับ handsfree</p>
<p><iframe title="YouTube video player" width="640" height="390" src="http://www.youtube.com/embed/TM0GQ58pUEg" frameborder="0" allowfullscreen></iframe></p>
<p>หรือถ้าไม่หาย ก็ลองวิธีนี้(ตอนหลังของ video)</p>
<p><iframe title="YouTube video player" width="640" height="390" src="http://www.youtube.com/embed/ayScKPuZPuM" frameborder="0" allowfullscreen></iframe><br />
ปล. หากไม่มีน้ำยาที่ไว้เช็ดอุปกรณ์อิเล็กทรอนิกส์ ใช้แอลกอฮอล์เช็ดแผลแทนก็ได้<br />
คำเตือน.. ห้ามกิน</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.punneng.net/2011/02/fix-the-earphone-speaker-no-sound-issue/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Simple startup script for OSX</title>
		<link>http://weblog.punneng.net/2011/01/55/</link>
		<comments>http://weblog.punneng.net/2011/01/55/#comments</comments>
		<pubDate>Thu, 20 Jan 2011 19:38:52 +0000</pubDate>
		<dc:creator>PunNeng</dc:creator>
				<category><![CDATA[Utilities]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[osx]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[startup]]></category>

		<guid isPermaLink="false">http://weblog.punneng.net/?p=55</guid>
		<description><![CDATA[พี่เกรียนเพิ่งได้คอมห่วยๆ มาตัวนึง อยากจะสั่งให้ทำอะไรบางอย่างทุกครั้งที่เปิดเครื่อง ทำได้ด้วยการเขียน startup script มีขั้นตอนไม่มาก อันดับแรกสร้าง folder ใน /Library/StartupItems แล้วก็สร้างไฟล์ plist แล้วก็ไฟล์ที่ไว้สั่งคำสั่ง แค่นี้ ไม่เยอะ เริ่มต้นด้วยการเปิด Teminal แล้วตามนี้.. $ cd /Library/StartupItems $ sudo mkdir WhatEverNameYouWant $ cd WhatEverNameYouWant แล้วก็สร้างไฟล์ชื่อ StartupParameters.plist ถนัดโปรแกรมอะไร ก็ใช้เลย ใส่ไปในไฟล์ว่า.. { Description = &#34;WhatEverNameYouWant&#34;; Provides = (&#34;ScriptNameYouWant&#34;); OrderPreference = &#34;None&#34;; } จากนั้นก็สร้างไฟล์ที่ไว้ execute แล้วใส่คำส่ังที่จะสั่ง อย่าลืม shebang #!/bin/sh ที่หัวไฟล์ ไม่งั้นมันจะไม่รู้ว่าสั่งด้วยภาษาอะไร หน้าตาจะประมาณ #!/bin/sh [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.pokpitch.com/" target="_blank">พี่เกรียน</a>เพิ่งได้คอมห่วยๆ มาตัวนึง อยากจะสั่งให้ทำอะไรบางอย่างทุกครั้งที่เปิดเครื่อง</p>
<p>ทำได้ด้วยการเขียน startup script มีขั้นตอนไม่มาก<br />
อันดับแรกสร้าง folder ใน /Library/StartupItems แล้วก็สร้างไฟล์ plist แล้วก็ไฟล์ที่ไว้สั่งคำสั่ง แค่นี้ ไม่เยอะ</p>
<p>เริ่มต้นด้วยการเปิด Teminal แล้วตามนี้..</p>
<pre class="terminal">$ cd /Library/StartupItems
$ sudo mkdir WhatEverNameYouWant
$ cd WhatEverNameYouWant</pre>
<p>แล้วก็สร้างไฟล์ชื่อ StartupParameters.plist<br />
ถนัดโปรแกรมอะไร ก็ใช้เลย ใส่ไปในไฟล์ว่า..</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">{
  Description     = &quot;WhatEverNameYouWant&quot;;
  Provides        = (&quot;ScriptNameYouWant&quot;);
  OrderPreference = &quot;None&quot;;
}</pre></div></div>

<p>จากนั้นก็สร้างไฟล์ที่ไว้ execute แล้วใส่คำส่ังที่จะสั่ง<br />
อย่าลืม shebang #!/bin/sh ที่หัวไฟล์ ไม่งั้นมันจะไม่รู้ว่าสั่งด้วยภาษาอะไร</p>
<p>หน้าตาจะประมาณ</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">#!/bin/sh
The commands to execute
commands
and the last command</pre></div></div>

<p>save แล้วก็สั่งให้ไฟล์มัน executable ได้</p>
<pre class="terminal">sudo chmod +x ScriptNameYouWant</pre>
<p>restart เครื่อง แล้วดูว่าจะทำให้อะไรในเครื่องเสียบ้าง ฮาา</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.punneng.net/2011/01/55/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quick start to Ruby with MySQL</title>
		<link>http://weblog.punneng.net/2010/12/quick-start-to-ruby-with-mysql/</link>
		<comments>http://weblog.punneng.net/2010/12/quick-start-to-ruby-with-mysql/#comments</comments>
		<pubDate>Tue, 14 Dec 2010 09:35:27 +0000</pubDate>
		<dc:creator>PunNeng</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[quickstarts]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://weblog.punneng.net/?p=25</guid>
		<description><![CDATA[เคยแต่เขียน Ruby on Rails ต่อกับ MySQL แต่ไม่เคยเขียน Ruby ต่อกับ MySQL ตรงๆ เลย เพิ่งจะจำเป็นต้องมาใช้เพื่อเช็คอะไรบางอย่างเล็กๆ น้อยๆ ไม่อยากจะต้องสร้าง rails process มาทั้งดุ้น มันเปลือง ram เอาแบบด่วนๆ เร็วๆ ละกัน เอา driver มาติดตั้งก่อน โดยจะมีตัวที่เขียนด้วยภาษา C กับเขียนด้วยภาษา Ruby ซึ่งจริงๆ แล้ว ถ้าใครมี gem ก็ติดต้ังผ่าน gem ได้เลย ด้วย $ sudo gem install mysql ตัวนี้จะเป็น driver ที่เขียนด้วยภาษา C ขั้นตอนการต่อก็ค่อนข้างง่าย เริ่มต้นด้วยการ require &#8216;mysql&#8217; แต่สำหรับการติดตั้งผ่าน gem ต้อง require [...]]]></description>
			<content:encoded><![CDATA[<p>เคยแต่เขียน Ruby on Rails ต่อกับ MySQL แต่ไม่เคยเขียน Ruby ต่อกับ MySQL ตรงๆ เลย เพิ่งจะจำเป็นต้องมาใช้เพื่อเช็คอะไรบางอย่างเล็กๆ น้อยๆ ไม่อยากจะต้องสร้าง rails process มาทั้งดุ้น มันเปลือง ram</p>
<p>เอาแบบด่วนๆ เร็วๆ ละกัน</p>
<p>เอา driver มาติดตั้งก่อน โดยจะมีตัวที่<a title="MySQL driver for Ruby written by C" href="http://www.tmtm.org/en/mysql/ruby/" target="_blank">เขียนด้วยภาษา C</a> กับ<a title="MySQL driver for Ruby written by Ruby" href="http://www.tmtm.org/en/ruby/mysql/" target="_blank">เขียนด้วยภาษา Ruby</a> ซึ่งจริงๆ แล้ว ถ้าใครมี gem ก็ติดต้ังผ่าน gem ได้เลย ด้วย</p>
<pre class="terminal">$ sudo gem install mysql</pre>
<p>ตัวนี้จะเป็น driver ที่เขียนด้วยภาษา C</p>
<p>ขั้นตอนการต่อก็ค่อนข้างง่าย เริ่มต้นด้วยการ require &#8216;mysql&#8217; แต่สำหรับการติดตั้งผ่าน gem ต้อง require &#8216;rubygems&#8217; มาก่อน แล้วสร้าง connection แล้วค่อย query</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rubygems'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'mysql'</span>
&nbsp;
db = Mysql::new<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;host&quot;</span>, <span style="color:#996600;">&quot;user&quot;</span>, <span style="color:#996600;">&quot;passwd&quot;</span>, <span style="color:#996600;">&quot;db&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
res = db.<span style="color:#9900CC;">query</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;select * from mytable&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
res.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>row<span style="color:#006600; font-weight:bold;">|</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;id: #{row[0]}&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>ผลที่ได้</p>
<pre class="terminal">id: 1
id: 2
id: 3
id: 4
...
...</pre>
<p>ค่อนข้างง่าย index ของ array ก็จะเรียงตาม columns ของ table นั้นๆ</p>
<p>หรือถ้าจะระบุเป็น column name เลยก็ได้ ด้วย each_hash</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">res.<span style="color:#9900CC;">each_hash</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>row<span style="color:#006600; font-weight:bold;">|</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;id: #{row['id']}&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>คู่มือที่เหลือก็ดูได้จากหน้าเว็บของมันเองได้เลย</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.punneng.net/2010/12/quick-start-to-ruby-with-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What the heck is JSONP?</title>
		<link>http://weblog.punneng.net/2010/12/what-the-heck-is-jsonp/</link>
		<comments>http://weblog.punneng.net/2010/12/what-the-heck-is-jsonp/#comments</comments>
		<pubDate>Sat, 04 Dec 2010 16:21:34 +0000</pubDate>
		<dc:creator>PunNeng</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[jsonp]]></category>

		<guid isPermaLink="false">http://weblog.punneng.net/?p=6</guid>
		<description><![CDATA[เคยทำให้มันทำงานได้ แต่ไม่เข้าใจเลยว่าเบื้องหลังมันมีอะไร JSONP มีไว้หลีกเลี่ยงปัญหา same origin policy คือ ถ้ามี request จาก browser เช่น javascript หรือ flash มันจะไม่อนุญาตให้เพราะต้องป้องกันเรื่อง script injection คือสามารถเข้าถึง resource อย่าง http cookies(session หรือ authentication หลายๆ อย่างก็เก็บใน cookies) ได้ เราแก้มันไม่ได้ แต่หลีกเลี่ยงได้ โดยแนวคิดเริ่มแรกก็มาจากเราสามารถเรียก javascript จาก script tag จากไหนก็ได้ &#60;script src=&#34;http://somewhere/jsfile&#34; type=&#34;text/javascript&#34;&#62;&#60;/script&#62; หลังจากที่โหลดเสร็จมันก็จะ execute javascript ก้อนนี้ได้ แต่ถ้า request ไปแล้วได้ json กลับมา execute ได้จริง แต่ไม่มีอะไรเกิดขึ้น น่าจะมีอะไรมารองรับ json [...]]]></description>
			<content:encoded><![CDATA[<p>เคยทำให้มันทำงานได้ แต่ไม่เข้าใจเลยว่าเบื้องหลังมันมีอะไร</p>
<p>JSONP มีไว้หลีกเลี่ยงปัญหา <a title="Same origin policy" href="http://en.wikipedia.org/wiki/Same_origin_policy" target="_blank">same origin policy</a> คือ ถ้ามี request จาก browser เช่น javascript หรือ flash มันจะไม่อนุญาตให้เพราะต้องป้องกันเรื่อง script injection คือสามารถเข้าถึง resource อย่าง http cookies(session หรือ authentication หลายๆ อย่างก็เก็บใน cookies) ได้</p>
<p>เราแก้มันไม่ได้ แต่หลีกเลี่ยงได้ โดยแนวคิดเริ่มแรกก็มาจากเราสามารถเรียก javascript จาก script tag จากไหนก็ได้</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>script src<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;http://somewhere/jsfile&quot;</span> type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span><span style="color: #339933;">&gt;&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></div></div>

<p>หลังจากที่โหลดเสร็จมันก็จะ execute javascript ก้อนนี้ได้</p>
<p>แต่ถ้า request ไปแล้วได้ json กลับมา execute ได้จริง แต่ไม่มีอะไรเกิดขึ้น น่าจะมีอะไรมารองรับ json ก้อนนี้หน่อย แต่การที่จะให้ server return อะไรแบบนี้มันก็ดูวุ่นวาย</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> json_var <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #3366CC;">'var1'</span><span style="color: #339933;">:</span><span style="color: #3366CC;">'val1'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>ที่น่าจะ ok ก็น่าจะเป็นการที่เราสามารถกำหนด callback ของเราเองได้</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">myCallback<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span><span style="color: #3366CC;">'var1'</span><span style="color: #339933;">:</span><span style="color: #3366CC;">'val1'</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>โดยตรงส่วนนี้ server ต้องเตรียมให้เราด้วย ซึ่งตรงนี้จะเป็น padding สำหรับรองรับข้อมูลเข้ามา</p>
<p>หน้าที่ต่อไปของเราก็คือประกาศ function นี้ (myCallback) ใน code ของเรา เพื่อรองรับข้อมูล</p>
<p>โดยตัวอย่างจาก graph ของ facebook ก็อนุญาตให้เราเพิ่ม callback นี้ได้เอง</p>
<pre><a href="https://graph.facebook.com/175459332480559/albums?callback=myCallback" target="_blank">https://graph.facebook.com/175459332480559/albums?callback=myCallback</a></pre>
<p>โดยใส่ ?callback=yourCallback เข้าไป</p>
<p>แต่สิ่งที่ทำให้ผมเข้าใจผิดตอนแรก เพราะจาก jQuery ที่สามารถ<a href="http://api.jquery.com/jQuery.ajax/" target="_blank">ประกาศ dataType เป็น jsonp</a> ผมก็เข้าใจว่ามันเป็น async  request ที่สามารถข้าม domain name บน browser ได้ หลงเข้าใจผิดอยู่นาน ซึ่งจริงๆ แล้วเบื้องหลังมันก็เตรียม function แบบนี้ให้เราอยู่ดี หน้าตาของ uri จะเป็นแบบนี้</p>
<pre><a href="https://graph.facebook.com/19292868552?callback=jsonp1291493679672" target="_blank">https://graph.facebook.com/19292868552?callback=jsonp1291493679672</a></pre>
<p>ตัว jsonp1291493679672 จะเป็น callback function ที่ถูกประกาศไว้ใน window แบบ window['jsonp1291493679672'] ซึ่งจะเซ็ต data แล้วคืนค่ามาให้ callback ที่เราประกาศไว้ตอนเรียกด้วย ajax อีกที โดย jQuery จะไปต่อท้าย uri ด้วย ?callback=? จากนั้นจะแทนที่ ? ด้วย jsonp1291493679672 ซึ่ง ตัวเลขด้านหลังมาจาก now() </p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.punneng.net/2010/12/what-the-heck-is-jsonp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The return of PunNeng</title>
		<link>http://weblog.punneng.net/2010/08/hello-world/</link>
		<comments>http://weblog.punneng.net/2010/08/hello-world/#comments</comments>
		<pubDate>Sat, 14 Aug 2010 20:15:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://weblog.punneng.net/?p=1</guid>
		<description><![CDATA[มันกลับมาแล้ว]]></description>
			<content:encoded><![CDATA[<p>มันกลับมาแล้ว</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.punneng.net/2010/08/hello-world/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

