<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>programming</title>
  <link rel="alternate" type="text/html" href="http://tewson.com/category/tags/programming"/>
  <link rel="self" type="application/atom+xml" href="http://tewson.com/taxonomy/term/56/atom/feed"/>
  <id>http://tewson.com/taxonomy/term/56/atom/feed</id>
  <updated>2009-03-30T17:08:57+07:00</updated>
  <entry>
    <title>org.eclipse.gef 0.0.0 required for installing Android Development Tools on Eclipse 3.5.1</title>
    <link rel="alternate" type="text/html" href="http://tewson.com/content/orgeclipsegef-000-required-installing-android-development-tools-eclipse-351" />
    <id>http://tewson.com/content/orgeclipsegef-000-required-installing-android-development-tools-eclipse-351</id>
    <published>2009-11-17T17:45:14+07:00</published>
    <updated>2009-11-17T17:46:10+07:00</updated>
    <author>
      <name>tewson</name>
    </author>
    <category term="android" />
    <category term="intellect" />
    <category term="programming" />
    <summary type="html"><![CDATA[<p>Today I wanted to try the Android SDK on my Ubuntu Karmic Koala, so I followed the instructions in the following URL.</p>
<p><a href="http://developer.android.com/sdk/index.html" title="http://developer.android.com/sdk/index.html">http://developer.android.com/sdk/index.html</a></p>
<p>I thought that an IDE would be useful so I installed Eclipse 3.5.1 and tried to install the Android Development Tools, or ADT. However, an error "org.eclipse.gef 0.0.0 required" (or something like that) appeared.</p>
<p>After googling for a while, I found a URL for the GEF SDK, which is Eclipse's Graphic Editing Framework, as the following URL.</p>
<p><a href="http://download.eclipse.org/tools/gef/updates/releases/" title="http://download.eclipse.org/tools/gef/updates/releases/">http://download.eclipse.org/tools/gef/updates/releases/</a></p>
<p>So I added this update into Eclipse by</p>
<ol>
<li>Go to the menu 'Help',</li>
<li>Choose 'Install New Software',</li>
<li>Place the GEF SDK updates URL into the box after 'Work with:',</li>
<li>Choose the right version of updates in the box below (for me, GEF SDK 3.5.1),</li>
<li>Click 'Next',</li>
<li>After Eclipse calculates all the dependencies, just click 'Finish' and let it install the plugin.</li>
</ol>
<p>After installing GEF SDK, return to installation of ADT. You should be able to install it now.</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>Today I wanted to try the Android SDK on my Ubuntu Karmic Koala, so I followed the instructions in the following URL.</p>
<p><a href="http://developer.android.com/sdk/index.html" title="http://developer.android.com/sdk/index.html">http://developer.android.com/sdk/index.html</a></p>
<p>I thought that an IDE would be useful so I installed Eclipse 3.5.1 and tried to install the Android Development Tools, or ADT. However, an error "org.eclipse.gef 0.0.0 required" (or something like that) appeared.</p>
<p>After googling for a while, I found a URL for the GEF SDK, which is Eclipse's Graphic Editing Framework, as the following URL.</p>
<p><a href="http://download.eclipse.org/tools/gef/updates/releases/" title="http://download.eclipse.org/tools/gef/updates/releases/">http://download.eclipse.org/tools/gef/updates/releases/</a></p>
<p>So I added this update into Eclipse by</p>
<ol>
<li>Go to the menu 'Help',</li>
<li>Choose 'Install New Software',</li>
<li>Place the GEF SDK updates URL into the box after 'Work with:',</li>
<li>Choose the right version of updates in the box below (for me, GEF SDK 3.5.1),</li>
<li>Click 'Next',</li>
<li>After Eclipse calculates all the dependencies, just click 'Finish' and let it install the plugin.</li>
</ol>
<p>After installing GEF SDK, return to installation of ADT. You should be able to install it now.</p>
    ]]></content>
  </entry>
  <entry>
    <title>Faulty Barcode Detection</title>
    <link rel="alternate" type="text/html" href="http://tewson.com/content/faulty-barcode-detection" />
    <id>http://tewson.com/content/faulty-barcode-detection</id>
    <published>2009-09-19T18:43:00+07:00</published>
    <updated>2009-09-19T18:43:00+07:00</updated>
    <author>
      <name>tewson</name>
    </author>
    <category term="image processing" />
    <category term="intellect" />
    <category term="programming" />
    <category term="project" />
    <category term="tech" />
    <summary type="html"><![CDATA[<p>อันนี้เป็นโครงงานเล็ก ๆ จากวิชา Computer Vision หัวข้อคือ ทำไงก็ได้ให้คอมมันรู้ได้ว่าภาพบาร์โค้ดมันสกปรก มีภาพตัวอย่างมาให้ด้วย</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>อันนี้เป็นโครงงานเล็ก ๆ จากวิชา Computer Vision หัวข้อคือ ทำไงก็ได้ให้คอมมันรู้ได้ว่าภาพบาร์โค้ดมันสกปรก มีภาพตัวอย่างมาให้ด้วย<br />
&lt;!--break--><br />
<img src="http://lh6.ggpht.com/_3MHSZs9ETeM/SrSwNFkhBkI/AAAAAAAACrQ/bjeevMJb0Ig/s400/BarCodeImage1.jpg" alt="Barcode1" /></p>
<p><img src="http://lh4.ggpht.com/_3MHSZs9ETeM/SrSwNfxi_ZI/AAAAAAAACrU/RfQyznjadM4/s400/BarCodeImage2.jpg" alt="Barcode2" /></p>
<p><img src="http://lh6.ggpht.com/_3MHSZs9ETeM/SrSwNqtb7jI/AAAAAAAACrY/6CY0D4QUVMM/s400/BarCodeImage3.jpg" alt="Barcode3" /></p>
<p>ดูแล้วก็แบบ เอ่อ มันสกปรกตรงไหนเนี่ย แต่ก็นั่นล่ะ เจ้าของโจทย์จริง ๆ เป็นบริษัทที่พิมพ์พวกบรรจุภัณฑ์กระดาษ เลยต้องการวิธีตรวจคุณภาพการพิมพ์ที่มันอัตโนมัติ (จริง ๆ แล้วซอฟท์แวร์อ่านบาร์โค้ดสมัยนี้มันฉลาดมาก เบี้ยวก็อ่านได้ เบลอก็อ่านได้)</p>
<p>จริง ๆ แล้วโจทย์มีสามข้อ คือ (1) ทำภาพแบบที่มีเอฟเฝ็กท์ประหลาด ๆ เช่น แขนขายืดออก ตัวหมุนเป็นเกลียว (ไอเดียคือตัดเอาส่วนเล็ก ๆ ของภาพในแต่ละเฟรมตามเวลามาต่อ ๆ กัน) (2) ใช้ภาพถ่ายของวัตถุเดียวกันสองภาพในตำแหน่งที่ต่างกันมาหาระยะห่างระหว่างวัตถุกับกล้อง และข้อสุดท้ายก็บาร์โค้ดนี่ล่ะ</p>
<p>เลือกข้อบาร์โค้ดนี่เพราะว่าข้อแรกคนทำเยอะมาก (เพราะเห็นผลชัดเจน) ตัวเปรียบเทียบเยอะ (ฮา) ส่วนข้อที่สองนี่ก็มีสูตรคณิตศาสตร์อยู่แล้ว เลือกข้อสุดท้ายนี่แหละ ท่าจะมันส์</p>
<p>เอาเข้าจริงมันก็มันส์ไปหน่อย งานวิชาอื่นก็ดันมาส่งพร้อม ๆ กัน (บอกผมสิว่าคุณไม่ดองงาน) ไอเดียในการแก้ปัญหามันเลยแอบเผา แต่อย่างน้อยมันก็ทำงานได้ตามจุดประสงค์เท่าที่มีตัวอย่างน่ะนะ</p>
<p><strong>ข้อความข้างล่างนี้ไปอาจจะน่าเบื่อไปหน่อย จริง ๆ ข้ามไปดูวิดีโอข้างล่างสุดได้เลย เอ๊ะ แต่ก็อยากให้อ่านแฮะ</strong></p>
<p>ไอเดียคร่าว ๆ ก็คือใช้ความ "เส้นเยอะ" (ไม่ใช่เส้นใหญ่) ของบาร์โค้ด ตอนแรกก็จับภาพนั้นมาหาเส้นก่อน ด้วย <a href="http://en.wikipedia.org/wiki/Hough_transform">Hough transform (แปลไทยว่า "การแปลงฮัฟ" เท่สลัด ๆ)</a> จะได้เส้นเยอะ ๆ ออกมา ซึ่งเส้นส่วนมากที่ได้จะมาจากบาร์โค้ด จากนั้นก็ดูมุมของความชันของเส้นพวกนั้น จัดการแบ่งมุมที่พบออกเป็นกลุ่มย่อย ๆ ก็จะพบว่ามีช่วงของขนาดมุมหนึ่ง ๆ ที่มีจำนวนเยอะกว่าช่วงอื่น (เช่น ถ้าบาร์โค้ดมันเอียงอยู่ประมาณ 45 องศา เราก็จะพบเส้นที่มีมุม 45 องศาเยอะกว่าเส้นที่ตั้งตรง) เราก็ถือเอาว่าช่วงมุมนั้นล่ะ เป็นมุมของความเอียงของบาร์โค้ด แล้วก็หมุนภาพให้บาร์โค้ดมันตั้งตรงซะ</p>
<p>เมื่อบาร์โค้ดมันตรงแล้ว อะไร ๆ ก็ง่ายขึ้น ก็จัดการหาขอบแนวตั้งซะก่อน คือ หาเส้นที่ตั้งตรง (ความชันเข้าใกล้อินฟินิตี้) แล้วเลือกเส้นที่อยู่นอกสุดสองฝั่งมา (ซึ่งวิธีนี้มันใช้ไม่ได้กับทุกสถานการณ์ ถ้ามีเส้นตั้งตรงอื่นอยู่นอกบาร์โค้ดแล้วจะจบเห่ อาศัยมองโลกในแง่ดีว่าถ้าจะให้คอมมันดูบาร์โค้ดให้แล้ว คนก็คงไม่ถ่ายภาพที่มันเป็นมุมกว้างมากมาให้หรอกมั้ง ฮา)</p>
<p>ต่อมาขอบแนวนอนนี่ปัญหาเลย เพราะบาร์โค้ดมันไม่มีขอบแนวนอน จะหารูปแบบของเส้นที่มันไม่ค่อยปะติดปะต่อกันแบบนั้นก็คงจะยากไป เลยจัดการ "ขยาย" (Dilate) แต่ละแท่งในบาร์โค้ดนั้นตามแนวนอน มันก็จะมาเชื่อมกัน กลายเป็นกล่อง มีขอบแนวนอนแล้ว เย้ (จริง ๆ ก็ขยายออกทางข้างแม่งทั้งภาพนั่นแหละ เพียงแต่ขยายนิดเดียว ส่วนอื่นของภาพไม่มีผลกระทบมาก แต่ช่องว่างในบาร์โค้ดมันแคบ เลยเชื่อมกันได้)</p>
<p>เจอปัญหาอีก คือพอจะหาเส้นแนวนอนแล้วมัน (เป็นไปได้ที่จะ) เสือกเจอหลายเส้น นอกเหนือจากขอบของบาร์โค้ด ก็แก้ปัญหาเฉพาะหน้า (งานโคตรเผา ฮา) ด้วยการเอาเส้นแนวตั้งสองเส้น กับเส้นแนวนอนทั้งหลายนั่นมาใช้แทนเส้นกริด เสมือนตัดภาพออกเป็นสี่เหลี่ยมหลาย ๆ อัน แล้วดูว่าสี่เหลี่ยมไหนที่บรรจุเส้นมากที่สุด นั่นล่ะบาร์โค้ด</p>
<p>เมื่อตัดเอาบาร์โค้ดออกมาได้แล้ว จะหารอยเปื้อนได้ยังไง คิดอยู่พักใหญ่เลย จะหาขอบของรอยเปื้อน จุดมันก็เล็กเกินไป ปกติในการหาความแตกต่างของภาพสองภาพ วิธีเบื้องต้นสุด ๆ คือการเอาสองภาพนั้นมาลบกัน (ลองนึกตามว่ามีภาพ (1) จุดสามจุด กับภาพ (2) จุดเดียวตรงกลาง เอาภาพ (2) ลบออกจากภาพ (1) ก็น่าจะได้จุดข้าง ๆ ที่เหลือ) ทีนี้ ถ้าเรามีภาพบาร์โค้ดเปื้อน ๆ อยู่ จะเอาภาพบาร์โค้ดสะอาด ๆ ที่ไหนมาลบออกไปล่ะ จ้องไปจ้องมาพบว่า เฮ้ย เราตั้งบาร์โค้ดได้แล้ว ถ้าเรา "หด" (Erode) ภาพบาร์โค้ดเปื้อนนั้นตามแนวตั้งเนี่ย พวกจุดก็จะหายไป แต่เส้นยังอยู่ (เพราะเส้นแนวตั้งมันยาว หดไปบ้างแต่ไม่หายไป) แล้วขยายกลับคืนตามแนวตั้ง ก็จะได้ภาพบาร์โค้ดสะอาด ๆ มา เอาไปลบออกจากภาพเดิมที่เปื้อนอยู่ ก็จะได้รอยเปื้อน!</p>
<p>ที่เหลือก็แค่นับรอยเปื้อน ซึ่งตรงนี้ก็เจอปัญหาอีกนิดหน่อย เพราะจากการที่เราหมุนภาพในตอนแรก มันทำให้เส้นขอบของแต่ละแท่งมันไม่ได้เรียบตรงเดี๊ยะ พอมายืด ๆ หด ๆ ตามแนวตั้งมันก็ยิ่งเปลี่ยนแปลง เมื่อเอาไปเทียบความแตกต่างกับรูปต้นฉบับจะพบว่าเกิดความแตกต่าง (ที่ไม่ใช่รอยเปื้อนจริง ๆ) พอสมควร ทางแก้ก็คือ แปลงภาพทั้งสอง (ภาพดั้งเดิมกับภาพสะอาด) ให้เป็นภาพขาวดำจริง ๆ ซะก่อน (คือมีแต่ขาวกับดำเท่านั้น) เอามาลบกัน จะพบว่าถ้าภาพดั้งเดิมมันสะอาด ผลต่างที่ได้จะเป็นแค่เส้นแนวดิ่งเล็ก ๆ กว้างไม่เกินหนึ่งพิกเซล (จากการหมุน) อย่างนี้ก็เสร็จโจร เราก็นับแค่เส้นแนวนอนที่ยาวสองพิกเซลขึ้นไป แล้วก็ดูว่าถ้ามีไอ้เส้นพวกนี้มากเท่าไรจึงจะตัดสินว่าภาพมันเปื้อน</p>
<p>มันน่าสับสนสินะ ใครที่อ่านข้างบนมานี่แล้วเข้าใจทั้งหมดผมแม่งโคตรนับถือเลยอะ ผมแนบวิดีโอสาธิตมาด้วยข้างล่างนี้ มีให้เห็นแต่ละขั้นตอนด้วย</p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/z2T4MiZWS9c&hl=en&fs=1&rel=0" /><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><embed src="http://www.youtube.com/v/z2T4MiZWS9c&hl=en&fs=1&rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>
<p>เท่านั้นไม่พอ มี<a href="/sites/default/files/barcode.pdf">รายงาน</a> (pdf ประมาณ 7 เม็กฯ) กับ<a href="/sites/default/files/findbarcode.py">โค้ด</a>กาก ๆ (เขียนด้วย Python ใช้ไลบรารี่ OpenCV) ให้เอาไปหัวเราะเยาะด้วยเอ้า (อยากจะหาเวลาศึกษาการเขียนโค้ดแบบ Pythonic อยู่ครับ ไอ้แบบ tewsonic ที่เขียนนี่มันอนาถสิ้นดี)</p>
<p>แล้วก็ ผมเชื่อว่ามีวิธีที่ฉลาดกว่านี้อยู่มากมาย ใครเห็นใจก็บอกกันหน่อยนะจ๊ะ</p>
    ]]></content>
  </entry>
  <entry>
    <title>BarCamp Bangkok 3</title>
    <link rel="alternate" type="text/html" href="http://tewson.com/content/barcamp-bangkok-3" />
    <id>http://tewson.com/content/barcamp-bangkok-3</id>
    <published>2009-05-25T01:17:13+07:00</published>
    <updated>2009-05-25T01:17:13+07:00</updated>
    <author>
      <name>tewson</name>
    </author>
    <category term="bangkok" />
    <category term="barcampbkk3" />
    <category term="intellect" />
    <category term="programming" />
    <category term="project" />
    <category term="tech" />
    <summary type="html"><![CDATA[<p>และแล้ว<a href="http://barcampbangkok.org">บาร์แค้มป์ กรุงเทพฯ ครั้งที่ 3</a> ก็จบลงอย่างเงียบ ๆ</p>
<p>ผมขอสดุดีให้กับทีมงานทุกคนสำหรับความอุตสาหะในการจัดงานครั้งนี้ เพราะผมเห็นว่ามันประสบความสำเร็จมาก</p>
<p>บาร์แค้มป์ครั้งนี้มีสิ่งที่พิเศษกว่าครั้งก่อน ๆ มาก ไม่ว่าจะเป็น <a href="http://www.twitpic.com/5u0m4">ดนตรีสด</a> <a href="http://www.twitpic.com/5rnkw">การประกวดมิสบาร์แค้มป์</a> หรือแม้แต่<a href="http://www.twitpic.com/5rp9e">เชียร์ลีดเด้อร์</a>! ทั้งนี้ก็เพราะเป็นครั้งแรกที่มีการค้างคืนกันนั่นเอง</p>
<p>ผมเองก็เสนอหัวข้อไปตั้งแต่วันแรก แต่ไม่ได้รับการโหวต วันที่สองดูรอบเช้าก็ยังไม่ได้ เลยนิ่งนอนใจ เข้าฟังหัวข้อ ดรูปั้ลปะทะเวิร์ดเพรสปะทะจูมล่า ด้วยความง่วงงุน (คืนก่อนวันงาน นอน 5 ชั่วโมง คืนวันงานนอน 3 ชั่วโมง) เลยเผลอหลับ ตื่นขึ้นมาตอนเลิกพอดี (เพราะเสียงปรบมือ) ก็มั่ว ๆ เดินออกนอกห้องตาม ๆ เขาไป</p>
<p>เจอ <a href="http://twitter.com/noomz">@noomz</a> ทักว่าต่อไปเป็นหัวข้อของผม แล้วตะกี้ในห้องเขาก็ถามว่าใครพูดหัวข้อต่อไป แต่ก็ไม่มีใครตอบ (ก็หลับอยู่นี่หว่า) เลยเกิดอาการรน วิ่งไปดูให้แน่ใจแล้ววิ่งกลับมา ยังดีที่มีคนเดินมาฟังบ้าง ก็เลยพูด ด้วยความรนและเพิ่งตื่นเลยพูดเร็วเกิน ต้องขออภัยคนที่ฟังด้วย ข้างล่างนี่เป็นสไล้ด์</p>
<div style="width:425px;text-align:left" id="__ss_1482234"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/tewson/using-qtwebkit-in-pyqt-as-a-n00b?type=presentation" title="Using QtWebKit in PyQt as a N00b">Using QtWebKit in PyQt as a N00b</a>
<object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=barcamp-090524130330-phpapp02&stripped_title=using-qtwebkit-in-pyqt-as-a-n00b" /><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=barcamp-090524130330-phpapp02&stripped_title=using-qtwebkit-in-pyqt-as-a-n00b" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object><div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;">View more <a style="text-decoration:underline;" href="http://www.slideshare.net/">Microsoft Word documents</a> from <a style="text-decoration:underline;" href="http://www.slideshare.net/tewson">tewson</a>.</div>
</div>
    ]]></summary>
    <content type="html"><![CDATA[<p>และแล้ว<a href="http://barcampbangkok.org">บาร์แค้มป์ กรุงเทพฯ ครั้งที่ 3</a> ก็จบลงอย่างเงียบ ๆ</p>
<p>ผมขอสดุดีให้กับทีมงานทุกคนสำหรับความอุตสาหะในการจัดงานครั้งนี้ เพราะผมเห็นว่ามันประสบความสำเร็จมาก</p>
<p>บาร์แค้มป์ครั้งนี้มีสิ่งที่พิเศษกว่าครั้งก่อน ๆ มาก ไม่ว่าจะเป็น <a href="http://www.twitpic.com/5u0m4">ดนตรีสด</a> <a href="http://www.twitpic.com/5rnkw">การประกวดมิสบาร์แค้มป์</a> หรือแม้แต่<a href="http://www.twitpic.com/5rp9e">เชียร์ลีดเด้อร์</a>! ทั้งนี้ก็เพราะเป็นครั้งแรกที่มีการค้างคืนกันนั่นเอง</p>
<p>ผมเองก็เสนอหัวข้อไปตั้งแต่วันแรก แต่ไม่ได้รับการโหวต วันที่สองดูรอบเช้าก็ยังไม่ได้ เลยนิ่งนอนใจ เข้าฟังหัวข้อ ดรูปั้ลปะทะเวิร์ดเพรสปะทะจูมล่า ด้วยความง่วงงุน (คืนก่อนวันงาน นอน 5 ชั่วโมง คืนวันงานนอน 3 ชั่วโมง) เลยเผลอหลับ ตื่นขึ้นมาตอนเลิกพอดี (เพราะเสียงปรบมือ) ก็มั่ว ๆ เดินออกนอกห้องตาม ๆ เขาไป</p>
<p>เจอ <a href="http://twitter.com/noomz">@noomz</a> ทักว่าต่อไปเป็นหัวข้อของผม แล้วตะกี้ในห้องเขาก็ถามว่าใครพูดหัวข้อต่อไป แต่ก็ไม่มีใครตอบ (ก็หลับอยู่นี่หว่า) เลยเกิดอาการรน วิ่งไปดูให้แน่ใจแล้ววิ่งกลับมา ยังดีที่มีคนเดินมาฟังบ้าง ก็เลยพูด ด้วยความรนและเพิ่งตื่นเลยพูดเร็วเกิน ต้องขออภัยคนที่ฟังด้วย ข้างล่างนี่เป็นสไล้ด์</p>
<div style="width:425px;text-align:left" id="__ss_1482234"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/tewson/using-qtwebkit-in-pyqt-as-a-n00b?type=presentation" title="Using QtWebKit in PyQt as a N00b">Using QtWebKit in PyQt as a N00b</a>
<object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=barcamp-090524130330-phpapp02&stripped_title=using-qtwebkit-in-pyqt-as-a-n00b" /><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=barcamp-090524130330-phpapp02&stripped_title=using-qtwebkit-in-pyqt-as-a-n00b" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object><div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;">View more <a style="text-decoration:underline;" href="http://www.slideshare.net/">Microsoft Word documents</a> from <a style="text-decoration:underline;" href="http://www.slideshare.net/tewson">tewson</a>.</div>
</div>
    ]]></content>
  </entry>
  <entry>
    <title>Python Qt MySQL และภาษาไทย</title>
    <link rel="alternate" type="text/html" href="http://tewson.com/content/python-qt-mysql-%E0%B9%81%E0%B8%A5%E0%B8%B0%E0%B8%A0%E0%B8%B2%E0%B8%A9%E0%B8%B2%E0%B9%84%E0%B8%97%E0%B8%A2" />
    <id>http://tewson.com/content/python-qt-mysql-%E0%B9%81%E0%B8%A5%E0%B8%B0%E0%B8%A0%E0%B8%B2%E0%B8%A9%E0%B8%B2%E0%B9%84%E0%B8%97%E0%B8%A2</id>
    <published>2009-03-30T17:08:56+07:00</published>
    <updated>2009-03-30T17:08:57+07:00</updated>
    <author>
      <name>tewson</name>
    </author>
    <category term="intellect" />
    <category term="programming" />
    <category term="python" />
    <summary type="html"><![CDATA[<p>วันนี้เขียนโปรแกรมโดยใช้ PyQt แล้วติดปัญหาว่าใส่ข้อมูลภาษาไทยลงฐานข้อมูลไม่ได้ โดยฐานข้อมูลใช้ charset เป็น UTF-8<br />
วิธีก็คือ ตอนเชื่อมต่อฐานข้อมูลให้ระบุไปด้วยว่าจะเชื่อมต่อแบบไหน<br />
<code><br />
conn = MySQLdb.connect (<br />
  host = "localhost",<br />
  user = "user",<br />
  passwd = "pass",<br />
  db = "db",<br />
  use_unicode=True,<br />
  charset='utf8')<br />
</code><br />
ต่อมา เนื่องจากเขียนอยู่บน PyQt พอจะเอาข้อความไปใส่ฐานข้อมูล ก็ต้องแปลงจาก QString เป็น String ธรรมดาก่อน ซึ่งจะใช้ฟังก์ชั่น str() เฉย ๆ ไม่ได้ เพราะมันเป็นภาษาไทย เลยต้องใช้ unicode() แทน<br />
ขอขอบคุณ <a href="http://www.narisa.com/forums/index.php?showtopic=15869" title="http://www.narisa.com/forums/index.php?showtopic=15869">http://www.narisa.com/forums/index.php?showtopic=15869</a></p>
    ]]></summary>
    <content type="html"><![CDATA[<p>วันนี้เขียนโปรแกรมโดยใช้ PyQt แล้วติดปัญหาว่าใส่ข้อมูลภาษาไทยลงฐานข้อมูลไม่ได้ โดยฐานข้อมูลใช้ charset เป็น UTF-8</p>
<p>วิธีก็คือ ตอนเชื่อมต่อฐานข้อมูลให้ระบุไปด้วยว่าจะเชื่อมต่อแบบไหน</p>
<p><code><br />
conn = MySQLdb.connect (<br />
  host = "localhost",<br />
  user = "user",<br />
  passwd = "pass",<br />
  db = "db",<br />
  use_unicode=True,<br />
  charset='utf8')<br />
</code></p>
<p>ต่อมา เนื่องจากเขียนอยู่บน PyQt พอจะเอาข้อความไปใส่ฐานข้อมูล ก็ต้องแปลงจาก QString เป็น String ธรรมดาก่อน ซึ่งจะใช้ฟังก์ชั่น str() เฉย ๆ ไม่ได้ เพราะมันเป็นภาษาไทย เลยต้องใช้ unicode() แทน</p>
<p>ขอขอบคุณ <a href="http://www.narisa.com/forums/index.php?showtopic=15869" title="http://www.narisa.com/forums/index.php?showtopic=15869">http://www.narisa.com/forums/index.php?showtopic=15869</a></p>
    ]]></content>
  </entry>
</feed>
