<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-7237929072659768518</atom:id><lastBuildDate>Tue, 18 Jun 2013 15:02:36 +0000</lastBuildDate><category>barcamp</category><category>congratulations</category><category>cli</category><category>tableview</category><category>free</category><category>customer</category><category>ipad event</category><category>iPad 4th</category><category>pretty</category><category>ku</category><category>cocoa</category><category>detection</category><category>docsplit</category><category>fbchat</category><category>argc</category><category>message</category><category>twinings</category><category>action</category><category>drag</category><category>.gitignore</category><category>radiobutton</category><category>cgaffine</category><category>islands</category><category>like</category><category>the</category><category>run windows program</category><category>c++</category><category>exchange</category><category>mutablearray</category><category>wget</category><category>friendly</category><category>sort</category><category>scripting</category><category>facebook</category><category>enumurator</category><category>opencv</category><category>names</category><category>hdd</category><category>ssd</category><category>ivy bridge</category><category>java</category><category>commit</category><category>selected</category><category>mac os</category><category>codejam. google</category><category>textmate2</category><category>prettify</category><category>nexus7</category><category>gesturerecognizer</category><category>drawrect</category><category>networking</category><category>rotate</category><category>playing</category><category>c</category><category>soft tabs</category><category>mvc</category><category>fb</category><category>android code</category><category>substring</category><category>parallax</category><category>numpy</category><category>iTunes</category><category>emulator</category><category>dessert</category><category>seekbar</category><category>view</category><category>mac</category><category>shutdown</category><category>limejs</category><category>cgsize</category><category>design</category><category>direction</category><category>linkedlist</category><category>notification</category><category>blogging</category><category>json</category><category>google</category><category>google i/o</category><category>bw</category><category>ruby</category><category>designer</category><category>gitflow</category><category>down</category><category>technology</category><category>skin diving</category><category>list</category><category>sea</category><category>listview</category><category>add</category><category>status</category><category>glasses</category><category>os x</category><category>textfield</category><category>central world</category><category>imaging</category><category>urllib3</category><category>nested model</category><category>it</category><category>3rd party</category><category>design pattern</category><category>clang</category><category>node</category><category>android dev</category><category>sound</category><category>ios</category><category>animation</category><category>error message</category><category>nsurlconnection</category><category>extreme</category><category>tester</category><category>computer</category><category>jelly bean</category><category>new year</category><category>source control</category><category>tdd</category><category>global object</category><category>image</category><category>code</category><category>naming</category><category>camelcase</category><category>filo</category><category>update</category><category>touch</category><category>social network</category><category>gesture</category><category>imageview</category><category>user experience</category><category>default python</category><category>i7</category><category>bot</category><category>source code management</category><category>processor</category><category>macbook pro</category><category>area</category><category>first time</category><category>startup</category><category>scm</category><category>program</category><category>thanks</category><category>files</category><category>world</category><category>music</category><category>round corner</category><category>mountain lion</category><category>change color</category><category>button</category><category>degree</category><category>limit. integer</category><category>queue</category><category>regex</category><category>grand central dispatch</category><category>run windows</category><category>android phone</category><category>slider</category><category>nsdate</category><category>cv2</category><category>unix</category><category>crc</category><category>twitter</category><category>mac mini</category><category>virus</category><category>architect</category><category>roation gesture</category><category>steve</category><category>coffee</category><category>bootstrap</category><category>tea</category><category>on web</category><category>image processing</category><category>cmyk</category><category>decimal</category><category>writing</category><category>toast</category><category>beautiful code</category><category>management</category><category>classic</category><category>mobile</category><category>tap gesture</category><category>block</category><category>so on</category><category>display</category><category>relative</category><category>html5</category><category>black</category><category>macport</category><category>plug-in</category><category>ios6</category><category>asihttp</category><category>how to</category><category>segmentation fault</category><category>corner</category><category>str</category><category>method</category><category>cin</category><category>nerd</category><category>how</category><category>freedom</category><category>library</category><category>big data</category><category>convention</category><category>renaming</category><category>css</category><category>seek</category><category>io12th</category><category>dev tools</category><category>spinner</category><category>app</category><category>ocr</category><category>argv</category><category>uiview</category><category>review</category><category>safari</category><category>lose</category><category>offset</category><category>xml</category><category>set date</category><category>bugday</category><category>pull to refresh</category><category>A</category><category>select</category><category>13 ratina</category><category>google maps</category><category>camera</category><category>transition</category><category>seminar</category><category>brother</category><category>andaman</category><category>separation</category><category>Six</category><category>thumbsup</category><category>polarized</category><category>language</category><category>textmate</category><category>dateformatter</category><category>untrack</category><category>move</category><category>vertical</category><category>iphone lost</category><category>android</category><category>xcode</category><category>integration</category><category>VCS</category><category>intel</category><category>software</category><category>tweet</category><category>messages</category><category>slide</category><category>find iphone</category><category>eclispe</category><category>uikit</category><category>delegate</category><category>cgrect</category><category>javascript</category><category>cidetector</category><category>connection</category><category>jsonserialization</category><category>front-end</category><category>night</category><category>map</category><category>change</category><category>image color</category><category>obj-c</category><category>social</category><category>gitignore</category><category>photos</category><category>http</category><category>curl</category><category>internship</category><category>webiz</category><category>price drop</category><category>jsonkit</category><category>picker</category><category>2012</category><category>beautiful</category><category>pinch</category><category>download</category><category>delete</category><category>jpc</category><category>radiogroup</category><category>starbucks</category><category>pinch gesture</category><category>imac</category><category>heiroku</category><category>class</category><category>script</category><category>ci</category><category>range</category><category>alertdialog</category><category>windows</category><category>linear</category><category>cmd</category><category>count</category><category>file</category><category>matching</category><category>3.x</category><category>stl</category><category>friends</category><category>sharing</category><category>feed</category><category>twitter api</category><category>quicksort</category><category>php</category><category>loops</category><category>process</category><category>iPhone 5</category><category>cgpoint</category><category>random</category><category>uiimagepickercontroller</category><category>execute</category><category>under_seperate</category><category>experience</category><category>oop</category><category>trip</category><category>proof</category><category>time</category><category>android apk</category><category>face</category><category>stack</category><category>rgb</category><category>sentest</category><category>blogger</category><category>iterator</category><category>computer vision</category><category>mobile dev</category><category>runtime</category><category>structure</category><category>boutique</category><category>command line</category><category>monkey patching</category><category>model</category><category>maps</category><category>interactive shell</category><category>ctw</category><category>desktop icon</category><category>first meet</category><category>beautifulsoup</category><category>resize</category><category>3d glasses</category><category>tools</category><category>find ipad</category><category>cocoapods</category><category>new iPhone</category><category>ceylon</category><category>bugs</category><category>uirefreshcontrol</category><category>hex</category><category>development</category><category>iPod Nano</category><category>qualification</category><category>infinity list</category><category>canon</category><category>white</category><category>parsing</category><category>avd</category><category>api</category><category>lion</category><category>your web</category><category>service</category><category>ipython</category><category>ipad3</category><category>arrayadapter</category><category>rubyonrails</category><category>symetric</category><category>array</category><category>chrome</category><category>data migration</category><category>objective-c</category><category>prime</category><category>practice</category><category>find my iphone</category><category>git</category><category>choose</category><category>gem</category><category>rss</category><category>rails</category><category>apps</category><category>developer</category><category>redirect</category><category>covered</category><category>click me</category><category>transform</category><category>barista</category><category>special</category><category>retina</category><category>POST</category><category>python shell</category><category>chickenpox</category><category>fromdate</category><category>price</category><category>python image</category><category>workshop</category><category>cv</category><category>absolute</category><category>refactor</category><category>theme</category><category>core</category><category>success</category><category>restful</category><category>field</category><category>lost ipad</category><category>information</category><category>thailand</category><category>store</category><category>left</category><category>orient</category><category>pil</category><category>format</category><category>memory</category><category>stringdate</category><category>mutable</category><category>nsdateformatter</category><category>anaglyph</category><category>pdf</category><category>bundles</category><category>rest</category><category>sound playing</category><category>ui</category><category>controller</category><category>text</category><category>alert</category><category>build</category><category>homebrew</category><category>10.8</category><category>javac</category><category>barcampbangkok</category><category>up</category><category>nokogiri</category><category>circle</category><category>network</category><category>framework</category><category>GET</category><category>love</category><category>content</category><category>error</category><category>af</category><category>dependencies</category><category>blocks</category><category>activity</category><category>upgrade python</category><category>intern</category><category>coordinates</category><category>thinness</category><category>comment</category><category>dom</category><category>client</category><category>opendream</category><category>manipulation</category><category>reboot</category><category>a5x</category><category>gcd</category><category>bangkhen</category><category>christmas</category><category>github</category><category>input</category><category>event</category><category>wine</category><category>pan gesture</category><category>command</category><category>inspiration</category><category>tmbundle</category><category>think</category><category>sleep</category><category>key feature</category><category>programmer</category><category>2013</category><category>shell</category><category>7saturday</category><category>wordcount</category><category>new ipad</category><category>stylesheets</category><category>ipad mini</category><category>sax</category><category>regular</category><category>classical</category><category>operation queue</category><category>sample intent</category><category>menu</category><category>hops</category><category>repository</category><category>iPod Touch</category><category>apk</category><category>theory</category><category>start it up</category><category>12-12-12</category><category>speed</category><category>nexus q</category><category>radio</category><category>input view</category><category>drawing</category><category>english</category><category>circular</category><category>number</category><category>PUT</category><category>gtypist</category><category>highlight</category><category>intent</category><category>mac os x</category><category>standard input</category><category>refresh</category><category>thread</category><category>hsl</category><category>gps</category><category>blackberry</category><category>scrum</category><category>documentcloud</category><category>textview</category><category>easy parsing</category><category>edittext</category><category>select date</category><category>gcc</category><category>12</category><category>frame</category><category>numbers</category><category>run</category><category>py</category><category>reuse</category><category>problem</category><category>show</category><category>install</category><category>command line tools</category><category>core data</category><category>dialog</category><category>bs4</category><category>lost ios</category><category>hardisk</category><category>ratina</category><category>south</category><category>3d</category><category>singleton</category><category>setvalue</category><category>canon in d</category><category>crawl</category><category>cs-camp</category><category>camel</category><category>3.2</category><category>open source</category><category>syntax</category><category>date</category><category>pronto</category><category>product</category><category>prolog</category><category>firefox</category><category>test</category><category>location</category><category>travel</category><category>iphone</category><category>i5</category><category>forin</category><category>web service</category><category>keyboard</category><category>dev android</category><category>eclipse</category><category>pachelbel</category><category>1.9.3</category><category>countdown</category><category>reef</category><category>intent sample</category><category>actionsheet</category><category>xp</category><category>cpu</category><category>young</category><category>multiple</category><category>contest</category><category>future</category><category>afternoon tea</category><category>sandy bridge</category><category>4.1</category><category>lost</category><category>foreach</category><category>logic</category><category>adt</category><category>slow</category><category>sequence</category><category>arc</category><category>parsing type</category><category>object</category><category>typing</category><category>pan</category><category>camping</category><category>alertview</category><category>geek</category><category>ux</category><category>algorithm</category><category>game</category><category>comprehension</category><category>compile</category><category>fibonacci</category><category>imagepicker</category><category>httpclient</category><category>arc4random</category><category>find ios</category><category>photo</category><category>edit</category><category>people</category><category>html</category><category>color</category><category>base</category><category>getling</category><category>coding</category><category>dev</category><category>canon in c</category><category>quality</category><category>10th</category><category>kiwi</category><category>version control</category><category>testing</category><category>detector</category><category>request</category><category>my sassy girl</category><category>objc</category><category>setup</category><category>app store</category><category>datasource</category><category>afnetworking</category><category>fifo</category><category>datestring</category><category>uitableview</category><category>auto</category><category>dynamic</category><category>uiimageview</category><category>apple</category><category>beach</category><category>bounds</category><category>core image</category><category>kmutt</category><category>indent</category><category>ipad</category><category>i3</category><category>ios dev</category><category>graph</category><category>conference</category><category>find my mac</category><category>power it up</category><category>2.7.3</category><category>form</category><category>string</category><category>zoom</category><category>find</category><category>agile</category><category>sdk</category><category>python</category><category>official</category><category>after you</category><category>llvm</category><category>hide</category><category>varicella</category><category>right</category><category>layout</category><category>fast enum</category><category>readable</category><category>kmitl</category><category>dos</category><category>port</category><category>crawler</category><category>sister</category><category>database</category><category>snokering</category><category>pair</category><category>element</category><category>research</category><category>android sdk</category><category>uiimage</category><category>elc</category><category>sqlite3 problem</category><category>avfoundation</category><category>programming</category><category>document</category><category>nsdictionary</category><category>2d</category><category>resizing</category><category>kanon</category><category>thinkcamp</category><category>sorting</category><category>complete</category><category>simple</category><category>expression</category><category>qsort</category><category>star</category><category>basenumber</category><category>iphone dev</category><category>alpha</category><category>similan</category><category>jobs</category><category>terminal</category><category>datepicker</category><category>web dev</category><category>microsoft</category><category>compiling</category><category>g++</category><category>data</category><category>less</category><category>money</category><title>iMacbaszii's Blog</title><description>Computer, Programming and My Interesting.</description><link>http://www.macbaszii.com/</link><managingEditor>noreply@blogger.com (Kiattisak Anoochitarom)</managingEditor><generator>Blogger</generator><openSearch:totalResults>200</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/macbaszii" /><feedburner:info uri="macbaszii" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:browserFriendly></feedburner:browserFriendly><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7237929072659768518.post-7055684466435912806</guid><pubDate>Tue, 18 Jun 2013 06:52:00 +0000</pubDate><atom:updated>2013-06-18T13:53:27.981+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">kiwi</category><category domain="http://www.blogger.com/atom/ns#">tdd</category><category domain="http://www.blogger.com/atom/ns#">ios</category><category domain="http://www.blogger.com/atom/ns#">code</category><category domain="http://www.blogger.com/atom/ns#">sentest</category><category domain="http://www.blogger.com/atom/ns#">test</category><category domain="http://www.blogger.com/atom/ns#">setup</category><title>[iOS Dev] Test Driven Development with Kiwi (Part II: TDD)</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-Iks5EPXVwj0/UaxFvCYgRFI/AAAAAAAAD3Y/n50iKaLhsA8/s1600/kiwi_vitamines_1024x768.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/-Iks5EPXVwj0/UaxFvCYgRFI/AAAAAAAAD3Y/n50iKaLhsA8/s400/kiwi_vitamines_1024x768.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
Blog ที่แล้ว เราพูดถึงการ Setup Kiwi กันนะครับ&lt;br /&gt;
&lt;div&gt;
คราวนี้เราจะมาเขียน Test กันละ ... ตัวอย่างที่ผมจะยกมาก็คือ &lt;b&gt;&lt;span style="font-size: large;"&gt;&lt;i&gt;Factorial Function&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: red;"&gt;** ก่อนอื่นให้ไปลบ Sample Test ในฟังก์ชั่น testExample ที่อยู่ใน testTargetName.m ก่อนนะ :) &amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-size: large;"&gt;&lt;i&gt;&lt;a href="http://www.code-66.com/blog/2011/02/test-driven-development-1/"&gt;ใครยังไม่รู้จัก TDD อ่านได้ที่นี่&lt;/a&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
มาเริ่มกันเลย ขั้นแรกให้เราสร้าง&lt;i&gt;&lt;b&gt; Objective-C Test Case Class&lt;/b&gt;&lt;/i&gt; ขึ้นมาก่อน&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-Fnv-R0pxgEQ/Ua1IUZd9aVI/AAAAAAAAD5I/haai_NTjK7M/s1600/Screen+Shot+2556-06-04+at+8.51.32+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="428" src="http://2.bp.blogspot.com/-Fnv-R0pxgEQ/Ua1IUZd9aVI/AAAAAAAAD5I/haai_NTjK7M/s640/Screen+Shot+2556-06-04+at+8.51.32+AM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
เมื่อสร้างแล้ว ก็ให้ลบไฟล์ Header File (.h) ออกซะ แล้วลบเนื้อหาภายใน Implementation File (.m) แบบนี้&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-dVU67Xd0VYs/Ua1JClEyv0I/AAAAAAAAD5Q/1FBa6JHuKYo/s1600/Screen+Shot+2556-06-04+at+8.54.57+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="234" src="http://2.bp.blogspot.com/-dVU67Xd0VYs/Ua1JClEyv0I/AAAAAAAAD5Q/1FBa6JHuKYo/s400/Screen+Shot+2556-06-04+at+8.54.57+AM.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
เวลาจะทำการ Test ก็ดูที่ Scheme ให้ดีนะครับ ว่าเป็นตัว Test Target ที่เราสร้างขึ้นหรือยัง ?&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-nasVGWVYM2I/Ua1KoniEg9I/AAAAAAAAD5k/iwoCC3mtAR8/s1600/Screen+Shot+2556-06-04+at+9.00.59+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="77" src="http://2.bp.blogspot.com/-nasVGWVYM2I/Ua1KoniEg9I/AAAAAAAAD5k/iwoCC3mtAR8/s320/Screen+Shot+2556-06-04+at+9.00.59+AM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
ถ้าต้อง Test ให้กด &lt;i&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;cmd&amp;nbsp;+ U&lt;/span&gt;&lt;/b&gt;&lt;/i&gt; หรือที่เมนู &lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;Product -&amp;gt; Test&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
ที่ยกตัวอย่างจำเป็นคำสั่งเบื้องต้นเท่านั้น อ่านเต็มๆ &lt;a href="https://github.com/allending/Kiwi/wiki/Specs"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;ได้ที่นี่เลยนะ&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
คราวนี้เรามาเริ่มเขียน Test กันได้เลย Factorial Function ควรจะเป็นยังไงครับ ?&lt;/div&gt;
&lt;div&gt;
ผมสร้าง &lt;b&gt;&lt;i&gt;KWMathFunction Class&lt;/i&gt;&lt;/b&gt; ขึ้นมาเพื่อเก็บฟังก์ชั่นการคำนวณทางคณิตศาสตร์เอาไว้&lt;/div&gt;
&lt;div&gt;
เมื่อสร้างแล้วเขียน Test เบื้องต้นว่า Factorial ของ 0 และ 1 ควรจะได้ 1&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
แน่นอนครับ Fail และโดนด่าว่า &lt;b&gt;&lt;i&gt;&lt;span style="color: red;"&gt;ไม่มีฟังก์ชั่นนี้โว้ยยยยย = ='&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-X7RRyJvn_t8/Ua1NSZm9BNI/AAAAAAAAD58/JLMDZ63rsWc/s1600/Screen+Shot+2556-06-04+at+9.12.48+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="408" src="http://2.bp.blogspot.com/-X7RRyJvn_t8/Ua1NSZm9BNI/AAAAAAAAD58/JLMDZ63rsWc/s640/Screen+Shot+2556-06-04+at+9.12.48+AM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
แน่นอนว่า ไม่มีก็ไปเขียน (ต้องประกาศใน Header File ด้วยนะ) แล้วก็เขียนให้ Test มันผ่าน&lt;/div&gt;
&lt;div&gt;
เขียนแค่นี้จริงๆ นะ ไม่ได้ตลก เราบอกแล้วว่า เราจะเขียนแค่ให้มัน &lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;ผ่าน&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-s5w0Ac2fyl0/Ua1NlQ5eGsI/AAAAAAAAD6E/KB_jYwYaZys/s1600/Screen+Shot+2556-06-04+at+9.14.26+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="323" src="http://1.bp.blogspot.com/-s5w0Ac2fyl0/Ua1NlQ5eGsI/AAAAAAAAD6E/KB_jYwYaZys/s640/Screen+Shot+2556-06-04+at+9.14.26+AM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
คราวนี้พอกลับมาเทสก็จะผ่านละ ใน 2 Case ที่เราเขียนไป&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-QlBwKmgJVt8/Ua1UvFLMsSI/AAAAAAAAD6Q/nsgU-yalxJQ/s1600/Screen+Shot+2556-06-04+at+9.44.26+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-QlBwKmgJVt8/Ua1UvFLMsSI/AAAAAAAAD6Q/nsgU-yalxJQ/s1600/Screen+Shot+2556-06-04+at+9.44.26+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
จากนั้นก็เพิ่ม Test เข้าไป&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/--k0665Z7bX8/Ua1VyUDvGLI/AAAAAAAAD6c/3S4eP6_QbwA/s1600/Screen+Shot+2556-06-04+at+9.46.29+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/--k0665Z7bX8/Ua1VyUDvGLI/AAAAAAAAD6c/3S4eP6_QbwA/s1600/Screen+Shot+2556-06-04+at+9.46.29+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
คราวนี้พอ Test เราก็จะ Fail แล้วโดนด่าว่า &lt;b&gt;&lt;i&gt;&lt;span style="color: red;"&gt;"ผิดโว้ยย ค่าที่ได้คือ 1" (แหงล่ะ)&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;i&gt;&lt;span style="color: red;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-nw-9MQObkHs/Ua1WwZN8VqI/AAAAAAAAD6o/aOMHc9mznEc/s1600/Screen+Shot+2556-06-04+at+9.48.51+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="168" src="http://4.bp.blogspot.com/-nw-9MQObkHs/Ua1WwZN8VqI/AAAAAAAAD6o/aOMHc9mznEc/s640/Screen+Shot+2556-06-04+at+9.48.51+AM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;i&gt;&lt;span style="color: red;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
พอละ เขียนโปรแกรมให้ถูกกันได้เลย (ฟังก์ชั่นที่ซับซ้อนกว่านี้ก็ต้องทำเยอะกว่านี้นะ)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-hrK2L3howAw/Ua1W2K5zskI/AAAAAAAAD6w/WvtGEuSCxPQ/s1600/Screen+Shot+2556-06-04+at+9.52.40+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-hrK2L3howAw/Ua1W2K5zskI/AAAAAAAAD6w/WvtGEuSCxPQ/s1600/Screen+Shot+2556-06-04+at+9.52.40+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
คราวนี้พอ Test ก็จะผ่านทุก Case ที่เราเขียนขึ้นมา ... เท่านี้เอง :)&lt;/div&gt;
&lt;div&gt;
ลองไปทำดูนะครับ การทำ TDD เป็นเรื่องของบุคคลนะ คือทำหรือไม่ทำก็ได้ แต่ทำแล้วเร็วส์ และ หล่อส์&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
...&lt;/div&gt;
&lt;div&gt;
..&lt;/div&gt;
&lt;div&gt;
.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
เค้าว่ามาอย่างนั้น :P&lt;/div&gt;
</description><link>http://www.macbaszii.com/2013/06/ios-dev-test-driven-development-with_18.html</link><author>noreply@blogger.com (Kiattisak Anoochitarom)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-Iks5EPXVwj0/UaxFvCYgRFI/AAAAAAAAD3Y/n50iKaLhsA8/s72-c/kiwi_vitamines_1024x768.jpg" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7237929072659768518.post-8948344640203446033</guid><pubDate>Mon, 17 Jun 2013 12:49:00 +0000</pubDate><atom:updated>2013-06-17T19:49:01.630+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">kiwi</category><category domain="http://www.blogger.com/atom/ns#">tdd</category><category domain="http://www.blogger.com/atom/ns#">ios</category><category domain="http://www.blogger.com/atom/ns#">code</category><category domain="http://www.blogger.com/atom/ns#">sentest</category><category domain="http://www.blogger.com/atom/ns#">test</category><category domain="http://www.blogger.com/atom/ns#">setup</category><title>[iOS Dev] Test Driven Development with Kiwi (Part I: Setup)</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-Iks5EPXVwj0/UaxFvCYgRFI/AAAAAAAAD3Y/n50iKaLhsA8/s1600/kiwi_vitamines_1024x768.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/-Iks5EPXVwj0/UaxFvCYgRFI/AAAAAAAAD3Y/n50iKaLhsA8/s400/kiwi_vitamines_1024x768.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
ขอเล่าก่อนว่า ผมได้ยินคำว่า TDD มาสักพักละ แต่ตัวผมเอง มองว่าทำไมเราต้องเสียเวลาเขียน Test&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
ไปเพื่ออะไร แต่ไม่รู้อะไรดลใจ ให้เริ่มตระหนักว่า มันอาจจะช่วยให้เรามองอะไรได้กว้างขึ้นในการเขียนโปรแกรม ก็เลยอยากลองดู ...&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
โดยใน Xcode ก็มี SenTest Framework มาให้อยู่นะ แต่มันไม่สวยเลย (เคยเขียนที่ Opendream แปปนึง)&lt;/div&gt;
&lt;div&gt;
มีคนแนะนำตัวนี้มา เลยลองเล่นดู ก็พบว่า น่ารักใช่ย่อย มันชื่อว่า &lt;b&gt;&lt;span style="font-size: large;"&gt;&lt;a href="https://github.com/allending/Kiwi"&gt;"Kiwi"&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
ใน Tutorial ครั้งนี้จะใช้ Cocoapods ด้วยนะครับ ใครไม่รู้จักขอให้ไปอ่าน Blog ที่แล้วก่อนนะ&lt;br /&gt;
&lt;span style="color: red;"&gt;** ใครเคยเขียน Rspec บน Rails มาดูออก ว่ามันเหมือนกัน ฮาาา&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;h1 class="title entry-title" itemprop="name" style="background-color: #fafafa; color: #333333; display: table-cell; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 20px; font-weight: normal; margin: 0px; padding: 0px 40px 0px 0px; position: relative; text-align: center; vertical-align: middle; width: 670px;"&gt;
&lt;a href="http://www.macbaszii.com/2013/05/ios-dev-hello-cocoapods.html" itemprop="url" rel="bookmark" style="-webkit-transition: color 0.3s; color: #333333; outline: none; text-decoration: none;"&gt;[iOS Dev] Hello, Cocoapods!&lt;/a&gt;&lt;/h1&gt;
&lt;br /&gt;
ส่วนใครอยากทำแบบไม่มี Cocoapods ก็ตามไปที่นี่ได้เลย&amp;nbsp;&lt;a href="http://git.io/RwQtQQ"&gt;http://git.io/RwQtQQ&lt;/a&gt;&lt;br /&gt;
ขั้นแรกให้สร้าง Unit Test Target ขึ้นมาก่อน โดยไปที่&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px;"&gt;File -&amp;gt; New -&amp;gt; Target... -&amp;gt; Other -&amp;gt; Cocoa Touch Unit Testing Bundle&lt;/pre&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-EKhuAQ-9cFk/UaxIcaW3TbI/AAAAAAAAD3k/6XYyTyDwnqg/s1600/Screen+Shot+2556-06-03+at+2.38.45+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="270" src="http://4.bp.blogspot.com/-EKhuAQ-9cFk/UaxIcaW3TbI/AAAAAAAAD3k/6XYyTyDwnqg/s400/Screen+Shot+2556-06-03+at+2.38.45+PM.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
เมื่อสร้างเสร็จแล้ว ใน Project Navigator ก็จะมี Unit Test Target เพิ่มขึ้นมา&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-kWtiCInQ3UA/UaxIrzxexGI/AAAAAAAAD3s/g7ss_NT0Rz0/s1600/Screen+Shot+2556-06-03+at+2.39.05+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="216" src="http://3.bp.blogspot.com/-kWtiCInQ3UA/UaxIrzxexGI/AAAAAAAAD3s/g7ss_NT0Rz0/s400/Screen+Shot+2556-06-03+at+2.39.05+PM.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
จากนั้นปิด Xcode Project ... สร้าง Podfile ขึ้นมา แล้วเพิ่ม Kiwi (หรือถ้ามีอยู่แล้ว ก็ให้เพิ่มเข้าไป)&lt;br /&gt;
&lt;span style="color: red;"&gt;** ตรง KiwiTDDTests ก็เปลี่ยนให้ตรงกับ Unit Test Bundle ที่สร้างขึ้นมานะครับ&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;&lt;br /&gt;
&lt;/span&gt; &lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-wwrbJWE63oE/UaxJLpOJP3I/AAAAAAAAD30/HywszYco3-I/s1600/Screen+Shot+2556-06-03+at+2.43.05+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-wwrbJWE63oE/UaxJLpOJP3I/AAAAAAAAD30/HywszYco3-I/s1600/Screen+Shot+2556-06-03+at+2.43.05+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
สั่ง Install Dependencies ด้วยคำสั่ง&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px;"&gt;$ pod install&lt;/pre&gt;
&lt;br /&gt;
เมื่อเสร็จแล้วให้เปิด &lt;b&gt;&lt;span style="color: red; font-size: large;"&gt;&lt;i&gt;projectName.xcworkspace&lt;/i&gt;&lt;/span&gt;&lt;/b&gt; ขึ้นมาเล่นกันต่อเลย&lt;br /&gt;
ต่อไปก็เป็นขั้นตอนการ Configuration อาจจะดูยุ่งยากหน่อย แต่ทำสัก 2-3 รอบก็คล่องละ ผมว่า&lt;br /&gt;
&lt;br /&gt;
1. เมื่อเปิด projectName.xcworkspace ขึ้นมาก็จะพบกับไฟล์ตัวนึงที่ชื่อว่า Pods-&amp;lt;TestTargetName&amp;gt;.xcconfig ไฟล์นี้ถูกสร้างขึ้นโดย Cocoapods และมีคำสั่งที่จะใช้เชื่อมต่อกับ Test Target อยู่ด้านใน&lt;br /&gt;
&lt;br /&gt;
2. ไปที่ Project Navigator เลือกที่ Project ของเราแล้วเลือกแถบ Info&lt;br /&gt;
3. ดูให้ดีว่าทุก configurations ในการสั่งให้ใช้ไฟล์ .xcconfig ข้างต้นในการ Test&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-Z8RRFpMVIYQ/UaxL9dMCLuI/AAAAAAAAD4I/Da-o2GTUaNA/s1600/Screen+Shot+2556-06-03+at+2.54.44+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="270" src="http://2.bp.blogspot.com/-Z8RRFpMVIYQ/UaxL9dMCLuI/AAAAAAAAD4I/Da-o2GTUaNA/s640/Screen+Shot+2556-06-03+at+2.54.44+PM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
4. ไปที่ Unit Test Target แล้วเลือกแถบ Build Settings&lt;br /&gt;
5. Other Linker Flags จะต้องมี -objC -framework SenTestingKit&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-5F2RKbTtIt0/UaxMpZ_ijPI/AAAAAAAAD4Q/vi1_91uTPlo/s1600/Screen+Shot+2556-06-03+at+2.58.07+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="166" src="http://3.bp.blogspot.com/-5F2RKbTtIt0/UaxMpZ_ijPI/AAAAAAAAD4Q/vi1_91uTPlo/s640/Screen+Shot+2556-06-03+at+2.58.07+PM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
6. ค้นหาคำว่า "Bundle Loader" แล้วใส่&lt;br /&gt;
&lt;br /&gt;
$(BUILD_PRODUCT_DIR)/projectName.app/ApplicationTargetName&amp;nbsp;ลงไปครับ&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-QTtoEzwK9ec/UaxOF00ms1I/AAAAAAAAD4c/UxBt8V8-J-s/s1600/Screen+Shot+2556-06-03+at+3.04.17+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-QTtoEzwK9ec/UaxOF00ms1I/AAAAAAAAD4c/UxBt8V8-J-s/s1600/Screen+Shot+2556-06-03+at+3.04.17+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
7. ค้นหาคำว่า "Test Host" แล้วใส่ $(BUNDLE_LOADER)&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-ENmZKhlq49U/UaxOnpf3SZI/AAAAAAAAD4k/nKYdYLDQ8CM/s1600/Screen+Shot+2556-06-03+at+3.06.34+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-ENmZKhlq49U/UaxOnpf3SZI/AAAAAAAAD4k/nKYdYLDQ8CM/s1600/Screen+Shot+2556-06-03+at+3.06.34+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
จากนั้นไปที่เมนู&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px;"&gt;Product -&amp;gt; Scheme -&amp;gt; Manage Schemes
&lt;/pre&gt;
&lt;br /&gt;
ให้เลือกที่ Unit Test Target ที่เราสร้างขึ้น แล้วกด Edit ...&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-6N7i3g3_zak/UaxQzZtLjtI/AAAAAAAAD4w/P5ZkHY176vI/s1600/Screen+Shot+2556-06-03+at+3.12.41+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="504" src="http://3.bp.blogspot.com/-6N7i3g3_zak/UaxQzZtLjtI/AAAAAAAAD4w/P5ZkHY176vI/s640/Screen+Shot+2556-06-03+at+3.12.41+PM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
จากนั้นในแถบด้านข้างเลือก Test แล้วดูว่ามี Unit Test Bundle หรือปล่าว (ตามภาพคือมีแล้ว)&lt;br /&gt;
ถ้าไม่มีให้ Add เข้ามาครับ&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-2EhHfS1gOcU/UaxQ8v7Qj-I/AAAAAAAAD44/4KSwNFoNYL0/s1600/Screen+Shot+2556-06-03+at+3.12.57+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="432" src="http://4.bp.blogspot.com/-2EhHfS1gOcU/UaxQ8v7Qj-I/AAAAAAAAD44/4KSwNFoNYL0/s640/Screen+Shot+2556-06-03+at+3.12.57+PM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
เป็นการจบการ Setup Wiki TDD ที่ยาวนาน :) เดี๋ยวไปต่อวิธีการเขียนเบื้องต้นกันใน Blog หน้านะ&lt;/div&gt;
</description><link>http://www.macbaszii.com/2013/06/ios-dev-test-driven-development-with.html</link><author>noreply@blogger.com (Kiattisak Anoochitarom)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-Iks5EPXVwj0/UaxFvCYgRFI/AAAAAAAAD3Y/n50iKaLhsA8/s72-c/kiwi_vitamines_1024x768.jpg" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7237929072659768518.post-3536856467237288777</guid><pubDate>Fri, 07 Jun 2013 17:45:00 +0000</pubDate><atom:updated>2013-06-09T02:21:23.373+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">agile</category><category domain="http://www.blogger.com/atom/ns#">developer</category><category domain="http://www.blogger.com/atom/ns#">sharing</category><category domain="http://www.blogger.com/atom/ns#">software</category><category domain="http://www.blogger.com/atom/ns#">thailand</category><category domain="http://www.blogger.com/atom/ns#">tester</category><category domain="http://www.blogger.com/atom/ns#">experience</category><category domain="http://www.blogger.com/atom/ns#">2013</category><title>Agile Thailand 2013: KEEP CALM and BE AGILE</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-3v5reRqual0/UbFFOmbjRVI/AAAAAAAAD7A/zzjsZB8Jif8/s1600/logo.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-3v5reRqual0/UbFFOmbjRVI/AAAAAAAAD7A/zzjsZB8Jif8/s1600/logo.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
งานนี้ไม่มีพลาดแน่นอน Agile Thailand 2013&lt;br /&gt;
&lt;div&gt;
ปีนี้สถานที่ และสิ่งอำนวยความสะดวกครบครัน จัดที่ตึก CP สีลม ใจกลางเมืองเลยทีเดียว&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
คราวนี้ผมได้ไปทั้ง 3 กิจกรรมที่จัดขึ้นเลยทั้ง Code Retreat, Agile Workshop 201 ด้วย&lt;br /&gt;
&lt;br /&gt;
ส่วนวันสัมนา&amp;nbsp;Session ที่ผมเลือกเข้าฟังก็มีตามนี้นะ&lt;br /&gt;
นำสรุปคร่าวๆ มาแชร์ให้อ่านกัน และข่าวดีคือ&lt;br /&gt;
ทุก Session มีการอัดวีดีโอไว้ เดี๋ยวมาเรื่อยๆ แล้วผมจะดึงมาใส่ไว้ให้นะ :)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;Agile in Startup&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
coming soon...&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;Physical board and Electronic board&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;
เป็นการปะทะระหว่างพี่รูฟ กับ พี่ปอม ก็ตามชื่อ session เลยฮะ ตบตีกันมันส์ใช้ได้&lt;br /&gt;
แต่ละอย่าง ก็มีข้อดี ข้อเสียต่างกันไป ตัวอย่างเช่น Physical Board เนี่ย สาวๆ มาให้กำลังใจใน Product Backlog Item ให้เราได้ด้วยนะ :)&lt;br /&gt;
&lt;br /&gt;
ส่วนฝั่งของ Electronic Board นี่จะชี้ให้เห็นข้อดี ก็อย่างเช่น ถ้าเราและทีมอยู่คนละที่กันล่ะ (พี่รูฟสวน "ก็จับมันมาอยู่ด้วยกันสิ")&lt;br /&gt;
&lt;br /&gt;
ส่วนตัวผมชอบ Physical Board ครับ พี่รูฟเคยสอนตอนฝึกงานว่า พวก Eletronic ข้อเสียที่น่าสนใจคือ เราหรือคนในทีมสามารถมองข้ามมันได้ แต่ถ้าเป็น Board ที่เห็นกันจะจะ จะทำให้ทราบปัญหาอย่างชัดแจ้ง ว่างานนี้มันไม่เสร็จ เห็นกันทุกคนในทีม และมา Discuss กันได้เร็ว ว่าเกิดอะไรขึ้น&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;Team Anatomy&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
ผู้พูดคือ พี่แอมป์ออกตัวไว้ก่อนเลย นี่ไม่ใช่ Session เกี่ยวกับ Build Team ... ฮาาา แต่เป็น Session ที่ว่าด้วย&amp;nbsp;'Being a (good) Team Member' เปิดเรื่องด้วยการบอกว่า&lt;br /&gt;
&lt;br /&gt;
"Team คือบุคคลแต่ละคน ที่สัญญา (committment) กันว่าจะทำงานด้วยกันเป็นทีม &lt;br /&gt;
ถ้าเอาคนมาทำงานร่วมกัน โดยไม่อยากทำด้วยกันนั่นไม่ใช่ Team"&lt;br /&gt;
&lt;br /&gt;
ดังนั้นการจะเป็น Team Member ที่ดีนั้น เราต้องลดความเป็น High Performer ของตัวเอง ซึ่งข้อเสียที่จะทำให้ทีมสะดุดนั้น ก็มี&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Perfectionism&amp;nbsp;ดี แต่ช้า เพราะจะรู้สึกว่าอะไรอะไรก็ไม่ Perfect สักที ให้ลองเปลี่ยน mindset เป็น Continuous Improvement แทน ทำให้เสร็จก่อน แล้วค่อยทำให้ดี&lt;/li&gt;
&lt;li&gt;I am better to be here … นี่พวกแกเห็น Value ฉันแบบที่ฉันเห็นตัวเองหรือปล่าว ?&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Never give up … การเชื่อมั่นว่า ถ้าทีมไม่มีฉัน ทีมนี้จะไปไม่รอดแน่นอน&lt;/li&gt;
&lt;li&gt;Self Confidence … ไม่มีคำอธิบาย&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
เรื่องการ Assume ไม่ว่าจะผิดใจ หรือแค่สงสัยอะไรเกี่ยวกับเพื่อนร่วมงาน "อย่า" คิดไปเอง ว่าเขาคิดกับเราอย่างนั้น อย่างนี้ เขาไม่ชอบเราหรือปล่าว ? (ถ้าถามได้) ให้ถามซะ&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
และ Quote อันหนึ่งที่ผมชอบในการฟัง Session นั้นก็คือ "In discussion, seniority is f*cking unnecessary"&lt;/div&gt;
&lt;div&gt;
แปลแบบตรงๆ เราจะพบว่า มันไม่ได้ทำกันง่ายๆ หรอกนะ แต่การลดช่องว่างตรงนี้ อาจจะเป็นอะไรที่ดีกว่า ในการที่จะแสดงความคิด หรือเปิดโอกาสให้คนอื่นได้พูด ได้สิ่งที่เขาอยากพูดบ้าง&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;Seeking Hyper Productivity&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;
จะมีจริงหรือ Practice ที่จะทำให้เราทำงานเร็วขึ้น (Productivity) 8 &amp;nbsp;- 10 เท่า พี่จั๊วบอกว่า คนที่ทำแบบ Agile คิดแบบ Agile เยอะๆ จะเข้าสู่ภาวะที่เรียกว่า "Hyper Productivity" (ยังกับภาวะไร้ตัวตน) เส้นทางที่จะไปสู่ภาวะไร้ตัวตนได้นั้น มีดังต่อไปนี้&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Responsiveness&lt;/li&gt;
&lt;li&gt;Motivation&lt;/li&gt;
&lt;li&gt;Communication&lt;/li&gt;
&lt;li&gt;Childliness&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
รายละเอียดข้อบนๆ ผมจำไม่ได้ แต่ผมเข้าใจข้อ 4 มากที่สุด พี่จั๊วเปิดด้วยคำถามที่ว่า "คิดว่าเด็กๆ มีอะไรพิเศษหรือปล่าว ในบางเรื่องเขาถึงเรียนรู้อะไรได้เร็วกว่าคนที่โตกว่า" และก็เล่าเปรียบเทียบว่า&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
เมื่อเด็กปั่นจักรยาน ตอนที่เขาเอาขาขึ้นกำลังจะปั่น ในหัวเด็กจะคิดถึงภาพที่เขาปั่นจักยานได้ และเมื่อเขาล้ม เขาจะรู้ว่า ทำไมถึงล้ม&amp;nbsp;ในขณะที่ผู้ใหญ่ ถ้าเริ่มปั่นจักรยาน ทันทีที่เอาขาขึ้น กำลังปั่น ภาพในหัวคือ ภาพที่เขาล้มในการขี่จักรยาน&amp;nbsp;และเมื่อล้ม เขาจะบอกตัวเองว่า นี่ไม่ใช่สิ่งที่เข้ากับเขา นั่นคือ เมื่อเราโตขึ้น ความกลัวเราก็มีมากขึ้น&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
สิ่งที่น่าสนใจจากเรื่องราวข้างต้นคือ ...&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
เราควรจะทำอะไรด้วย Passion และความสนุกที่จะเกิดขึ้น ไม่ใช่คิดแต่จะรอรับความกลัวที่จะเกิดขึ้น&lt;br /&gt;
ถ้าโยงไปเรื่องการเขียนโปรแกรม คนในองค์กรที่อยู่มานาน จะกลัวการเปลี่ยนแปลงมาก เทคโนโลยีที่เคยใช้ ความคิดเก่าที่เคยคิด เขาจะไม่เปลี่ยน ถึงแม้ว่า จะมีใครสักคนที่พร่ำบอกข้อเสียมากแค่ไหนก็ตาม&lt;br /&gt;
&lt;br /&gt;
การกลัวความเปลี่ยนแปลงนั่นคือความของผู้ใหญ่ในเรื่องดังกล่าว ถ้าเราลองกลับไปเป็นเด็ก มีของใหม่ เราอยากเล่น เราอยากลอง ... เชื่อเถอะ ในโลกของเทคโนโลยี ความรู้ที่มี ใหญ่จนเราคาดคิดไม่ถึงเลยล่ะ&lt;/div&gt;
&lt;br /&gt;
&lt;i&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Retrospective&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
การทำ Retrospective คือการพูดคุยกันของสมาชิกในทีมเพื่อปรับปรุงวิธีการทำงานของทีม&lt;br /&gt;
ไม่ใช่การคุยกันเพื่อน Focus ที่งานนะครับ Focus ที่ทีมเป็นหลัก&lt;br /&gt;
&lt;br /&gt;
การทำ Retrospective ควรจะทำบ่อยๆ อาจจะทุกๆ ท้าย Sprint&lt;br /&gt;
เป็นการ Sound เสียงว่าทีม "เรายังเป็นทีมที่มีประสิทธิภาพอยู่ไหม ?" #คุ้นๆ&lt;br /&gt;
&lt;br /&gt;
Practice ที่น่าสนใจคือ การพูดขอบคุณใครสักคนในการ Retrospective&lt;br /&gt;
คือเป็นการกระทำที่มีแต่ได้ ไม่มีการเสียเลือดเสียเนื้ออะไร หาเรื่องขอบคุณไปเถอะ เช่น&lt;br /&gt;
&lt;br /&gt;
"เราขอบคุณเธอนะ ถึงแม้เธอจะไม่ช่วยอะไรเราเลย แต่ก็ไม่เคยบ่นเราเลย" #อ่าว&lt;br /&gt;
&lt;br /&gt;
อ่านเต็มๆ ได้ที่นี่ --&amp;gt;&amp;nbsp;&lt;a href="http://www.amp-io.com/2013/06/05/retrospective-the-art-of-continuous-improvement/?utm_source=rss&amp;amp;utm_medium=rss&amp;amp;utm_campaign=retrospective-the-art-of-continuous-improvement"&gt;Retrospective: The Art of Continuous Improvement&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;How can I live with CMMI but I want to be Agile&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
อันนี้ไม่ได้ฟังนาน เพราะหนีไปดู CD with Android ...&lt;br /&gt;
ฟังเพราะ อยากรู้ว่า CMMi ที่เขาว่ากันจริงๆ แล้วคืออะไร ?&lt;br /&gt;
&lt;br /&gt;
คำตอบคือ CMMi คือ Set of Best Practice ของการทำ Software&lt;br /&gt;
ว่าการจะ Deriver Software ที่ดี (หรอ ?) สักตัวนั้น ... จะต้องทำอะไรบ้าง (ไม่ใช่ทำอย่างไร)&lt;br /&gt;
ซึ่งงานเอกสารก็เป็นส่วนประกอบ มีทั้ง 5 Level&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;Continuous Delivery with Android&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;
ประเด็นหลักๆ ของ Session นี้ก็คือ เราจะใช้เครื่องมืออะไรบ้าง&lt;br /&gt;
ที่จะทำให้ App อยู่ในสถานะที่เรียกว่า "Production Ready" ตลอดเวลา&lt;br /&gt;
และพร้อมที่จะ Release เมื่อ Biz ต้องการ ...&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;Bridging Management Gap&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
องค์กรของคุณจะเปลี่ยนเป็น Agile ได้หรือปล่าว ?&lt;br /&gt;
อ่าน --&amp;gt;&amp;nbsp;&lt;a href="http://korn4d.wordpress.com/2013/04/24/bridging-the-management-gap/"&gt;http://korn4d.wordpress.com/2013/04/24/bridging-the-management-gap/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;Agile:66 Special Report&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
coming soon...&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Link วีดีโอ Session ที่ผมไม่ได้เข้าฟัง&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
จะเข้ามา Update เรื่อยๆ ดีกว่าครับ สำหรับ Blog นี้ เพราะบางเรื่องนี่ก็ต้องมา Revised กันหน่อย&lt;/div&gt;
</description><link>http://www.macbaszii.com/2013/06/agile-thailand-2013-keep-calm-and-be.html</link><author>noreply@blogger.com (Kiattisak Anoochitarom)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-3v5reRqual0/UbFFOmbjRVI/AAAAAAAAD7A/zzjsZB8Jif8/s72-c/logo.jpg" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7237929072659768518.post-6138798184569548824</guid><pubDate>Mon, 27 May 2013 15:31:00 +0000</pubDate><atom:updated>2013-05-27T22:33:08.242+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">dependencies</category><category domain="http://www.blogger.com/atom/ns#">3rd party</category><category domain="http://www.blogger.com/atom/ns#">cocoapods</category><category domain="http://www.blogger.com/atom/ns#">ios</category><category domain="http://www.blogger.com/atom/ns#">gem</category><title>[iOS Dev] Hello, Cocoapods!</title><description>ใครที่เคยเขียน Ruby on Rails อาจจะรู้จัก Gemfile&lt;br /&gt;
&lt;div&gt;
ใครที่เคยเขียน Python อาจจะรู้จัก Pypi&lt;/div&gt;
&lt;div&gt;
ใครใช้ Terminal อาจจะรู้จัก Homebrew&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
แล้วเชื่อว่าทุกคน ก็น่าจะรู้สึกว่า ชีวิตง่ายขึ้นแค่ไหน :) (หมายถึงว่ามันอารมณ์เดียวกันนะ)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
วันนี้จะมาแนะนำ &lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;&lt;a href="http://cocoapods.org/"&gt;Cocoapods&lt;/a&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt; ครับ ซึ่งเป็น Dependencies Management บน iOS&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-uaMRWnJ5StY/UaN6lJFttNI/AAAAAAAAD3I/MyHs0SkFgjg/s1600/8b374a26ac900a5c7b83a8767faff333.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-uaMRWnJ5StY/UaN6lJFttNI/AAAAAAAAD3I/MyHs0SkFgjg/s320/8b374a26ac900a5c7b83a8767faff333.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
มีข้อจำกัดของการใช้งานเพียงอย่าวเดียวคือ "การอัพเดทของ Library จะเป็นนหน้าที่ของ Cocoapods"&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
นั่นหมายความว่า เวอร์ชั่นของ 3rd Party Library อาจจะไม่ตรงกับใน Official ในบางกรณีเช่น "พึ่งออก"&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
ส่วนวิธีการใช้งาน ก็ไม่ยากเลยครับ เปิด Terminal ขึ้นมาแล้วสั่ง&lt;/div&gt;
&lt;div&gt;
&lt;pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(204, 204, 204); color: #333333; font-family: Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px; text-align: justify;"&gt;&lt;code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; font-family: Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 12px; line-height: 1.4em; margin: 0px; padding: 0px;"&gt;$ gem install cocoa-pods 
$ pod setup &lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
จากนั้นก็เข้าไปใน Folder ของ Xcode Project ที่เราทำงานอยู่ แล้วสร้างไฟล์ชื่อ Podfile&lt;/div&gt;
&lt;div&gt;
เขียนใน File ตัวอย่างเช่น&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(204, 204, 204); color: #333333; font-family: Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px; text-align: justify;"&gt;&lt;code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; font-family: Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 12px; line-height: 1.4em; margin: 0px; padding: 0px;"&gt;platform :ios, '5.1.2'
pod 'AFNetworking'
pod 'Reachability'
pod 'SBJSON'&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
จากนั้นในหน้า Terminal สั่ง (เข้าไปใน Wordking Space ของเราที่มี Podfile นะครับ)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(204, 204, 204); color: #333333; font-family: Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px; text-align: justify;"&gt;&lt;code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; font-family: Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 12px; line-height: 1.4em; margin: 0px; padding: 0px;"&gt;$ pod install&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
เท่านี้เองครับ ... เมื่อทำการ Install Dependencies เสร็จแล้ว&lt;/div&gt;
&lt;div&gt;
ใน Working Folder ก็จะมีไฟล์เพิ่มขึ้นมาคือ &lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;projectName.xcworkspcae&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;ให้เราเปิดทำงานกับตัวนี้แทนนะครับ :)&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
เราจะสังเกตุว่า Cocoapods ทำการสร้างอีก Project มารวมกับ Project ที่เราทำงานอยู่&lt;/div&gt;
&lt;div&gt;
และใส่ Dependencies ไว้ใน Project ที่แยกไปต่างหาก&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
ดังนั้นระหว่าง Working Space ของเรากับ Dependencies อยู่คนละที่กันแล้ว ...&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
เวลา #import เข้ามาใช้งานจะต้องใช้ &lt;b&gt;&lt;i&gt;&amp;lt;dependencieName.h&amp;gt; (Angle Bracket)&lt;/i&gt;&lt;/b&gt; แทน "" (Double Quote)&lt;/div&gt;
&lt;div&gt;
เช่น&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(204, 204, 204); color: #333333; font-family: Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px; text-align: justify;"&gt;&lt;code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; font-family: Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 12px; line-height: 1.4em; margin: 0px; padding: 0px;"&gt;#import &amp;lt;AFNetworking.h&amp;gt;
#import &amp;lt;Reachability.h&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
เท่านี้เองครับ ง่ายใช่ไหมล่ะ :)&lt;/div&gt;
</description><link>http://www.macbaszii.com/2013/05/ios-dev-hello-cocoapods.html</link><author>noreply@blogger.com (Kiattisak Anoochitarom)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-uaMRWnJ5StY/UaN6lJFttNI/AAAAAAAAD3I/MyHs0SkFgjg/s72-c/8b374a26ac900a5c7b83a8767faff333.png" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7237929072659768518.post-165391157527575510</guid><pubDate>Thu, 09 May 2013 02:17:00 +0000</pubDate><atom:updated>2013-05-29T17:47:51.701+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">nsdate</category><category domain="http://www.blogger.com/atom/ns#">ios</category><category domain="http://www.blogger.com/atom/ns#">time</category><category domain="http://www.blogger.com/atom/ns#">ios dev</category><category domain="http://www.blogger.com/atom/ns#">nsdateformatter</category><category domain="http://www.blogger.com/atom/ns#">date</category><title>[iOS Dev] NSDate &amp; NSDateFormatter Manipulation</title><description>ได้ลองทำอะไรเล่นๆ เลยขอ Blog เก็บไว้หน่อย เกี่ยวกับ NSDate, NSDateFormatter&lt;br /&gt;
ไว้มีอะไรที่เล่นเกี่ยวกับ วันที่ และ เวลา ก็จะมาอัพเดทไว้ที่นี่แหละ :)&lt;br /&gt;
&lt;br /&gt;
1. ได้วันที่มาในรูปแบบ &lt;b&gt;month/day/year&lt;/b&gt; อยากรู้ว่าวันนั้นวันอะไร (จันทร์ - อาทิตย์)&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-JuchUAtomi8/UUsxpBGDRkI/AAAAAAAADrs/idypcwrR12o/s1600/Screen+Shot+2556-03-21+at+11.12.43+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-JuchUAtomi8/UUsxpBGDRkI/AAAAAAAADrs/idypcwrR12o/s1600/Screen+Shot+2556-03-21+at+11.12.43+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
2. แปลง &lt;b&gt;RFC3339 Datetime Format&lt;/b&gt; เป็น String เป็นรูปแบบที่ &lt;b&gt;Facebook Graph API &lt;/b&gt;ใช้&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-HBxtC9c1ZTk/UUs0l06B6HI/AAAAAAAADr0/VUXHcF54gnY/s1600/Screen+Shot+2556-03-21+at+11.24.14+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-HBxtC9c1ZTk/UUs0l06B6HI/AAAAAAAADr0/VUXHcF54gnY/s1600/Screen+Shot+2556-03-21+at+11.24.14+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
3. &lt;b&gt;UNIX Timestamp&lt;/b&gt; (จำนวนวินาทีนับจากวันที่ January, 1 1970) วิธีการแปลงให้เป็นเวลาปกติที่อ่านรู้เรื่อง&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-dhtpqYCyGqA/UVhsNhCw0gI/AAAAAAAADvI/6Bw2mbxQhcA/s1600/Screen+Shot+2556-04-01+at+12.02.23+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-dhtpqYCyGqA/UVhsNhCw0gI/AAAAAAAADvI/6Bw2mbxQhcA/s1600/Screen+Shot+2556-04-01+at+12.02.23+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
4. Extracted &lt;b&gt;Components&lt;/b&gt; ต่างๆ (วัน เดือน ปี เวลา) จาก NSDate&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-oai3yc3irog/UYsG6mwrtmI/AAAAAAAAD04/jCur1FLC8C4/s1600/Screen+Shot+2556-05-09+at+9.14.56+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-oai3yc3irog/UYsG6mwrtmI/AAAAAAAAD04/jCur1FLC8C4/s1600/Screen+Shot+2556-05-09+at+9.14.56+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;</description><link>http://www.macbaszii.com/2013/05/ios-dev-nsdate-nsdateformatter.html</link><author>noreply@blogger.com (Kiattisak Anoochitarom)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-JuchUAtomi8/UUsxpBGDRkI/AAAAAAAADrs/idypcwrR12o/s72-c/Screen+Shot+2556-03-21+at+11.12.43+PM.png" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7237929072659768518.post-5967458175967482988</guid><pubDate>Fri, 26 Apr 2013 08:55:00 +0000</pubDate><atom:updated>2013-04-26T15:55:43.779+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">library</category><category domain="http://www.blogger.com/atom/ns#">ios</category><category domain="http://www.blogger.com/atom/ns#">ios dev</category><category domain="http://www.blogger.com/atom/ns#">arc</category><category domain="http://www.blogger.com/atom/ns#">actionsheet</category><category domain="http://www.blogger.com/atom/ns#">menu</category><category domain="http://www.blogger.com/atom/ns#">button</category><category domain="http://www.blogger.com/atom/ns#">alert</category><title>[iOS Dev] Alert and ActionSheet in Blocks Style</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-O5pA_vYJ2UI/UWzwKJ1MaGI/AAAAAAAADyI/y6xTQF7PI2k/s1600/Screen+Shot+2556-04-16+at+1.29.46+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-O5pA_vYJ2UI/UWzwKJ1MaGI/AAAAAAAADyI/y6xTQF7PI2k/s1600/Screen+Shot+2556-04-16+at+1.29.46+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
ปกติเวลาเราเขียน UIAlertView, UIActionSheet สิ่งที่เราจะเขียนก็มีประมาณนี้ ...&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
สั่งแสดง UIAlertView พร้อมข้อความ และปุ่มต่างๆ&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-HZwhFxKqZqY/UWzzS3cxFmI/AAAAAAAADyg/M3gUw0FYFu8/s1600/Screen+Shot+2556-04-16+at+1.42.44+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-HZwhFxKqZqY/UWzzS3cxFmI/AAAAAAAADyg/M3gUw0FYFu8/s1600/Screen+Shot+2556-04-16+at+1.42.44+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
จากนั้นก็ไปเขียน Delegate เพื่อจัดการ Event ของการกดปุ่มต่างๆ บน UIAlertView&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-uZuw2t4HYh8/UWzzYvMP1xI/AAAAAAAADyo/PEhmtEvuXy8/s1600/Screen+Shot+2556-04-16+at+1.42.48+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-uZuw2t4HYh8/UWzzYvMP1xI/AAAAAAAADyo/PEhmtEvuXy8/s1600/Screen+Shot+2556-04-16+at+1.42.48+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
คราวนี้จะทำให้ Code ดูน่ารักขึ้นหน่อย ... เรามาใช้ Blocks Style กันดีกว่า&lt;br /&gt;
มันจะทำให้เวลาเรา Add ปุ่มเนี่ยก็จะเขียน Event เพื่อรอ Execute ตรงนั้นเลย&lt;br /&gt;
ไม่ต้องย้าย Focus มานั่งอ่าน Delegate method ว่าปุ่มนี้กดแล้ว ทำอะไร อีกปุ่มกดแล้วทำอะไร&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h1 class="entry-title public" itemscope="" itemtype="http://data-vocabulary.org/Breadcrumb" style="background-color: white; border: 0px; color: #666666; font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 20px; font-weight: normal; letter-spacing: -1px; line-height: 28px; margin: 0px 0px 15px; padding: 0px 0px 0px 36px; position: relative; z-index: 0;"&gt;
&lt;span class="author vcard" style="border: 0px; margin: 0px; padding: 0px;"&gt;&lt;a class="url fn" href="https://github.com/gpambrozio" itemprop="url" rel="author" style="border: 0px; color: #4183c4; margin: 0px; padding: 0px; text-decoration: none; white-space: nowrap;"&gt;&lt;span itemprop="title" style="border: 0px; margin: 0px; padding: 0px;"&gt;gpambrozio&lt;/span&gt;&amp;nbsp;&lt;/a&gt;&lt;/span&gt;/&amp;nbsp;&lt;strong style="border: 0px; margin: 0px; padding: 0px;"&gt;&lt;a class="js-current-repository" href="https://github.com/gpambrozio/BlockAlertsAnd-ActionSheets" style="border: 0px; color: #4183c4; margin: 0px; padding: 0px; text-decoration: none; white-space: nowrap;"&gt;BlockAlertsAnd-ActionSheets&lt;/a&gt;&lt;/strong&gt;&lt;/h1&gt;
&lt;div&gt;
นี่เป็น Official Repository ของ Library นี้ครับ &lt;span style="color: red;"&gt;**ไม่รองรับ ARC**&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
แน่นอนว่ามันขัดจิตขัดใจผม ผมก็เลย Forked มาแก้เป็น ARC เองซะเลย ใครต้องการก็ที่นี่เลย&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h1 class="entry-title public" itemscope="" itemtype="http://data-vocabulary.org/Breadcrumb" style="background-color: white; border: 0px; color: #666666; font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 20px; font-weight: normal; letter-spacing: -1px; line-height: 28px; margin: 0px 0px 15px; padding: 0px 0px 0px 36px; position: relative; z-index: 0;"&gt;
&lt;span class="author vcard" style="border: 0px; margin: 0px; padding: 0px;"&gt;&lt;a class="url fn" href="https://github.com/macbaszii" itemprop="url" rel="author" style="border: 0px; color: #4183c4; margin: 0px; padding: 0px; text-decoration: none; white-space: nowrap;"&gt;&lt;span itemprop="title" style="border: 0px; margin: 0px; padding: 0px;"&gt;macbaszii&lt;/span&gt;&amp;nbsp;&lt;/a&gt;&lt;/span&gt;/&amp;nbsp;&lt;strong style="border: 0px; margin: 0px; padding: 0px;"&gt;&lt;a class="js-current-repository" href="https://github.com/macbaszii/BlockAlertsAnd-ActionSheets" style="border: 0px; color: #4183c4; margin: 0px; padding: 0px; text-decoration: none; white-space: nowrap;"&gt;BlockAlertsAnd-ActionSheets&lt;/a&gt;&lt;/strong&gt;&lt;/h1&gt;
&lt;div&gt;
โดย Library นี้ไม่ได้เกิดจากการ subclass UIAlertView, UIActionSheet แต่อย่างใด&lt;br /&gt;
เป็นการวาด UIView ขึ้นมาใหม่เลยนะครับ ... ใครอยากศึกษาวิธีการเขียนก็เข้าไปแงะโค้ดกันได้&lt;br /&gt;
คราวนี้วิธีใช้งานก็ไม่ยากเลย แค่ลาก Header, Implementation File ที่เขียนไว้เข้า Project&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-vUWcCq6NODE/UWzt0cudjfI/AAAAAAAADx4/rTs3h8snxhc/s1600/Screen+Shot+2556-04-16+at+1.20.33+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-vUWcCq6NODE/UWzt0cudjfI/AAAAAAAADx4/rTs3h8snxhc/s1600/Screen+Shot+2556-04-16+at+1.20.33+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
แล้วเขียนเรียกใช้งานประมาณนี้&lt;/div&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-2HfXczdv164/UWzzfuVAkRI/AAAAAAAADyw/w0yjyH94wHs/s1600/Screen+Shot+2556-04-16+at+1.39.33+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-2HfXczdv164/UWzzfuVAkRI/AAAAAAAADyw/w0yjyH94wHs/s1600/Screen+Shot+2556-04-16+at+1.39.33+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
สำหรับ ActionSheet ก็แบบนี้&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-_guN3OifQUk/UWzzlppBLhI/AAAAAAAADy4/KNWrf5oSLMg/s1600/Screen+Shot+2556-04-16+at+1.39.39+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-_guN3OifQUk/UWzzlppBLhI/AAAAAAAADy4/KNWrf5oSLMg/s1600/Screen+Shot+2556-04-16+at+1.39.39+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
เท่านี้เองครับ ใช้ง่ายมาก :) ลองนำไปใช้ดูนะครับ</description><link>http://www.macbaszii.com/2013/04/ios-dev-alert-and-actionsheet-in-blocks.html</link><author>noreply@blogger.com (Kiattisak Anoochitarom)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-O5pA_vYJ2UI/UWzwKJ1MaGI/AAAAAAAADyI/y6xTQF7PI2k/s72-c/Screen+Shot+2556-04-16+at+1.29.46+PM.png" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7237929072659768518.post-4107400684936003858</guid><pubDate>Sun, 21 Apr 2013 12:15:00 +0000</pubDate><atom:updated>2013-05-31T13:55:03.839+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">monkey patching</category><category domain="http://www.blogger.com/atom/ns#">reuse</category><category domain="http://www.blogger.com/atom/ns#">runtime</category><category domain="http://www.blogger.com/atom/ns#">refactor</category><category domain="http://www.blogger.com/atom/ns#">language</category><title>Monkey Patching in Ruby</title><description>&lt;script&gt;prettyPrint()&lt;/script&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-m6ddoGVQ3oY/UWw6w4UHZuI/AAAAAAAADxg/iGQ_abCeIAk/s1600/Ruby-Programming-for-Beginners-course.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-m6ddoGVQ3oY/UWw6w4UHZuI/AAAAAAAADxg/iGQ_abCeIAk/s1600/Ruby-Programming-for-Beginners-course.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;Monkey Patching&lt;/span&gt;&lt;/i&gt;&lt;/b&gt; คือ Feature หนึ่งของภาษา Ruby&lt;br /&gt;
&lt;div&gt;ที่อนุญาติให้เราเพิ่ม หรือ แก้ไข method ของ Class ที่ถูกประกาศไว้แล้วได้ ...&lt;br /&gt;
หรืออีกนัยหนึ่งเราอาจบอกได้ว่า เป็นการเพิ่มความสามารถให้ Class ที่มีอยู่แล้วนั่นเอง&lt;/div&gt;&lt;div&gt;โดย method ที่เกิดขึ้นจากการ Monkey Patch โดย Developer จะถูกเพิ่ม และเรียกใช้ขณะ Runtime&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-e2UR0oRwgXQ/UWw7ZF3ZKkI/AAAAAAAADxo/C6pBrtnyX9k/s1600/Screen+Shot+2556-04-16+at+12.39.29+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-e2UR0oRwgXQ/UWw7ZF3ZKkI/AAAAAAAADxo/C6pBrtnyX9k/s1600/Screen+Shot+2556-04-16+at+12.39.29+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;เช่นบน Rails เนี่ย เขาก็แก้ให้ Fixnum Class (Class ที่จัดการกับตัวเลขใน Ruby)&amp;nbsp;&lt;/div&gt;&lt;div&gt;สามารถเขียน&amp;nbsp;2.days.ago เพื่อคืนค่าเวลาของ 2 วันที่แล้วได้&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;ปัญหาที่เกิดขึ้นคือ ในเมื่อใครๆ ก็แก้ได้ เมื่อทำงานกันเป็นทีม ต้องคุยกันให้ดี&lt;br /&gt;
ว่าใคร Monkey Patch อะไรไว้บ้าง ... จะได้เกิดการชนกันของ method ที่เราเพิ่มหรือแก้ไป&lt;br /&gt;
(ตาม Bug ยากด้วย) ซึ่งใน Ruby 2.0 ก็มี Feature ที่มาแก้ปัญหานี้ได้ด้วยคือ &lt;b&gt;&lt;span style="font-size: large;"&gt;&lt;i&gt;&lt;a href="https://visibletrap.wordpress.com/2012/11/18/%E0%B8%9F%E0%B8%B5%E0%B9%80%E0%B8%88%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B9%83%E0%B8%AB%E0%B8%A1%E0%B9%88%E0%B8%82%E0%B8%AD%E0%B8%87-ruby-2-0-%E0%B8%95%E0%B8%AD%E0%B8%99%E0%B8%97%E0%B8%B5%E0%B9%88-1-refin/"&gt;Refinement&lt;/a&gt;&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;แต่ผมจะมาแนะนำ Feature นี้ในเชิงทั่วๆ ไป เช่น การเล่น Problem Solving&lt;br /&gt;
ที่ผมใช้ในเชิงว่าผมต้องการ Refactor Code ให้สวยขึ้น อ่านง่ายขึ้น&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;ตัวอย่างง่ายๆ เช่น ปกติถ้าผมต้องการเขียนฟังก์ชั่นที่ใช้ในการตรวจสอบความเป็นพาลินโดรมของ String สักสายนึง ก็จะเขียนแบบนี้&lt;/div&gt;&lt;div&gt;&lt;pre class="prettyprint"&gt;def is_palindrome(s)
  s == s.reverse
