<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8372854729698244077</id><updated>2011-07-08T07:37:24.573-07:00</updated><category term='ruby'/><category term='roti'/><category term='facebook'/><category term='activerecord'/><category term='forkjoin'/><category term='java'/><category term='news'/><category term='web'/><category term='process'/><category term='plug-in'/><category term='up1'/><category term='merb'/><category term='java hibernate'/><category term='oracle'/><category term='mq'/><category term='firefox'/><category term='grails'/><category term='iPhone'/><category term='groovy'/><category term='software'/><category term='twitter'/><category term='rabbitmq'/><category term='AMQP'/><category term='bdd'/><category term='architecture'/><category term='jsr166y'/><category term='google'/><title type='text'>UP1's Blog</title><subtitle type='html'>I'm just developer ...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://somkiatspns.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://somkiatspns.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>up1</name><uri>http://www.blogger.com/profile/11945100712671949630</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_jVzpkJk8JBg/SNsSogWLcBI/AAAAAAAAAFk/g5FVMdOkSMM/S220/dsc_4692_128.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>28</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8372854729698244077.post-4662906662775084739</id><published>2009-07-12T08:13:00.000-07:00</published><updated>2009-07-12T08:40:02.474-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>มาดูรายชื่อ Account ของ google ใน Twitter กัน</title><content type='html'>&lt;span style="font-weight:bold;"&gt;ที่มา ::&lt;/span&gt; &lt;a href="http://googleblog.blogspot.com/2009/07/google-accounts-on-twitter.html"&gt;Google Accounts On Twitter&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ดูแล้วเยอะน่าดูชมครับ ....&lt;br /&gt;&lt;br /&gt;twitter.com/Google - our central account&lt;br /&gt;twitter.com/Blogger - for Blogger fans&lt;br /&gt;twitter.com/GoogleCalendar - user tips &amp; updates&lt;br /&gt;twitter.com/GoogleImages - news, tips, tricks on our visual image search&lt;br /&gt;twitter.com/GoogleNews - latest headlines via Google News&lt;br /&gt;twitter.com/GoogleReader - from our feed reader team&lt;br /&gt;twitter.com/iGoogle - news &amp; notes from Google's personalized homepage&lt;br /&gt;twitter.com/GoogleStudents - news of interest to students using Google&lt;br /&gt;twitter.com/YouTube - for YouTube fans&lt;br /&gt;twitter.com/YouTubeES - en Espanol&lt;br /&gt;twitter.com/GoogleAtWork - solutions for IT and workplace productivity&lt;br /&gt;&lt;br /&gt;Geo-related&lt;br /&gt;twitter.com/SketchUp - Google SketchUp news&lt;br /&gt;twitter.com/3DWH - SketchUp's 3D Warehouse&lt;br /&gt;twitter.com/Modelyourtown - 3D modeling to build your favorite places&lt;br /&gt;twitter.com/EarthOutreach - Earth &amp; Maps tools for nonprofits &amp; orgs&lt;br /&gt;twitter.com/GoogleMaps - uses, tips, mashups&lt;br /&gt;twitter.com/GoogleSkyMap -Android app for the night sky&lt;br /&gt;&lt;br /&gt;Ads-related&lt;br /&gt;twitter.com/AdSense - for online publishers&lt;br /&gt;twitter.com/AdWordsHelper - looking out for AdWords questions and tech issues&lt;br /&gt;twitter.com/AdWordsProSarah - Google Guide for AdWords Help Forum&lt;br /&gt;twitter.com/GoogleAnalytics - insights for website effectiveness&lt;br /&gt;twitter.com/GoogleAdBuilder - re building display ads&lt;br /&gt;twitter.com/GoogleRetail - for retail advertisers&lt;br /&gt;twitter.com/TechnologyUK - for U.K. tech advertisers&lt;br /&gt;twitter.com/InsideAdWordsDE - for German AdWords customers&lt;br /&gt;twitter.com/GoogleAgencyDE - for German ad agencies&lt;br /&gt;twitter.com/AdSensePT - info for Portuguese-language publishers&lt;br /&gt;twitter.com/AdWordsRussia - AdWords news &amp; tips in Russian&lt;br /&gt;twitter.com/DentroDeAdWords - Spanish updates from the Inside AdWords blog&lt;br /&gt;twitter.com/AdWordsAPI - AdWords API tips&lt;br /&gt;&lt;br /&gt;Developer &amp; technical&lt;br /&gt;twitter.com/GoogleResearch - from our research scientists&lt;br /&gt;twitter.com/GoogleWMC - Google Webmaster Central&lt;br /&gt;twitter.com/GoogleCode - latest updates for Google developer products&lt;br /&gt;twitter.com/GoogleData - Data APIs provide a standard protocol for reading and writing web data&lt;br /&gt;twitter.com/app_engine - web apps run on Google infrastructure&lt;br /&gt;twitter.com/DataLiberation - our initiative for complete import/export of all data&lt;br /&gt;twitter.com/GoogleMapsAPI - about using Google Maps embedded in websites&lt;br /&gt;twitter.com/GoogleIO - Google's largest annual developer event&lt;br /&gt;&lt;br /&gt;Culture, People&lt;br /&gt;twitter.com/googletalks - notes from our @Google speaker series&lt;br /&gt;twitter.com/googlejobs - the voice of Google recruiters&lt;br /&gt;&lt;br /&gt;Country or Region&lt;br /&gt;twitter.com/googlearabia - news from the Google Arabia Blog*&lt;br /&gt;twitter.com/googledownunder - Google activities in Australia &amp; New Zealand&lt;br /&gt;twitter.com/GoogleDE - Google in Germany&lt;br /&gt;twitter.com/GoogleLatAm - Latin America (en Espanol)&lt;br /&gt;twitter.com/GooglePolicyIt - Notes on Google policy issues in Italy&lt;div class="blogger-post-footer"&gt;test&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8372854729698244077-4662906662775084739?l=somkiatspns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://somkiatspns.blogspot.com/feeds/4662906662775084739/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8372854729698244077&amp;postID=4662906662775084739' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/4662906662775084739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/4662906662775084739'/><link rel='alternate' type='text/html' href='http://somkiatspns.blogspot.com/2009/07/account-google-twitter.html' title='มาดูรายชื่อ Account ของ google ใน Twitter กัน'/><author><name>up1</name><uri>http://www.blogger.com/profile/11945100712671949630</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_jVzpkJk8JBg/SNsSogWLcBI/AAAAAAAAAFk/g5FVMdOkSMM/S220/dsc_4692_128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8372854729698244077.post-4031765112415895863</id><published>2009-07-10T09:43:00.000-07:00</published><updated>2009-07-10T09:52:48.130-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>การปรับปรุงผลการค้นหาข้อมูลของ Google</title><content type='html'>จากบทความนี้ http://googleblog.blogspot.com/2009/07/seeing-world-with-improved-google.html&lt;br /&gt;&lt;br /&gt;ทำให้เห้นว่า google พยายามนำข้อมูลจาก media และ project ต่างๆ ของตนมาประกอบกัน เพื่อช่วยให้ผลการค้นหาถูกต้องและชัดเจนมากยิ่งขึ้น&lt;br /&gt;&lt;br /&gt;ผมก็เป็นคนหนึ่งที่ชอบเดินทางไปไหนมาไหนประจำ  ... ลองคิดดูว่า ถ้าผมอยากไปสักที่ เช่น  อุทยานแห่งชาติเขาใหญ่ แล้วผมลองไปค้นหาจะเจอข้อมูลที่ต้องการหรือเกี่ยวข้องเช่น&lt;br /&gt;- ข้อมูลทั่วไป&lt;br /&gt;- แผนที่การเดินทาง&lt;br /&gt;- รูปภาพต่างๆ ที่เกี่ยวข้อง เช่น รูปวิว รูปสัตว์ รูปพืชต่างๆ &lt;br /&gt;- vdo ที่เกี่ยวข้อง&lt;br /&gt;- blog ที่เกี่ยวข้อง&lt;br /&gt;&lt;br /&gt;... ถ้าได้จริง ผมว่าทุกๆ คน happy แน่ๆ ครับ&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ตัวอย่างที่ google นำมาให้ดูก็เช่น&lt;br /&gt;- http://www.google.com/search?q=paris&lt;br /&gt;- http://www.google.com/search?q=Yellowstone+National+Park&lt;br /&gt;&lt;br /&gt;ซึ่งน่าสนใจมากๆ ครับ  ต่อไปคงมีอะไรปรับปรุงมาอีกเรื่อยๆ เพื่อให้ได้ผลัพธ์ที่ตรงตามความต้องการมากยิ่งขึ้น&lt;div class="blogger-post-footer"&gt;test&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8372854729698244077-4031765112415895863?l=somkiatspns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://somkiatspns.blogspot.com/feeds/4031765112415895863/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8372854729698244077&amp;postID=4031765112415895863' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/4031765112415895863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/4031765112415895863'/><link rel='alternate' type='text/html' href='http://somkiatspns.blogspot.com/2009/07/google.html' title='การปรับปรุงผลการค้นหาข้อมูลของ Google'/><author><name>up1</name><uri>http://www.blogger.com/profile/11945100712671949630</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_jVzpkJk8JBg/SNsSogWLcBI/AAAAAAAAAFk/g5FVMdOkSMM/S220/dsc_4692_128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8372854729698244077.post-5882663822062650797</id><published>2009-06-11T08:05:00.000-07:00</published><updated>2009-06-11T08:07:05.152-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><title type='text'>เปรียบเทียบระหว่าง iPhone กับ Nokia 3310</title><content type='html'>ผมขอฟันธงว่า 3310 กินขาด ชัวร์ !!!!!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_jVzpkJk8JBg/SjEdeVu4aCI/AAAAAAAAALw/9YoQYZOXIXg/s1600-h/3310-vs-iphone.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 330px; height: 400px;" src="http://1.bp.blogspot.com/_jVzpkJk8JBg/SjEdeVu4aCI/AAAAAAAAALw/9YoQYZOXIXg/s400/3310-vs-iphone.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5346086639732549666" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;test&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8372854729698244077-5882663822062650797?l=somkiatspns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://somkiatspns.blogspot.com/feeds/5882663822062650797/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8372854729698244077&amp;postID=5882663822062650797' title='1 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/5882663822062650797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/5882663822062650797'/><link rel='alternate' type='text/html' href='http://somkiatspns.blogspot.com/2009/06/iphone-nokia-3310.html' title='เปรียบเทียบระหว่าง iPhone กับ Nokia 3310'/><author><name>up1</name><uri>http://www.blogger.com/profile/11945100712671949630</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_jVzpkJk8JBg/SNsSogWLcBI/AAAAAAAAAFk/g5FVMdOkSMM/S220/dsc_4692_128.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_jVzpkJk8JBg/SjEdeVu4aCI/AAAAAAAAALw/9YoQYZOXIXg/s72-c/3310-vs-iphone.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8372854729698244077.post-8916285445707300640</id><published>2009-05-31T04:04:00.000-07:00</published><updated>2009-05-31T04:08:48.068-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='facebook'/><title type='text'>บนบนล่างล่างซ้ายขวาซ้ายขวาบีเอ enter บน Facebook</title><content type='html'>บนบนล่างล่างซ้ายขวาซ้ายขวาบีเอ enter บน facebook.com คุ้นๆ ว่าเคยได้ยินมาประมาณนี้ไหม บน-บน-ล่าง-ล่าง-ซ้าย-ขวา-ซ้าย-ขวา-บี-เอ-ซีเล็คท์-สตาร์ท&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;นี่มันสูตรของเกมส์ contra นิ&lt;br /&gt;&lt;br /&gt;ผลการทำงานบน facebook จะแสดงเมื่อเอา mouse เลื่อน scrollbar ดังรูป&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_jVzpkJk8JBg/SiJlI7sQh_I/AAAAAAAAALo/XKu85aAKVzM/s1600-h/facebook.gif"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 163px;" src="http://4.bp.blogspot.com/_jVzpkJk8JBg/SiJlI7sQh_I/AAAAAAAAALo/XKu85aAKVzM/s400/facebook.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5341943312151513074" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;test&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8372854729698244077-8916285445707300640?l=somkiatspns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://somkiatspns.blogspot.com/feeds/8916285445707300640/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8372854729698244077&amp;postID=8916285445707300640' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/8916285445707300640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/8916285445707300640'/><link rel='alternate' type='text/html' href='http://somkiatspns.blogspot.com/2009/05/enter-facebook.html' title='บนบนล่างล่างซ้ายขวาซ้ายขวาบีเอ enter บน Facebook'/><author><name>up1</name><uri>http://www.blogger.com/profile/11945100712671949630</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_jVzpkJk8JBg/SNsSogWLcBI/AAAAAAAAAFk/g5FVMdOkSMM/S220/dsc_4692_128.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_jVzpkJk8JBg/SiJlI7sQh_I/AAAAAAAAALo/XKu85aAKVzM/s72-c/facebook.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8372854729698244077.post-3019706674263372020</id><published>2009-02-20T08:51:00.001-08:00</published><updated>2009-02-20T09:08:52.975-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><title type='text'>การ tuning ระบบ :: Case Study is Twitter</title><content type='html'>พอดีกำลังออกแบบระบบที่ให้สา่มารถรองรับการใช้งานและรองรับข้อมูลจำนวนมากๆ ได้  ดังนั้นเลยลองมาดูเอกสารเกี่ยวกับ Architecture ของระบบใหญ่ๆ&lt;br /&gt;&lt;br /&gt;ระบบแรกที่ไปดูมาก็คือ การ tuning ของ twitter.com ว่าทำอย่างไร&lt;br /&gt;&lt;br /&gt;ซึ่งทำการศึกษาจากเอกสารที่นี่&lt;br /&gt;&lt;br /&gt;&lt;div style="width: 425px; text-align: left;" id="__ss_41197"&gt;&lt;a style="margin: 12px 0pt 3px; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; display: block; text-decoration: underline;" href="http://www.slideshare.net/Blaine/scaling-twitter?type=powerpoint" title="Scaling Twitter"&gt;Scaling Twitter&lt;/a&gt;&lt;object style="margin: 0px;" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=scaling-twitter-12758&amp;amp;stripped_title=scaling-twitter"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=scaling-twitter-12758&amp;amp;stripped_title=scaling-twitter" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;"&gt;View more &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/Blaine"&gt;Blaine&lt;/a&gt;. (tags: &lt;a style="text-decoration: underline;" href="http://slideshare.net/tag/performance"&gt;performance&lt;/a&gt; &lt;a style="text-decoration: underline;" href="http://slideshare.net/tag/scaling"&gt;scaling&lt;/a&gt;)&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;สิ่งที่น่าสนใจคือ&lt;/span&gt;&lt;br /&gt;1. การทำ patitioning โดยการ split ข้อมูลออกเป็นส่วนๆ เช่นการใช้ sharding เข้ามาช่วย&lt;br /&gt;2. การ caching ซึ่งจะเก็บในทุกๆ  level&lt;br /&gt;3. การจัดทำ index และ tuning sql&lt;br /&gt;4. ทำ Denormalize [ ไม่ใช่ Normalize นะครับ ]&lt;br /&gt;5. จัดการเรื่อง message โดยใช้ RabbitMQ [ พัฒนาด้วย Erlang ]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ส่วนที่จะเอาไปใช้งานก็คงเป็นข้อแรกก่อน ต่อจากนั้นค่อยทำการขยับขยายต่อไป&lt;div class="blogger-post-footer"&gt;test&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8372854729698244077-3019706674263372020?l=somkiatspns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://somkiatspns.blogspot.com/feeds/3019706674263372020/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8372854729698244077&amp;postID=3019706674263372020' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/3019706674263372020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/3019706674263372020'/><link rel='alternate' type='text/html' href='http://somkiatspns.blogspot.com/2009/02/tuning-case-study-is-twitter.html' title='การ tuning ระบบ :: Case Study is Twitter'/><author><name>up1</name><uri>http://www.blogger.com/profile/11945100712671949630</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_jVzpkJk8JBg/SNsSogWLcBI/AAAAAAAAAFk/g5FVMdOkSMM/S220/dsc_4692_128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8372854729698244077.post-5043863337854962857</id><published>2009-02-18T22:42:00.000-08:00</published><updated>2009-02-18T22:45:31.292-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><title type='text'>Twitter ปิดเพื่อปรับปรุงด้าน performance</title><content type='html'>วันนี้เห้นประกาศการปิด server เพื่อปรับปรุงประสิทธิภาพการทำงานของ twitter  ที่ &lt;a href="http://status.twitter.com/post/79456053/working-on-site-latency-issues"&gt;http://status.twitter.com/post/79456053/working-on-site-latency-issues&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;และตอนนี้ Date :: 2009/02/19 ก็ได้ปิดแล้ววว ดังรูป&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_jVzpkJk8JBg/SZz_24M9CJI/AAAAAAAAAJk/s7_998egJhs/s1600-h/Untitled-1.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 302px;" src="http://3.bp.blogspot.com/_jVzpkJk8JBg/SZz_24M9CJI/AAAAAAAAAJk/s7_998egJhs/s400/Untitled-1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5304395779400337554" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;test&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8372854729698244077-5043863337854962857?l=somkiatspns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://somkiatspns.blogspot.com/feeds/5043863337854962857/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8372854729698244077&amp;postID=5043863337854962857' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/5043863337854962857'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/5043863337854962857'/><link rel='alternate' type='text/html' href='http://somkiatspns.blogspot.com/2009/02/twitter-performance.html' title='Twitter ปิดเพื่อปรับปรุงด้าน performance'/><author><name>up1</name><uri>http://www.blogger.com/profile/11945100712671949630</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_jVzpkJk8JBg/SNsSogWLcBI/AAAAAAAAAFk/g5FVMdOkSMM/S220/dsc_4692_128.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_jVzpkJk8JBg/SZz_24M9CJI/AAAAAAAAAJk/s7_998egJhs/s72-c/Untitled-1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8372854729698244077.post-3853576881916636027</id><published>2009-02-14T08:31:00.000-08:00</published><updated>2009-02-14T08:34:48.866-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><title type='text'>Twitter is over capacity</title><content type='html'>Date :: 2009/02/14&lt;br /&gt;&lt;br /&gt;Happy Valentine Day&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_jVzpkJk8JBg/SZbye2Mtn_I/AAAAAAAAAJc/YEs31ySMAc8/s1600-h/twitter_error.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 337px;" src="http://1.bp.blogspot.com/_jVzpkJk8JBg/SZbye2Mtn_I/AAAAAAAAAJc/YEs31ySMAc8/s400/twitter_error.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5302692223034171378" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;test&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8372854729698244077-3853576881916636027?l=somkiatspns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://somkiatspns.blogspot.com/feeds/3853576881916636027/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8372854729698244077&amp;postID=3853576881916636027' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/3853576881916636027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/3853576881916636027'/><link rel='alternate' type='text/html' href='http://somkiatspns.blogspot.com/2009/02/twitter-is-over-capacity.html' title='Twitter is over capacity'/><author><name>up1</name><uri>http://www.blogger.com/profile/11945100712671949630</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_jVzpkJk8JBg/SNsSogWLcBI/AAAAAAAAAFk/g5FVMdOkSMM/S220/dsc_4692_128.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_jVzpkJk8JBg/SZbye2Mtn_I/AAAAAAAAAJc/YEs31ySMAc8/s72-c/twitter_error.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8372854729698244077.post-8321548240493342665</id><published>2009-02-11T02:38:00.001-08:00</published><updated>2009-02-11T02:40:41.784-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><title type='text'>Twitter.com Down !! 2009/02/11</title><content type='html'>วันที่ 2009/02/11 &lt;br /&gt;เวลา 17.30&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_jVzpkJk8JBg/SZKq8L6UeHI/AAAAAAAAAJU/AmLAasC0pLQ/s1600-h/twitter_down.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 338px;" src="http://1.bp.blogspot.com/_jVzpkJk8JBg/SZKq8L6UeHI/AAAAAAAAAJU/AmLAasC0pLQ/s400/twitter_down.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5301487662334769266" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;test&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8372854729698244077-8321548240493342665?l=somkiatspns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://somkiatspns.blogspot.com/feeds/8321548240493342665/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8372854729698244077&amp;postID=8321548240493342665' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/8321548240493342665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/8321548240493342665'/><link rel='alternate' type='text/html' href='http://somkiatspns.blogspot.com/2009/02/twittercom-down-20090211.html' title='Twitter.com Down !! 2009/02/11'/><author><name>up1</name><uri>http://www.blogger.com/profile/11945100712671949630</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_jVzpkJk8JBg/SNsSogWLcBI/AAAAAAAAAFk/g5FVMdOkSMM/S220/dsc_4692_128.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_jVzpkJk8JBg/SZKq8L6UeHI/AAAAAAAAAJU/AmLAasC0pLQ/s72-c/twitter_down.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8372854729698244077.post-1884544297618468944</id><published>2008-12-14T08:49:00.000-08:00</published><updated>2008-12-14T09:12:24.087-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Review website TwitBlogs Vs TwitWall</title><content type='html'>ไปเจอบทความการเปิด website &lt;a href="http://www.twitblogs.com"&gt;TwitBlogs.com&lt;/a&gt; ที่ &lt;a href="http://www.techcrunch.com/2008/12/14/the-notorious-sam-sethi-launches-his-latest-venture-twitblogs/"&gt;TechCrunch&lt;/a&gt; ผมก็เลยลองเล่นว่ามันต่างจาก twitwall อย่างไร&lt;br /&gt;เริ่มกันเลย&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Features ที่เหมือนกัน&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1. ใช้ username/password จาก &lt;a href="http://twitter.com"&gt;twitter &lt;/a&gt;ทั้งสองเว็บ&lt;br /&gt;&lt;br /&gt;2. เมื่อทำการ post Blog ใหม่ๆ หรือแก้ไขข้อมูล จะทำการ post ไปที่ twitter เสมอ  ซึ่งทำเหมือนกันทั้งสองเว็บ&lt;br /&gt;&lt;br /&gt;3. เมื่อทำการ comment จะส่งการ comment ไปที่ twitter เสมอ   ซึ่งทำเหมือนกันทั้งสองเว็บ&lt;br /&gt;&lt;br /&gt;4. Layout, Theme, Tone สี จะเป็นไปตาม Twitter มาก&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Feateres ที่แตกต่่างกัน&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1. ในการสร้าง blog ที่ TwitBlogs จะสามารถสร้างเป็น Draft ได้ ส่วน Twitwall จะไม่มี&lt;br /&gt;&lt;br /&gt;2. TwitBlogs สามารถเปลี่ยน UI ไปทำการ post เหมือนใน Twitter ได้  แต่ UI ที่เป็น CSS ยังไม่ smooth เท่าไร  UI นั้นเหมือนเป็น theme ของ iPhone เลย    &lt;br /&gt;&lt;br /&gt;ส่วน UI ของ Twitwall จะแข็งๆ ไม่มีอะไรมาก  แต่มี Editor ช่วยในการเขียนดีกว่า&lt;br /&gt;&lt;br /&gt;3. TwitBlogs  เพิ่งเปิดมาใหม่ทำให้ link ในหน้าต่างๆ ยังไม่ครบ เช่น about page, Term page, Privacy page&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;================&lt;br /&gt;&lt;br /&gt;แต่ทั้งสองเว็บพยายามที่จะ promote ให้ผู้ใช้งาน twitter ที่ต้องการพิมพ์มากกว่า 140 ตัวอักษร แต่ยังสามารถ post ข้อความใน twitter ได้อยู่ &lt;br /&gt;&lt;br /&gt;ดูๆ ไปทาง &lt;a href="http://www.noknok.in.th/"&gt;NokNok &lt;/a&gt;ซึ่งเป็น Twitter Clone ของคนไทยจะแก้ปัญหานี้ไปในตัวด้วยแล้ว&lt;div class="blogger-post-footer"&gt;test&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8372854729698244077-1884544297618468944?l=somkiatspns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://somkiatspns.blogspot.com/feeds/1884544297618468944/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8372854729698244077&amp;postID=1884544297618468944' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/1884544297618468944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/1884544297618468944'/><link rel='alternate' type='text/html' href='http://somkiatspns.blogspot.com/2008/12/review-website-twitblogs-vs-twitwall.html' title='Review website TwitBlogs Vs TwitWall'/><author><name>up1</name><uri>http://www.blogger.com/profile/11945100712671949630</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_jVzpkJk8JBg/SNsSogWLcBI/AAAAAAAAAFk/g5FVMdOkSMM/S220/dsc_4692_128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8372854729698244077.post-4545073007077350424</id><published>2008-12-08T06:31:00.000-08:00</published><updated>2008-12-08T06:42:17.909-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>เพิ่ม Widget ของ Google Friend Connect ใน blog แล้ว</title><content type='html'>&lt;div class='rotilinks'&gt;&lt;br /&gt;ผมทำการเพิ่ม Widget ของ Google Friend Connect ใน blog แล้วครับ&lt;br /&gt;&lt;br /&gt;ใช้งานง่ายดีครับ ใครสนใจใช้ลองไปที่นี่ครับ&lt;br /&gt;&lt;a href="http://www.google.com/friendconnect/"&gt;http://www.google.com/friendconnect/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;หรือไปดูขั้นตอนที่นี่ครับ &lt;br /&gt;&lt;a href="http://sitdh.blogspot.com/2008/12/google-friend-connect-social-gadget.html"&gt;http://sitdh.blogspot.com/2008/12/google-friend-connect-social-gadget.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Related link from Roti&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;test&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8372854729698244077-4545073007077350424?l=somkiatspns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://somkiatspns.blogspot.com/feeds/4545073007077350424/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8372854729698244077&amp;postID=4545073007077350424' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/4545073007077350424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/4545073007077350424'/><link rel='alternate' type='text/html' href='http://somkiatspns.blogspot.com/2008/12/widget-google-friend-connect-blog.html' title='เพิ่ม Widget ของ Google Friend Connect ใน blog แล้ว'/><author><name>up1</name><uri>http://www.blogger.com/profile/11945100712671949630</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_jVzpkJk8JBg/SNsSogWLcBI/AAAAAAAAAFk/g5FVMdOkSMM/S220/dsc_4692_128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8372854729698244077.post-8986608241970999568</id><published>2008-12-05T11:01:00.000-08:00</published><updated>2008-12-08T06:37:03.470-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Update ข่าวสารของโลก java และ grails ว่ามีอะไรใหม่ๆ อออกมากันบ้าง</title><content type='html'>&lt;div class='rotilinks'&gt;&lt;br /&gt;Update ข่าวสารของโลก java และ grails ว่ามีอะไรใหม่ๆ อออกมากันบ้าง&lt;br /&gt;&lt;br /&gt;&lt;a href="http://grails.org/"&gt;1. Grails 1.1 beta&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.javafx.com/"&gt;2. JavaFX 1.0&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.jboss.org/jbossas"&gt;3. JBoss AS 5.0&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.hibernate.org/410.html"&gt;4. Hibernate Search 3.1 GA&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.springsource.org/spring-integration"&gt;5. Spring Integration 1.0 GA&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Related link from Roti&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;test&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8372854729698244077-8986608241970999568?l=somkiatspns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://somkiatspns.blogspot.com/feeds/8986608241970999568/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8372854729698244077&amp;postID=8986608241970999568' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/8986608241970999568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/8986608241970999568'/><link rel='alternate' type='text/html' href='http://somkiatspns.blogspot.com/2008/12/update-java-grails.html' title='Update ข่าวสารของโลก java และ grails ว่ามีอะไรใหม่ๆ อออกมากันบ้าง'/><author><name>up1</name><uri>http://www.blogger.com/profile/11945100712671949630</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_jVzpkJk8JBg/SNsSogWLcBI/AAAAAAAAAFk/g5FVMdOkSMM/S220/dsc_4692_128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8372854729698244077.post-3805326173965359744</id><published>2008-11-24T07:58:00.000-08:00</published><updated>2008-11-24T08:12:44.548-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='roti'/><title type='text'>การใช้งาน roti ใน blog spot</title><content type='html'>&lt;div class='rotilinks'&gt;&lt;br /&gt;วันนี้ถามเรื่องการนำ &lt;a href="http://roti.me/"&gt;roti&lt;/a&gt; มาใช้ใน BlogSpot จากคุณ &lt;a href="http://twitter.com/pphetra"&gt;@pphetra&lt;/a&gt;  ได้เรื่องดังนี้&lt;br /&gt;&lt;br /&gt;1. เพิ่ม include js นี้ในส่วน รูปแบบ -&gt; รูปแบบ html ดังนี้&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_jVzpkJk8JBg/SSrSC_aP4dI/AAAAAAAAAH0/v1MgCdsN558/s1600-h/roti_1.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="http://3.bp.blogspot.com/_jVzpkJk8JBg/SSrSC_aP4dI/AAAAAAAAAH0/v1MgCdsN558/s400/roti_1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5272257262613684690" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2. เมื่อสร้าง content ให้ content อยู่ใน&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_jVzpkJk8JBg/SSrSKcgYnJI/AAAAAAAAAH8/XdEZucK6KRc/s1600-h/roti_2.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 204px;" src="http://2.bp.blogspot.com/_jVzpkJk8JBg/SSrSKcgYnJI/AAAAAAAAAH8/XdEZucK6KRc/s400/roti_2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5272257390683135122" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;เท่านี้ก็เป็นอันจบพิธีครับ&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Related link from Roti&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;test&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8372854729698244077-3805326173965359744?l=somkiatspns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://somkiatspns.blogspot.com/feeds/3805326173965359744/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8372854729698244077&amp;postID=3805326173965359744' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/3805326173965359744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/3805326173965359744'/><link rel='alternate' type='text/html' href='http://somkiatspns.blogspot.com/2008/11/roti-blog-spot.html' title='การใช้งาน roti ใน blog spot'/><author><name>up1</name><uri>http://www.blogger.com/profile/11945100712671949630</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_jVzpkJk8JBg/SNsSogWLcBI/AAAAAAAAAFk/g5FVMdOkSMM/S220/dsc_4692_128.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_jVzpkJk8JBg/SSrSC_aP4dI/AAAAAAAAAH0/v1MgCdsN558/s72-c/roti_1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8372854729698244077.post-358759770048598542</id><published>2008-11-24T07:42:00.000-08:00</published><updated>2008-12-08T06:35:53.876-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Google Makes Major Interface Change To Search: SearchWiki</title><content type='html'>&lt;div class='rotilinks'&gt;&lt;br /&gt;ตอนนี้ google ได้เพิ่ม feature ใหม่เข้ามาในการค้นหาข้อมูลคือ SearchWiki [ Make your own search result ]  จาก blog ของคุณ  &lt;a href="http://pphetra.blogspot.com/"&gt;pphetra&lt;/a&gt;  บอกว่าถ้าต้องการเปิดใช้งานนั้นให้ใส่ * ในการค้นหาข้อมูลเช่น test *  เมื่อกดปุ่มค้นหาจะสามารถใช้งาน UI ใหม่ของ Google Search Engine   &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;อ้อ  อย่าลืม set preference ของ UI เป็นภาษาอังกฤษด้วย&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;VDO สาธิตการใช้งาน&lt;/span&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/t8Pl1H0dIXE&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/t8Pl1H0dIXE&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;ที่มา ::&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.techcrunch.com/2008/11/20/google-makes-major-interface-change-to-search-searchwiki/"&gt;http://www.techcrunch.com/2008/11/20/google-makes-major-interface-change-to-search-searchwiki/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://googleblog.blogspot.com/2008/11/searchwiki-make-search-your-own.html"&gt;SearchWiki: make search your own&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Related link from Roti&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;test&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8372854729698244077-358759770048598542?l=somkiatspns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://somkiatspns.blogspot.com/feeds/358759770048598542/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8372854729698244077&amp;postID=358759770048598542' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/358759770048598542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/358759770048598542'/><link rel='alternate' type='text/html' href='http://somkiatspns.blogspot.com/2008/11/google-makes-major-interface-change-to.html' title='Google Makes Major Interface Change To Search: SearchWiki'/><author><name>up1</name><uri>http://www.blogger.com/profile/11945100712671949630</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_jVzpkJk8JBg/SNsSogWLcBI/AAAAAAAAAFk/g5FVMdOkSMM/S220/dsc_4692_128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8372854729698244077.post-5850991076067635236</id><published>2008-11-13T10:21:00.000-08:00</published><updated>2008-11-24T07:21:21.710-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><title type='text'>Sequel, The Database Toolkit For Ruby</title><content type='html'>&lt;div class='rotilinks'&gt;&lt;br /&gt;&lt;a href="http://sequel.rubyforge.org/"&gt;Sequel &lt;/a&gt;คือ OR Mapping Layer ซึ่งจะ mapping กับ Ruby Object  ซึ่งเป็นอีกหนึ่งทางเลือกจาก ActiveRecord และ DataMapper&lt;br /&gt;&lt;br /&gt;Features ต่างๆ ที่น่าสนใจของ &lt;a href="http://sequel.rubyforge.org/"&gt;Sequel &lt;/a&gt; ดังนี้&lt;br /&gt;1. Connection Pooling&lt;br /&gt;2. DSL สำหรับการสร้าง SQL&lt;br /&gt;3. สนับสนุน &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/prepared_statements_rdoc.html"&gt;prepared statements&lt;/a&gt;&lt;br /&gt;4. Master/Slave Configuration&lt;br /&gt;5. ตัวที่น่าสนใจคือ &lt;a href="http://sequel.rubyforge.org/rdoc/files/doc/sharding_rdoc.html"&gt;Database Sharding&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ที่มา ::&lt;/span&gt; &lt;a href="http://www.infoq.com/news/2008/11/sequel-ruby-db-toolkit"&gt;http://www.infoq.com/news/2008/11/sequel-ruby-db-toolkit&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Related link from Roti&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;test&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8372854729698244077-5850991076067635236?l=somkiatspns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://somkiatspns.blogspot.com/feeds/5850991076067635236/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8372854729698244077&amp;postID=5850991076067635236' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/5850991076067635236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/5850991076067635236'/><link rel='alternate' type='text/html' href='http://somkiatspns.blogspot.com/2008/11/sequel-database-toolkit-for-ruby.html' title='Sequel, The Database Toolkit For Ruby'/><author><name>up1</name><uri>http://www.blogger.com/profile/11945100712671949630</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_jVzpkJk8JBg/SNsSogWLcBI/AAAAAAAAAFk/g5FVMdOkSMM/S220/dsc_4692_128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8372854729698244077.post-3140461537103122663</id><published>2008-11-10T06:01:00.000-08:00</published><updated>2008-11-24T07:22:41.621-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='merb'/><category scheme='http://www.blogger.com/atom/ns#' term='activerecord'/><title type='text'>เริ่มต้น ActiveRecord with Merb</title><content type='html'>&lt;div class='rotilinks'&gt;&lt;br /&gt;ตอนแรกคิดว่าจะลองใช้ &lt;a href="http://datamapper.org/"&gt;DataMapper &lt;/a&gt;แต่ไปๆ มาๆ ยังไงไม่รู้เลยมาลองที่ตัว &lt;a href="http://ar.rubyonrails.org/"&gt;ActiveRecord &lt;/a&gt;ก่อนก็แล้วกัน&lt;br /&gt;&lt;br /&gt;หลังจากที่ลองสร้าง Controller กับ View ไปแล้ว ตอนนี้มาขอพูดการสร้าง Model ตามแนวคิดของ MVC  ใน merb&lt;br /&gt;&lt;br /&gt;ในการจัดการ Model ใน merb นั้นแนะนำมา 3 ตัวคือ&lt;br /&gt;1. &lt;a href="http://ar.rubyonrails.org/"&gt;ActiveRecord&lt;/a&gt;&lt;br /&gt;2. &lt;a href="http://datamapper.org/"&gt;DataMapper&lt;/a&gt;&lt;br /&gt;3. &lt;a href="http://sequel.rubyforge.org/"&gt;Sequel&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ผมเลือก ActiveRecord มาเป็นตัวแรก  โดย ActiveRecord นั้นถูกสร้างมาด้วยแนวคิด &lt;a href="http://www.martinfowler.com/eaaCatalog/activeRecord.html"&gt;Active Record Pattern&lt;/a&gt; ของคุณ Martin Fowler  ซึ่งทำหน้าที่จัดการ RDBMS  หรืออาจจะเรียกว่า O/R Mapping ก็ได้&lt;br /&gt;&lt;br /&gt;ไม่พูดมากแล้ว มาเริ่มต้นกันเลยดีกว่า&lt;br /&gt;&lt;br /&gt;ก่อนอื่นเริ่มที่การติดตั้ง ActiveRecord กันก่อน ด้วยคำสั่ง&lt;br /&gt;$gem install activerecord merb_activerecord merb-helpers&lt;br /&gt;&lt;br /&gt;ต่อมาทำการสร้าง merb application ด้วยคำสั่ง&lt;br /&gt;$merb-gen app  my_application&lt;br /&gt;&lt;br /&gt;ผมเลือกใช้ DBRAS คือ mysql ครับ  ดังนั้นอย่างแรกที่ต้องทำคือ การกำหนด database configuration ให้กับ merb application ดังนี้&lt;br /&gt;&lt;br /&gt;- กำหนด orm ที่จะใช้ ซึ่งผมใช้ ActiveRecord จึงแก้ไขใน file  file config/init.rb ดังนี้&lt;br /&gt;dependency "merb-helpers"&lt;br /&gt;use_orm :activerecord&lt;br /&gt;&lt;br /&gt;- กำหนด database connection ใน file config/database.yml ดังนี้&lt;br /&gt;:adapter: mysql&lt;br /&gt;:database: &lt;db name=""&gt;&lt;br /&gt;:username: &lt;username&gt;&lt;br /&gt;:password: &lt;password&gt;&lt;br /&gt;:host: &lt;ip or="" hostname=""&gt;&lt;br /&gt;:socket: /tmp/mysql.sock&lt;br /&gt;:encoding: &lt;encoding&gt;   #eg. utf8&lt;br /&gt;&lt;br /&gt;ต่อมาผมต้องการจะสร้าง Application ทั่วไปให้สามารถทำการเพิ่มข้อมูลและแสดงผลอยู่ในหน้าเดียวกัน  ดังนั้นผมจึงเริ่มการสร้างดังนี้&lt;br /&gt;&lt;br /&gt;1. ก่อนอื่นผมขอสร้าง table ขึ้นมาก่อนชื่อว่า post มี column ดังนี้&lt;br /&gt;id  int&lt;br /&gt;body varchar(500)&lt;br /&gt;create_date datetime&lt;br /&gt;[ ผมชอบออกแบบ database ก่อนเสมอครับ ]&lt;br /&gt;&lt;br /&gt;2. สร้าง Model ชื่อ Post ดังนี้ [ ชื่อเดียวกับ Table ]&lt;br /&gt;$ merb-gen model Post&lt;br /&gt;&lt;br /&gt;merb จะสร้าง file /app/models/post.rb ขึ้นมาดังนี้&lt;br /&gt;class Post &lt; posts =" Post.find(" order =""&gt; "create_date DESC" )&lt;br /&gt;render&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;6. ทำการแก้ไข View ที่ /app/views/posts/index.html.erb ดังนี้&lt;br /&gt;&lt;a href="http://gist.github.com/23498"&gt;http://gist.github.com/23498&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;โดยผมใช้ partial มาใช้ เนื่องจากผมชอบแนวคิดการ reuse ของ element ต่างๆ ซึ่งจากตัวอย่างนี้จะเป็นการ reuse ข้อมูลแต่ละตัวที่เพิ่มเข้าไปในระบบ&lt;br /&gt;&lt;br /&gt;จากนี้สามารถลอง run merb ด้วยคำสั่ง $merb ได้ แล้วเข้าไปลอง run ที่ http://localhost:4000/posts&lt;br /&gt;&lt;br /&gt;7. เพิ่มส่วนการเพิ่มข้อมูล ซึ่งผมจะเพิ่มในส่วน View ใน file /app/views/posts/index.html.erb ดังนี้&lt;br /&gt;[ ผมเพิ่มไปที่ท้าย file ]&lt;br /&gt;&lt;a href="http://gist.github.com/23500"&gt;http://gist.github.com/23500&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;8. แก้ไข controller ใน file  /app/controllers/post.rb  ผมจะเพิ่ม action create เข้าไปเพื่อทำการเพิ่มข้อมูลลง table เมื่อทำงานเสร็จจะ redirect ไปยัง action index เพื่อแสดงผลข้อมูลทั้งหมด ดังนี้&lt;br /&gt;def create&lt;br /&gt; Post.create( :body =&gt; params[ :body ], :create_date =&gt; Time.now )&lt;br /&gt; redirect url(:action =&gt; "index")&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;9. จะชักช้าอยู่ใยครับ run merb เลยดีกว่า แล้วเข้าไปทดลองใช้งานที่  http://localhost:4000/posts&lt;br /&gt;&lt;br /&gt;10. สุดท้าย ผมมี css เพิ่มเข้าไปใน public/stylesheets/master.css ดังนี้&lt;br /&gt;#posts.container {&lt;br /&gt; border: 10px solid #eaeaea;&lt;br /&gt; min-height: 240px;&lt;br /&gt; position: relative;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;div.post {&lt;br /&gt; position: relative;&lt;br /&gt; border-bottom: 2px solid #c0c0c0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;div.post p.body {&lt;br /&gt; color: #3d4043;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;div.post p.created {&lt;br /&gt; color: #d5d5d5;&lt;br /&gt; position: absolute;&lt;br /&gt; top: 0px;&lt;br /&gt; right: 10px;&lt;br /&gt; font-weight: bold;&lt;br /&gt; font-size: 15px;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;form {&lt;br /&gt; background-color: #d5d5d5;&lt;br /&gt; padding: 20px;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;form input[type=text] {&lt;br /&gt; font: 17px "Helvetica", Helvetica,, sans-serif;&lt;br /&gt; padding: 3px 5px;&lt;br /&gt; color: #424242;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;form button {&lt;br /&gt; font-size: medium;&lt;br /&gt; padding: 5px 10px;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;คุณ @punneng บอกว่าแรกๆ ก็แบบนี้แหละครับ พอใช้ไป แล้วไปลอง deploy แล้วจะรู้สึกเองครับ อิอิอิ&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ที่มา&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.socialface.com/slapp/"&gt;http://www.socialface.com/slapp/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.rubyinside.com/merb-tutorials-and-resources-716.html"&gt;http://www.rubyinside.com/merb-tutorials-and-resources-716.html&lt;/a&gt;&lt;/encoding&gt;&lt;/ip&gt;&lt;/password&gt;&lt;/username&gt;&lt;/db&gt;&lt;br /&gt;&lt;br /&gt;Related link from Roti&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;test&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8372854729698244077-3140461537103122663?l=somkiatspns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://somkiatspns.blogspot.com/feeds/3140461537103122663/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8372854729698244077&amp;postID=3140461537103122663' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/3140461537103122663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/3140461537103122663'/><link rel='alternate' type='text/html' href='http://somkiatspns.blogspot.com/2008/11/activerecord-with-merb.html' title='เริ่มต้น ActiveRecord with Merb'/><author><name>up1</name><uri>http://www.blogger.com/profile/11945100712671949630</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_jVzpkJk8JBg/SNsSogWLcBI/AAAAAAAAAFk/g5FVMdOkSMM/S220/dsc_4692_128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8372854729698244077.post-8049558020823446520</id><published>2008-11-09T09:37:00.000-08:00</published><updated>2008-11-24T07:23:20.635-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='merb'/><title type='text'>เริ่มต้นกับ Merb</title><content type='html'>&lt;div class='rotilinks'&gt;&lt;br /&gt;เห็นคุณ &lt;a href="http://twitter.com/punneng"&gt;@punneng&lt;/a&gt; พูดถึง &lt;a href="http://www.merbivore.com/index.html"&gt;Merb &lt;/a&gt;มาตั้งแต่ยังไม่เป็น version 1.0 แต่ตอนนี้มันออก version 1.0 มาแล้ว เลยขอนำมาลองหน่อยว่าเป็นยังไงบ้าง&lt;br /&gt;&lt;br /&gt;มาเริ่มการทดลองแบบคนไม่มีอะไรเกี่ยวกับ Ruby เลยครับ&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;My Environment&lt;/span&gt;&lt;br /&gt;- OS : Windows&lt;br /&gt;- ใช้ cygwin&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Sotfware&lt;/span&gt;&lt;br /&gt;1. &lt;a href="http://www.ruby-lang.org/en/"&gt;Ruby&lt;/a&gt;&lt;br /&gt;2. &lt;a href="http://www.rubygems.org/"&gt;Ruby Gem&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;มาเริ่มต้นการติดตั้ง&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;1. install ruby&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;$./configure --prefix=/usr/local/ruby/myruby&lt;br /&gt;$make&lt;br /&gt;$make install&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;2. install ruby gem &lt;/span&gt;&lt;br /&gt;[ RubyGems is the name of the project that developed the gem packaging system and the gem command ]&lt;br /&gt;&lt;br /&gt;$ ruby setup.rb&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;3. install merb&lt;/span&gt;&lt;br /&gt;$gem install merb&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;4. install mongrel &lt;/span&gt; [ Mongrel is a fast HTTP library and server for Ruby  ]&lt;br /&gt;$gem install mongrel&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;5. Hello Merb&lt;/span&gt;&lt;br /&gt;$merb-gen app  test_01&lt;br /&gt;$cd test_01&lt;br /&gt;$merb&lt;br /&gt;&lt;br /&gt;ทดลองเข้า http://localhost:4000 ใน browser ก็จะเจอหน้า Merb&lt;br /&gt;&lt;br /&gt;ลองทดสอบสร้าง controller&lt;br /&gt;$merb-gen controller Hello&lt;br /&gt;&lt;br /&gt;file  Hello.rb จะถูกสร้างที่ app\controllers  .ให้แก้ไขดังนี้&lt;br /&gt;&lt;br /&gt;class Hello &lt; Application&lt;br /&gt;  def index&lt;br /&gt;    'Hello Merb'&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;แล้วลอง start merb และเข้าไปที่  http://localhost:4000/hello  จะแสดงคำว่า Hello Merb ใน browser &lt;br /&gt;&lt;br /&gt;เท่านี้ก็ถือว่าเป็นการเริ่มต้นกับ Merb ของผมล่ะครับ&lt;br /&gt;&lt;br /&gt;ต่อไปเดี๋ยวจะลองดู &lt;a href="http://datamapper.org/doku.php"&gt;DataMapper &lt;/a&gt;ครับว่าเป็นยังไง&lt;br /&gt;&lt;br /&gt;Related link from Roti&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;test&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8372854729698244077-8049558020823446520?l=somkiatspns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://somkiatspns.blogspot.com/feeds/8049558020823446520/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8372854729698244077&amp;postID=8049558020823446520' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/8049558020823446520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/8049558020823446520'/><link rel='alternate' type='text/html' href='http://somkiatspns.blogspot.com/2008/11/merb.html' title='เริ่มต้นกับ Merb'/><author><name>up1</name><uri>http://www.blogger.com/profile/11945100712671949630</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_jVzpkJk8JBg/SNsSogWLcBI/AAAAAAAAAFk/g5FVMdOkSMM/S220/dsc_4692_128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8372854729698244077.post-66289623933363136</id><published>2008-11-06T21:22:00.000-08:00</published><updated>2008-11-24T07:26:57.446-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java hibernate'/><title type='text'>Solved ::  Hibernate + UTF-8</title><content type='html'>&lt;div class='rotilinks'&gt;&lt;br /&gt;ผมได้ยินคำถามนี้มาจากหลายๆ ที่ว่าทำไมบันทึกข้อมูลภาษาไทยแล้วเป็น ?????? มีหลากหลายวิธีที่จำแก้ปัญหา แต่ผมขอแนะนำไว้ดังนี้&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;ทุกๆ อย่างๆ ในทุกๆ layer เป็น UTF-8  ดังนี้&lt;/span&gt;&lt;br /&gt;-  jsp file ก็ใส่  encoding เป็น UTF-8&lt;br /&gt;-  Servlet ก็ใส่ Servlet Filter ให้กำหนด  request.setcharecterEncoding( "UTF-8" ) &lt;br /&gt;-  URL Connection String จาก Hibernate ไป DBRMS ก็ใส่ encoding=UTF-8 ไปด้วย ถ้า RDBMS สนับสนุน&lt;br /&gt;-  และสุดท้าย DB ของคุณต้องเป็น UTF-8 ด้วยครับ ทั้ง DB, Table, Column&lt;br /&gt;&lt;br /&gt; ถ้าคุณทำเพียงเท่านี้คุณก็จะไปเจอปัญหา ??? อีกแล้วครับ&lt;br /&gt;&lt;br /&gt;^_^  ^_^  ^_^&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Related link from Roti&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;test&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8372854729698244077-66289623933363136?l=somkiatspns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://somkiatspns.blogspot.com/feeds/66289623933363136/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8372854729698244077&amp;postID=66289623933363136' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/66289623933363136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/66289623933363136'/><link rel='alternate' type='text/html' href='http://somkiatspns.blogspot.com/2008/11/solved-hibernate-utf-8.html' title='Solved ::  Hibernate + UTF-8'/><author><name>up1</name><uri>http://www.blogger.com/profile/11945100712671949630</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_jVzpkJk8JBg/SNsSogWLcBI/AAAAAAAAAFk/g5FVMdOkSMM/S220/dsc_4692_128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8372854729698244077.post-9109398817122942514</id><published>2008-10-28T02:28:00.000-07:00</published><updated>2008-10-28T02:38:02.697-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>update ข่าวสาร</title><content type='html'>&lt;span style="font-weight:bold;"&gt;1. Google Earth App สำหรับ iPhone  สามารถ load ได้ที่ Apple Store  สามารถใช้งานได้ทั้งแบบ Online และ Offline&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.macnewsworld.com/story/64949.html"&gt;http://www.macnewsworld.com/story/64949.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;2. Widows Live,  google, yahoo สนับสนุน Open ID กันหมดแล้ว แล้วเราจะรอช้าอยู่ใย&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;3. Google ทำการเพิ่ม Gadget ของ Google Docs และ Google Calendar  ใน GMail แล้วนะครับ ลองใช้กันดู&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;4. ICT ใช้งบ 100-500 ล้านบาท ในการ block web ที่หมิ่นเบื้องสูง&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;a href="http://developer.yahoo.com/yap/"&gt;&lt;br /&gt;5. Yahoo Application Platform [ YAP ]&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.techcrunch.com/wp-content/uploads/2008/10/yap1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 300px; height: 211px;" src="http://www.techcrunch.com/wp-content/uploads/2008/10/yap1.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;test&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8372854729698244077-9109398817122942514?l=somkiatspns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://somkiatspns.blogspot.com/feeds/9109398817122942514/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8372854729698244077&amp;postID=9109398817122942514' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/9109398817122942514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/9109398817122942514'/><link rel='alternate' type='text/html' href='http://somkiatspns.blogspot.com/2008/10/update.html' title='update ข่าวสาร'/><author><name>up1</name><uri>http://www.blogger.com/profile/11945100712671949630</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_jVzpkJk8JBg/SNsSogWLcBI/AAAAAAAAAFk/g5FVMdOkSMM/S220/dsc_4692_128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8372854729698244077.post-970643259548791437</id><published>2008-10-15T23:49:00.000-07:00</published><updated>2008-11-24T07:26:01.319-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>Oracle :: SQL สำหรับการดึงข้อมูลล่าสุด</title><content type='html'>&lt;div class='rotilinks'&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;SQL สำหรับการดึงข้อมูลล่าสุด โดยใช้บน Oracle Database เป็นดังนี้&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;ตัวอย่าง&lt;/span&gt; จะเป็นการดึงข้อมูล 10 records ล่าสุด&lt;br /&gt;&lt;br /&gt;SELECT *&lt;br /&gt;  FROM (SELECT ROWNUM rno , my_column&lt;br /&gt;          FROM some_table) &lt;br /&gt; WHERE rno &gt; (SELECT (MAX (ROWNUM) - 10)&lt;br /&gt;                   FROM some_table)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;ซึ่งสามารถทำการ ordered หรือเรียงลำดับของ ROWNUM ดังนี้&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ROW_NUMBER () OVER (ORDER BY some_column ASC) AS rno&lt;br /&gt;&lt;br /&gt;อย่าลืมใส่ index ด้วยนะครับ เพื่อความเร็วของ query ครับ&lt;br /&gt;&lt;br /&gt;Related link from Roti&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;test&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8372854729698244077-970643259548791437?l=somkiatspns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://somkiatspns.blogspot.com/feeds/970643259548791437/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8372854729698244077&amp;postID=970643259548791437' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/970643259548791437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/970643259548791437'/><link rel='alternate' type='text/html' href='http://somkiatspns.blogspot.com/2008/10/oracle-sql.html' title='Oracle :: SQL สำหรับการดึงข้อมูลล่าสุด'/><author><name>up1</name><uri>http://www.blogger.com/profile/11945100712671949630</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_jVzpkJk8JBg/SNsSogWLcBI/AAAAAAAAAFk/g5FVMdOkSMM/S220/dsc_4692_128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8372854729698244077.post-8185826264031981845</id><published>2008-10-10T02:36:00.000-07:00</published><updated>2008-11-24T07:25:26.316-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>java.io.IOException :: Too many open file</title><content type='html'>&lt;div class='rotilinks'&gt;&lt;br /&gt;ปัญหามีไว้ให้แก้จริงๆ ด้วย&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Problem&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;java.io.IOException :: Too many open file&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;วิเคราะปัญหา&lt;/span&gt;&lt;br /&gt;- มีการ access มายังระบบ 400,000 ครั้ง ซึ่งวิเคราะจาก Access Log ของระบบ&lt;br /&gt;- ใช้คำสั่ง lsof  [ List of open file ] ใน Linux เพื่อดูว่าแต่ละ process ทำการเปิด file อยู่เท่าไร ดังนี้&lt;br /&gt;&gt;lsof -p &lt;process id&gt; | wc -l&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;สาเหตุของปัญหาที่อาจจะเกิดขึ้นได้&lt;/span&gt;&lt;br /&gt;- มีการเปิด file หรือ IO จำนวนมากที่ OS จะรับได้&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;การแก้ไขปัญหา&lt;/span&gt;&lt;br /&gt;- มีการเปิด file ใน code แต่ไม่ทำการปิด file  ???&lt;br /&gt;- มีการแตก process ย่อยจากการใช้คำสั่ง Runtime.getProcess() ซึ่งคุณรูไหมว่า จะมีการเปิด Stream/Pipe ไว้ 3 ช่องทางคือ&lt;br /&gt;stdin, stdout, stderr [ Input, Output, Error ] ดังนั้นควรจะต้องปิดทั้ง 3 ท่อหรือช่องทางไปด้วย เช่น&lt;br /&gt;&lt;br /&gt;process.getInputStream().close();&lt;br /&gt;process.getOutputStream().close();&lt;br /&gt;process.getErrorStream().close();&lt;br /&gt;&lt;br /&gt;- ในระดับ OS สามารถกำหนด จำนวนสูงสุดในการเปิด file [ เป็นการต่อลมหายใจของระบบเท่านั้น ]&lt;br /&gt; ซึ่งสามารถดูจำนวนได้ด้วยคำสั่ง&lt;br /&gt;&gt;ulimit -a&lt;br /&gt;ดูในส่วนของ  open files  และสามารถแก้ไขค่าได้&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Website Reference&lt;/span&gt;&lt;br /&gt;&lt;a href="https://support.bea.com/application_content/product_portlets/support_patterns/wls/TooManyOpenFilesPattern.html"&gt;https://support.bea.com/application_content/product_portlets/support_patterns/wls/TooManyOpenFilesPattern.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Related link from Roti&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;test&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8372854729698244077-8185826264031981845?l=somkiatspns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://somkiatspns.blogspot.com/feeds/8185826264031981845/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8372854729698244077&amp;postID=8185826264031981845' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/8185826264031981845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/8185826264031981845'/><link rel='alternate' type='text/html' href='http://somkiatspns.blogspot.com/2008/10/javaioioexception-too-many-open-file.html' title='java.io.IOException :: Too many open file'/><author><name>up1</name><uri>http://www.blogger.com/profile/11945100712671949630</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_jVzpkJk8JBg/SNsSogWLcBI/AAAAAAAAAFk/g5FVMdOkSMM/S220/dsc_4692_128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8372854729698244077.post-4147339612232586667</id><published>2008-10-09T05:08:00.000-07:00</published><updated>2008-10-09T05:36:35.842-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='forkjoin'/><category scheme='http://www.blogger.com/atom/ns#' term='jsr166y'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>ทดลองใช้ JSR166y</title><content type='html'>พอดีไปเห็นบทความเกี่ยวกับ JSR166y ที่นี่ &lt;a href="http://groovy.dzone.com/news/concurrency-jsr-166y-meets-gro"&gt;http://groovy.dzone.com/news/concurrency-jsr-166y-meets-gro&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;โดยเป้าหมายหลักของ JSR166y คือ lightweight task framework สำหรับ Java Platform ซึ่งใช้แนวคิดของ &lt;a href="http://gee.cs.oswego.edu/dl/papers/fj.pdf"&gt;Fork and Join Framework&lt;/a&gt; เพื่อนำมาแก้ไขปัญหาการใช้งาน Thread ในระบบแบบขนาน เนื่องจาก Thread นั้นกินทรัพยากรของระบบมากจนเกินไป&lt;br /&gt;&lt;br /&gt;๋JSR166y นี้เป็น library ตัวใหม่ที่วางแผนไว้ว่าจะเพิ่มเข้าไปใน JDK 7  ครับ&lt;br /&gt;&lt;br /&gt;สำหรับ library นั้นสามารถ Download ได้ที่นี่  &lt;a href="http://gee.cs.oswego.edu/dl/jsr166/dist/jsr166y.jar"&gt;http://gee.cs.oswego.edu/dl/jsr166/dist/jsr166y.jar&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ส่วน JavaDoc ก็ที่นี่ครับ  &lt;a href="http://gee.cs.oswego.edu/dl/jsr166/dist/jsr166ydocs/overview-summary.html"&gt;http://gee.cs.oswego.edu/dl/jsr166/dist/jsr166ydocs/overview-summary.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;ผมลองทำการทดสอบใช้งานดังนี้&lt;/span&gt;&lt;br /&gt;- ทำ application เพื่ออ่าน Rss Feed จากหลายๆ เว็บ ดังนี้&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Environment ที่ใช้ทดสอบ&lt;/span&gt;&lt;br /&gt;- Windows XP&lt;br /&gt;- JDK 6&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;String[] url = { &lt;br /&gt;  "http://www.grails66.com/blog/feed/",    &lt;br /&gt;  "http://www.rails66.com/blog/feed/",&lt;br /&gt;  "http://www.ajax66.com/blog/feed/",&lt;br /&gt;  "http://www.seam66.com/blog/?feed=rss2",&lt;br /&gt;  "http://www.ofbiz66.com/blog/?feed=rss2"&lt;br /&gt;  };&lt;br /&gt;&lt;br /&gt;ForkJoinExecutor fje = ParallelArray.defaultExecutor();&lt;br /&gt;ParallelArray&lt;String&gt; p = ParallelArray.createFromCopy(url, fje);&lt;br /&gt;p.replaceWithMapping(new RssFeed());&lt;br /&gt;System.out.println(p.asList());&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;สร้าง class RssFeed สำหรับการทำงานในแต่ละ process ที่แตกออกมา ( Fork ) ดังนี้&lt;br /&gt;&lt;br /&gt;class RssFeed implements Op&lt;String, String&gt; {&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public String op(String url) {&lt;br /&gt;  System.out.println(System.currentTimeMillis() + " : " + url);&lt;br /&gt;  return getData(url);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;เมื่อทำการ run แล้วจะเห้นได้ว่าจะไม่ได้ทำการแบบ sequential เลย จะทำงานแบบ parallel ครับ  ตรงนี้ทำงานดูดีครับ&lt;br /&gt;&lt;br /&gt;หรืออาจจะกำหนด Pool ของ ForkJoin process ได้เองดังนี้&lt;br /&gt;&lt;br /&gt;ForkJoinPool pool = new ForkJoinPool(3); // กำหนดเป็น 3&lt;br /&gt;ParallelArray&lt;String&gt; p = ParallelArray.createFromCopy(url, pool);&lt;br /&gt;&lt;br /&gt;ทดสอบ run ก็จะได้ผลอีกแบบครับ&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;เอกสารเพิ่มเติม&lt;/span&gt;&lt;br /&gt;&lt;a href="http://groovy.dzone.com/news/concurrency-jsr-166y-meets-gro"&gt;http://groovy.dzone.com/news/concurrency-jsr-166y-meets-gro&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;test&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8372854729698244077-4147339612232586667?l=somkiatspns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://somkiatspns.blogspot.com/feeds/4147339612232586667/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8372854729698244077&amp;postID=4147339612232586667' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/4147339612232586667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/4147339612232586667'/><link rel='alternate' type='text/html' href='http://somkiatspns.blogspot.com/2008/10/jsr166y.html' title='ทดลองใช้ JSR166y'/><author><name>up1</name><uri>http://www.blogger.com/profile/11945100712671949630</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_jVzpkJk8JBg/SNsSogWLcBI/AAAAAAAAAFk/g5FVMdOkSMM/S220/dsc_4692_128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8372854729698244077.post-2150151652795244283</id><published>2008-10-09T01:16:00.000-07:00</published><updated>2008-10-09T01:26:30.507-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='process'/><title type='text'>ป้องกันการ run process แบบไม่สิ้นสุดใน Java</title><content type='html'>วันนี้ทำการทดสอบ migrate data process ซึ่งจะมีบาง process ทำการ run process ผ่าน java.lang.Process &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt; โดยปัญหาที่พบคือ&lt;/span&gt; อาจจะมีบาง process ที่ทำงานไม่จบสักที [ ไม่มี signal ออกมาจาก process นั้น ]&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;ส่วน code ที่เป้นปัญหาคือ&lt;/span&gt;  มัน&lt;br /&gt;while( true ) {&lt;br /&gt;    try {&lt;br /&gt;          int process_status = process.waitFor();&lt;br /&gt;          break;&lt;br /&gt;    } catch( InterruptedException e )  {&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;ปัญหามันเกิดขึ้นมาเมื่อ process ไม่มี signal อะไรออกมา&lt;br /&gt;&lt;br /&gt;ดังนั้น สามารถแก้ปัญหาได้โดยการใช้  Timer มาช่วย  จะกำหนด timeout ได้ ดังนี้&lt;br /&gt;&lt;br /&gt;Timer timer = new Timer();&lt;br /&gt;timer.schedule(new InterruptProcess(Thread.currentThread()), 5000);&lt;br /&gt;    try {&lt;br /&gt;      exitStatus = proc.waitFor();&lt;br /&gt;    }&lt;br /&gt;    catch (InterruptedException e) {&lt;br /&gt;      proc.destroy();&lt;br /&gt;    }&lt;br /&gt;    finally {&lt;br /&gt;      timer.cancel();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;และ Class  InterruptProcess  ซึ่งจะ extends มาจาก timerTask ดังนี้&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;class InterruptProcess&lt;br /&gt;    extends TimerTask {&lt;br /&gt;  Thread target = null;&lt;br /&gt;  InterruptProcess(Thread target) {&lt;br /&gt;    this.target = target;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * run&lt;br /&gt;   */&lt;br /&gt;  public void run() {&lt;br /&gt;    target.interrupt();&lt;br /&gt;    System.out.print("-|Run Interrupt|-");&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;จากตัวอย่าง ผมทำการกำหนด timeout = 5 วินาที ดังนั้นถ้า process  มีเวลาทำงานมากที่สุดคือ 5 วินาทีเท่านั้น ส่วน process ที่ run เสร็จเร็วก็ไม่มีปัญหาอะไร&lt;div class="blogger-post-footer"&gt;test&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8372854729698244077-2150151652795244283?l=somkiatspns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://somkiatspns.blogspot.com/feeds/2150151652795244283/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8372854729698244077&amp;postID=2150151652795244283' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/2150151652795244283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/2150151652795244283'/><link rel='alternate' type='text/html' href='http://somkiatspns.blogspot.com/2008/10/run-process-java.html' title='ป้องกันการ run process แบบไม่สิ้นสุดใน Java'/><author><name>up1</name><uri>http://www.blogger.com/profile/11945100712671949630</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_jVzpkJk8JBg/SNsSogWLcBI/AAAAAAAAAFk/g5FVMdOkSMM/S220/dsc_4692_128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8372854729698244077.post-929158327183890100</id><published>2008-10-05T21:28:00.000-07:00</published><updated>2008-10-05T23:30:25.111-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='plug-in'/><title type='text'>เริ่มต้นการพัฒนา Firefox Plug-in Application</title><content type='html'>หลังจากที่ทิ้งไปนานก็เลยกลับมาศึกษาการพัฒนา Firefox Plug-in Application กันหน่อย&lt;br /&gt;&lt;br /&gt;โดยสามารถเริ่มการศึกษาได้ที่นี่&lt;br /&gt;&lt;a href="http://developer.mozilla.org/en/Building_an_Extension#Extending_the_Browser_with_XUL"&gt;http://developer.mozilla.org/en/Building_an_Extension#Extending_the_Browser_with_XUL&lt;/a&gt;&lt;br /&gt;และ slide ที่นี่อธิบายได้ดี&lt;br /&gt;&lt;a href="http://www.slideshare.net/skeevs/mozilla-firefox-extension-development/"&gt;http://www.slideshare.net/skeevs/mozilla-firefox-extension-development/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ก่อนจะพัฒนานั้น ผมก็มานั่งศึกษาก่อนว่าโครงสร้างของ Firefox Plug-in เป็นอย่างไรบ้าง อนุญาตให้เราทำอะไรได้บ้าง&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;1. เทคดนโลยีที่ใช้ ประกอบไปด้วย&lt;/span&gt;&lt;br /&gt;- JavaScript, AJAX, DOM, XML, CSS&lt;br /&gt;- &lt;a href="http://www.mozilla.org/projects/xul/"&gt;XUL (XML User Interface Language)  &lt;/a&gt;&lt;br /&gt;- &lt;a href="http://www.mozilla.org/projects/xpcom/"&gt;xpcom ( Cross Platform Component Object Model ) &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;2. Tools ที่ใช้ในการพัฒนา&lt;/span&gt;&lt;br /&gt;- ผมเลือกใช้ Eclipse + XULBooster plug-in เหตุผลง่ายๆ คือ ฟรี  และเป็น tools ที่ใกล้ตัวที่สุด&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;3. โครงสร้างของ Firefox Plug-in &lt;/span&gt;&lt;br /&gt;นามสกุลของ file คือ xpi [ Mozilla/Firefox Browser Extension Archive ] สามารถเปิดด้วย winzip และ winrar  ใน file xpi จะประกอบไปด้วย&lt;br /&gt;- install.rdf  [ ใช้สำหรับการ install plug-in จะอธิบายเกี่ยวกับ plug-in นั้น มี format เป็น xml ]&lt;br /&gt;- chrome.manifest &lt;br /&gt;- *.xul  [ ส่วนแสดงผล ]&lt;br /&gt;- *.js&lt;br /&gt;- *.css&lt;br /&gt;- *.xml&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;มีโครงสร้างของ files ดังรูป&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_jVzpkJk8JBg/SOmjy0fu50I/AAAAAAAAAG4/N2mr2I6hvbM/s1600-h/plugin_002.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_jVzpkJk8JBg/SOmjy0fu50I/AAAAAAAAAG4/N2mr2I6hvbM/s400/plugin_002.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5253910533784921922" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;4. ส่วนการแสดงผล จะสร้างด้วย XUL นั้นสามารถ custom ส่วนต่างๆ ของ Firefox  หรือ Chrome UI ได้ดังนี้&lt;/span&gt;&lt;br /&gt;- MenuBar&lt;br /&gt;- Toolbox&lt;br /&gt;- Toolbar&lt;br /&gt;- Toolbar button&lt;br /&gt;- Window&lt;br /&gt;- Menu List&lt;br /&gt;- Button&lt;br /&gt;- Status Bar&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;5. มาทำความรู้จักกับ XUL กันหน่อย&lt;/span&gt;&lt;br /&gt;- ย่อมาจาก  XML User-interface Language&lt;br /&gt;- โครงสร้างเป็น xml&lt;br /&gt;- จะใช้เป็นส่วนการแสดงผล และการควบคุมการทำงานต่างๆ เช่น Layout,  Input, Window&lt;br /&gt;&lt;br /&gt;file xul นั้นสามารถ reference ได้ดังนี้&lt;br /&gt;Chrome://my-plugin/content/test.xul&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;6. การใช้งาน JavaScript ใน xul &lt;/span&gt; นั้นสามารถ reference ได้ดังนี้&lt;br /&gt;&lt;br /&gt;โดย JavaScript นั้นสามารถจัดการ event ต่างๆ ใน XUL UI , จัดการ DOM Tree และการติดต่อผ่าน xpcom ได้&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;7. Localization [ L10n ] &lt;/span&gt; สนับสนุนหลายๆ ภาษาได้  ซึ่งจะเป็นส่วน label  โดยสามารถกำหนดไว้ใน &lt;my-plugin&gt;/local/&lt;language&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;เมื่อลองศึกษามาบ้าง ผมก็ลองสร้าง Firefox plug-in บ้างโดยความต้องการง่ายๆ คือ&lt;/span&gt;&lt;br /&gt;1. ทำการดึงข้อมูลจาก feed ของ &lt;a href="http://www.mozilla.org/projects/xpcom/"&gt;paw66.com&lt;/a&gt;  จากที่นี่  &lt;a href="http://www.paw66.com/sandbox/aggregator/rss"&gt;http://www.paw66.com/sandbox/aggregator/rss&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2. นำมาแสดงผลในส่วน Status Bar ของ Firefox&lt;br /&gt;&lt;br /&gt;3. เมื่อ click ขวาที่ status bar แล้วจะมี menu ขึ้นมาให้เลือกคือ &lt;br /&gt;- ดึงข้อมูลล่าสุด&lt;br /&gt;- เกี่ยวกับ paw66&lt;br /&gt;&lt;br /&gt;4. เมื่อ click ซ้ายจะ เปิด tab ใหม่เพื่อเปิด url ของ feed นั้นๆ&lt;br /&gt; รูปแสดงการใช้งาน plugin ที่ผมลองทำดู&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_jVzpkJk8JBg/SOmgDYYOuAI/AAAAAAAAAGw/ppJYRKn7Sr0/s1600-h/plugin_001.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_jVzpkJk8JBg/SOmgDYYOuAI/AAAAAAAAAGw/ppJYRKn7Sr0/s400/plugin_001.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5253906420248524802" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ผม upload plug-in ไว้ที่นี่  &lt;a href="http://www.pai-pa.com/somkiat/ff/paw66-feed.xpi"&gt;http://www.pai-pa.com/somkiat/ff/paw66-feed.xpi&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;นี่ก็คือการลองสร้าง Firefox plug-in application แบบง่ายๆ ครับ&lt;div class="blogger-post-footer"&gt;test&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8372854729698244077-929158327183890100?l=somkiatspns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://somkiatspns.blogspot.com/feeds/929158327183890100/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8372854729698244077&amp;postID=929158327183890100' title='1 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/929158327183890100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/929158327183890100'/><link rel='alternate' type='text/html' href='http://somkiatspns.blogspot.com/2008/10/firefox-plug-in-application.html' title='เริ่มต้นการพัฒนา Firefox Plug-in Application'/><author><name>up1</name><uri>http://www.blogger.com/profile/11945100712671949630</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_jVzpkJk8JBg/SNsSogWLcBI/AAAAAAAAAFk/g5FVMdOkSMM/S220/dsc_4692_128.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_jVzpkJk8JBg/SOmjy0fu50I/AAAAAAAAAG4/N2mr2I6hvbM/s72-c/plugin_002.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8372854729698244077.post-3577029737995860417</id><published>2008-10-01T04:37:00.000-07:00</published><updated>2008-10-01T05:37:08.156-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><title type='text'>เพิ่ม Search ของคุณลงใน FireFox กันไหม</title><content type='html'>ว่างๆ ไม่มีไรทำเลยหาเรื่องใส่ตัวสักหน่อย&lt;br /&gt;&lt;br /&gt;แว่วๆๆ ว่า คนแถวๆ  office จะไปจ้างใครไม่รู้ทำ FireFox Plugin เพื่อช่วยให้เข้าใช้งาน web app ง่ายมากขึ้น  ได้ฟังแล้วมันฟุ้งซ่านขึ้นมาทันที   ของมันไม่ได้ยากเลย ยังจะจ้างกันอีก  ก็เลยลองเริ่มขั้นตอนแรกให้หายงงก่อน คือ เพิ่ม Search ของ Web ที่จะทำลงไปยัง FireFox ก่อนดีกว่า  ซึ่งจะไปเพิ่มตรงนี้ ดังรูป&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_jVzpkJk8JBg/SONrd27ysDI/AAAAAAAAAGY/52rwISckeyU/s1600-h/search_001.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_jVzpkJk8JBg/SONrd27ysDI/AAAAAAAAAGY/52rwISckeyU/s400/search_001.jpg" alt="" id="BLOGGER_PHOTO_ID_5252159751150809138" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;จะเพิ่มยังไง ??&lt;/span&gt;&lt;br /&gt;1. ขั้นแรก ต้องบอกก่อนผมใช้ Firefox 3.0.3 นะครับ&lt;br /&gt;2. ไปที่ C:\Program Files\Mozilla Firefox\searchplugins [ ติดตั้งที่ drive ไหนก็ไปตามนั้นครับ ส่วนผมติดตั้งไว้ที่ drive c: ]&lt;br /&gt;3. ใน folder นี้จะมี xml หลายๆ ตัว  ดังนั้นผมเอาบ้าง สร้าง my_search.xml เลย หน้าตาของ xml จะประมาณนี้ครับ&lt;br /&gt;&lt;a href="http://gist.github.com/14072"&gt;&lt;br /&gt;http://gist.github.com/14072&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ส่วนที่สำคัญคือ&lt;br /&gt;- Image  จะเป็น data image ที่เป็น base64 ครับ  ใครอยากลองแปลงก็ตาม url นี้ หรือแปลงเองก็ได้นะ ใช้ js ง่ายๆ&lt;br /&gt;http://www.greywyvern.com/code/php/binary2base64&lt;br /&gt;&lt;br /&gt;- Url ให้ใส่ end point url ของ search ที่คุณต้องการครับ และสามารถใส่ parameter ได้ด้วย&lt;br /&gt;- {searchTerms} คือข้อมูลที่จะกรอกมาจากหน้าของ FireFox&lt;br /&gt;&lt;br /&gt;4. ทำการ restart Firefox ครับ แล้วจะเห็นประมาณนี้&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_jVzpkJk8JBg/SONs2PZB1KI/AAAAAAAAAGg/Dq8jLmKfVjU/s1600-h/search_002.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_jVzpkJk8JBg/SONs2PZB1KI/AAAAAAAAAGg/Dq8jLmKfVjU/s400/search_002.jpg" alt="" id="BLOGGER_PHOTO_ID_5252161269544375458" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;5. เลือกใช้กันหน่อย อิอิอิ  แต่ไม่ซะใจ  ตั้งให้เป็น Default Search ไปเลยครับ&lt;br /&gt;- ไปที่ about:config  &lt;br /&gt;- แก้ไขค่าของ key browser.search.order.1  เป็น  Custom Search&lt;br /&gt;- restart Firefox แล้วจะได้แบบนี้&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_jVzpkJk8JBg/SONud_NjRZI/AAAAAAAAAGo/DW_As9wlxoA/s1600-h/search_003.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_jVzpkJk8JBg/SONud_NjRZI/AAAAAAAAAGo/DW_As9wlxoA/s400/search_003.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5252163051907663250" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;เป็นอันเสร็จสิ้นครับผม&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Website References&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.greywyvern.com/code/php/binary2base64"&gt;http://www.greywyvern.com/code/php/binary2base64&lt;/a&gt;&lt;br /&gt;&lt;a href="http://labnol.blogspot.com/2006/09/learn-to-create-firefox-search-plugin.html"&gt;http://labnol.blogspot.com/2006/09/learn-to-create-firefox-search-plugin.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;test&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8372854729698244077-3577029737995860417?l=somkiatspns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://somkiatspns.blogspot.com/feeds/3577029737995860417/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8372854729698244077&amp;postID=3577029737995860417' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/3577029737995860417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/3577029737995860417'/><link rel='alternate' type='text/html' href='http://somkiatspns.blogspot.com/2008/10/search-firefox.html' title='เพิ่ม Search ของคุณลงใน FireFox กันไหม'/><author><name>up1</name><uri>http://www.blogger.com/profile/11945100712671949630</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_jVzpkJk8JBg/SNsSogWLcBI/AAAAAAAAAFk/g5FVMdOkSMM/S220/dsc_4692_128.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_jVzpkJk8JBg/SONrd27ysDI/AAAAAAAAAGY/52rwISckeyU/s72-c/search_001.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8372854729698244077.post-1759134582398120516</id><published>2008-09-30T09:46:00.000-07:00</published><updated>2008-09-30T09:47:59.507-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>Software release life cycle</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_jVzpkJk8JBg/SOJYKfQQUDI/AAAAAAAAAGA/y0bW4vQrOG4/s1600-h/180px-Develstages.svg.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_jVzpkJk8JBg/SOJYKfQQUDI/AAAAAAAAAGA/y0bW4vQrOG4/s320/180px-Develstages.svg.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5251857052679032882" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;test&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8372854729698244077-1759134582398120516?l=somkiatspns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://somkiatspns.blogspot.com/feeds/1759134582398120516/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8372854729698244077&amp;postID=1759134582398120516' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/1759134582398120516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/1759134582398120516'/><link rel='alternate' type='text/html' href='http://somkiatspns.blogspot.com/2008/09/software-release-life-cycle.html' title='Software release life cycle'/><author><name>up1</name><uri>http://www.blogger.com/profile/11945100712671949630</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_jVzpkJk8JBg/SNsSogWLcBI/AAAAAAAAAFk/g5FVMdOkSMM/S220/dsc_4692_128.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_jVzpkJk8JBg/SOJYKfQQUDI/AAAAAAAAAGA/y0bW4vQrOG4/s72-c/180px-Develstages.svg.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8372854729698244077.post-4070971596476800709</id><published>2008-09-26T00:53:00.000-07:00</published><updated>2008-09-26T01:27:54.148-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='mq'/><category scheme='http://www.blogger.com/atom/ns#' term='rabbitmq'/><category scheme='http://www.blogger.com/atom/ns#' term='AMQP'/><title type='text'>ติดตั้ง RabbitMQ  บน windows</title><content type='html'>หลังจากลองศึกษามาพอสมควรกับ Message Queue Server ตัวนี้  เริ่มจากลองดุที่ภาษา &lt;a href="http://www.erlang.org/"&gt;Erlang &lt;/a&gt;ซึ่งเป็นภาษาที่เหมาะสมกับระบบที่มี concurrent user จำนวนมาก แตก thread การทำงานได้เยอะๆ [ เขาว่ามาอย่างนั้น ]  และมาเจอ MQ ที่ implement ด้วย Erlang คือ &lt;a href="http://www.rabbitmq.com"&gt;RabbitMQ  &lt;/a&gt;มันยังถูกใช้ใน &lt;a href="http://twitter.com"&gt;Twitter &lt;/a&gt;ซึ่งปัจจุบันใช้อยู่ประจำ จึงยิ่งทำให้เกิดความสนใจมากขึ้น  ไม่พูดมากแล้ว เริ่มเลยดีกว่า ...&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;RabbitMQ is an implementation of &lt;a href="http://www.rabbitmq.com/faq.html#what-is-amqp"&gt;AMQP&lt;/a&gt;, the emerging standard for high performance enterprise messaging&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;ขั้นตอนการติดตั้ง&lt;/span&gt;&lt;br /&gt;1. download RabbitMQ Windows Bundle ที่ http://www.rabbitmq.com/download.html  โดยใน zip file จะประกอบไปด้วย&lt;br /&gt;-  Erlang :: otp_win32_xxxx.exe&lt;br /&gt;-  RabbitMq Server  :: rabbitmq-server-windows-xxxx.zip&lt;br /&gt;-  RabbitMq Client for Java  :: rabbitmq-java-client-bin-xxxx.zip&lt;br /&gt;&lt;br /&gt;2. ทำการติดตั้ง Erlang&lt;br /&gt;3. extract rabbitmq-server-windows-xxxx.zip จะมี folder -&gt; ebin, sbin,  src, include&lt;br /&gt;4. กำหนด env ตาม &lt;a href="http://www.rabbitmq.com/install.html#windows"&gt;Link&lt;/a&gt; สรุปง่ายๆ เป็นดังนี้&lt;br /&gt;- กำหนด ERLANG_HOME คือ folder ที่ทำการติดตั้ง erlang&lt;br /&gt;- กำหนด RABBITMQ_BASE คือ folder ที่จะใช้เก็บข้อมูลต่างๆ ของ mq เช่น user account, message&lt;br /&gt;&lt;br /&gt;5. ทดสอบ run rabbitmq server  &lt;br /&gt;- ไปที่ folder sbin ทำการ run&lt;br /&gt;&gt;&gt;rabbitmq-server.bat&lt;br /&gt;จะแสดงผลดังนี้ เป็นอันเสร็จสิ้น&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;...&lt;br /&gt;starting database             ...done&lt;br /&gt;starting core processes       ...done&lt;br /&gt;starting recovery             ...done&lt;br /&gt;starting persister            ...done&lt;br /&gt;starting builtin applications ...done&lt;br /&gt;starting TCP listeners        ...done&lt;br /&gt;ิbroke running&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;มาดูการจัดการหลังการติดตั้ง&lt;/span&gt; สามารถเข้าไปดูได้ที่ี่ http://www.rabbitmq.com/admin-guide.html  โดยหลักจะทำการ&lt;br /&gt;- Manage Server : stop, start&lt;br /&gt;- Manage User Account&lt;br /&gt;- Manage VirtualHost&lt;br /&gt;- Manage Realm&lt;br /&gt;- Grant permmision to user&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;ค่า default ของ rabbitmq เป็นดังนี้&lt;/span&gt;&lt;br /&gt;username = guest&lt;br /&gt;password = guest&lt;br /&gt;virtualhost = /&lt;br /&gt;realm = /data&lt;br /&gt;host = localhost/ip/127.0.0.1&lt;br /&gt;&lt;br /&gt;ผมใช้ client เป็น java ตามสิ่งที่ load มาตั้งแต่แรก  ซึ่ง API ที่ให้มาก้ใช้งานไม่ยาก สามารถอ่านจากเอกสารได้ที่  http://www.rabbitmq.com/api-guide.html&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;ตัวอย่าง code การติดต่อ จะประกอบไปด้วย&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;1. Create Channel&lt;/span&gt;&lt;br /&gt;ConnectionParameters params = new ConnectionParameters();&lt;br /&gt;params.setUsername("guest");&lt;br /&gt;params.setPassword("guest");&lt;br /&gt;params.setVirtualHost("/");&lt;br /&gt;params.setRequestedHeartbeat(0);&lt;br /&gt;ConnectionFactory factory = new ConnectionFactory(params);&lt;br /&gt;Connection conn = factory.newConnection("localhost", 5672);&lt;br /&gt;Channel channel = conn.createChannel();&lt;br /&gt;int ticket = channel.accessRequest("/data");&lt;br /&gt;channel.exchangeDeclare(ticket, "exchangeName", "direct", true);&lt;br /&gt;channel.queueDeclare(ticket, "queueName");&lt;br /&gt;channel.queueBind(ticket, "queueName", "exchangeName","routingKey");&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;2. Publish Message to broker [ RabbitMQ ]&lt;/span&gt;&lt;br /&gt;byte[] messageBodyBytes = "Hello, world!".getBytes();&lt;br /&gt;channel.basicPublish(ticket, "exchangeName", "routingKey",  null, messageBodyBytes);&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;3. Retrieve Message from broker [ RabbitMQ ]  &lt;/span&gt;&lt;br /&gt;GetResponse response = channel.basicGet(ticket, "queueName", noAck);&lt;br /&gt;if (response == null) {&lt;br /&gt; // No message retrieved.&lt;br /&gt;} else {&lt;br /&gt; AMQP.BasicProperties props = response.getProps();&lt;br /&gt; byte[] body = response.getBody();&lt;br /&gt; long deliveryTag = response.getEnvelope().getDeliveryTag();&lt;br /&gt; channel.basicAck(deliveryTag, false);&lt;br /&gt; System.out.println(new String(body));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;4. Close channel&lt;/span&gt;&lt;br /&gt;channel.close(AMQP.REPLY_SUCCESS, "Goodbye");&lt;br /&gt;conn.close(AMQP.REPLY_SUCCESS);&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;เท่านี้ก็สามารถเริ่มใช้งาน RabbitMQ ในเบื้องต้นได้แล้วครับ&lt;div class="blogger-post-footer"&gt;test&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8372854729698244077-4070971596476800709?l=somkiatspns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://somkiatspns.blogspot.com/feeds/4070971596476800709/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8372854729698244077&amp;postID=4070971596476800709' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/4070971596476800709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/4070971596476800709'/><link rel='alternate' type='text/html' href='http://somkiatspns.blogspot.com/2008/09/rabbitmq-windows.html' title='ติดตั้ง RabbitMQ  บน windows'/><author><name>up1</name><uri>http://www.blogger.com/profile/11945100712671949630</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_jVzpkJk8JBg/SNsSogWLcBI/AAAAAAAAAFk/g5FVMdOkSMM/S220/dsc_4692_128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8372854729698244077.post-8926117663443038192</id><published>2008-09-25T11:08:00.000-07:00</published><updated>2008-09-25T11:09:53.072-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='up1'/><title type='text'>Process ที่เป็นอยู่</title><content type='html'>while (true) {&lt;br /&gt;    identify_and_fix_bottlenecks();&lt;br /&gt;    drink();&lt;br /&gt;    sleep();&lt;br /&gt;    notice_new_bottleneck();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;This loop runs many times a day.&lt;div class="blogger-post-footer"&gt;test&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8372854729698244077-8926117663443038192?l=somkiatspns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://somkiatspns.blogspot.com/feeds/8926117663443038192/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8372854729698244077&amp;postID=8926117663443038192' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/8926117663443038192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/8926117663443038192'/><link rel='alternate' type='text/html' href='http://somkiatspns.blogspot.com/2008/09/process.html' title='Process ที่เป็นอยู่'/><author><name>up1</name><uri>http://www.blogger.com/profile/11945100712671949630</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_jVzpkJk8JBg/SNsSogWLcBI/AAAAAAAAAFk/g5FVMdOkSMM/S220/dsc_4692_128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8372854729698244077.post-2969496660518468927</id><published>2008-09-25T09:29:00.000-07:00</published><updated>2008-09-25T10:03:03.120-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='bdd'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>BDD with easyb</title><content type='html'>หลายสัปดาห์มาแล้วได้เรียนรู้เกี่ยวกับ  &lt;a href="http://en.wikipedia.org/wiki/Behavior_Driven_Development"&gt;BDD&lt;/a&gt; :: Behavior Driven Development ซึ่งฟังดูไปจะคล้ายๆ กับ &lt;a href="http://en.wikipedia.org/wiki/Test-driven_development"&gt;TDD&lt;/a&gt; :: Test-Driven Developement  แต่แตกต่างตรงที่&lt;br /&gt;&lt;br /&gt;TDD คือ เขียน test  -&gt; coding -&gt; Run Test -&gt; Refactoring&lt;br /&gt;&lt;br /&gt;แต่ BDD นั้นจะเป็นการทดสอบระบบงานให้เป็นไปตาม specification/requirement ไม่ได้ทำการทดสอบในระดับ unit test   แต่การพัฒนานั้นสามารถใช้คู่กันได้อย่างปกติ [ BDD ไม่ได้มาทดแทน แต่มาช่วยทำให้ทั้งฝ่าย business และ developer เข้าใจกันมากขึ้น ]&lt;br /&gt;&lt;br /&gt;TDD -&gt; test&lt;br /&gt;BDD -&gt; spec&lt;br /&gt;&lt;br /&gt;ฺBDD framework มีหลายตัวที่น่าสนใจเช่น&lt;br /&gt;RSpec :: http://rspec.info/&lt;br /&gt;JBehave :: http://jbehave.org/&lt;br /&gt;easyb :: http://easyb.org/&lt;br /&gt;JDave :: http://www.jdave.org/&lt;br /&gt;&lt;br /&gt;framework ที่ผมสนใจคือ easyb  เนื่องจากพัฒนาเพื่อใช้งานบน java platform และที่สำคัญสามารถใช้งานกับ groovy และ grails ได้ครับ&lt;br /&gt;&lt;br /&gt;มาดูการใช้งานคร่าวๆ&lt;br /&gt;&lt;br /&gt;ก่อนอื่นต้องเข้าใจ story และ specification &lt;br /&gt;โดย story จะประกอบด้วย scenario ซึ่งใน scenario แต่ละตัวจะมี&lt;br /&gt;- Given&lt;br /&gt;- When&lt;br /&gt;- Then&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ตัวอย่างของ scenario &lt;/span&gt;&lt;br /&gt;scenario "check username/password", {&lt;br /&gt;  given "user account already exists", {&lt;br /&gt;  }&lt;br /&gt;  when "user logins", {&lt;br /&gt;  }&lt;br /&gt;  then "should return a valid account", {&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;ใน { ... } นั้นสามารถแทรก code การทำงานในแต่ละส่วนเข้าไปเพื่อทดสอบได้&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;มาดูการ run easyb กัน  &lt;/span&gt;&lt;br /&gt;1. download easyb จาก  http://easyb.org/download.html&lt;br /&gt;2. extract และ run ตามนี้&lt;br /&gt;java org.disco.easyb.BehaviorRunner  MyStory.groovy&lt;br /&gt;&lt;br /&gt;-&gt; MyStory.groovy คือ story ที่เก็บ scenario ด้านบน  โดยชื่อ file ต้องมี suffix เป็น Story&lt;br /&gt;&lt;br /&gt;3. สามารถ generate report ได้ 2 แบบคือ&lt;br /&gt;3.1  Text file&lt;br /&gt;&gt;&gt;java org.disco.easyb.BehaviorRunner MyStory.groovy  -txtstory mystory.txt&lt;br /&gt;&lt;br /&gt;3.2  Xml file&lt;br /&gt;&gt;&gt;java org.disco.easyb.BehaviorRunner MyStory.groovy  -xmleasyb mystory.xml&lt;br /&gt;&lt;br /&gt;ใน easyb version 1.0 จะสามารถ generate เป็น  html ได้ครับ  ต้องตั้งหน้าตั้งตารอคอยครับ&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;ถ้าต้องการใช้ใน grails  สามารถใช้ plug-in มาช่วยได้ที่นี่ครับ &lt;/span&gt;  &lt;a href="http://github.com/urubatan/easybtest/tree/master"&gt;EasyBTest&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ใช้งานก็ง่ายดังนี้ครับ&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;การติดตั้ง&lt;/span&gt;&lt;br /&gt;$grails install-plugin grails-easybtest-latest.zip&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;ทดสอบ run&lt;/span&gt;&lt;br /&gt;$grails easyb-test&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ส่วน BDD Framework ภาษาไทยก็มีนะครับ คือ &lt;a href="http://github.com/chanwit/tspec/tree/master"&gt;TSpec&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;นี่ก็คือจุดเริ่มต้นในการศึกษาและใช้งาน BDD ครับ&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Web Reference&lt;/span&gt;&lt;br /&gt;http://www.grails66.com&lt;br /&gt;http://easyb.org/&lt;br /&gt;http://java.dzone.com/articles/is-easyb-easy&lt;br /&gt;http://www.javaworld.com/javaworld/jw-09-2008/jw-09-easyb.html&lt;div class="blogger-post-footer"&gt;test&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8372854729698244077-2969496660518468927?l=somkiatspns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://somkiatspns.blogspot.com/feeds/2969496660518468927/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8372854729698244077&amp;postID=2969496660518468927' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/2969496660518468927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8372854729698244077/posts/default/2969496660518468927'/><link rel='alternate' type='text/html' href='http://somkiatspns.blogspot.com/2008/09/bdd-with-easyb.html' title='BDD with easyb'/><author><name>up1</name><uri>http://www.blogger.com/profile/11945100712671949630</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_jVzpkJk8JBg/SNsSogWLcBI/AAAAAAAAAFk/g5FVMdOkSMM/S220/dsc_4692_128.jpg'/></author><thr:total>0</thr:total></entry></feed>