end
&lt;/pre&gt;&lt;br /&gt;
แล้วเรียกใช้โดยเขียนแบบนี้&lt;br /&gt;
&lt;pre class="prettyprint"&gt;s = "racecar"
if is_palindrome(s)
  puts "s is Palindrome"
else
  puts "s is not Palindrome"
end
&lt;/pre&gt;&lt;br /&gt;
ซึ่งมันก็พอรับได้แหละ แต่เนื่องจากการเป็น &lt;b&gt;Dynamic Typing&lt;/b&gt; (ไม่รู้ type ของ s จริงๆ ถ้าส่ง s ที่เป็น Integer ไปก็จะพัง) &lt;br /&gt;
เราจะเห็นว่า ถ้ามีฟังก์ชั่นที่ต้องใช้งานเยอะๆ ก็คงจะเละเทะน่าดู และฟังก์ชั่นนี้เขียนมาเพื่อใช้งานกับ String เท่านั้น ผมก็เลยเลือกที่จะ Monkey Patch มัน&lt;br /&gt;
&lt;br /&gt;
วิธีการง่ายๆ ก็คือเขียนบอกว่า เราจะทำ Monkey Patching กับ Class อะไร &lt;br /&gt;
จะเพิ่ม method อะไร และแทนตัวแปรที่จะมาเรียกใช้งานด้วย self &lt;br /&gt;
&lt;br /&gt;
&lt;pre class="prettyprint"&gt;class String
  def is_palindrome
    self == self.reverse
  end
end
&lt;/pre&gt;&lt;br /&gt;
พอเวลาเรียกใช้เราก็เรียกผ่านตัวแปรที่เป็น String ได้ทันทีแบบนี้&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="prettyprint"&gt;s = "abbba"
if s.is_palindrome
  puts "s is Palindrome"
else
  puts "s is not Palindrome"
end
&lt;/pre&gt;&lt;br /&gt;
อีกตัวอย่างนะครับ คราวนี้ผมจะเขียน method เพื่อตรวจสอบว่าตัวเลขนั้นๆ เป็นจำนวนเฉพาะหรือไม่ ?&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="prettyprint"&gt;class Fixnum
  def root
    Math.sqrt(self)
  end

  def is_prime
    return false if self &amp;lt; 2
    2.upto(self.root.to_i) { |i| return false if self % i == 0 }
    return true
  end
end
&lt;/pre&gt;&lt;br /&gt;
เวลาใช้งาน อย่างเช่น ต้องการแสดงจำนวนเฉพาะที่อยู่ระหว่าง 1 - 100 ก็เขียนแบบนี้&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="prettyprint"&gt;1.upto(100) do |i|
  if i.is_prime
    print "#{i} "
  end
end
&lt;/pre&gt;&lt;br /&gt;
ทั้งนี้ สิ่งที่ควรระวังก็เรื่องการตั้งชื่อแหละครับ ถ้ามันไปซ้ำกับ method ที่มีอยู่ก็แปลว่าเราแก้ไข method ที่มีอยู่ และอย่าไปซ้ำกับพวก reserved word ทั้งหลาย ทั้งแหล่   ลองนำไปใช้ดูนะครับ ... ผมว่า Code จะดูสวยและเป็นระเบียบมากขึ้นเลยนะ  &lt;/div&gt;</description><link>http://www.macbaszii.com/2013/04/monkey-patching-in-ruby.html</link><author>noreply@blogger.com (Kiattisak Anoochitarom)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-m6ddoGVQ3oY/UWw6w4UHZuI/AAAAAAAADxg/iGQ_abCeIAk/s72-c/Ruby-Programming-for-Beginners-course.jpg" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7237929072659768518.post-6981386215216238796</guid><pubDate>Sun, 14 Apr 2013 17:27:00 +0000</pubDate><atom:updated>2013-04-18T12:57:23.786+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">blogger</category><category domain="http://www.blogger.com/atom/ns#">highlight</category><category domain="http://www.blogger.com/atom/ns#">code</category><category domain="http://www.blogger.com/atom/ns#">prettify</category><category domain="http://www.blogger.com/atom/ns#">google</category><category domain="http://www.blogger.com/atom/ns#">syntax</category><category domain="http://www.blogger.com/atom/ns#">script</category><title>Syntax Highlighting for Blogger (Dynamic Views) </title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-l4-gupzAVTI/UWrfLWjUIcI/AAAAAAAADxI/vmQsW7GJYyY/s1600/Screen+Shot+2556-04-14+at+11.53.42+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-l4-gupzAVTI/UWrfLWjUIcI/AAAAAAAADxI/vmQsW7GJYyY/s1600/Screen+Shot+2556-04-14+at+11.53.42+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
ผมค้นหามานานละ วิธีที่จะทำ Syntax Highlighting สำหรับ Dynamic Views&lt;br /&gt;
ก็มาเจอตัวนี้แหละครับ เป็นหนึ่งในโครงการ Google Code ชื่อว่า &lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;&lt;a href="http://code.google.com/p/google-code-prettify/"&gt;Prettify&lt;/a&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/b&gt;
โดยวิธีการติดตั้งก็ไม่ยาก ผมก็เลยเขียนไว้ที่นี่เผื่อเป็นประโยชน์&lt;br /&gt;
ขั้นแรกในหน้า Dashboard ของ Blogger ให้เลือกไปที่ Template &lt;span style="color: #3d85c6;"&gt;(กรอบสีฟ้า)&lt;/span&gt;  &lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-jizlKaTiVls/UWrYnqy_L_I/AAAAAAAADww/XriQOp1xBzI/s1600/Screen+Shot+2556-04-14+at+11.22.58+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-jizlKaTiVls/UWrYnqy_L_I/AAAAAAAADww/XriQOp1xBzI/s1600/Screen+Shot+2556-04-14+at+11.22.58+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
โดยเราสามารถเลือกที่จะ Backup Template &lt;span style="color: red;"&gt;(กรอบสีแดง)&lt;/span&gt; เก็บไว้ก่อนนะครับ เผื่อมีอะไรผิดพลาด จากนั้นกดที่ Edit HTML &amp;nbsp;&lt;span style="color: orange;"&gt;(กรอบสีส้ม)&lt;/span&gt; &lt;span style="color: orange;"&gt; &lt;/span&gt; ก็จะได้หน้าต่างการแก้ไข Template แบบนี้ &lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-qbPo1rJT1eA/UWrZOBrvPiI/AAAAAAAADw4/Y0UVo0gG0ko/s1600/Screen+Shot+2556-04-14+at+11.27.58+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-qbPo1rJT1eA/UWrZOBrvPiI/AAAAAAAADw4/Y0UVo0gG0ko/s1600/Screen+Shot+2556-04-14+at+11.27.58+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
จากนั้นก็ให้เพิ่ม Code นี้ลงไปภายใน &amp;lt;head&amp;gt; Tag ครับ  &lt;script&gt;prettyPrint()&lt;/script&gt;   &lt;br /&gt;
&lt;pre class="prettyprint"&gt;&amp;lt;link 
   href="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css" 
    type="text/css" 
    rel="stylesheet"/&amp;gt;
  &amp;lt;script type="text/javascript" 
   src="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js"&amp;gt;
  &amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;span style="color: red;"&gt;** และเราสามารถเปลี่ยน Theme ได้ด้วยนะ ตรง CSS File ที่ import เข้ามาสามารถเปลี่ยนได้ แค่ไปหยิบ Source Path ของ Theme มาใส่แทน ไปเลือกที่นี่ได้เลย &lt;a href="http://google-code-prettify.googlecode.com/svn/trunk/styles/index.html"&gt;Prettify Theme Gallery&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
จากนั้นใน Body Tag ก็ไปเรียกให้ javascript ทำงานแบบนี้  &lt;br /&gt;
&lt;pre class="prettyprint"&gt;&amp;lt;body onload="prettyPrint()"  ... &amp;gt;
&lt;/pre&gt;
แต่ถ้าใครใช้ Dynamic View (Theme แบบใหม่ของ Blogger) เนื่องจาก Post นั้นถูกโหลดแบบ Asynchronous จะให้ทำให้ onLoad() ใน Body Tag ทำงานไปก่อนที่โพสจะถูกโหลดจริงๆ ดังนั้น เวลาเขียน Blog ใหม่ต้องเพิ่มโค้ดนี้เข้าไปด้วย  &lt;br /&gt;
&lt;pre class="prettyprint"&gt;&amp;lt;script&amp;gt;prettyPrint()&amp;lt;/script&amp;gt;
&lt;/pre&gt;
แบบนี้  &lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-c527-9FT064/UWrchC3V29I/AAAAAAAADxA/AHIhLpwmdXk/s1600/Screen+Shot+2556-04-14+at+11.41.53+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-c527-9FT064/UWrchC3V29I/AAAAAAAADxA/AHIhLpwmdXk/s1600/Screen+Shot+2556-04-14+at+11.41.53+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
ส่วนวิธีการใช้งานก็ไม่ยาก ... แค่ใส่ Tag ด้านล่างครอบ Source Code ของเราแค่นั้นเอง ในหน้า HTML นะ :) (แต่ถ้าโค้ดมันเป็น HTML ล่ะก็มันจะ Execute แทนให้เราเปลี่ยนเครื่องหมายเป็น html symbol เช่น เครื่องหมายมากกว่าก็เป็น "&amp;amp;lt;")  &lt;br /&gt;
&lt;pre class="prettyprint"&gt;&amp;lt;pre class="prettyprint"&amp;gt; ... &amp;lt;/pre&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-nKrwvm2kEf0/UWrfR4OQFUI/AAAAAAAADxQ/dfv6sZFbYxg/s1600/Screen+Shot+2556-04-14+at+11.53.05+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-nKrwvm2kEf0/UWrfR4OQFUI/AAAAAAAADxQ/dfv6sZFbYxg/s1600/Screen+Shot+2556-04-14+at+11.53.05+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
เท่านี้ก็เรียบร้อยแล้ว แค่นี้ Source Code ก็สวยงาม ... ปกติเวลาผมวาง Code จะใช้วิธีถ่ายภาพ ต่อไป ถ้าอยากเผยแพร่ Code คงใช้วิธีนี้แล้วล่ะ :)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</description><link>http://www.macbaszii.com/2013/04/syntax-highlighting-for-blogger-dynamic.html</link><author>noreply@blogger.com (Kiattisak Anoochitarom)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-l4-gupzAVTI/UWrfLWjUIcI/AAAAAAAADxI/vmQsW7GJYyY/s72-c/Screen+Shot+2556-04-14+at+11.53.42+PM.png" height="72" width="72" /><thr:total>2</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7237929072659768518.post-2677473603579584959</guid><pubDate>Sun, 14 Apr 2013 15:22:00 +0000</pubDate><atom:updated>2013-04-15T20:56:39.833+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">qualification</category><category domain="http://www.blogger.com/atom/ns#">contest</category><category domain="http://www.blogger.com/atom/ns#">codejam. google</category><category domain="http://www.blogger.com/atom/ns#">programming</category><title>Google Code Jam 2013 รอบคัดเลือก</title><description>&lt;div style="text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-byMHmz4h4T8/UWrVq7PWTCI/AAAAAAAADwg/UACVYFP6-2M/s1600/photo.jpg.png" imageanchor="1"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-byMHmz4h4T8/UWrVq7PWTCI/AAAAAAAADwg/UACVYFP6-2M/s320/photo.jpg.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
ปีนี้สุดท้ายแล้วได้มา 80 คะแนนครับ อันดับอยู่ 8 พันกว่าๆ เนื่องจาก กว่าจะตื่นมาทำก็เที่ยงละ แล้วข้อสุดท้ายที่ทำได้ ก็เล่นเอาเกือบหมดเวลา (ตี 4 ของอีกวัน หมดเวลา 7 โมงเช้า)&lt;br /&gt;
&lt;br /&gt;
ทรมานคนแข่งประเทศอื่น Google ก็คิดว่า Programmer ต้องนอนดึกเลยจัดแข่ง 11.00PM เวลาที่นู่น&lt;br /&gt;
ซึ่งเมืองไทยก็ 6 โมงไงครับ Programmer ที่นี่ บางทีพึ่งจะนอนหลับกัน (รึปล่าว ?)&lt;br /&gt;
&lt;br /&gt;
ผมทำไปทั้งหมด 3 ข้อ&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://code.google.com/codejam/contest/2270488/dashboard#s=p0"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="background-color: white; color: #666666; font-family: Arial, sans-serif; font-weight: bold;"&gt;Problem A.&lt;/span&gt;&lt;span style="background-color: white; font-family: Arial, sans-serif; font-weight: bold;"&gt;&amp;nbsp;Tic-Tac-Toe-Tomek&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
อันนี้ไม่มีอะไรครับ เป็น OX แบบ 4x4 ที่มีตัวพิเศษคือ T อยู่บนตาราง 1 ตัว (หรืออาจจะไม่มี) ซึ่ง T จะเป็นตัวพิเศษคือถ้ามี O หรือ X จำนวน 3 ตัวแล้วมี T ไม่ว่าจะแทรกอยู่หรือต่อท้าย เป็นว่าชนะ&lt;br /&gt;
&lt;br /&gt;
Input ตารางเข้าไปแล้วให้หาว่า ใครชนะ เสมอ หรือเกมส์ยังไม่จบ&lt;br /&gt;
ตอนแรกคิดว่า T จะต้องต่อ XXX เท่านั้น แต่มาอ่านอีกที T เนี่ยแทรกอยู่ตรงไหนก็ได้&lt;br /&gt;
Algorithm ที่ผมใช้ เลยใช้ประโยชน์จากตัวภาษา แล้วนับจำนวนเลย&lt;br /&gt;
&lt;br /&gt;
(ตอนแรกก็เขียน check แถวหลักธรรมดาแหละ แต่ Code ยาวไปยันเกือบ 120 บรรทัดมั้ง = =')&lt;br /&gt;
&lt;br /&gt;
&lt;script&gt;prettyPrint()&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="prettyprint"&gt;test = gets.chomp.to_i
def win_checker(symbol_list, symbol)
  symbol_list.count(symbol) == 4 or 
    (symbol_list.count(symbol) == 3 and symbol_list.count('T') == 1)
end

test = gets.chomp.to_i
test.times do |t|
  table = []
  n = 3
  4.times { table &amp;lt;&amp;lt; gets.chomp }
  dummy = gets.chomp
  
  x_win = o_win = false
  
# vertical
  vertical_1, vertical_2, vertical_3, vertical_4 = [], [], [], []
  0.upto(3) do |i|
    vertical_1 &amp;lt;&amp;lt; table[i][0]
    vertical_2 &amp;lt;&amp;lt; table[i][1]
    vertical_3 &amp;lt;&amp;lt; table[i][2]
    vertical_4 &amp;lt;&amp;lt; table[i][3]
  end
  
  if win_checker(vertical_1, 'X') or 
      win_checker(vertical_2, 'X') or
        win_checker(vertical_3, 'X') or
          win_checker(vertical_4, 'X')
    x_win = true
  elsif win_checker(vertical_1, 'O') or 
          win_checker(vertical_2, 'O') or
            win_checker(vertical_3, 'O') or
              win_checker(vertical_4, 'O')
    o_win = true
  end
  
# horizontal
  horizontal_1, horizontal_2, horizontal_3, horizontal_4 = [], [], [], []
  0.upto(3) do |i|
   horizontal_1 &amp;lt;&amp;lt; table[0][i]
   horizontal_2 &amp;lt;&amp;lt; table[1][i]
   horizontal_3 &amp;lt;&amp;lt; table[2][i]
   horizontal_4 &amp;lt;&amp;lt; table[3][i]
  end
  
  if win_checker(horizontal_1, 'X') or 
      win_checker(horizontal_2, 'X') or
        win_checker(horizontal_3, 'X') or
          win_checker(horizontal_4, 'X')
    x_win = true
  elsif win_checker(horizontal_1, 'O') or 
          win_checker(horizontal_2, 'O') or
            win_checker(horizontal_3, 'O') or
              win_checker(horizontal_4, 'O')
    o_win = true
  end
       
# diagonal
  diagonal_right = []
  diagonal_left = []
  0.upto(3) do |i|
    0.upto(3) do |j|
      if i == j
        diagonal_right &amp;lt;&amp;lt; table[i][j]
      elsif j == (n - i)
        diagonal_left &amp;lt;&amp;lt; table[i][j]
      end
    end
  end
  
  if win_checker(diagonal_right, 'X') or
      win_checker(diagonal_left, 'X')
    x_win = true
  elsif win_checker(diagonal_right, 'O') or
          win_checker(diagonal_left, 'O')
    o_win = true
  end
      
  print "Case ##{t + 1}: "
  table_string = table.join
  
  if x_win
    print "X won\n"
  elsif o_win
    print "O won\n"
  elsif !x_win and !o_win
    print (table_string.count('.') != 0) ? "Game has not completed\n" : "Draw\n"
  end
end
&lt;/pre&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;a href="http://code.google.com/codejam/contest/2270488/dashboard#s=p1"&gt;&lt;span style="background-color: white; color: #666666; font-family: Arial, sans-serif; font-weight: bold;"&gt;Problem B.&lt;/span&gt;&lt;span style="background-color: white; font-family: Arial, sans-serif; font-weight: bold;"&gt;&amp;nbsp;Lawnmower&lt;/span&gt;&lt;/a&gt;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
ข้อนี้ก็โจทย์ไถหญ้าครับ คือมีผัวเมียคู่หนึ่ง ไถหญ้าหน้าบ้านเป็น Pattern ทุกปี (ว่างสินะ) แต่พอดีว่ามีนวัตกรรมเครื่องไถหญ้าใหม่ออกขาย ... คือมันไถตรงไปข้างหน้าได้อย่างเดียว เลือกสักแถวแหละ มันไถเกรียนเท่ากันหมด (ทั้งในแนวแกน X, Y) ให้หาว่า ถ้าให้ Pattern แบบนี้มา จะไถได้หรือไม่ ?  ข้อนี้เปลี่ยนมาใช้ Python เขียน ไม่รู้นึกอะไร เปลี่ยนบรรยากาศบ้าง :)&lt;br /&gt;
&lt;br /&gt;
ข้อนี้แหละที่มา Submit ตอนก่อนหมดเวลา&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="prettyprint"&gt;import re

def check_game(lawn):
    row_maxes = [max(x) for x in lawn]
    cols = [[lawn[i][j] for i in range(len(lawn))] for j in range(len(lawn[0]))]
    col_maxes = [max(x) for x in cols]
    for i in range(len(lawn)):
        for j in range(len(lawn[i])):
            val = lawn[i][j]
            if val != row_maxes[i] and val != col_maxes[j]:
                return "NO"
    return "YES"

def read_input():
    dims = map(int, raw_input().split())
    x,y = int(dims[1]), int(dims[0])    
    lawn = []
    for i in range(y):
        line = raw_input()
        nums = [int(x.strip()) for x in re.split(" ",line)]
        lawn.append(nums)

    return lawn
    
if __name__ == "__main__":
    test = input()
    for i in xrange(test):
        lawn = read_input()
        result = check_game(lawn)
        print "Case #%d: %s" % (i + 1, result)
&lt;/pre&gt;
&lt;br /&gt;
&lt;a href="http://code.google.com/codejam/contest/2270488/dashboard#s=p2"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="background-color: white; color: #666666; font-family: Arial, sans-serif; font-weight: bold;"&gt;Problem C.&lt;/span&gt;&lt;span style="background-color: white; font-family: Arial, sans-serif; font-weight: bold;"&gt;&amp;nbsp;Fair and Square&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
โจทย์ข้อนี้คือเมื่อให้ช่วงตัวเลข A - B มา&amp;nbsp;ให้หาว่ามีเลขที่เป็น Palindrome และรากที่สองของตัวเลขนั้นยังคงเป็น Palindrome ด้วย ทั้งหมดกี่ตัว&lt;br /&gt;
&lt;br /&gt;
โจทย์ข้อนี้ผมรันไม่ทันครับ ... ใน small problem มันกระจอกมาก ... Algorithm ที่ใช้เลยรันได้สบายๆ&lt;br /&gt;
แต่พอ Large นี่เดี้ยงทันที ... ให้ดูอันที่กากก่อนนะ :P&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="prettyprint"&gt;class Fixnum
  def is_palindrome
    self.to_s == self.to_s.reverse
  end
end

test = gets.chomp.to_i

test.times do |t|
  count = 0
  
  a, b = gets.chomp.split.map! { |e| e.to_i }
  (a).upto(b) do |i|
    if i.to_s.is_palindrome
      squared = Math.sqrt(i)
      if squared.to_s[squared.to_i.to_s.length + 1, 2] == "0" and 
          squared.to_s[0, squared.to_i.to_s.length].is_palindrome
        count += 1
      end
    end 
  end
  
  puts "Case ##{t + 1}: #{count}"
end
&lt;/pre&gt;
&lt;br /&gt;
จากนั้นก็ได้ไปอ่าน Code ของหลายๆ คนที่ทำได้ครับ (&lt;a href="http://twitter.com/champjss"&gt;@champjss&lt;/a&gt;,&amp;nbsp;&lt;a href="http://twitter.com/neizod"&gt;@neizod&lt;/a&gt;, &lt;a href="http://twitter.com/jittat"&gt;@jittat&lt;/a&gt;) เลยกระจ่างว่าทำยังไง โดยมีอยู่ 2 วิธี ที่น่าสนใจและเข้าใจง่ายคงเป็นวิธี Dynamic Programming ของ&amp;nbsp;&lt;a href="http://twitter.com/jittat"&gt;@jittat&lt;/a&gt; ซึ่งผมแปลงมาเป็น Ruby ได้แบบนี้ครับ (อาจารย์ท่านเขียนด้วย C++)&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="prettyprint"&gt;class Fixnum
  def is_palindrome
    self.to_s == self.to_s.reverse
  end
  
  def square
    self * self
  end
  
  def between(a, b)
    a &amp;lt;= self and self &amp;lt;= b
  end
end

palindrome_list = []

def generate_palindrome_list
  1.upto(20000000) do |i|
    if i.is_palindrome
      squared_i = i.square
      if squared_i.is_palindrome
        palindrome_list &amp;lt;&amp;lt; squared_i
      end
    end
  end
end

generate_palindrome_list
test = gets.chomp.to_i

test.times do |t|
  a, b = gets.chomp.split.map { |e| e.to_i }
  result_count = 0
  palindrome_list.each do |each|
    if each.between(a, b)
      result_count += 1
    end
  end
  
  puts "Case ##{t + 1}: #{result_count}"
end
&lt;/pre&gt;
</description><link>http://www.macbaszii.com/2013/04/google-code-jam-2013.html</link><author>noreply@blogger.com (Kiattisak Anoochitarom)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-byMHmz4h4T8/UWrVq7PWTCI/AAAAAAAADwg/UACVYFP6-2M/s72-c/photo.jpg.png" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7237929072659768518.post-4227894942477122659</guid><pubDate>Thu, 11 Apr 2013 11:04:00 +0000</pubDate><atom:updated>2013-04-12T15:35:16.378+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">integration</category><category domain="http://www.blogger.com/atom/ns#">social</category><category domain="http://www.blogger.com/atom/ns#">dev</category><category domain="http://www.blogger.com/atom/ns#">network</category><category domain="http://www.blogger.com/atom/ns#">facebook</category><category domain="http://www.blogger.com/atom/ns#">ios dev</category><category domain="http://www.blogger.com/atom/ns#">ios6</category><category domain="http://www.blogger.com/atom/ns#">twitter</category><category domain="http://www.blogger.com/atom/ns#">iphone</category><title>[iOS Dev] iOS 6 Social Framework</title><description>จากที่เคยเขียน &lt;a href="http://www.macbaszii.com/2012/07/ios-dev-official-twitter-api-on-ios5.html"&gt;Twitter Integration&lt;/a&gt; ไปเมื่อก่อนหน้านี้ ...&lt;br /&gt;
หลังจากนั้น Apple ก็ได้ผนวก Facebook Sharing Service เข้ามา&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-MA2PjGY6JoQ/UWaZgRpsGaI/AAAAAAAADwA/j6nfBRauPo0/s1600/article_facebook-twitter.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-MA2PjGY6JoQ/UWaZgRpsGaI/AAAAAAAADwA/j6nfBRauPo0/s1600/article_facebook-twitter.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
โดยเปิด Framework ใหม่บน iOS 6 SDK ชื่อว่า &lt;a href="https://developer.apple.com/library/ios/#documentation/Social/Reference/Social_Framework/_index.html%23//apple_ref/doc/uid/TP40012233"&gt;Social Framework&lt;/a&gt;&lt;br /&gt;
ทีนี้เราก็ทำ Sharing Service ได้อย่างง่ายๆ บน App ของเราแล้วครับ :)&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-usd1HCRkSJU/UWfHLHSGYfI/AAAAAAAADwQ/8juwfDpJ8hs/s1600/Screen+Shot+2556-04-12+at+3.34.26+PM.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-usd1HCRkSJU/UWfHLHSGYfI/AAAAAAAADwQ/8juwfDpJ8hs/s1600/Screen+Shot+2556-04-12+at+3.34.26+PM.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;เพิ่ม Social.framework&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
ตัวอย่างการ Post Facebook ที่ใส่ Link ลงไปด้วย&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-kOqtgXWgDwo/UWUNTMjZVhI/AAAAAAAADvY/R3mGigf2gNk/s1600/Screen+Shot+2556-04-10+at+1.52.48+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-kOqtgXWgDwo/UWUNTMjZVhI/AAAAAAAADvY/R3mGigf2gNk/s1600/Screen+Shot+2556-04-10+at+1.52.48+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&amp;nbsp;หรือจะเลือกใส่เป็นภาพแทนก็ได้ โดย method นี้จะ return BOOL ที่เป็นสถานะในการแนบไฟล์&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-GXKOXoy9hZg/UWUNTt7qgKI/AAAAAAAADvg/GBrf-zBkPHY/s1600/Screen+Shot+2556-04-10+at+1.53.51+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-GXKOXoy9hZg/UWUNTt7qgKI/AAAAAAAADvg/GBrf-zBkPHY/s1600/Screen+Shot+2556-04-10+at+1.53.51+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;span style="text-align: -webkit-auto;"&gt;ตัวอย่างการ Post Facebook ที่ใส่ Link ลงไปด้วย&lt;/span&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-sN0dIshMsyY/UWUNYmWFrpI/AAAAAAAADvo/vjICR6mE9LQ/s1600/Screen+Shot+2556-04-10+at+1.56.35+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-sN0dIshMsyY/UWUNYmWFrpI/AAAAAAAADvo/vjICR6mE9LQ/s1600/Screen+Shot+2556-04-10+at+1.56.35+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&amp;nbsp;&amp;nbsp;หรือจะเลือกใส่เป็นภาพแทนก็ได้ โดย method นี้จะ return BOOL ที่เป็นสถานะในการแนบไฟล์&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-UvtW1ge4vOk/UWUNY6u0czI/AAAAAAAADvs/LC_XSu3DKpY/s1600/Screen+Shot+2556-04-10+at+1.55.48+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-UvtW1ge4vOk/UWUNY6u0czI/AAAAAAAADvs/LC_XSu3DKpY/s1600/Screen+Shot+2556-04-10+at+1.55.48+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
ความเห็นส่วนตัวคิดว่า Framework นี้ยังทำให้สวยได้อีกเยอะ ใน iOS SDK รุ่นหน้านะ ... เหมือนหลายๆ อย่างยังไม่เสร็จดี แต่เข็นออกมาก่อน ดูง่ายๆ ว่า ทำไม setInitialText ต้องเป็น message ได้อย่างเดียว ซึ่ง property แบบนี้ควรจะรองรับ dot notation ด้วย&lt;br /&gt;
&lt;br /&gt;
รอดูกันต่อไปครับ ... คราวหน้าจะมาลองใช้ SLRequest กัน ถ้าจะดึงข้อมูลเบื้องต้น&lt;br /&gt;
นี่อาจจะไม่ต้องพึ่ง Official SDK เลยล่ะครับ :)</description><link>http://www.macbaszii.com/2013/04/ios-dev-social-framework-on-ios-6.html</link><author>noreply@blogger.com (Kiattisak Anoochitarom)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-MA2PjGY6JoQ/UWaZgRpsGaI/AAAAAAAADwA/j6nfBRauPo0/s72-c/article_facebook-twitter.jpg" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7237929072659768518.post-3220688268546018146</guid><pubDate>Fri, 05 Apr 2013 08:34:00 +0000</pubDate><atom:updated>2013-04-05T15:34:16.332+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">api</category><category domain="http://www.blogger.com/atom/ns#">httpclient</category><category domain="http://www.blogger.com/atom/ns#">request</category><category domain="http://www.blogger.com/atom/ns#">afnetworking</category><category domain="http://www.blogger.com/atom/ns#">client</category><title>[iOS Dev] Write your own APIClient with AFNetworking</title><description>เขียน Blog เก็บไว้ซะหน่อย เกี่ยวกับ &lt;b&gt;&lt;span style="font-size: large;"&gt;&lt;i&gt;AFNetworking&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;div&gt;
&lt;div&gt;
ใครยังไม่รู้จัก หรือยังใช้ไม่เป็นไปอ่านกันที่นี่ก่อนนะครับ&amp;nbsp;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-sv3iHpfolhc/UUlkow2UVWI/AAAAAAAADp0/POaO8Wx6M9I/s1600/afnetworking-logo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-sv3iHpfolhc/UUlkow2UVWI/AAAAAAAADp0/POaO8Wx6M9I/s1600/afnetworking-logo.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;h1 class="title entry-title" itemprop="name" style="background-color: #fafafa; color: #333333; display: table-cell; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 20px; font-weight: normal; margin: 0px; padding: 0px 40px 0px 0px; position: relative; text-align: center; vertical-align: middle; width: 670px;"&gt;
&lt;a href="http://www.macbaszii.com/2012/11/ios-dev-network-programming-with.html"&gt;[iOS Dev] Network Programming with AFNetworking&lt;/a&gt;&lt;/h1&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
ปกติแล้วเวลาเรา Request API เนี่ยเราก็จะเรียกพวก Class เหล่านี้มาใช้&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-sYrYfP0nMHM/UUleWzF9xmI/AAAAAAAADpE/Vvg8Y4UE3lc/s1600/Screen+Shot+2556-03-20+at+1.58.57+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-sYrYfP0nMHM/UUleWzF9xmI/AAAAAAAADpE/Vvg8Y4UE3lc/s1600/Screen+Shot+2556-03-20+at+1.58.57+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
ซึ่งเราก็ต้องใส่ Parameters เกี่ยวกับ URL ที่เราจะ Request หลายบรรทัดอยู่&lt;/div&gt;
&lt;div&gt;
แต่นั่นไม่ใช่ประเด็น ประเด็นคือ ถ้าเราอยากจะเขียน APIClient ขึ้นมาใช้เอง&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
เช่น อาจจะมี method ที่เขียนขึ้นมาเฉพาะ เพื่อใช้กับ API เราในหลายๆ รูปแบบ&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
เริ่มต้นที่ให้เราสร้าง Class ที่ subclass AFHTTPClient ขึ้นมา แล้วจัดการเขียน Singleton method ไว้&lt;/div&gt;
&lt;div&gt;
(ใครยังไม่รู้จัก Singleton อ่านได้ที่นี่&lt;b&gt;&lt;span style="font-size: large;"&gt; &lt;a href="http://www.macbaszii.com/2012/09/ios-dev-singleton-design-pattern.html"&gt;[iOS Dev] Singleton Design Pattern&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;)&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-cQL56o_Whdw/UUlf3WNsk5I/AAAAAAAADpM/SooDVERvNGg/s1600/Screen+Shot+2556-03-20+at+2.03.34+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-cQL56o_Whdw/UUlf3WNsk5I/AAAAAAAADpM/SooDVERvNGg/s1600/Screen+Shot+2556-03-20+at+2.03.34+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
จากนั้นใน Implementation ก็เขียน Singleton method ให้เรียบร้อย พร้อมกับคำหนดค่าคงที่สำหรับ Base URL และ API Token ด้วย (ถ้าต้องการใช้งาน)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-wYdgbzXvnis/UUlgSEJGgwI/AAAAAAAADpU/VPW0dsD1pds/s1600/Screen+Shot+2556-03-20+at+2.07.26+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-wYdgbzXvnis/UUlgSEJGgwI/AAAAAAAADpU/VPW0dsD1pds/s1600/Screen+Shot+2556-03-20+at+2.07.26+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div&gt;
จากนั้นก็ Override&lt;b&gt; -initWithBaseURL&lt;/b&gt; method เพื่อทำการเซตค่าต่างๆ เกี่ยวกับ API ของเรา&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
(ในที่นี้ผมใช้ Rails ในการเขียน Back-end และ Response กลับมาเป็น JSON)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-mM5UpfKlP9M/UUlgteAUvPI/AAAAAAAADpc/6M_R747BeMw/s1600/Screen+Shot+2556-03-20+at+2.08.04+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-mM5UpfKlP9M/UUlgteAUvPI/AAAAAAAADpc/6M_R747BeMw/s1600/Screen+Shot+2556-03-20+at+2.08.04+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
จากนั้นเวลาเรียกใช้ก็ง่ายครับ ตัวอย่างจะเป็นกรณี &lt;b&gt;GET Request&lt;/b&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-9VXUdv9Z3uc/UUlhsqZ94jI/AAAAAAAADpk/3Q9cpey-l40/s1600/Screen+Shot+2556-03-20+at+2.13.37+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-9VXUdv9Z3uc/UUlhsqZ94jI/AAAAAAAADpk/3Q9cpey-l40/s1600/Screen+Shot+2556-03-20+at+2.13.37+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
ในกรณี &lt;b&gt;POST Request&lt;/b&gt; ก็เขียนแบบนี้ พร้อมส่ง Parameters ไปให้ Server ด้วย&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-_FsPID9noEM/UUlkBdPyDSI/AAAAAAAADps/hPYPS_jxTxQ/s1600/Screen+Shot+2556-03-20+at+2.23.02+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-_FsPID9noEM/UUlkBdPyDSI/AAAAAAAADps/hPYPS_jxTxQ/s1600/Screen+Shot+2556-03-20+at+2.23.02+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
ทีนี้ถ้าเห็น Code ด้านบนผมว่าคุณน่าจะรู้แล้วนะ ว่าถ้าจะทำ DELETE, PUT Request ต้องเรียก method ชื่ออะไร ? :P งั้นก็ บ๊ายยยย ... บายยยย&lt;/div&gt;
&lt;/div&gt;
</description><link>http://www.macbaszii.com/2013/04/ios-dev-write-your-own-apiclient-with.html</link><author>noreply@blogger.com (Kiattisak Anoochitarom)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-sv3iHpfolhc/UUlkow2UVWI/AAAAAAAADp0/POaO8Wx6M9I/s72-c/afnetworking-logo.png" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7237929072659768518.post-4951544258242040848</guid><pubDate>Tue, 02 Apr 2013 05:55:00 +0000</pubDate><atom:updated>2013-04-25T20:00:21.173+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">nested model</category><category domain="http://www.blogger.com/atom/ns#">rails</category><category domain="http://www.blogger.com/atom/ns#">framework</category><category domain="http://www.blogger.com/atom/ns#">form</category><category domain="http://www.blogger.com/atom/ns#">web dev</category><title>[Ruby on Rails] Nested Model Form Wrapper</title><description>&lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;Nested Model Form&lt;/span&gt;&lt;/i&gt;&lt;/b&gt; คือ Dynamic Form ที่สามารถเพิ่ม/ลบ จำนวนของ Form นั้นๆ ได้&lt;br /&gt;
หน้าตาจะประมาณนี้ครับ :)&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-_qyrCE_cink/UU11M7UnvkI/AAAAAAAADsE/6EuN7qch19s/s1600/Screen+Shot+2556-03-23+at+4.25.36+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-_qyrCE_cink/UU11M7UnvkI/AAAAAAAADsE/6EuN7qch19s/s1600/Screen+Shot+2556-03-23+at+4.25.36+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
ซึ่งวิธีการทำนั้นก็ไม่ยากครับ มีสอนเสร็จสรรพที่ &lt;b&gt;RailsCasts&lt;/b&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-Ed5u4wLb-70/UU11tzIfh8I/AAAAAAAADsM/ODOIc5VLaxQ/s1600/Screen+Shot+2556-03-23+at+4.27.43+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-Ed5u4wLb-70/UU11tzIfh8I/AAAAAAAADsM/ODOIc5VLaxQ/s1600/Screen+Shot+2556-03-23+at+4.27.43+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
แต่มันมีวิธีง่ายกว่านั้น เพราะคุณ RyanB เขียน Open-source Wrapper ให้ใช้ และมันใช้ง่ายมาก&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
เลยจะมาแนะนำครับ :)&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;&lt;a href="https://github.com/ryanb/nested_form"&gt;https://github.com/ryanb/nested_form&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
ขั้นแรกก็ไปเพิ่ม Gem ที่ GemFile และ include jQuery ที่ application.js ด้วยครับ&amp;nbsp;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;/div&gt;
&lt;pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(204, 204, 204); color: #333333; font-family: Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 14px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px;"&gt;&lt;span style="font-size: 12px; line-height: 16px;"&gt;gem 'nested_form'&lt;/span&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;/div&gt;
&lt;pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(204, 204, 204); margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px;"&gt;&lt;span style="color: #333333; font-family: Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 12px; line-height: 16px;"&gt;//= require &lt;/span&gt;&lt;span style="background-color: transparent; font-size: 12px; line-height: 16px;"&gt;&lt;span style="color: #333333; font-family: Monaco, Courier New, DejaVu Sans Mono, Bitstream Vera Sans Mono, monospace;"&gt;jquery_nested_form&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
วิธีการใช้งานนะครับ&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-J3yzKk0qmb8/UU148lH5tiI/AAAAAAAADsc/ouo1NZ3ZU88/s1600/Screen+Shot+2556-03-23+at+4.41.18+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-J3yzKk0qmb8/UU148lH5tiI/AAAAAAAADsc/ouo1NZ3ZU88/s1600/Screen+Shot+2556-03-23+at+4.41.18+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
ใน Controller ก็สั่ง Build ได้ด้วยนะ แบบอาจจะมีสักอันเพื่อ Guide User ก่อน&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-M1MbxfA2akI/UU16FC7CezI/AAAAAAAADss/9vqfnA80VpA/s1600/Screen+Shot+2556-03-23+at+4.46.15+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-M1MbxfA2akI/UU16FC7CezI/AAAAAAAADss/9vqfnA80VpA/s1600/Screen+Shot+2556-03-23+at+4.46.15+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
จากนั้นใน Form เราจะเขียนแบบนี้&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-qOzQ1ecdCk4/UU15jRwWLpI/AAAAAAAADsk/Rtyl3eQgtuM/s1600/Screen+Shot+2556-03-23+at+4.44.26+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-qOzQ1ecdCk4/UU15jRwWLpI/AAAAAAAADsk/Rtyl3eQgtuM/s1600/Screen+Shot+2556-03-23+at+4.44.26+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
เท่านี้แหละครับ เพราะทาง Developer เค้าจัดการเรื่อง Javascript ให้เราแล้ว :) ใช้ง่ายมาก แนะนำๆ&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
ส่วนใครใช้ &lt;span style="color: red;"&gt;SimpleForm&lt;/span&gt; หรือ &lt;span style="color: #3d85c6;"&gt;Formtastic&lt;/span&gt; ก็รองรับเช่นกัน&amp;nbsp;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
โดยเปลี่ยน &lt;span style="color: #e69138;"&gt;nested_form_for&lt;/span&gt; เป็น &lt;span style="color: red;"&gt;simple_nested_form_for&lt;/span&gt;, &lt;span style="color: #3d85c6;"&gt;semantic_nested_form_for&lt;/span&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
ถ้าเราจะจำกัดให้ User สามารถเพิ่ม Form ได้จำกัด เช่น ไม่เกิน 5 อันก็มีวิธีเช่นกัน&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
ให้นำ Script นี้ไปใส่ใน View ที่มี Nested Form อยู่ (กรณีนี้คือมี Nested Form เพียงชุดเดียว)&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
โดยเมื่อมีจำนวน Field ถึงจำนวนที่กำหนดแล้วปุ่ม &lt;b&gt;add&lt;/b&gt; จะหายไป :)&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-jqlVPCXTB8g/UXkn5o7FmfI/AAAAAAAADzg/c00nla9XTUk/s1600/Screen+Shot+2556-04-25+at+7.55.41+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-jqlVPCXTB8g/UXkn5o7FmfI/AAAAAAAADzg/c00nla9XTUk/s1600/Screen+Shot+2556-04-25+at+7.55.41+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
สามารถเปลี่ยน 5 เป็นค่าอะไรก็ได้ (แล้วแต่จะจำกัด หรือ Pass Value จาก Rails โดยใช้ ERB Tag ได้เลย)&lt;/div&gt;
</description><link>http://www.macbaszii.com/2013/04/ruby-on-rails-nested-model-form-wrapper.html</link><author>noreply@blogger.com (Kiattisak Anoochitarom)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-_qyrCE_cink/UU11M7UnvkI/AAAAAAAADsE/6EuN7qch19s/s72-c/Screen+Shot+2556-03-23+at+4.25.36+PM.png" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7237929072659768518.post-5783678386903628573</guid><pubDate>Thu, 28 Mar 2013 05:51:00 +0000</pubDate><atom:updated>2013-04-22T22:53:31.351+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">c++</category><category domain="http://www.blogger.com/atom/ns#">prime</category><category domain="http://www.blogger.com/atom/ns#">number</category><category domain="http://www.blogger.com/atom/ns#">algorithm</category><category domain="http://www.blogger.com/atom/ns#">numbers</category><category domain="http://www.blogger.com/atom/ns#">c</category><category domain="http://www.blogger.com/atom/ns#">infinity list</category><title>Prime Number Algorithm</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-uwCnk-9PV2g/UUrZcT-W2qI/AAAAAAAADqU/Y4u8UFXeJcI/s1600/prime-number-11.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" border="0" height="376" src="http://4.bp.blogspot.com/-uwCnk-9PV2g/UUrZcT-W2qI/AAAAAAAADqU/Y4u8UFXeJcI/s640/prime-number-11.jpg" title="Prime Number Visualization" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;จำนวนเฉพาะ (Prime Number)&lt;/span&gt;&lt;/i&gt;&lt;/b&gt; คือ&lt;b&gt;จำนวนที่หาร 1 และตัวมันเองลงตัวเท่านั้น&lt;/b&gt; ...&lt;br /&gt;
&lt;div&gt;
เจอมาทุกปีครับ เราท่องกันมาแบบนี้ แต่เวลาเขียนโปรแกรมมันเป็นแบบนั้นซะที่ไหนล่ะ&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
ผมเจอโค้ดแบบนี้ล่ะปวดหัว แต่ก็เจอมาทุกปี&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-ekhLKgoGdVM/UUrYtBxS1tI/AAAAAAAADqE/54CxEqq0-Ok/s1600/Screen+Shot+2556-03-21+at+4.53.30+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-ekhLKgoGdVM/UUrYtBxS1tI/AAAAAAAADqE/54CxEqq0-Ok/s1600/Screen+Shot+2556-03-21+at+4.53.30+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
โดยในการตรวจสอบว่า &lt;b&gt;"เลขจำนวนเต็มบวกใดๆ"&lt;/b&gt; เป็นจำนวนเฉพาะหรือไม่&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
มีวิธีมากมาย วันนี้ผมจะเสนอ 3 วิธี และวิธีที่ง่ายที่สุด ก็คือ&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
นำเลข 2 จนถึง N-1 (โดยที่ N คือจำนวนเต็มใดๆ ที่ต้องการตรวจสอบ) ว่า N หารลงตัวหรือไม่ ถ้าในระหว่างนี้มีการหารลงตัวเกิดขึ้น นั่นแปลว่าเลขที่รับเข้ามา&lt;b&gt;ไม่เป็นจำนวนเฉพาะ&lt;/b&gt; แต่ถ้าหารไม่ลงตัวเลย (หลุด Loop มาได้) ก็แปลว่าเลขนั้น&lt;b&gt;เป็นจำนวนเฉพาะ&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
โดยจะเขียนโปรแกรมในภาษา Ruby ได้ดังนี้&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-Fmz43T7wEFk/UUrcPHQatJI/AAAAAAAADqk/SYHEB9CXt2Y/s1600/Screen+Shot+2556-03-21+at+5.08.29+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-Fmz43T7wEFk/UUrcPHQatJI/AAAAAAAADqk/SYHEB9CXt2Y/s1600/Screen+Shot+2556-03-21+at+5.08.29+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
แต่วิธีนี้เป็นวิธีที่ช้ามาก ... ก็มีวิธีที่เร็วกว่านั้นคือแทนที่จะหารด้วย 2 ถึง N-1 ให้เราหารถึงแค่ √N แทน&lt;/div&gt;
&lt;div&gt;
เพราะว่าในบรรดาคู่ของตัวเลข (a, b) ที่คูณกันแล้วได้ N ทั้งหมดนั้น จะไม่มีค่า a ที่มากกว่าค่าของรากที่ 2 ของ N เช่น คู่ของตัวที่คูณกันได้ 100 มี (1, 100), (2, 50), (4, 25), (5, 20), (10, 10) ดังนั้นจึงไม่มีความจำเป็นที่ต้องทดสอบมากกว่า 10 เพราะตัวถัดไปที่จะเจอคือ 20 ซึ่งคู่กับ 5 อยู่ดี&lt;/div&gt;
&lt;div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-Qq8ZYDcTrrs/UXVc1bXjLDI/AAAAAAAADzI/7Y14CfjKvbw/s1600/Screen+Shot+2556-04-22+at+10.52.03+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-Qq8ZYDcTrrs/UXVc1bXjLDI/AAAAAAAADzI/7Y14CfjKvbw/s1600/Screen+Shot+2556-04-22+at+10.52.03+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div&gt;
ส่วนวิธีที่ 3 ที่จะบอกก็คือ&amp;nbsp;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes"&gt;Sieve of Eratosthenes&lt;/a&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-stuBpWLOY1c/UUrf_p82wrI/AAAAAAAADrA/hbGyRkbrZgM/s1600/Screen+Shot+2556-03-21+at+5.23.03+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-stuBpWLOY1c/UUrf_p82wrI/AAAAAAAADrA/hbGyRkbrZgM/s1600/Screen+Shot+2556-03-21+at+5.23.03+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
โดยวิธีการก็เป็นตัดตัวเลขที่ไม่ใช่ออกไป โดยการตัดตัวที่ Prime Number ใดๆ&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
หารลงตัวออก&amp;nbsp;ซึ่งจะเป็นไปตามภาพนี้&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-A3zMay6BNmc/UUrggRRdwXI/AAAAAAAADrM/S1AdpF7Ix8I/s1600/Sieve_of_Eratosthenes_animation.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-A3zMay6BNmc/UUrggRRdwXI/AAAAAAAADrM/S1AdpF7Ix8I/s1600/Sieve_of_Eratosthenes_animation.gif" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
เท่านี้แหละครับ ลองไปทำความเข้าใจดูนะ ... ขอทิ้งท้ายด้วย Algorithm ที่ 2 (ซึ่งผมใช้บ่อย)&lt;/div&gt;
&lt;div&gt;
ในรูปแบบของภาษา C++ (ไม่มีอะไรต่างกับ C เพียงแต่ผมต้องการใช้ Boolean) ล่ะกันนะครับ&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-L57VWaFE2Fw/UUriG1ET4zI/AAAAAAAADrY/GDA4BXFUMMk/s1600/Screen+Shot+2556-03-21+at+5.33.38+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-L57VWaFE2Fw/UUriG1ET4zI/AAAAAAAADrY/GDA4BXFUMMk/s1600/Screen+Shot+2556-03-21+at+5.33.38+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</description><link>http://www.macbaszii.com/2013/03/prime-number-algorithm.html</link><author>noreply@blogger.com (Kiattisak Anoochitarom)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-uwCnk-9PV2g/UUrZcT-W2qI/AAAAAAAADqU/Y4u8UFXeJcI/s72-c/prime-number-11.jpg" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7237929072659768518.post-6249162647022075361</guid><pubDate>Sun, 24 Mar 2013 06:30:00 +0000</pubDate><atom:updated>2013-03-24T13:30:33.401+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">quality</category><category domain="http://www.blogger.com/atom/ns#">bugs</category><category domain="http://www.blogger.com/atom/ns#">ux</category><category domain="http://www.blogger.com/atom/ns#">testing</category><category domain="http://www.blogger.com/atom/ns#">big data</category><category domain="http://www.blogger.com/atom/ns#">bugday</category><title>บันทึกการเดินทาง#19 :: BugDay 2013</title><description>วันนี้ไปงาน &lt;b&gt;&lt;span style="font-size: large;"&gt;&lt;i&gt;Bugday 2013&lt;/i&gt;&lt;/span&gt;&lt;/b&gt; มาครับ :)&lt;br /&gt;
&lt;div&gt;
งานนี้เป็นงานสัมนาเกี่ยวกับ Software Quality &amp;amp; Software Testing&lt;br /&gt;
&lt;div&gt;
Theme ประมาณนี้ ... ซึ่งก็จะมีคนในวงการมาเล่าประสบการณ์ในการทำงานให้ฟัง&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
ปีนี้จัดที่สถาบันวิทยาการปัญญาภิวัฒน์ตรงแจ้งวัฒนะ&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-Dnq54z33BKg/UU3TaPRzqnI/AAAAAAAADs8/xQBy6bVZFVo/s1600/554868_575293512483685_1942527641_n.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://2.bp.blogspot.com/-Dnq54z33BKg/UU3TaPRzqnI/AAAAAAAADs8/xQBy6bVZFVo/s640/554868_575293512483685_1942527641_n.jpg" width="452" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
ผมได้เข้าฟังทั้งหมด 4 Session ครับ ก็จะเล่าเท่าที่จำได้เนอะ :)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;Fix UX Bugs!&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
เข้าใจ User ให้มากขึ้น ถาม User ให้มากขึ้นเป็นการ Improve User eXperience ได้อย่างดี&lt;br /&gt;
อย่าไปคิดแทน User ว่าเขาต้องการแบบนั้นแบบนี้ ลด Ego ของ Developer ลงบ้าง&lt;br /&gt;
อย่าไปคิดแทนเค้า ... คิดว่า User จะเป็นอย่างไร ถ้าอยู่ใน Environment ที่มี Software ของเรา&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;How to Improve quality of Freelance with Agile&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;
Session นี้มาเข้าช้านิดหน่อย เพราะแวะซื้อกาแฟที่ Central ... ก็มาเข้าประมาณครึ่งทาง แต่ก็ฟังทัน พี่เขาเล่าเกี่ยกวับการเอา Agile มาใช้ ซึ่งดูจากศัพท์และการกระทำแล้วก็ Scrum นั่นแหละ แต่เราอย่าไปพยายามเอาศัพท์ใส่หัวลูกค้า ว่า นู่น นี่ นั่น คืออะไร ? (ซึ่ง Scrum มี Practice เยอะพอสมควร) สิ่งที่เราควรทำคือ เอา Practice ของ Agile มาใช้พัฒนางาน ทำงาน โดยที่ไม่ต้องบอกลูกค้าว่ามันคืออะไรก็ได้ ... เช่น Definition of Done คือการคุยตกลงให้แน่ชัด ว่า "เสร็จ" ของงานนั้นๆ คืออะไร ? หรือ Sprint Review ถ้าเป็นเรื่องการให้ดูงานเป็นเรื่องที่ดีมาก เพราะยิ่งบ่อย ก็จะยิ่งได้รับ Feedback ที่เร็วขึ้น ถ้าผิดก็จะผิดเล็กๆ ผิดบ่อยๆ ไม่เป็นไรหรอก ... แล้วการเป็น Freelance ถ้าทำงานช้า ไม่เสร็จ ไม่มีหลักประกันอะไรทั้งสองฝ่าย (อาจจะมีสัญญา แล้วแต่) เราบอกไปตรงๆ ว่าไม่เสร็จ ยังดีกว่าเผางานให้เสร็จ แล้วมันไม่ได้เรื่อง เพราะก็รู้กันอยู่ ว่า &lt;b&gt;Programmer เป็นสิ่งมีที่ชีวิตที่อ่อนไหว และเป็นคนเหมือนกัน&lt;/b&gt; ... พูดให้ลูกค้าฟัง พยายามให้เขาเข้าใจ จะดีกว่า&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;วัวลืมตีน (Curse of Knowledge)&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;
เป็นเรื่องที่ดีเช่นกัน อะไรที่ Curse จาก Knowledge เวลาเรามีความรู้อะไรลึกๆ ในสายงานของเรา หรือเรื่องใดเรื่องหนึ่ง จะทำให้เราพ่น keyword ในสิ่งที่เรารู้ออกมาเยอะๆ แล้วอย่าคิดว่าพูด keyword เสียงดังขึ้นแล้วอีกฝ่ายจะรู้เรื่อง แม้แต่เวลาเราต้องสอน (Coach) ใครสักคน Practice ที่พี่หนุ่มยกตัวอย่างคือ "นักศึกษาฝึกงาน" บางทีเราก็ต้องเข้าใจว่า "เราก็เคยผ่านจุดนั้นมา" แต่ละคนมี Learning Curve ของแต่ละคนไม่เหมือนกัน อย่าไปคิดว่าเขาจะต้องรู้เรื่องนั้นเรื่องนี้ มองความพยายามของเขา ถ้าเขาเต็มที่แล้ว แล้วทำไม่ได้จริงๆ เป็นอันว่า เรายัดเยียดความไม่สนุกในการฝึกงานให้เขา ต้องจับมานั่งคุยกันจริงๆ จังๆ ว่า ต้องการอะไรกันแน่ ? คุยกัน คุยกันให้เยอะ&lt;br /&gt;
&lt;br /&gt;
Session นี้มี Discussion กันนิดหน่อยด้วย ... สนุกมากเลย&lt;br /&gt;
เราก็พูดในฐานะนักศึกษาฝึกงาน พี่ๆ ก็พูดในฐานะ Coach ได้ฟังและเข้าใจพวกพี่ๆ เขาเหมือนกัน&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;Big Data and How to test it&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;
พูดถึงอะไรคือ Big Data และมีวิธีการใดบ้างในการจัดการข้อมูล รายละเอียดเยอะหมือนกัน เขาว่ามันเป็น Trend ในปี 2013 (Gartner) Big Data คือข้อมูลขนาดใหญ่มาก (เช่นข้อมูลโพสต์ของ Facebook, ข้อมูลเที่ยวบินต่างๆ ของสนามบิน) เกิดมาเพื่อวิเคราะห์ และตัดสินใจ ในการสร้างองค์ความรู้&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/--_kFzPu5Y0o/UU3aE25lJ9I/AAAAAAAADtE/TdFRdQFt5LE/s1600/model.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/--_kFzPu5Y0o/UU3aE25lJ9I/AAAAAAAADtE/TdFRdQFt5LE/s1600/model.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
ผมก็ไม่ค่อยทัน ยังไงไปติดตามต่อที่นี่นะครับ&lt;br /&gt;
พี่ปุ๋ยทำ Slide สำหรับให้อ่านได้ด้วย&amp;nbsp;&lt;a href="http://www.slideshare.net/up1"&gt;http://www.slideshare.net/up1&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</description><link>http://www.macbaszii.com/2013/03/19-bugday-2013.html</link><author>noreply@blogger.com (Kiattisak Anoochitarom)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-Dnq54z33BKg/UU3TaPRzqnI/AAAAAAAADs8/xQBy6bVZFVo/s72-c/554868_575293512483685_1942527641_n.jpg" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7237929072659768518.post-6867959781923854588</guid><pubDate>Thu, 21 Mar 2013 09:35:00 +0000</pubDate><atom:updated>2013-03-21T16:38:17.994+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">uirefreshcontrol</category><category domain="http://www.blogger.com/atom/ns#">pull to refresh</category><category domain="http://www.blogger.com/atom/ns#">ios</category><category domain="http://www.blogger.com/atom/ns#">ios dev</category><category domain="http://www.blogger.com/atom/ns#">ios6</category><category domain="http://www.blogger.com/atom/ns#">refresh</category><title>[iOS Dev] Pull to Refresh with UIRefreshControl</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-RncZXykrt_0/UTtsEMG8uwI/AAAAAAAADn4/Jj2mcptJRcM/s1600/stretchMsg.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-RncZXykrt_0/UTtsEMG8uwI/AAAAAAAADn4/Jj2mcptJRcM/s1600/stretchMsg.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
เป็น Feature ที่หวือหวามาก ตอนที่ผมเริ่มใช้ iOS 6 ใหม่ๆ ซึ่ง Feature นี้ถูกใช้ในโปรแกรม Mail&lt;br /&gt;
แต่ว่าเรื่องการทำ Pull to Refresh เนี่ย มีคนทำมานานแล้วล่ะครับ&lt;br /&gt;
แต่นี่เป็น Official API จาก Apple ซึ่งจะใช้ได้บนการพัฒนา iOS 6 ขึ้นไปเท่านั้น&lt;br /&gt;
&lt;br /&gt;
ชื่อของมันก็คือ &lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;&lt;a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/UIRefreshControl_class/Reference/Reference.html"&gt;UIRefreshControl&lt;/a&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
โดย UIRefreshControl นั่นจะเป็น Property ของ UITableView นะครับ&lt;br /&gt;
&lt;br /&gt;
App ง่ายๆ ที่เราจะเขียนกันก็คือ TableView ธรรมดาที่มี Data อยู่แค่นั้นแหละครับ&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-983YtEeWEHs/UTts3Aq84mI/AAAAAAAADoA/MqCqbPCElc8/s1600/initialState.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-983YtEeWEHs/UTts3Aq84mI/AAAAAAAADoA/MqCqbPCElc8/s1600/initialState.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
ผมคงไม่ต้องให้ Code ในส่วนนี้นะ คิดว่าถ้าต้องการทำแบบนี้คงเขียน TableView เป็นหมดแล้ว&lt;br /&gt;
ส่วนการ Implement ก็ไม่ยากเลยครับ ... ในกรณีที่เราเขียน Code โดย Controller ที่ใช้เป็น UITableViewController นั้นจะมี Property ให้เราใช้ได้เลย แบบนี้&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-3zPf_08vUQ4/UTtwOoGy-CI/AAAAAAAADoI/203y9TSvK-A/s1600/Screen+Shot+2556-03-10+at+12.23.34+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-3zPf_08vUQ4/UTtwOoGy-CI/AAAAAAAADoI/203y9TSvK-A/s1600/Screen+Shot+2556-03-10+at+12.23.34+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
ต่อมาก็เขียน Handle method กัน ตามที่เราได้ setTarget เอาไว้&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-7XcMx4E2U30/UTtwdXYjo6I/AAAAAAAADoQ/Tafl7SIHAb0/s1600/Screen+Shot+2556-03-10+at+12.23.44+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-7XcMx4E2U30/UTtwdXYjo6I/AAAAAAAADoQ/Tafl7SIHAb0/s1600/Screen+Shot+2556-03-10+at+12.23.44+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
คราวนี้ถ้า Controller เราไม่ใช่ UITableViewController ล่ะ (เช่น UIViewController ที่มี UITableView วางอยู่) ...&lt;br /&gt;
มันก็จะไม่มี Property ที่ชื่อว่า self.refreshControl ให้ใช้ ... เราจะเปลี่ยนไปใช้ addSubview แทนครับ แบบนี้&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-RZPMIJ5RcLg/UTtxOrK5LQI/AAAAAAAADoY/_f684uhwFGw/s1600/Screen+Shot+2556-03-10+at+12.28.08+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-RZPMIJ5RcLg/UTtxOrK5LQI/AAAAAAAADoY/_f684uhwFGw/s1600/Screen+Shot+2556-03-10+at+12.28.08+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
ด้านบนจะเป็น Hard Code นะครับ แล้วมีวิธีที่จะทำบน Interface Builder หรือปล่าว ? คำตอบคือ "มี"&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-nOK0tB2cudw/UTtxyZMnLXI/AAAAAAAADog/L-daiy2XJ90/s1600/attributes-inspector.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-nOK0tB2cudw/UTtxyZMnLXI/AAAAAAAADog/L-daiy2XJ90/s1600/attributes-inspector.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-tYzhDmuNCh0/UTtx5qU-CmI/AAAAAAAADoo/Dy3X3LJ__bk/s1600/refresh.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-tYzhDmuNCh0/UTtx5qU-CmI/AAAAAAAADoo/Dy3X3LJ__bk/s1600/refresh.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-m_mJTu-Xa4o/UTtx-Bz8URI/AAAAAAAADow/zczRGhBYFW8/s1600/ibaction.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-m_mJTu-Xa4o/UTtx-Bz8URI/AAAAAAAADow/zczRGhBYFW8/s1600/ibaction.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
เท่านี้ครับ ... แล้วก็ไปเขียน - addTarget ตามด้านบนให้ self.refeshControl ใน UITableViewController เท่านี้ก็เรียบร้อย :)&lt;br /&gt;
ใครสนใจที่จะทำ Pull to Refresh บน iOS 5 แนะนำตัวนี้นะครับ &lt;a href="https://github.com/samvermette/SVPullToRefresh"&gt;SVPullToRefresh&lt;/a&gt;&lt;br /&gt;
เคยเห็นแบบที่ลอก Apple มาเป๊ะๆ เลยก็มีนะ แต่นึกไม่ออกว่าอันไหน ไว้เจอจะมา Update ให้ครับ</description><link>http://www.macbaszii.com/2013/03/ios-dev-pull-to-refresh-with.html</link><author>noreply@blogger.com (Kiattisak Anoochitarom)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-RncZXykrt_0/UTtsEMG8uwI/AAAAAAAADn4/Jj2mcptJRcM/s72-c/stretchMsg.png" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7237929072659768518.post-1133991784010250759</guid><pubDate>Fri, 15 Mar 2013 16:14:00 +0000</pubDate><atom:updated>2013-03-15T23:14:29.052+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">3.2</category><category domain="http://www.blogger.com/atom/ns#">mobile</category><category domain="http://www.blogger.com/atom/ns#">social</category><category domain="http://www.blogger.com/atom/ns#">fb</category><category domain="http://www.blogger.com/atom/ns#">sdk</category><category domain="http://www.blogger.com/atom/ns#">ios</category><category domain="http://www.blogger.com/atom/ns#">facebook</category><category domain="http://www.blogger.com/atom/ns#">ios dev</category><title>[iOS Dev] Facebook Login within your App</title><description>มาว่ากันเรื่องเล็กๆ น้อยๆ เกี่ยวกับ &lt;b&gt;UX&lt;/b&gt; ของ &lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;Facebook Login&lt;/span&gt;&lt;/i&gt;&lt;/b&gt; กัน&lt;br /&gt;
ปกติถ้าเปิด Session ตาม Facebook SDK Tutorial นั้นจะเป็นการ Login แบบนี้&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-WU9FugogdIc/UThynktS5uI/AAAAAAAADlw/ifox5zb-UO8/s1600/Screen+Shot+2556-03-07+at+5.56.35+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-WU9FugogdIc/UThynktS5uI/AAAAAAAADlw/ifox5zb-UO8/s320/Screen+Shot+2556-03-07+at+5.56.35+PM.png" width="170" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
นั่นคือตัว &lt;b&gt;Apps จะเปลี่ยนไป Login ผ่าน Safari เมื่อเสร็จแล้วก็จะเด้งกลับมาที่ App&lt;/b&gt;&lt;br /&gt;
แล้วเราจะ Login จากตัว App เลยได้ไหม ? คำตอบคือ ทำได้ครับ :)&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-X-q2oIiZ68c/UTh0I0vI5SI/AAAAAAAADl8/maoCThPoZkE/s1600/Screen+Shot+2556-03-07+at+6.01.18+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-X-q2oIiZ68c/UTh0I0vI5SI/AAAAAAAADl8/maoCThPoZkE/s320/Screen+Shot+2556-03-07+at+6.01.18+PM.png" width="170" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
ตามภาพผลลัพธ์เลย &lt;b&gt;การ Login จะเปลี่ยนจากดีดไปหา Safari เป็นการเด้ง UIWebView ขึ้นมาแทน&lt;/b&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
วิธีการก็คือ เราต้องเขียน FBSession Object ขึ้นมาเองถึงจะสามารถตั้งค่า Behavior ตรงนี้ได้&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
โดยเราจะเปลี่ยนจากการเขียนแบบนี้ (ซึ่งใน Facebook Tutorial แนะนำเอาไว้)&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-TGwXV8BN37E/UTh-eNcf4-I/AAAAAAAADmQ/rV_qi7UbQac/s1600/Screen+Shot+2556-03-07+at+6.44.49+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-TGwXV8BN37E/UTh-eNcf4-I/AAAAAAAADmQ/rV_qi7UbQac/s1600/Screen+Shot+2556-03-07+at+6.44.49+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
ให้เปลี่ยนมาเขียนแบบนี้&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-xt5M7c7N7xw/UTiEhFlDgeI/AAAAAAAADmo/oZpSSK2C8w4/s1600/Screen+Shot+2556-03-07+at+6.45.16+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-xt5M7c7N7xw/UTiEhFlDgeI/AAAAAAAADmo/oZpSSK2C8w4/s1600/Screen+Shot+2556-03-07+at+6.45.16+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
เท่านี้ก็ได้แล้วครับ อีกเรื่องนึงคือ หลายๆ อย่างเปลี่ยนไปใน Facebook SDK for iOS 3.2 นะครับ&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
ใครไม่ได้ตามก็ลองเข้าไปอ่านนี่ซะหน่อยนะ&amp;nbsp;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;a href="https://developers.facebook.com/docs/tutorial/iossdk/upgrading-from-3.1-to-3.2/#reftable"&gt;https://developers.facebook.com/docs/tutorial/iossdk/upgrading-from-3.1-to-3.2/#reftable&lt;/a&gt;&lt;/div&gt;
</description><link>http://www.macbaszii.com/2013/03/ios-dev-facebook-login-within-your-app.html</link><author>noreply@blogger.com (Kiattisak Anoochitarom)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-WU9FugogdIc/UThynktS5uI/AAAAAAAADlw/ifox5zb-UO8/s72-c/Screen+Shot+2556-03-07+at+5.56.35+PM.png" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7237929072659768518.post-7445208927376527040</guid><pubDate>Mon, 11 Mar 2013 12:54:00 +0000</pubDate><atom:updated>2013-03-11T19:54:04.846+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">c++</category><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">wordcount</category><category domain="http://www.blogger.com/atom/ns#">python</category><category domain="http://www.blogger.com/atom/ns#">count</category><category domain="http://www.blogger.com/atom/ns#">programming</category><category domain="http://www.blogger.com/atom/ns#">language</category><title>Word Counting in Various (Programming)Language</title><description>ผมเป็นคนหนึ่งทีีเขียน Programming Langauge ได้หลายภาษา&lt;br /&gt;
&lt;div&gt;
เนื่องจากสนใจ ผมเริ่มเขียนจาก C/C++ ซึ่งก็ไม่สบายนัก เลย&lt;/div&gt;
&lt;div&gt;
ค้นหาภาษาที่จะมาช่วยล่นระยะเวลาในการเขียนเล่น เช่น &lt;i&gt;&lt;b&gt;Python, Ruby&amp;nbsp;&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-m_MiKs31j6Y/UTrQO-YbWjI/AAAAAAAADnk/hyuOebEGePc/s1600/programming.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-m_MiKs31j6Y/UTrQO-YbWjI/AAAAAAAADnk/hyuOebEGePc/s1600/programming.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
วันนี้ก็อยากเขียนเล่น โดยเราจะมาเขียนโปรแกรมง่ายๆ กันด้วยหลายๆ ภาษากัน&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;ปัญหา:&lt;/b&gt; ผมจะนับคำจำนวนคำที่ไม่ซ้ำจากข้อความหนึ่งข้อความ (string)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;C++&lt;/span&gt;&lt;/b&gt; เนื่องจากการใช้ split บน C++ นั้นไม่เจอวิธีที่ดูง่ายก็เลยเขียนเองซะเลย&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-reM1PS4fyKM/UTrMmePhQeI/AAAAAAAADm4/-NQAfkWapkI/s1600/Screen+Shot+2556-03-09+at+12.44.43+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-reM1PS4fyKM/UTrMmePhQeI/AAAAAAAADm4/-NQAfkWapkI/s1600/Screen+Shot+2556-03-09+at+12.44.43+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;Objective-C (with ARC)&lt;/span&gt;&lt;/b&gt;&amp;nbsp;เริ่มมีตัวช่วยเป็นภาษาที่ใช้เขียนบน iOS&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-sj1YVp4xm-A/UTrM76XhDFI/AAAAAAAADnA/YptwuR6Ddi4/s1600/Screen+Shot+2556-03-09+at+12.46.13+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-sj1YVp4xm-A/UTrM76XhDFI/AAAAAAAADnA/YptwuR6Ddi4/s1600/Screen+Shot+2556-03-09+at+12.46.13+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;Java&lt;/span&gt;&lt;/b&gt; ภาษาที่เขาว่าเวิ่นเว้อ #จาว่าเร็วส์&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-eZ15cu86HQg/UTrNfKSH-jI/AAAAAAAADnI/w4mwEBFl_5Y/s1600/Screen+Shot+2556-03-09+at+12.49.20+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-eZ15cu86HQg/UTrNfKSH-jI/AAAAAAAADnI/w4mwEBFl_5Y/s1600/Screen+Shot+2556-03-09+at+12.49.20+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
คราวนี้มาฝั่ง Scripting Langauge กันบ้างเริ่มที่ &lt;b&gt;&lt;span style="font-size: large;"&gt;Python&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-YTz6TF2ZHR4/UTrN7v_4D7I/AAAAAAAADnQ/NF-vkqQmUOc/s1600/Screen+Shot+2556-03-09+at+12.51.20+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-YTz6TF2ZHR4/UTrN7v_4D7I/AAAAAAAADnQ/NF-vkqQmUOc/s1600/Screen+Shot+2556-03-09+at+12.51.20+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;Ruby&lt;/span&gt;&lt;/b&gt;&amp;nbsp;กันบ้าง เป็นภาษาที่พักหลังนี้ผมใช้เขียนประจำเลยครับ :)&amp;nbsp;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-datdWaMVDT4/UTrOKkFPvxI/AAAAAAAADnY/x0X4TzDr3Oo/s1600/Screen+Shot+2556-03-09+at+12.52.11+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-datdWaMVDT4/UTrOKkFPvxI/AAAAAAAADnY/x0X4TzDr3Oo/s1600/Screen+Shot+2556-03-09+at+12.52.11+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
มีคนบอกว่าภาษาพวก Scripting เร็วส์ ซึ่งเร็วในที่นี้หมายถึง &lt;b&gt;"ความเร็วในการพัฒนา"&lt;/b&gt; นะครับ&lt;/div&gt;
&lt;div&gt;
จากที่เห็นไปด้านบน เราสามารถแก้ปัญหาด้วย Code เพียงไม่กี่บรรทัดเท่านั้น&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
ลองเล่นกันครับ ... เป็นหลายๆ ภาษามันก็ดี เน้นที่พื้นฐานให้มาก ถ้าพื้นฐานเน้น กำแพงเวลาในการเรียนรู้ภาษาใหม่ๆ จะลดลง แล้วอย่าพยายามเขียนภาษาใหม่ ใน Environment ของภาษาเก่า เช่นมาเขียน Scripting แล้วดันไปเขียน Index-based Loop อะไรแบบนั้น&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
ผมเล่นหลายๆ ภาษาเพราะการชอบทำ Problem Solving นะครับ ... รู้สึกสนุก ท้าทาย ปัญหาไม่ต้องยากขึ้นเรื่อยๆ ก็ได้ (ยากๆ ก็ทำไม่ได้เหมือนกัน) เพียงแต่เราหาวิธีในการแก้ปัญหาให้มันง่ายขึ้นได้เรื่อยๆ เรื่องความเร็วอย่าไปกังวลให้มาก (ถ้ามันไม่ช้าเกินไปน่ะนะ)&lt;/div&gt;
</description><link>http://www.macbaszii.com/2013/03/word-counting-in-various.html</link><author>noreply@blogger.com (Kiattisak Anoochitarom)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-m_MiKs31j6Y/UTrQO-YbWjI/AAAAAAAADnk/hyuOebEGePc/s72-c/programming.jpg" height="72" width="72" /><thr:total>1</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7237929072659768518.post-3108699285813954725</guid><pubDate>Fri, 08 Mar 2013 02:58:00 +0000</pubDate><atom:updated>2013-03-08T16:35:52.075+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">service</category><category domain="http://www.blogger.com/atom/ns#">customer</category><category domain="http://www.blogger.com/atom/ns#">starbucks</category><category domain="http://www.blogger.com/atom/ns#">coffee</category><category domain="http://www.blogger.com/atom/ns#">barista</category><title>12 วิธี การบริการและดูแลลูกค้าในร้าน Starbucks</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-6o7TH-_ppgI/UTYbssSW-MI/AAAAAAAADlg/bAxey2NKUX4/s1600/starbucks.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-6o7TH-_ppgI/UTYbssSW-MI/AAAAAAAADlg/bAxey2NKUX4/s1600/starbucks.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
ใครหลายคนมักตั้งคำถามว่า "จะดื่มกาแฟแก้วละเกือบ 200 ไปทำไม ดื่มแล้วได้อะไร?" ผมพบเจอบทความหนึ่งจาก Internet เกี่ยวกับอีกสิ่งสำคัญของ &lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;Starbucks&lt;/span&gt;&lt;/i&gt;&lt;/b&gt; นอกจากกาแฟ นั่นคือ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;ระบบการบริการลูกค้า (Customer Service)&lt;/b&gt; ที่เป็นหัวใจที่สำคัญยิ่งของกาแฟแบรนด์ดังที่ชื่อว่า Starbucks จากวิสัยทัศน์ของผู้บริหารกาแฟ Starbucks ที่มุ่งเน้นไปที่การบริการลูกค้าให้ดีที่สุด ซึึ่งมาจากพนักงานที่ยอดเยี่ยมที่สุดจากทาง Starbucks และมีความเชื่อมั่นและให้ความใส่ใจกันองค์กรเป็นอย่างยิ่ง ซึ่งสำหรับผู้ที่ดื่มกาแฟ Starbucks เป็นปกติอยู่แล้วก็จะได้รับการบริการด้วยไมตรีจิตที่ดีจากพนักงานหรือเรียกอีกอย่างว่า “partners” ที่แฝงไว้ซึ่งคุณภาพภายใต้การสวมใส่ผ้ากันเปื้อนสีเขียว&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-se3y3wd_REU/UTYZ67sneNI/AAAAAAAADlE/kwB9YpMLJEg/s1600/213.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-se3y3wd_REU/UTYZ67sneNI/AAAAAAAADlE/kwB9YpMLJEg/s1600/213.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
เราจะมาดูกันครับว่า 12 วิธีการบริการลูกค้าร้านกาแฟที่เป็นหัวใจที่สำคัญของทาง Starbucks นั้นมีอะไรบ้าง&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;b&gt;1. สอบถามความต้องการลูกค้าเพื่อช่วยตัดสินใจ&lt;/b&gt;&lt;br /&gt;
การเริ่มต้นด้วยคำถามที่เป็นการช่วยลูกค้าตัดสินใจ เมื่อลูกค้าเข้าร้านมา อย่างเช่น “สวัสดีค่ะ คุณจะรับชาหรือกาแฟดีคะ”, “ไม่ทราบว่าคุณจะรับเป็นเครื่องดื่มร้อนหรือว่าเย็นดีคะ” หรือ อาจจะเป็นคำถามในเรื่องของรสชาติเช่น “ถ้าคุณชอบหวานเราของแนะนำตัวนี้ค่ะ…..” ซึ่งเมื่อไหร่ที่คุณไปซื้อกาแฟที่ร้านกาแฟ Starbucks แบบว่าไม่รู้จะดื่มอะไร แน่นอนว่าทางร้านกาแฟ Starbucks สามารถทำให้คุณได้รับกาแฟที่คุณชอบได้อย่างแน่นอน ซึ่งจะเป็นการช่วยเพิ่มความใกล้ชิดระหว่างพนักงานร้านกาแฟกับลูกค้าอีกด้วย จากวิธีการช่วยเหลือแนะนำเมนูโปรดให้แก่ลูกค้า&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;2. จำชื่อลูกค้าได้&lt;/b&gt;&lt;br /&gt;
ลูกค้าที่มาใช้บริการหรือมาซื้อกาแฟที่ร้านกาแฟ Starbucks เป็นประจำนั้น ทางพนักงานร้านกาแฟจะจดจำชื่อลูกค้าได้เป็นอย่างดีและรู้ว่าลูกค้าท่านนั้นๆชอบสั่งหรือมีเครื่องดื่มประจำเป็นอะไร&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;3. สอบถามเกี่ยวกับความเป็นอยู่ของลูกค้า&lt;/b&gt;&lt;br /&gt;
ซึ่งไม่เฉพาะแค่จำชื่อลูกค้าได้เท่านั้น พนักงานของทาง Starbucks จะสอบถามถึงชีวิตความเป็นอยู่ของคุณในส่วนที่คุณเปิดเผยได้เช่น ช่วงนี้ทำงานอะไร กำลังจะเรียนต่อ ย้ายบ้านหรือว่าได้เลื่อนตำแหน่งงานในบริษัท หรือว่าในวันว่างๆ คุณทำกิจกรรมอะไร มีงานอดิเรกหรือไม่ ซึ่งช่วยให้คุณได้รู้จักลูกค้าและพูดคุยสอบถามสารทุกข์สุกดิบของลูกค้าได้มากขึ้น&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;4. รับทราบความไม่พอใจของลูกค้าที่เกิดขึ้น&lt;/b&gt;&lt;br /&gt;
ข้อความที่ถือว่าเป็นอันตรายร้ายแรงอย่างใหญ่หลวงในการบริการลูกค้าสำหรับพนักงานก็คือ “มันไม่ใช่ความผิดของฉัน” ดังนั้นพนักงานของกาแฟ Starbucks จะได้รับการอบรมมาเป็นอย่างดีเยี่ยมในเรื่องการยอมรับความไม่พอใจของลูกค้า ซึ่งต้องมีสติและพิจารณากับความไม่พอใจนั้นให้ออก การที่เราสามารถหาเหตุผลมาพิสูจน์ความผิดว่า ความผิดนั้นเป็นความผิดของลูกค้าเองจนได้นั้น จะเป็นสิ่งอันตรายที่ทำให้คุณเสียลูกค้า ดังนั้นประเด็นของข้อนี้ไม่ได้อยู่ที่การหาว่าใครถูกใครผิด แต่หัวใจหลักที่สำคัญคือ การหาทางออกของความไม่พอใจหรือข้อขัดแย้งนั้นต่างหาก&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;5. ต้องจัดการและแก้ปัญหาความเข้าใจผิด&lt;/b&gt;&lt;br /&gt;
พนักงานของกาแฟ Starbucks นั้นได้รับการอบรมในเรื่องของการแก้ปัญหาที่เกิดจากความเข้าใจผิดมาเป็นอย่างดีเยี่ยม เช่น หากคุณทำเครื่องดื่มมาผิด แน่นอนคุณต้องทำมาให้ใหม่ ไม่มีคำถามหรือข้อแก้ตัวใดๆ หรือ หากคุณทำช้าเกินไปจนลูกค้ารอนานมาก ไม่เพียงแค่คำขอโทษแต่คุณควรจะให้คูปองเครื่องดื่มฟรีเพื่อเป็นการทดแทน สิ่งหล่านี้จะช่วยให้ลูกค้ามีความยินดีมากขึ้น หลังจากที่อาจจะอารมณ์เสียกับความผิดพลาดของเรา ดังนั้นหัวใจของข้อนี้คือการพร้อมที่จะรับมือและแก้ไขปัญหาหรือความผิดพลาดที่เกิดขึ้นได้อย่างรวดเร็ว&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;6. สร้างรอยยิ้มให้แก่ลูกค้า&lt;/b&gt;&lt;br /&gt;
สำหรับข้อนี้นั้นก็เป็นข้อสำคัญอีกข้อหนึ่งที่พนักงาน Starbucks จะมีบทสนทนาหรือรู้ว่าจะทำให้ลูกค้ามีวันที่ดีๆได้อย่างไร ซึ่งอาจจะเกิดจากคำพูดที่สร้างบรรยากาศชวนยิ้มแย้มแจ่มใสหรือทำให้คุณตลกขบขันได้ โดยยึดหลักว่า “ชีวิตนี้ช่างสั้นนัก เกินกว่าที่จะมีเวลาไปให้กับสิ่งที่เครียดๆ หดหู่ ดังนั้นเราจะทำอย่างไรให้ลูกค้าของเรามีรอยยิ้มได้”&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;7. การให้ชิมเครื่องดื่มตัวอย่าง&lt;/b&gt;&lt;br /&gt;
เมื่อมีเครื่องดื่มหรือเมนูกาแฟใหม่ๆมา ทางร้านก็จะมีการทำเครื่องดื่มนั้นให้ลูกค้าได้ชิมโดยใส่แก้วเล็กๆไม่ใหญ่มาก ซึ่งเป็นการช่วยโปรโมทเครื่องดื่มตัวใหม่ๆไปในตัวและอาจจะกลายเป็นเครื่องดื่มที่ลูกค้าอยากดื่มเป็นรายการต่อไปก็ได้&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-BgfvOoeF2Jo/UTYaxMUhhgI/AAAAAAAADlI/kK-rYD4gY4U/s1600/rec5-2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-BgfvOoeF2Jo/UTYaxMUhhgI/AAAAAAAADlI/kK-rYD4gY4U/s1600/rec5-2.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;8. ใส่ใจกับลูกค้าใหม่&lt;/b&gt;&lt;br /&gt;
กรณีที่มีลูกค้าใหม่เข้าร้านมา บางทีร้านเราอาจจะตั้งชื่อเมนูแปลกๆที่ลูกค้าอ่านแล้วอาจจะมึนงงได้ ดังนั้นสิ่งที่จะช่วยสร้างความประทับใจให้กับลูกค้าก็คือ การอธิบายเมนูหรือคำศัพท์ยากๆให้เข้าใจง่ายๆ เช่น “เครื่องดื่ม…..จะมีรสชาติคล้ายๆกับ…..” หรือ “เมนูนี้ประกอบไปด้วย….และ….ผสมรวมกันอยู่ค่ะ” ซึ่งจะเป็นการช่วยให้ลูกค้าเข้าใจในตัวสินค้าของเราได้มากขึ้น&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;9. เพิ่มการปรับแต่งเมนูตามใจลูกค้าหากเป็นไปได้&lt;/b&gt;&lt;br /&gt;
การที่เราสร้างเมนูกาแฟขึ้นมานั้น บางเมนูลูกค้าอาจจะมีความต้องการไม่เหมือนกันดังนั้นการปรับแต่งให้ตรงกับลูกค้าแต่ละคนนั้นเป็นเรื่องที่ดี ที่คุณจะสร้างความประทับใจและเมนูสุดโปรดให้กับลูกค้าของคุณได้ และแน่นอนว่าถ้าไม่มีที่ไหนทำได้อร่อยและตรงใจเท่ากับร้านของคุณแล้ว ลูกค้าก็จะไม่หนีไปไหนอย่างแน่นอน&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;10. ใส่ใจกับคุณภาพ&lt;/b&gt;&lt;br /&gt;
การใส่ใจกับคุณภาพและปริมาณการผสมเครื่องดื่มต่างๆนั้นเป็นสิ่งที่สำคัญอย่างยิ่ง โดยให้ยึดถือเป็นมาตรฐานเลยว่าในแต่ละเมนูที่คุณทำมาในทุกๆครั้งนั้น รสชาติและองค์ประกอบควรจะเหมือนกัน ไม่ใช่ว่า สั่งดื่มคนละวัน รสชาติคนละแบบ ซึ่งจะทำให้ลูกค้าที่ดื่มอยู่เป็นประจำทราบได้ว่าคุณไม่ใส่ใจในรสชาติหรือองค์ประกอบเท่าที่ควร ซึ่งถือเป็นเรื่องที่ไม่น่ายินดีเท่าไหร่นัก&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;11. เรียนรู้วิธีการพูดจาและแสดงท่าทีต่อลูกค้า&lt;/b&gt;&lt;br /&gt;
ตรงข้อนี้ไม่ใช้เป็นการส่งเสริมให้ฝึกการเสแสร้งแกล้งทำ โดยปกติแล้วเวลาเราทำกาแฟเราก็จะจดจ่ออยู่กับการทำกาแฟเป็นหลักซึ่งอาจจะทำให้เราไม่สามารถคิดหรือทำอะไรได้หลายๆอย่างในเวลาเดียวกัน ซึ่งแน่นอนว่าเราอาจจะปฏิบัติต่อลูกค้าเหมือนๆกันจนเป็นที่ชินชาเกินไป ดังนั้นการฝึกการแสดงออกที่เหมาะสมกับลูกค้าแต่ละคนนั้นเป็นสิ่งสำคัญ โดยเฉพาะอย่างยิ่งการตอบสนองพูดคุยกับลูกค้าหลายๆคนในเวลาเดียวกันกับที่คุณกำลังทำกาแฟอยู่&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&amp;nbsp;12. สร้างความพอใจให้กับลูกค้าเป็นเป้าหมายของพนักงานทุกๆคนในร้าน&lt;/b&gt;&lt;br /&gt;
“ลูกค้าต้องมาก่อน” แน่นอนว่าวลีนี้ใช้ได้กับกาแฟ Starbucks อย่างแน่นอน ซึ่งการสร้างความประทับใจให้กับลูกค้านั้นต้องอาศัยความร่วมมือกันของทีมหรือพนักงานซึ่งถือว่าเป็นหัวใจหลักที่สำคัญที่สุดในการที่จะทำงานบริการลูกค้าให้มีคุณภาพ&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-QjW2LrgkA4w/UTYbFMTHyAI/AAAAAAAADlQ/upQOZhMPelw/s1600/117.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-QjW2LrgkA4w/UTYbFMTHyAI/AAAAAAAADlQ/upQOZhMPelw/s1600/117.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</description><link>http://www.macbaszii.com/2013/03/12-starbucks.html</link><author>noreply@blogger.com (Kiattisak Anoochitarom)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-6o7TH-_ppgI/UTYbssSW-MI/AAAAAAAADlg/bAxey2NKUX4/s72-c/starbucks.jpg" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7237929072659768518.post-3943990021753929161</guid><pubDate>Sun, 03 Mar 2013 13:58:00 +0000</pubDate><atom:updated>2013-03-03T20:58:26.201+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">designer</category><category domain="http://www.blogger.com/atom/ns#">retina</category><category domain="http://www.blogger.com/atom/ns#">ios</category><category domain="http://www.blogger.com/atom/ns#">ios dev</category><category domain="http://www.blogger.com/atom/ns#">display</category><category domain="http://www.blogger.com/atom/ns#">design</category><category domain="http://www.blogger.com/atom/ns#">uikit</category><category domain="http://www.blogger.com/atom/ns#">ui</category><category domain="http://www.blogger.com/atom/ns#">iphone</category><category domain="http://www.blogger.com/atom/ns#">element</category><title>[iOS Dev] Sizes of iPhone UI Elements for Designer</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-4SuT3UN6yls/URijC4WdA3I/AAAAAAAADhc/4Nf59fJyyhA/s1600/bothPhones.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-4SuT3UN6yls/URijC4WdA3I/AAAAAAAADhc/4Nf59fJyyhA/s1600/bothPhones.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
เรามาเขียน Blog ให้ iOS Designer กันบ้างดีกว่า ...&lt;br /&gt;
วันนี้จะว่าเรื่อง UI Elements พื้นฐานตัวต่างๆ บน iPhone นะครับ&lt;br /&gt;
ว่าถ้าเราจะลง Design เนี่ยจะต้องออกแบบ UI ส่วนไหนขนาดเท่าไรบ้าง&lt;br /&gt;
ตามตารางด้านล่างจะเป็น UI มาตรฐานของตัว iOS เองนะครับ&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-UONs1DCJUrM/URim8GbSCwI/AAAAAAAADh4/Yzk6Wjni06M/s1600/Screen+Shot+2556-02-11+at+3.05.51+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-UONs1DCJUrM/URim8GbSCwI/AAAAAAAADh4/Yzk6Wjni06M/s1600/Screen+Shot+2556-02-11+at+3.05.51+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;Point vs Pixels&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
เนื่องจากตั้งแต่ Apple เปิดตัว iPhone 4 นั้นก็ได้เปิดตัวหน้าจอใหม่ที่ชื่อว่า Retina Display ซึ่งจะมี Pixels มากกว่าเดิม 2 เท่า ดังนั้นเพื่อความเข้าใจง่าย หน่วยของการออกแบบที่ Apple ใช้จึงเป็น Point (pts) โดยที่ &lt;b&gt;1 pt = 1 pixels&lt;/b&gt; ในหน้าจอที่ไม่ใช่ Retina Display และเมื่อเป็น Retina Display ก็แค่คูณ 2 เข้าไป&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;Graphics for Retina Display&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;a href="http://3.bp.blogspot.com/-q88AmY-AFp8/URioRAL1e8I/AAAAAAAADiE/Ux84T7G9JLw/s1600/Screen+Shot+2556-02-11+at+3.13.34+PM.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-q88AmY-AFp8/URioRAL1e8I/AAAAAAAADiE/Ux84T7G9JLw/s1600/Screen+Shot+2556-02-11+at+3.13.34+PM.png" /&gt;&lt;/a&gt;&lt;br /&gt;
ความสบายอยู่ตรงนี้แหละ เราไม่จำเป็นที่จะต้องเปลี่ยนหรือเขียน Code อะไรเพื่อจะมารองรับหน้าจอที่เป็น Retina Display เราเพียงแค่ออกแบบ Graphics ตัวใหม่มา พร้อมกับใส่ต่อท้ายชื่อด้วย &lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;"@2x"&lt;/span&gt;&lt;/i&gt;&lt;/b&gt; เท่านี้ Apple จะมีเครื่องมือจัดการให้เราเองอัตโนมัติ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ส่วนเครื่องมือใน UIKit ก็ขึ้นอยู่กับเราปรับขนาดของ UI เลยครับ เป็นไปตามที่เราตั้งค่าไว้ในหน่วย Point (pts) เหมือนเดิม นั่นคือถ้าเป็น Retina Display ก็อย่าลืมออกแบบ Graphic ที่มีขนาด 2 เท่าพร้อมตั้งชื่อตามด้านบนมารองรับไว้ด้วย :)&lt;br /&gt;
&lt;br /&gt;</description><link>http://www.macbaszii.com/2013/03/ios-dev-sizes-of-iphone-ui-elements-for.html</link><author>noreply@blogger.com (Kiattisak Anoochitarom)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-4SuT3UN6yls/URijC4WdA3I/AAAAAAAADhc/4Nf59fJyyhA/s72-c/bothPhones.jpg" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7237929072659768518.post-3785741055961778386</guid><pubDate>Wed, 27 Feb 2013 07:53:00 +0000</pubDate><atom:updated>2013-03-12T11:44:59.930+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">c++</category><category domain="http://www.blogger.com/atom/ns#">getling</category><category domain="http://www.blogger.com/atom/ns#">standard input</category><category domain="http://www.blogger.com/atom/ns#">input</category><category domain="http://www.blogger.com/atom/ns#">method</category><category domain="http://www.blogger.com/atom/ns#">cin</category><category domain="http://www.blogger.com/atom/ns#">string</category><title>Problem when using 'getline' with 'cin' in C++</title><description>ว่าด้วยปัญหาที่ถูกตั้งคำถาม Classic เวลาเราใช้ cin ใน C++ กันเลยนะ&lt;br /&gt;
นั่นคือการใช้ &lt;b&gt;&lt;span style="font-size: large;"&gt;cin&lt;/span&gt;&lt;/b&gt; รับ input ที่เป็น &lt;i&gt;&lt;b&gt;string with whitespaces&lt;/b&gt; &lt;/i&gt;เช่น &lt;b&gt;"this is a cat"&lt;/b&gt;&lt;br /&gt;
ซึ่งจะเห็นได้ว่า เราจะได้แค่ &lt;b&gt;"this"&lt;/b&gt; เก็บไว้ในตัวแปรเท่านั้น&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-KyolRdaldiQ/USZxOZBlT9I/AAAAAAAADkI/bF0Q2obZooY/s1600/slider_course_cplusplus01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-KyolRdaldiQ/USZxOZBlT9I/AAAAAAAADkI/bF0Q2obZooY/s1600/slider_course_cplusplus01.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
ถ้าต้องการรจะรับ Input ที่เป็น String with whitespaces ให้เปลี่ยนมาใช้&lt;br /&gt;
&lt;b&gt;cin.getline(char_array_variable, stream_size)&lt;/b&gt; กรณีที่ตัวแปรเป็น &lt;b&gt;Array of Character&lt;/b&gt;&lt;br /&gt;
หรือ &lt;b&gt;getline(cin, string_variable)&lt;/b&gt; ในกรณีที่ตัวแปรเป็น &lt;b&gt;C++ String (#include &amp;lt;string&amp;gt;)&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.cplusplus.com/reference/istream/istream/getline/"&gt;http://www.cplusplus.com/reference/istream/istream/getline/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
แต่ปัญหาที่ผมจะกล่าวถึงมาจากการที่เราไม่สามารถใช้&lt;br /&gt;
&lt;b&gt;cin.getline&lt;/b&gt; กับตัวแปรชนิดอื่นๆ ได้นอกจาก string (or array of character)&lt;br /&gt;
&lt;br /&gt;
เราก็เลยต้องกลับไปใช้ cin นั่นแหละ ปัญหาที่เกิดขึ้นคือ ถ้าเราเรียกใช้ cin.getline ต่อจาก cin&lt;br /&gt;
มันจะข้ามการ input ของ cin.getline ไปเลย ดังภาพครับ&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-AxIvXuEyi_Q/USZuiZ7UJSI/AAAAAAAADj4/PJ5gmGVA5oM/s1600/Screen+Shot+2556-02-22+at+1.59.02+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-AxIvXuEyi_Q/USZuiZ7UJSI/AAAAAAAADj4/PJ5gmGVA5oM/s1600/Screen+Shot+2556-02-22+at+1.59.02+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;สาเหตุของปัญหาคือ&lt;/span&gt;&lt;/b&gt; ... คำสั่ง &lt;b&gt;cin&lt;/b&gt; จะมี &lt;b&gt;Newline Character (\n)&lt;/b&gt; ตอนที่เรากด Enter ติดท้ายมาเสมอ ... ทำให้เจ้า &lt;b&gt;getline&lt;/b&gt; ที่ตามหลังมานั้นคิดว่า Newline Character เป็น stream ที่ถูก input เข้ามามันเลยถูกเรียกให้ทำงานทันที จึงทำให้ข้ามการ input จริงๆ ไป ...&lt;br /&gt;
&lt;br /&gt;
วิธีการแก้ที่ง่ายที่สุดคือ ... หลอกมันครับ เอาตัวแปร Dummy มาให้มันเก็บ Newline Character ไปก่อน&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-fLRgFsKKP_k/USZv-9JFaaI/AAAAAAAADkA/XgzfeaCt2wY/s1600/Screen+Shot+2556-02-22+at+2.05.12+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-fLRgFsKKP_k/USZv-9JFaaI/AAAAAAAADkA/XgzfeaCt2wY/s1600/Screen+Shot+2556-02-22+at+2.05.12+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;</description><link>http://www.macbaszii.com/2013/02/problem-when-using-getline-with-cin-in-c.html</link><author>noreply@blogger.com (Kiattisak Anoochitarom)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-KyolRdaldiQ/USZxOZBlT9I/AAAAAAAADkI/bF0Q2obZooY/s72-c/slider_course_cplusplus01.jpg" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7237929072659768518.post-4513768514964292642</guid><pubDate>Fri, 22 Feb 2013 02:42:00 +0000</pubDate><atom:updated>2013-02-28T13:32:54.676+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">seminar</category><category domain="http://www.blogger.com/atom/ns#">user experience</category><category domain="http://www.blogger.com/atom/ns#">thumbsup</category><category domain="http://www.blogger.com/atom/ns#">start it up</category><category domain="http://www.blogger.com/atom/ns#">startup</category><category domain="http://www.blogger.com/atom/ns#">power it up</category><category domain="http://www.blogger.com/atom/ns#">crc</category><category domain="http://www.blogger.com/atom/ns#">ux</category><category domain="http://www.blogger.com/atom/ns#">ui</category><category domain="http://www.blogger.com/atom/ns#">microsoft</category><title>บันทึกการเดินทาง#18 :: Start It Up, Power It Up #3</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-9fpbF1J3au0/USUeTQQ9UxI/AAAAAAAADjM/z_1VvfsKu8Q/s1600/DSC04477.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="480" src="http://1.bp.blogspot.com/-9fpbF1J3au0/USUeTQQ9UxI/AAAAAAAADjM/z_1VvfsKu8Q/s640/DSC04477.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
ได้เป็น 1 ในผู้ที่ได้รับ Confirmaion Email กับงานนี้ครับ Start It Up, Power It Up ครั้งที่ 3&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
จัดโดย Thumbsup เช่นเคย คราวนี้ที่ Microsoft Auditorium ครับ ...&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://thumbsup.in.th/2013/01/start-it-up-power-it-up-3/"&gt;http://thumbsup.in.th/2013/01/start-it-up-power-it-up-3/&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
ผมเดินทางไปแต่เช้าเลย ถึงอนุเสาวรีย์ประมาณ 9 โมงเนื่องจากรถติด นั่ง BTS ไปเพลินจิต&lt;/div&gt;
&lt;div&gt;
ไปเดินหลงกว่าจะเจอสถานที่จัดงาน เล่นเอามึน คือตึก CRC อยู่ใน All Seasons Place ครับ&lt;/div&gt;
&lt;div&gt;
ต้องเดินจากสถานีรถไฟฟ้าประมาณ 1km เห็นจะได้ .... แต่ก็พอเดินไหวครับ&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-6wefhY-CWe8/USUfGG9xmUI/AAAAAAAADjU/6EgFgZKW3lg/s1600/DSC04474.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="480" src="http://4.bp.blogspot.com/-6wefhY-CWe8/USUfGG9xmUI/AAAAAAAADjU/6EgFgZKW3lg/s640/DSC04474.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
มาถึงก็กินกันเลย ที่นี่เลี้ยงดีมากครับ มีขนมให้กินทั้งวันเลย ... วันทั้งวัน ก็นั่งฟัง Session ต่างๆ ทั้งความรู้บ้าง ขายของบ้าง ... ปนๆ กันไป แต่ก็สนุกดีครับ ผมสนใจแต่ Session ประสบการณ์และความรู้มากกว่านะ จนหมดวัน ขอแชร์ไว้นิดหน่อยแล้วกันนะครับ&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;ปัจจุบันการทำ Startup อย่า One man show&lt;/span&gt;&lt;/b&gt; การหา Partner ไม่ว่าจะเป็นชาติเดียวกัน หรือต่างชาติก็ควรหา อะไรที่ทำเองได้ก็ทำ อะไรที่มันเป็นงานใหญ่ ในตอนเริ่มต้นหาได้ก็หา เปิดรับแนวคิด Open Innovation เยอะๆ บางคนอาจจะกลัวว่า ถ้าไปเป็น Partner กับคนอื่น จะกลัวเสียไอเดีย หรือปล่าว ?&amp;nbsp;การรักษาความลับมีได้หลายวิธี ต้องลองศึกษาดูครับ เช่น Codename, Need to Know Specification, etc.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;การพัฒนาคน&lt;/span&gt;&lt;/b&gt;นั้นบริษัทใหญ่ๆ มักจะใช้การจัด Training ขึ้นมา แต่สำหรับ Startup แล้วการพัฒนาคน (Talent Development) อาจจะทำไปควบคู่กับ Product Development เลยก็ได้ ... เช่น ถ้าอยากพัฒนาใครให้มีความสามารถอะไรโดดเด่นก็โยนงานแนวนั้นไปให้บ่อยๆ (ทั้งนี้ก็คงขึ้นอยู่กับความสามารถและ Learning Curve ของคนคนนั้นด้วย)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;VC (Venture Capital) นั้นจะไม่สนใจบริษัทที่เป็นสีเทา &lt;/b&gt;&lt;/span&gt;คือบริษัทที่เป้าหมายไม่ชัดเจน ไม่มี committment ที่ดี องค์กรไร้ทิศทาง เรื่องแบบนี้เขาดูรู้หมดนะครับ อาจจะเพียงแค่คุยกัน ผู้นำควรจะเป็นผู้นำได้จริงๆ อาจจะไม่ใช่ Founder เสมอไป พยายามสะสม Know-how, Core Technology และคิดเรื่อง Reuse Design ให้มาก ไม่ใช่ทำแล้วจบๆ ไป ... มองเรื่อง International ให้เป็นเรื่องใหญ่&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;อย่ามองว่าตลาด 'Consumer' ว่าง่าย&lt;/span&gt;&lt;/b&gt;&amp;nbsp;ทำ Application แบบนี้ออกมา เดี๋ยวก็มีคนใช้ ถ้าคิดจะทำเงิน และโอกาสที่ดี ตลาด Business เป็นทางเลือกที่ดีกว่า ประเด็นหลักๆ เลยนะ เพราะความ "เรื่องมาก" ของ User นี่แหละ = =' (พี่เจนแกพูดงี้เลยนะ) ไม่ควรเริ่มต้นด้วยการเล็งตลาด "Consumer" ถ้าไอเดียไม่ดีจริงๆ (แต่ถ้าบ้านรวย เงินเหลือ ก็อีกเรื่องนึงนะ)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;ทีมงานทุกคนจะต้องมีความฝันชัดเจน&lt;/span&gt;&lt;/b&gt;&amp;nbsp;ในการทำ Startup หัวหน้าทีม หรือผู้นำจะต้องทำให้ผู้ร่วมทุนเห็นว่า Partnership จะได้อะไรจาก Product ที่มาลงทุน หรือทำด้วยกัน (ไม่ใช่แค่เรื่องเงินเพียงอย่างเดียว)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;พยายามหาช่องทางที่ Go Inter ให้ได้&amp;nbsp;&lt;/span&gt;&lt;/b&gt;โดยเฉพาะเวลามองหาผู้ลงทุน (Venture Capital, Angel Investor) อย่ากรอบตัวเองอยู่แค่ในประเทศ(ไทย) เนื่องจากประเทศไทยนักลงทุนที่มีความรู้ทาง Technical มีน้อย ส่วนใหญ่จะกลัวการลงทุนในเรื่อง Technical มาก คงจะเพราะผลกำไรที่ยังไม่ชัดเจนในตอนเริ่มต้น&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;คำแนะนำเวลาต้องร่วมทุนหรือทำธุรกิจกับ Partner ต่างชาติ&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;คุยกันรู้เรื่อง พยายามหาคนที่ mindset ตรงกัน&lt;/li&gt;
&lt;li&gt;ภาษา ในแง่ของการสื่อสาร ภาษาอังกฤษต้องยืนพื้นไว้ก่อน&lt;/li&gt;
&lt;li&gt;ความซื่อสัตย์ ความเที่ยงตรง&lt;/li&gt;
&lt;li&gt;คิดว่าทำไมเขาถึงจะให้เงินเรา ? Customer Based, Technical Person, Pitching&lt;/li&gt;
&lt;li&gt;Pitching ทุกครั้งที่มีโอกาสเหมาะๆ (ย้ำนะ เหมาะๆ)&lt;/li&gt;
&lt;li&gt;ทำ Prototype ให้เก่ง ... การทำ Prototype เก่งมักหมายถึงทำให้เร็วเพื่อไปเสนอ&lt;/li&gt;
&lt;li&gt;Product ที่เรามี หรือจะทำ แตกต่างและเจ๋งกว่าของที่มีอยู่ในตลาดอย่างไร (Killing Feature)&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;เรื่องคน (อีกแล้ว)&lt;/span&gt;&lt;/b&gt; ไม่ว่าจะใคร ปัญหาการออกเกิดบ่อยๆ มักจะเสียดายกันเวลา Train ซะดิบดีออกซะงั้น ก็จะไปว่าเขาฝ่ายเดียวก็ไม่ได้ สิ่งที่ผู้นำที่ดีควรทำคือ พยายามมองพวกเขาเป็นฟันเฟืองให้กับองค์กร ไม่ใช่ให้เขารู้สึกว่า เขาเป็นแค่พนักงานบริษัท ใจเขาใจเรานะครับ ตรงนี้&lt;/div&gt;
&lt;div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://3.gvt0.com/vi/Ovj4hFxko7c/0.jpg" height="266" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Ovj4hFxko7c&amp;fs=1&amp;source=uds" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;embed width="320" height="266"  src="http://www.youtube.com/v/Ovj4hFxko7c&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;UX (User eXperience) คือ&lt;/span&gt;&lt;/b&gt;อะไรก็ตาม ทุกๆ อย่างที่ทำให้ประสบการณ์ผู้ใช้เปลี่ยนไป งานของ UX ไม่ใช่งานของ Designer เพียงอย่างเดียว ความเร็วในการทำงาน ความราบรื่นของ UI การกระทำของหน้าจอล้วนเป็นส่วนหนึ่งของ UX แต่เราจะเห็นว่างานพวกนี้เป็นงานของ Developer ทั้งสิ้น ดังนั้น UX คือการเอาใจของ User เข้ามาใส่ในทีมงานทุกคน&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;UX Designer ที่ดี&lt;/span&gt;&lt;/b&gt;จะต้องใส่ใจในรายละเอียด เช่นถ้าเดินเข้าไปร้านอาหารที่ดูแปลกตาอาจจะสงสัยว่า ทำไมเก้าอี้ที่ร้านนี้ต้องวางแบบนี้ ? หรือถ้าในเรื่องานก็อาจจะเข้าใจระบบต่างๆ การเขียนโปรแกรมเป็นหรือไม่เป็นสำหรับ UX Designer ก็ช่วยได้ เพราะจะได้รู้ข้อจำกัดของการพัฒนา&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;Application ไม่จำเป็นต้องทำได้ทุกอย่าง&lt;/span&gt;&lt;/b&gt; แต่ทำสิ่งที่มันควรจะทำได้ตามเป้าหมายให้ที่สุด (Killing Feature เป็นเรื่องสำคัญมาก) อะไรที่มีให้ใช้ก็ควรใช้ อย่าไปดั้นด้นทำเอง ตัวอย่างเช่น Application เราส่งเมล์ได้ มี Mail API ให้ใช้ไหม ? ใช้สิ :P&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;i&gt;&lt;span style="font-size: x-large;"&gt;UX is method change from "like" to "LOVE"&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;วิธีหนึ่งในการ Design UX ที่ดี&lt;/span&gt;&lt;/b&gt;คือ &lt;b&gt;&lt;i&gt;Design Thinking&lt;/i&gt;&lt;/b&gt; นั่นคือให้ทุกคนมานั่งด้วยกัน แจก Post It ให้ทุกคน เขียนปัญหาและวิธีการแก้ปัญหา ซึ่งในขั้นตอนแรกนั้นจะเน้น "ปริมาณ" มากกว่า "คุณภาพ" จากนั้นทุกคนจะเริ่มระดมสมอง อธิบายวิธีที่ตัวเองเสนอมา ก็จะสามารถ จัดเรียง/จัดหมู่ วิธีการแก้ปัญหาได้และ "คุณภาพ" จะตามมาเอง&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;User บอกสิ่งที่เขา 'want' แต่ไม่ได้บอกสิ่งที่เขา 'need'&lt;/span&gt;&lt;/b&gt; กระบวนการ UX จะดึงสิ่งที่เขา 'need' ออกมาจริงๆ เช่นเหตุการณ์ดังต่อไปนี้&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;UXer&lt;/b&gt;: คุณป้าต้องการอะไรครับ ?&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ป้า&lt;/b&gt;: ป้าต้องการสะพาน&lt;/li&gt;
&lt;li&gt;&lt;b&gt;UXer&lt;/b&gt;: ได้ครับ แต่เดี๋ยวก่อนนะครับ คุณป้าจะใช้สะพานข้ามไปไหนหรือครับ ?&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ป้า&lt;/b&gt;: ป้าปวดท้องน่ะ&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;UXer&lt;/b&gt;: ไม่ต้องใช้สะพานก็ได้ครับ ถ้าคุณป้าปวดท้อง เดินอ้อมไปหน่อยก็เจอโรงพยาบาลแล้วครับ&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ป้า&lt;/b&gt;: ป้าปวดท้องห้องน้ำน่ะ ไม่ต้องไปโรงพยาบาลหรอก&lt;/li&gt;
&lt;li&gt;&lt;b&gt;UXer&lt;/b&gt;: อ๋อออออออออ ห้องน้ำอยู่ด้านหลังนี่เองครับ เดินตามผมมา เดี๋ยวผมพาไปครับ&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
เราจะเห็นว่าบางที User ก็บอกไม่ได้ว่าจริงๆ แล้วเขาต้องการอะไรเนื่องจากปัจจัยต่างๆ จากเหตุการณ์นี้สุดท้ายแล้วก็ไม่จำเป็นที่ต้องสร้างอะไรเลย &lt;b&gt;สิ่งที่ป้าแก Need คือห้องน้ำ&lt;/b&gt; แต่ตอนแรกแกไม่รู้ :)&lt;/div&gt;
&lt;br /&gt;
เท่าที่ผม Note ได้ก็มีเท่านี้ครับ หยิบ Macbook Air ขึ้นมา Mockup Data กันเลยทีเดียว&lt;br /&gt;
ถ้าศัพท์หรือข้อมูลตรงไหนผิด ก็ comment กันมาได้นะครับ ยินดีจะรีบแก้ไขให้ :)&lt;br /&gt;
จนหมดวัน ผมนัดเพื่อนไปปิดท้ายกันที่ &lt;b&gt;After You, Siam Paragon&lt;/b&gt; ไปจัด I Love You Toast กัน&lt;br /&gt;
อร่อยมากเลย ขอลงภาพทิ้งท้ายไว้นะครับ :P&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-bpeVbzdu1b4/USZo5NAqQNI/AAAAAAAADjw/AliEwme6n5s/s1600/DSC04498.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://2.bp.blogspot.com/-bpeVbzdu1b4/USZo5NAqQNI/AAAAAAAADjw/AliEwme6n5s/s400/DSC04498.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
</description><link>http://www.macbaszii.com/2013/02/18-start-it-up-power-it-up-3.html</link><author>noreply@blogger.com (Kiattisak Anoochitarom)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-9fpbF1J3au0/USUeTQQ9UxI/AAAAAAAADjM/z_1VvfsKu8Q/s72-c/DSC04477.jpg" height="72" width="72" /><thr:total>2</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7237929072659768518.post-8662096018754138898</guid><pubDate>Wed, 20 Feb 2013 04:12:00 +0000</pubDate><atom:updated>2013-02-20T11:32:33.153+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">cidetector</category><category domain="http://www.blogger.com/atom/ns#">resizing</category><category domain="http://www.blogger.com/atom/ns#">core image</category><category domain="http://www.blogger.com/atom/ns#">ios</category><category domain="http://www.blogger.com/atom/ns#">ios dev</category><category domain="http://www.blogger.com/atom/ns#">detection</category><category domain="http://www.blogger.com/atom/ns#">uiimage</category><category domain="http://www.blogger.com/atom/ns#">resize</category><category domain="http://www.blogger.com/atom/ns#">face</category><category domain="http://www.blogger.com/atom/ns#">detector</category><title>[iOS Dev] Face Detection with Core Image (Part II)</title><description>&lt;div class="separator" style="clear: both; text-align: -webkit-auto;"&gt;
มาต่อกันนะครับ Blog ที่แล้วเราทำการ Detect ได้จุดของวัตถุต่างๆ ละ&amp;nbsp;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: -webkit-auto;"&gt;
คราวนี้เราจะทำการวาดกรอบของสิ่งที่เรา Detect ได้กัน&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: -webkit-auto;"&gt;
ผลลัพธ์ที่ได้ก็ประมาณนี้นะ&amp;nbsp;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-z6vynBJHSy4/URdLhqHdlWI/AAAAAAAADgQ/kV9l49__P3k/s1600/480162_611626238852686_384459722_n.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://1.bp.blogspot.com/-z6vynBJHSy4/URdLhqHdlWI/AAAAAAAADgQ/kV9l49__P3k/s640/480162_611626238852686_384459722_n.jpg" width="340" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: -webkit-auto;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;span style="text-align: -webkit-auto;"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style="text-align: -webkit-auto;"&gt;ปัญหาแรกที่จะเกิดขึ้นและทำให้งงคือ Coordinates System ของ UIKit และ Core Image นั้นต่างกัน&lt;/span&gt;&lt;br /&gt;
&lt;span style="text-align: -webkit-auto;"&gt;และทำให้ใครหลายคน (รวมทั้งตัวผมเอง) งง และเกิด Bug ไปอ่าน Entry นี้กันก่อนนะ :)&lt;/span&gt;&lt;br /&gt;
&lt;h1 class="title entry-title" itemprop="name" style="background-color: #fafafa; color: #333333; display: table-cell; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 20px; font-weight: normal; margin: 0px; padding: 0px 40px 0px 0px; position: relative; text-align: center; vertical-align: middle; width: 670px;"&gt;
&lt;span style="font-size: large; text-align: -webkit-auto;"&gt;&lt;a href="http://www.macbaszii.com/2013/02/ios-dev-uikit-and-core-image.html"&gt;[iOS Dev] UIKit and Core Image Coordinates System&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;span style="text-align: -webkit-auto;"&gt;เราได้ทำการกะขนาดของ ปาก และ ตา ไว้ดังนี้ (โดยอ้างอิงจากขนาดของใบหน้า)&lt;/span&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-N07ZhLRXUwU/URdJqaPq-OI/AAAAAAAADfo/1NGgel3CRaM/s1600/Screen+Shot+2556-02-10+at+2.16.58+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="62" src="http://1.bp.blogspot.com/-N07ZhLRXUwU/URdJqaPq-OI/AAAAAAAADfo/1NGgel3CRaM/s320/Screen+Shot+2556-02-10+at+2.16.58+PM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
จากนั้นผมก็จะทำการวาดกรอบของ Face Feature ต่างๆ ซึ่งนี่แแหละ เป็นเรื่องที่ยุ่งยาก เพราะจะวาดเลยก็ไม่ได้เนื่องจาก Coordinates System ไม่เหมือนกัน ตามที่กล่าวไปข้างต้น (Code ส่วนนี้เป็นส่วนหนึ่งของ - (void)faceDetection; ใน Part I)&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-8JEDkf88Q84/URdKfe3E7hI/AAAAAAAADgE/4DhvrCb1iRs/s1600/Screen+Shot+2556-02-10+at+2.21.13+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-8JEDkf88Q84/URdKfe3E7hI/AAAAAAAADgE/4DhvrCb1iRs/s1600/Screen+Shot+2556-02-10+at+2.21.13+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
และเรื่อง Coordinates System ของ UIKit และ Core Image นั้นไม่เหมือนกัน จึงต้องทำการแปลงให้เรียบร้อยก่อน ซึ่งผมก็แยกเขียน method การแปลงจุดและกรอบออกมา&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-28Q4eUqV__0/URdJMNjMs7I/AAAAAAAADfg/RCFKryOy2sg/s1600/Screen+Shot+2556-02-10+at+2.14.33+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-28Q4eUqV__0/URdJMNjMs7I/AAAAAAAADfg/RCFKryOy2sg/s1600/Screen+Shot+2556-02-10+at+2.14.33+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style="text-align: left;"&gt;ส่วนเรื่องการวาด ตอนแรกผมนั่งมึนว่าจะใช้อะไรวาดดี = =' ลองใช้ Quartz 2D แล้วสำหรับผมคงยากไป ... ไม่ชอบเลย เลยสดโดยใช้ UIView นี่แหละครับ ง่ายดี ใครอยากวาดวงกลมก็ใช้ QuartzCore Framework ปรับ Corner Radius นะครับ :)&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-k725gVKval8/URdMHey4RBI/AAAAAAAADgg/l_lLnF1LVWM/s1600/Screen+Shot+2556-02-10+at+2.28.15+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-k725gVKval8/URdMHey4RBI/AAAAAAAADgg/l_lLnF1LVWM/s1600/Screen+Shot+2556-02-10+at+2.28.15+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style="text-align: left;"&gt;&lt;br /&gt;&lt;/span&gt;
</description><link>http://www.macbaszii.com/2013/02/ios-dev-face-detection-with-core-image_20.html</link><author>noreply@blogger.com (Kiattisak Anoochitarom)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-z6vynBJHSy4/URdLhqHdlWI/AAAAAAAADgQ/kV9l49__P3k/s72-c/480162_611626238852686_384459722_n.jpg" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7237929072659768518.post-8734849456525838253</guid><pubDate>Wed, 20 Feb 2013 04:10:00 +0000</pubDate><atom:updated>2013-02-20T11:18:35.844+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">cidetector</category><category domain="http://www.blogger.com/atom/ns#">resizing</category><category domain="http://www.blogger.com/atom/ns#">core image</category><category domain="http://www.blogger.com/atom/ns#">ios</category><category domain="http://www.blogger.com/atom/ns#">ios dev</category><category domain="http://www.blogger.com/atom/ns#">detection</category><category domain="http://www.blogger.com/atom/ns#">uiimage</category><category domain="http://www.blogger.com/atom/ns#">resize</category><category domain="http://www.blogger.com/atom/ns#">face</category><category domain="http://www.blogger.com/atom/ns#">detector</category><title>[iOS Dev] Face Detection with Core Image (Part I)</title><description>การทำ &lt;b&gt;Face Feature Detection&lt;/b&gt; บน iOS นั้น ไม่ยากเลย เพราะมีของให้ใช้อยู่แล้ว&lt;br /&gt;
พระเอกในงานนี้ก็คือ &lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;Core Image&lt;/span&gt;&lt;/i&gt;&lt;/b&gt; ซึ่งเป็น Library ที่ถูกบรรจุมาตั้งแต่ iOS 5 SDK&lt;br /&gt;
และสิ่งที่เราใช้ในการ Detection ก็คือ &lt;b&gt;&lt;i&gt;CIDetector&lt;/i&gt; Class&lt;/b&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-BC2Z_xYwa6Q/URdRMHP06LI/AAAAAAAADhE/kTEtmLE2usM/s1600/core-value.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-BC2Z_xYwa6Q/URdRMHP06LI/AAAAAAAADhE/kTEtmLE2usM/s1600/core-value.gif" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
โดย &lt;b&gt;CIDetector&lt;/b&gt; สำหรับการทำ Face Feature Detection จะสามารถ Detect ได้ 4 อย่าง&lt;br /&gt;
นั่นคือ &lt;b&gt;กรอบหน้า (Face Rectangle), ปาก (Mouth), ตาซ้าย (Left Eye) &lt;/b&gt;และ&lt;b&gt; ตาขวา (Right Eye)&lt;/b&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
ขั้นแรกก็จัดการสร้าง UIImageView และใส่ภาพที่ต้องการลงไป&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;span style="color: red; text-align: -webkit-auto;"&gt;&lt;span style="color: red;"&gt;** ก่อนที่จะใส่ภาพ เราควรจะย่อภาพให้เท่ากับขนาดของ UIImageView ซะก่อน&lt;/span&gt; เนื่องจาก Core Image จะใช้ขนาดต้นฉบับของภาพ ซึ่งไม่ตรงกับที่เราเห็นบน UIImageView แล้วจะทำให้การ Detect เกิดความผิดพลาด &lt;span style="color: red;"&gt;(Code ของการย่อภาพอยู่ใน Part II)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-agTH5U12Fig/URdHcMnrA4I/AAAAAAAADfI/MbW-XYnGZKc/s1600/Screen+Shot+2556-02-10+at+2.07.57+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-agTH5U12Fig/URdHcMnrA4I/AAAAAAAADfI/MbW-XYnGZKc/s1600/Screen+Shot+2556-02-10+at+2.07.57+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
ส่วนวิธีการทำ Face Detection ก็ไม่ยากเลยครับ ใช้ Code เพียงเท่านี้เอง&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-6EI9is3b18E/URdKA7OJPxI/AAAAAAAADfw/W2YQWiAwfXM/s1600/Screen+Shot+2556-02-10+at+2.19.12+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-6EI9is3b18E/URdKA7OJPxI/AAAAAAAADfw/W2YQWiAwfXM/s1600/Screen+Shot+2556-02-10+at+2.19.12+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
แค่นี้เราก็จะได้ &lt;b&gt;NSArray&lt;/b&gt; ของ &lt;b&gt;CIFaceFeature Object&lt;/b&gt; มาใช้งานแล้วล่ะครับ&lt;br /&gt;
ต่อไปเราจะมาวาดกรอบให้ใบหน้า, ปาก, ตาซ้าย และ ตาขวานะครับ&lt;br /&gt;
ซึ่งผมตัดสินใจแยกออกไปอีก Blog (ผมกลัวคนอ่านตาลายกับ Code)</description><link>http://www.macbaszii.com/2013/02/ios-dev-face-detection-with-core-image.html</link><author>noreply@blogger.com (Kiattisak Anoochitarom)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-BC2Z_xYwa6Q/URdRMHP06LI/AAAAAAAADhE/kTEtmLE2usM/s72-c/core-value.gif" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7237929072659768518.post-5301384831479186878</guid><pubDate>Fri, 15 Feb 2013 04:03:00 +0000</pubDate><atom:updated>2013-02-16T02:06:48.529+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">bounds</category><category domain="http://www.blogger.com/atom/ns#">ci</category><category domain="http://www.blogger.com/atom/ns#">coordinates</category><category domain="http://www.blogger.com/atom/ns#">core image</category><category domain="http://www.blogger.com/atom/ns#">ios</category><category domain="http://www.blogger.com/atom/ns#">ios dev</category><category domain="http://www.blogger.com/atom/ns#">uikit</category><category domain="http://www.blogger.com/atom/ns#">uiimage</category><title>[iOS Dev] UIKit and Core Image Coordinates System</title><description>นั่งดู &lt;b&gt;Get Started with Core Image&lt;/b&gt; ซึ่งเป็น Session หนึ่งของ WWDC 2012 ครับ&lt;br /&gt;
ร้อนวิชา อยากทำ Face Detection เลยลองเล่นดู พบความปวดหัวเรื่องหนึ่งนั่นคือ Coordinates&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-5nVyeo12jvc/URiswNI1z1I/AAAAAAAADiw/U4W65IuEYpw/s1600/Screen+Shot+2556-02-11+at+3.32.41+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-5nVyeo12jvc/URiswNI1z1I/AAAAAAAADiw/U4W65IuEYpw/s1600/Screen+Shot+2556-02-11+at+3.32.41+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
ซึ่ง Coordinates หรือจุดอ้างอิงต่างๆ บน View นั้น (Blog นี้จะกล่าวถึงจุด origin)&lt;br /&gt;
Coordinates ของ UIKit และ Core Image นั้นแตกต่างกันนะครับ&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;UIKit's Coordinates System&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
ก็เป็นแบบที่เราคุ้ยเคยกันดี ว่าจุด origin นั้น&lt;br /&gt;
จะอยู่มุมซ้ายบนหรือเรียกอย่างเป็นทางการว่า "Upper Left Origin Coordinates System"&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-ic4Vms-X-aU/URcylOawy0I/AAAAAAAADeo/7pZHOCNBYoQ/s1600/Screen+Shot+2556-02-10+at+12.38.40+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-ic4Vms-X-aU/URcylOawy0I/AAAAAAAADeo/7pZHOCNBYoQ/s1600/Screen+Shot+2556-02-10+at+12.38.40+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;Core Image Coordinates System&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
ส่วน Core Image จะต่างออกไป โดยรูปที่เรานำมา Process&lt;br /&gt;
จะมี Coordinates space เป็นของตัวเอง&amp;nbsp;และจุด origin ของรูปจะอยู่ที่มุมซ้ายล่าง&lt;br /&gt;
"Lower Left Origin Coordinates System" ซึ่งจะใช้ใน Core Graphics ด้วยเช่นกัน&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-C2Uaep8TkJI/URcyrEBSBdI/AAAAAAAADew/WX9aQvxlKiM/s1600/Screen+Shot+2556-02-10+at+12.39.06+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-C2Uaep8TkJI/URcyrEBSBdI/AAAAAAAADew/WX9aQvxlKiM/s1600/Screen+Shot+2556-02-10+at+12.39.06+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
ดังนั้นเวลาเราได้จุดจากการทำ Detection บน Core Image&lt;br /&gt;
เราก็ยังไม่สามารถนำมาวาดบน UIKit Element (UIImageView, UIView) ได้ทันที&lt;br /&gt;
จะต้องแปลงก่อน&amp;nbsp;โดยจะต้องใช้ Matrix การแปลงตามนี้&lt;br /&gt;
&lt;span style="color: red;"&gt;** (ใครเคยเรียน Image Processing มาจะดู Matrix พวกนี้ออกได้ไม่ยากเย็นนัก :)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-yz2L31X9IF0/URcv48Wn2xI/AAAAAAAADeE/ZVMRUkHyEmw/s1600/png-1.latex.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="132" src="http://3.bp.blogspot.com/-yz2L31X9IF0/URcv48Wn2xI/AAAAAAAADeE/ZVMRUkHyEmw/s400/png-1.latex.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;ui = UIKit, ci = Core Image, h = height of image&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
โดยในการแปลงนั้นก็ไม่ได้ยากอย่างที่คิด เนื่องจาก iOS SDK จัดของพวกนี้มาให้หมดแล้ว นั่นคือ &lt;b&gt;CGAffineTransform &lt;/b&gt;ที่เราคุ้นเคยกันดีนั่นเอง&lt;b&gt;&amp;nbsp;&lt;/b&gt;โดยแปลงได้ทั้ง Rect ทั้ง Point เลยทีเดียว&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-xTsE56uRB6g/URcxenlnORI/AAAAAAAADeQ/JnOQQpMbcVo/s1600/Screen+Shot+2556-02-10+at+12.34.24+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-xTsE56uRB6g/URcxenlnORI/AAAAAAAADeQ/JnOQQpMbcVo/s1600/Screen+Shot+2556-02-10+at+12.34.24+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
ลองนำไปใช้กันนะครับ :) เจอกัน Entry หน้า Facial Recognition&lt;br /&gt;
&lt;br /&gt;</description><link>http://www.macbaszii.com/2013/02/ios-dev-uikit-and-core-image.html</link><author>noreply@blogger.com (Kiattisak Anoochitarom)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-5nVyeo12jvc/URiswNI1z1I/AAAAAAAADiw/U4W65IuEYpw/s72-c/Screen+Shot+2556-02-11+at+3.32.41+PM.png" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7237929072659768518.post-4908660698411650300</guid><pubDate>Mon, 11 Feb 2013 08:18:00 +0000</pubDate><atom:updated>2013-02-11T15:18:45.795+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">cli</category><category domain="http://www.blogger.com/atom/ns#">reboot</category><category domain="http://www.blogger.com/atom/ns#">sleep</category><category domain="http://www.blogger.com/atom/ns#">command line</category><category domain="http://www.blogger.com/atom/ns#">shutdown</category><category domain="http://www.blogger.com/atom/ns#">mac</category><category domain="http://www.blogger.com/atom/ns#">terminal</category><title>Shutdown Reboot and Sleep Mac using Terminal</title><description>ปัญหาของผมในวันนี้คือ ... ที่บ้านมีจอ LED 23" อยู่ เวลาใช้งานปกติ&lt;br /&gt;
ไม่ได้เขียนโปรแกรมที่ต้องใช้งาน 2 จอ ผมก็จะปิด Macbook Air แล้วใช้จอใหญ่เล่นเท่านั้น&lt;br /&gt;
&lt;br /&gt;
ก็จะมี Apple Wireless Keyboard และ Magic Mouse แยกไป&lt;br /&gt;
ปัญหาคือ เวลาจะลุกออกไปไหนนานๆ สิ่งที่ปิด สิ่งแรกคือ Mouse และบางครั้ง&lt;br /&gt;
ถ้าเผลอปิด Mouse ก่อนจะไม่สามารถ Shutdown หรือ Sleep ได้ ต้องเปิด Mouse เพื่อทำใหม่&lt;br /&gt;
&lt;br /&gt;
แต่ Keyboard ยังเปิดอยู่ตลอดนี่ ก็เลยหาวิธีทำผ่าน Terminal ซึ่งก็ไม่ได้ยากเลย คำสั่งบรรทัดเดียว&lt;br /&gt;
โดยในแต่ละคำสั่งจะต้องใช้คำสั่ง sudo (Super User) ดังนั้นก็ต้องใส่ Password เครื่องด้วยนะ (ถ้ามี)&lt;br /&gt;
เวลาพิมพ์ Password ก็จะมองไม่เห็นนะ พิมพ์เสร็จก็กด Enter ซะ&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Shutdown Immediately&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-RHjru_GPfMs/UQVPFSGxWSI/AAAAAAAADb0/4zBtEgbxRtA/s1600/Screen+Shot+2556-01-27+at+10.58.55+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-RHjru_GPfMs/UQVPFSGxWSI/AAAAAAAADb0/4zBtEgbxRtA/s1600/Screen+Shot+2556-01-27+at+10.58.55+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;span style="text-align: -webkit-auto;"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;Reboot Immediately&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-M0NOoCmA3rA/UQVPHyRNixI/AAAAAAAADcM/pbuGSsTKilY/s1600/Screen+Shot+2556-01-27+at+10.59.10+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-M0NOoCmA3rA/UQVPHyRNixI/AAAAAAAADcM/pbuGSsTKilY/s1600/Screen+Shot+2556-01-27+at+10.59.10+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b&gt;&lt;i&gt;&lt;span style="font-size: large;"&gt;Sleep Immediately&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-7eCHxHdndoc/UQVPGoVpvvI/AAAAAAAADb8/IOFAnnl95OQ/s1600/Screen+Shot+2556-01-27+at+10.59.22+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-7eCHxHdndoc/UQVPGoVpvvI/AAAAAAAADb8/IOFAnnl95OQ/s1600/Screen+Shot+2556-01-27+at+10.59.22+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
คำสั่งด้านบนจะมี &lt;b&gt;now&lt;/b&gt; เป็น argument ตัวสุดท้าย หมายความว่า &lt;b&gt;"ทันที"&lt;/b&gt; แต่ถ้าเราอยากตั้งเวลาก่อน ก็ให้เปลี่ยน now เป็น&amp;nbsp;+ แล้วตามด้วยจำนวนเวลาก่อนที่คำสั่งจะทำงานมีหน่วยเป็น &lt;b&gt;"นาที"&lt;/b&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-aMV4AdsBAMA/UQVPHMdqlsI/AAAAAAAADcE/L2FFv6_pQxk/s1600/Screen+Shot+2556-01-27+at+10.59.33+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-aMV4AdsBAMA/UQVPHMdqlsI/AAAAAAAADcE/L2FFv6_pQxk/s1600/Screen+Shot+2556-01-27+at+10.59.33+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
หรือถ้าต้องการตั้งเวลาที่แน่นอนก็ใส่ argument อีกแบบครับ โดยจะอยู่ในรูปแบบสายอักขระของตัวเลข&lt;br /&gt;
ตามนี้ --&amp;gt; &lt;b&gt;ปีเดือนวันเวลา (24 format)&lt;/b&gt; ในทีนี้คือ ให้ Sleep ในวันที่ 27 มกราคม 2013 เวลา 16.45 น.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-7DWLi_d1c5M/UQVQ3r8fkkI/AAAAAAAADck/ALL5pnWcX_o/s1600/Screen+Shot+2556-01-27+at+11.07.41+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-7DWLi_d1c5M/UQVQ3r8fkkI/AAAAAAAADck/ALL5pnWcX_o/s1600/Screen+Shot+2556-01-27+at+11.07.41+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;
เท่านี้เอง เทคนิคง่ายๆ ลองนำไปใช้กันนะ :) ปัญหาอาจจะไม่ได้แบบผม แต่แค่ทำเป็นก็เท่แล้วนะ 5555&lt;br /&gt;
&lt;br /&gt;</description><link>http://www.macbaszii.com/2013/02/shutdown-reboot-and-sleep-mac-using.html</link><author>noreply@blogger.com (Kiattisak Anoochitarom)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-RHjru_GPfMs/UQVPFSGxWSI/AAAAAAAADb0/4zBtEgbxRtA/s72-c/Screen+Shot+2556-01-27+at+10.58.55+PM.png" height="72" width="72" /><thr:total>1</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item></channel></rss>
