แม้ว่าจะไม่ได้แก้ปัญหา Remote หาย แต่น่าจะแก้ปัญหาเรื่องปุ่มมากมายบน remote ได้
เห็นถึงความพยายาม แต่ถ้าทำเป็น wii remote หรือไม่ต้องมีปุ่มเลยน่าจะดีกว่ามากทีเดียว
ที่มา: งาน Japan CEATEC 2008
ได้เวลาไล่ตาม seam เสียที
ที่สำคัญตอนนี้ปัญหาเรื่อง OpenID ที่คาราคาซังมานานก็แก้ได้แล้วครับ คาดว่าจะตาไป update เวบสหาย 66 ทั้งหมดให้เสียทีครับ
ผมรัก Spring เข้าเลือดเลย แต่ทั้งนี้ทั้งนั้นเราอาจจะพูดถึง spring ในเรื่องของการทำ services และ การทำ integration เสียมากนะครับ ส่วนในเรื่องของการทำ presentation นั้นเป็นเรื่องที่ต่างคนต่างใช้ตามถนัดน่าจะดีนะครับ
การเรียนแบบ Learning By Doing น่าจะเป็นการเีรียนรู้ที่ไม่น่าเบื่อที่สุดสำหรับการเรียนเรื่อง Development Framework ดังนั้นบทความใน series นี้จะเป็นเรื่องของการสอน spring แบบสนุกๆกันเพื่อให้ทุกคนสามารถเข้าใจ spring ได้ง่ายขึ้น โดยที่เรามากำหนด environment พื้นฐานกันก่อนว่าการเรียนการสอนของเราจะใช้อะไรบ้าง
jdk 1.5 ขึ้นไป
maven2 ขึ้นไป
netbeans6.1 ขึ้นไป (แต่อันนี้แล้วแต่สะดวกนะครับ)
spring2.5 ขึ้นไป
ก่อนอื่นใครไม่รู้จัก Maven ขอให้ไปอ่านทำความเข้าใจที่เวบของ Maven เองนะครับ โดยการใช้ Maven จะช่วยเหลือเรามากๆในเรื่องของการบริหาร project structure และเรื่องของ library dependency ที่เป็นเรื่องที่น่ากลัวมากสำหรับคนที่เขียน Java ไม่คล่องเพราะมันจะใช้ Library เยอะมากจนน่าปวดหัวแถมมีหลาย version ด้วย ดังนั้นการใช้ Maven จะทำให้เราลืมเรื่องพวกนี้ไปได้เลย
เริ่มด้วยการสร้าง Project แบบว่างๆโล่งก่อนนะครับ โดยให้ทุกท่านพิมพ์คำสั่งนี้ลงไปในที่ที่ต้องการ
mvn archetype:create -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.spring66.tutorial -DartifactId=spring66-app
จากนนั้นเราจะได้โปรเจคชื่อ spring66-app มาพร้อมทั้งมี packeage [...]
ก่อนอื่นก่อนที่จะเข้าเนื้อหาจริงๆของ spirng เราควรรู้จัก product ในสายสปริงให้หมดก่อนว่ามอะไรบ้าง แต่ละตัวมีความสามารถอะไรบ้างพอสังเขป เนื่องจากข้อมูลเหล่านี้จะได้เป็นประโยชน์กับเราในการตัดสินใจใช้งาน product แต่ละตัวได้อย่างถูกต้อง จากข้อมูลปัจจุบันนั้นผลิตภัณท์ของ spirngsource นั้นมีด้วยกันทั้งหมด 16 ตัว(ทางการ) และรอเข้าคิวเปิดตัวอยู่อีกสองสามตัว เริ่มจากที่เป็นทางการก่อนแล้วกันครับ
Spring Framework พี่ใหญ่ของเรา IOC container ที่ได้รับการยอมรับว่าดีที่สุดในโลกสามารถเอาทุกอย่างมาแปะติดเป็น service ได้เกือบหมดโลก ช่วยให้เราเขียนโค้ดได้ง่ายขึ้นมากๆ
Spring Web Flow เป็นส่วนต่อเติมของ Spring MVC ที่ช่วยใ ห้เtราสามารถสร้าง Controllers ที่มีความสามารถใuนการใsช้งาน domain-specific-language. โดยที่ DSL นี้ถูกออกแบบมาใ ห้ผู้ใlช้สามารถสร้างระบบที่มี state ที่ซับซ้อนไ ด้อย่างง่ายดายแnละสะดวกขึ้น
Spring BlazeDS Integration เป็นส่วนเติมเต็มของ spring ในการทำ Rich Internet Application ด้วย Flex และสามารถทำงานร่วมกับ Adobe BlazeDS ได้อย่างดี
Spring Web Services [...]
เอกสารนี้เขียนไว้ที่ thaidev.org ครับเมื่อประมาณสี่ปีที่แล้วเป็นจุดเริ่มต้นที่ผมเริ่มศึกษาสปริง เนื่องจากทุก IOC คือแก่นของสปริงดังนั้นใครจะใช้สปริงไม่รู้เรื่อง IOC เนี่ยโคตรบาป ขอเอามาแปะในนี้ต่อนะครับ
Inversion of control or Dependency Injection
เอกสารนี้มีต้นตอมาจาก http://martinfowler.com/articles/injection.html ครับ
เนื่องจากปัจจุบันมีการกล่าวขวัญถึง Lightweight Container กันมากขึ้นในกลุ่มผู้ใช้จาวาและมีการสร้าง container แบบนี้หลายโปรเจคแต่จริงๆแล้วโปรเจคเหล่านี้ได้ทำตามแนวคิดของ Design Pattern ที่ชื่อ Dependency Injection หรือ Inversion of Control
แนวคิดต่างๆนี้พรั่งพรูออกมาในกลุ่มคนชอบเปิดเผย (Open Source) เพื่อที่จะหาทางเลือกอะไรสักอย่างที่สามารถเข้ามาแทนผลิตภัณฑ์หลักที่แสนจะซับซ้อนของ J2EE แนวคิดหลักๆคือจะรวมเอาองค์ประกอบหลักๆของการทำเวบที่ต่างกันเข้าด้วยกันได้อย่างไรยกตัวอย่างเช่นจะรวมเอาเวบคอมโปเนนท์ กับเดต้าเบสคอมโปเนนท์ที่ทำมาจากเทคโนโลยีที่ต่างกันเข้าได้อย่างไร บางโปรเจคไม่สามารถแก้ไขปัญหานี้ได้แต่ในทางกลับกันบางโปรเจคสามารถแก้ไขปัญหานี้ได้ด้วยความสามารถในการรวมคอมโปเนนท์ต่างๆเข้าด้วยกันเป็นชั้นๆไปเช่น PicoContainer หรือ Spring
Component และ Service
ก่อนที่จะเข้าสู่เรื่องของ Inversion Of Control จะขอทำความเข้าใจความแตกต่างระหว่าง Component และ Service ในมุมมองของ Martin Fowler เสียก่อน จริงๆแล้วทั้งสองอย่างเหมือนกันตรงที่ต่างเป็นก้อนของซอฟท์แวร์ที่ทำหน้าที่ใดหน้าที่หนึ่งโดยเฉพาะและไม่สามารถหรือยากที่จะเปลี่ยนแปลง แต่สิ่งที่ทำให้สองสิ่งแตกต่างกันคือ [...]
KDE แบ่งกลุ่มผู้ใช้ออกมาแบบนี้ทำให้การสนทนาผ่าน Mailing list ง่ายขึ้นมากทีเดียว เพราะสามารถบอกได้ว่าข้อเสนอนั้นเหมาะกับ A และต้องแก้ไขอย่างไรเพื่อให้เหมาะกับกลุ่ม B ผมตามอ่าน Usability ของ Gnome มาพักใหญ่ ข้อถกเถียงทุกอันต่างมีเหตุผล และมีข้อดีข้อเสีย แต่การให้คะแนน หรือแบ่งกลุ่มข้อดีข้อเสียกลับทำได้ยากมาก ทำให้สุดท้ายต้องตัดสินใจด้วยความรู้สึก หรือให้คนที่มีผลงานมากที่สุดตัดสิน
การที่ KDE ตั้งตุ๊กตาของกลุ่มเป้าหมายเป็น 5 กลุ่ม จะเหมือนการสร้างคำศัพท์ขึ้นมาเพื่อใช้อ้างอิงตอนคุยกัน นับว่าเป็นแนวคิดที่ฉลาดมากทีเดียว แต่ปัญหาใต้น้ำที่โผลออกมาทันทีที่ตั้งตุ๊กตา 5 ตัวนี้ขึ้นมา คือความแตกต่างอันมากมายของตุ๊กตาแต่ละตัว
Office Worker ไม่ชอบความตื่นเต้น
Student ของง่ายๆ ควรง่าย
Recreational User ปรับแต่งได้ตามใจ
Decision Maker ผมเลือกใช้ของดี
Geek หงุดหงิดที่อยากลอง แต่ทำไม่ได้
การจะเอาใจ Office Worker และ Geek ไปพร้อมๆ ต้องใช้ความพยายามเป็นหลายเท่า เพราะต้องมีของอยู่บนหน้าจอให้น้อยที่สุดเพื่อให้ Office Worker เข้าใจการทำงานของระบบให้เร็วที่สุด แต่นั่นทำให้ Geek หงุดหงิดทันทีเพราะสิ่งที่เขาอยากให้มีจะไม่มี หรือต้องคอยเปิดขึ้นมาเมื่อต้องการใช้ เหมือนการเอา [...]
ZK เป็น framework แบบ event-driven และ component-based ช่วยในการสร้าง rich user interfacs สำหรับ Web applications. ZK ประกอบด้วย AJAX-based event-driven engine , XUL และ XHTML components และ markup language ที่เรียกว่า ZUML (ZK User Interface Markup Language)
ด้วย ZK เราสามารถสร้าง rich interface ได้ด้วย XUL และ XHTML components และ จัดการมัน โดยขึ้นอยู่กับ event ที่ ผู้ใช้งาน กระทำกับ แอพพลิเคชั่น แบบเดียวกับ เดสท็อป แอพพลิเคชั่น ไม่เหมือนกับ [...]
ไปเจอ video เรื่อง Multi-touch ของ Autodesk Labs ครับ เป็น Interface แบบไม่มีเครื่องมีใดๆ อยู่บนหน้าจอ ให้เอานิ้วลองจิ้มๆ เดาๆ เอาเอง
ถ้ามี iPhone Jumbo ออกมา โลกคอมพิวเตอร์คงเปลี่ยนไปน่าดู ไม่รู้ว่าผู้ใช้จะรับได้หรือเปล่า แต่น่าจะช่วยให้งานหลายๆ อย่างง่ายขึ้นอย่างเหลือเชื่อเลยล่ะครับ
เพื่อนๆ ที่เจอ video ดีๆ เอามา Review กันได้นะครับ เขียนอยู่คนเดียว เหงาน่าดู
สวัสดีปีใหม่ครับ ขอให้ทุกคนมีความสุขในการออกแบบ Application ตลอดปี 2009 นะครับ
ก่อนวันหยุดยาวปีใหม่ผมบังเอิญต้อง Update Host ให้กับ User ของ Mysql ผ่าน Mysql-Admin ทำให้เจอบางอย่างน่าสนใจเข้า
ผม Add New Host ให้กับ User คนหนึ่งในระบบ หลังจากที่ผมเห็น Host ปรากฏอยู่ใต้ชื่อ User ก็สบายใจปิดโปรแกรมไป แต่กลายเป็นว่า User คนนั้นยังไม่ได้รับสิทธิ์ มาตรวจสอบอีกทีกลายเป็นว่าต้องกดปุ่ม Apply ก่อน รูปด้านบนแสดงตำแหน่งของปุ่ม Apply ของ Mysql Admin Version Widows (ผมลืมภาพ Version Linux ไว้ที่ office ขอเอาที่หาได้บน google มาแสดงไปก่อน)
ปัญหาของปุ่ม Apply ใน Version Linux และ Windows คือมันสื่อความหมายไม่ครอบคลุมพื้นที่ด้านซ้ายมือ ดังนั้นผู้ใช้อย่างผม [...]
ส่วนของการ Prioritizing design decisions เป็นส่วนที่ผมชอบมากอีกส่วนหนึ่งใน Apple Human Interface Guideline เพราะมันช่วยในการตัดสินใจยากๆ ทำได้อย่างเป็นระบบ ก็การตัดสินใจที่จะตัด feature เจ๋งๆ ออกจากโปรแกรมมันทำได้ยากจริงๆ นะครับ ใน HIG เค้าแบ่งความสำคัญออกเป็นสามระดับ
โปรแกรมที่รองรับความต้องการพื้นฐานของผู้ใช้ก่อน จึงจะถือว่าเป็นโปรแกรมที่ใช้งานได้ แต่ไม่ได้หมายความว่าโปรแกรมนั้นจะรองรับความต้องการที่ผู้ใช้คาดหวังไว้ หากไม่เป็นไปตามที่ผู้ใช้หวัง จะส่งผลให้โปรแกรมไม่ได้รับความนิยม และสร้างความภักดีกับผู้ใช้ไม่ได้ หรือเรียกว่าสร้าง Brand Royalty ไม่สำเร็จ ความคาดหวังของผู้ใช้เป็นจุดชี้วัดความสำเร็จของโปรแกรม การวิเคราะห์ความคาดหวังของผู้ใช้จึงเป็นสิ่งจำเป็นสำหรับคนที่กำลังออกแบบโปรแกรม หากเราต้องตัดสินใจตัดหรือเพิ่มอะไรในโปรแกรมของเรา ผมคิดว่าแนวทางต่อไปนี้จะช่วยได้มากทีเดียวครับ
1. Meet Minimum Requirement
ใน Apple HIG จะพูดถึงการที่โปรแกรมมีความสามารถพื้นฐาน ของ OS เช่นสามารถใช้ Copy & Parse รองรับ Clipboard ของระบบ มีการใช้ Dock และการใช้ Standard controls แต่ผมอยากให้มองอีกมุมหนึ่ง ว่าโปรแกรมของเรารองรับความต้องการพื้นฐานที่โปรแกรมของเราเป็นหรือไม่ [...]
ทางทีมพัฒนา Grails และ SpringSource ได้ปล่อย Grails 1.1 beta 2 ออกมาติดๆ สามารถ Download ได้ที่นี่
ส่วน Features ใหม่ๆ สามารถอ่านได้จากที่นี่
ผมทำการสรุป Features ใหม่ๆ บางส่วนมีดังนี้ครับ
1. GORM มี features เพิ่มเติมดังนี้
- เพิ่ม GORM Event เข้ามาคือ afterInsert, afterUpdate และ afterDelete
- ในการ join table สามารถใช้ String, Integer [ ชนิดข้อมูลทั่วไป ] เช่น
class Person {
static hasMany = [...]
ใครที่่ใช้ linux ที่เป็น debian-based แล้วต้องการจะทดลอง Grails 1.0.4 โดยการไป download ตัว deb package จาก Grails.org แล้วติดตั้งบนเครื่องของท่าน อาจจะเจอปัญหาว่าไม่สามารถสร้าง controller ได้เพราะ version conflict ระหว่าง null กับ null ให้ลองเช็คดูว่า ไฟล์ deb package ใช่ไฟล์ grails_1.0.4-1_all.deb หรือไม่ ถ้าใช่แสดงว่าตัว debian package ที่ไปโหลดมาไม่มีไฟล์ build.properties ให้เรา download ตัว debian package ตัวใหม่กว่า โดยลองดูจากรายการ download จะมี grails ล่าสุดอยู่ ติดตั้งไฟล์ใหม่แล้วลองสร้าง controller ดู จะพบว่าใช้ได้แล้วนะครับ
เผื่อว่าใครเจอปัญหาเดียวกันจะได้ไม่ต้องติดอยู่นานครับ
มีของขวัญวันปีใหม่+คริสต์มาสมาฝากครับ
Merb 2.0 และ Rails 3.0 จะกลายเป็นสิ่งเดียวกัน
ผู้พัฒนาทั้งสองฝั่ง คือ Merb กับ Rails ตัดสินใจ ที่จะพัฒนา framework ทั้งสองตัวนี้ร่วมกัน โดยจะเอาของดีหลักๆ ของ Merb ไปใส่ใน Rails คือ
Agnosticism - คือการไม่ยึดติด เช่น ไม่ชอบ AcitveRecord เอาตัวอื่นได้ไหม
Modularity - คือการแยกเป็นส่วนๆ แยกไปเลยเป็น module ไว้ทำอะไร เวลาเขียน code ก็อย่าให้มันตีกัน
Improved performance - แน่นอน ประสิทธิภาพดีขึ้น เร็วขึ้น
Public API - บังคับให้คนใช้ คือบางกรณี ดันไปเรียก method ที่ protected/private(ไม่เห็นใน API) ไว้ แต่ถ้าที่ protected/private นั้น มีการ update ล่ะ [...]
สำหรับแฟน Dojo ตอนนี้ได้ทดลอง Tatami Toolkit version ใหม่แล้ว
คุณสมบัติใหม่
- License switched from LGPL only to LGPL or Apache License or BSD
- Now relies on latest Dojo 1.2.3 release
- Charting support
- Tree Widget
- Dojo drag and drop can now be used in Tatami
- The border container has been ported, advantageously replacing both
GWT DockPanel and SplitPanels
- Relies on custom [...]
ในรุ่นนี้เน้นการแก้บั๊กและปรับปรุงเรื่องประสิทธิภาพความเร็วเป็นหลัก ครั้นกระนั้นจากครั้งก่อนเคยพูดไว้แล้ว Seam 2.1 นั้นได้เพิ่มฟีเจอร์ใหม่เข้ามาพอสมควร หนึ่งในเรื่องใหญ่ที่สุดก็เรื่อง Seam Security ดูแลทั้งเรื่อง Authentication และ Authorization เรียกได้ว่าปั้นมาเพื่อเป็นมวยชนกับ Spring Acegi ก็ว่าได้
การรองรับ OpenID เป็นหนึ่งในเรื่องที่ถูกใส่เข้าไปไม่ทันในกำหนดการออก 2.1 GA ดังนั้นมันเลยเป็นความสามารถใหม่ที่โผล่เข้ามาใน Seam 2.1.1 GA ครั้งนี้แทน
ฟีเจอร์ย่อยๆ ที่ถูกปรับปรุงเพิ่มเติมอีกส่วนหนึ่งก็คือตัว seam-gen อีกแล้ว เวลาสั่ง seam-gen สร้างโปรเจกต์ใหม่จะรองรับการเปิดโปรเจกต์นั้นด้วย IntelliJ IDEA ด้วย เพราะในขณะนี้ IntelliJ IDEA 8 ได้เพิ่มการรองรับ JBoss Seam ไว้แล้วอย่างเป็นทางการ
สามารถดาวน์โหลด Seam 2.1.1 GA ได้ที่นี่
สำหรับแฟน Hibernate คงรู้จักว่าอะไรคือ Query by Criteria อยู่แล้วนะครับ เพราะเป็นฟีเจอร์ที่มีอยู่นานแล้ว แต่ฟีเจอร์นี้ไม่ได้ถูกครอบคลุมใน JPA 1.0 พอมาถึงคราวจะออก JPA 2.0 ก็มีการถกกันเพื่อนำฟีเจอร์นี้เข้ามาเป็นมาตรฐานเสียที
ก่อนจะถกต่อเรื่อง Criteria แบบ type-safe อธิบายสั้นๆ ว่า Criteria API จะมีประโยชน์อย่างไรบ้าง
ปกติแล้ว ทั้ง Hibernate/JPA ก็มี HQL/JPAQL ให้ใช้ในการ query ข้อมูลที่อยู่ในมุมมองเชิงออบเจ็กอยู่แล้ว แต่วิธีนี้เหมาะกับกรณีที่เรารู้ล่วงหน้าว่าคำสั่ง query คืออะไร อาจมีส่วนที่ต้องไดนามิกบ้างก็เฉพาะค่าพารามิเตอร์บางตัวที่ส่งเข้ามา ซึ่ง HQL/JPAQL ก็รับใช้เราได้ดีในจุดนี้
แต่ก็มีบางกรณีเช่นกันที่เราแทบไม่มีคำใบ้ใดๆ ให้เราเลยว่าคำสั่ง query เหล่านั้นจะหน้าตาเป็นเช่นไร หรือไม่ก็ sample space มันใหญ่จนการเตรียม query ไว้ล่วงหน้าไม่เอื้อต่อการปฏิบัติได้จริง กรณีนี้ความไดนามิกมีสูงกว่ากรณีแรกมาก ถ้าปราศจาก criteria API แล้ว ลำบากเราที่ต้องเผชิญกับ if-else สารพัดและการต่อ String [...]
Groovy :: HTTPBuilder module
HTTPBuilder คือ module ที่ wrapper ของ Apache HttpClient ด้วยภาษา Groovy โดย module นี้ได้แนวคิดเรื่อง request/response model มาจาก prototypejs
โดย module ตัวนี้เป็นเพียง beta version เท่านั้นเนื่องจากมีอีกหลายๆ ส่วนที่ยังไม่อ่านการทดสอบ ดังนั้น ถ้าใครคิดจะเอาไปใช้งานก็ต้องพิจารณาความเสี่ยงด้วยครับ
แต่ผมเอามา overview ให้ดูก่อน เนื่องจากผมก็เป็นคนหนึ่งที่ใช้งาน Apache HttpClient อยู่ประจำเช่นกัน พอเขียนด้วย Groovy แล้วมันจะง่ายกว่าเก่าเยอะครับ
มาดู Feature ของ HTTPBuilder ประกอบไปด้วย
- จะมี Parser ที่สนับสนุน XML, JSON และ HTML
- สนับสนุน GZIP and Deflate content-encoding
- [...]
ไม่ได้เขียนมาพักใหญ่ เนื่องจากต้องเร่งส่งงาน ตอนนี้ส่งเรียบร้อยไประดับหนึ่ง จึงมีเวลาเอาสิ่งที่อยากเขียนมาเขียนซะที วันนี้อยากพูดถึงเว็บไซต์ gotoknow.com ครับ เว็บนี้ผมเข้ามาอ่านประจำแต่พึ่งมีโอกาสได้เขียน comment เมื่อไม่กี่วันมานี้เอง พอเริ่มใช้ฟอร์มใส่ comment ทำให้สัมผัสได้ถึงปัญหา แต่ยังไม่รู้ว่าปัญหาอะไรเลยลองวิเคราะห์ดู
ผมพบว่าฟอร์มนี้ประกอบด้วยสี่ส่วน
1. ส่วนระบุตัวตนของคน comment
2. ส่วนของข้อความที่จะ comment
3. ส่วนยืนยันว่าผู้ถามเป็นคน
4. ปุ่มกดเพื่อบันทึก หรือยกเลิก
พอแยกเป็นช่องๆ ทำให้เห็นว่ากลุ่มแรกระบบ label เป็นแบบซ้ายไปขวาหมด แต่กล่องที่สองและสาม ไม่ได้เป็นแบบเดียวกัน สีเขียวของผมคือเส้นสายตาที่คาดว่าผู้ใช้จะมองตามนี้
label อันที่ 1 กับ 2 อยู่ในที่ตาม concept ครับ ถึงแม้คำว่าชื่อจะอยู่ห้างจากตัว text box ทำให้เล็งยาก แต่เป็นหัวแถวเลยไม่มีปัญหา
label อันที่ 3 จะเหมือนโดนสับขาหลอก เพราะมี label แต่ไม่มีช่องให้กรอก คาดว่าผู้พัฒนามองเป็นอีก attribute หนึ่ง และไม่อยากเอามาไว้ใต้ email เพราะจะทำให้ดูเป็นตัวขยายชุด email ไปซะ อีกปัญหาของ label [...]
ประชาสัมพันธ์เว็บ Django Site of the Week เป็นเว็บที่คลอดลูกคลอดหลานมาจากเว็บ Django Sites เป็นเว็บที่เลือกเว็บสุดยอดที่พัฒนาด้วย Django สัปดาห์ละเว็บ พร้อมด้วย บทสัมภาษณ์ทีมนักพัฒนา โดยสัปดาห์แรกเริ่มที่เว็บ Disqus ที่เป็นเว็บให้บริการระบบ comment สำหรับ blog หรือเว็บอื่น ๆ
เป็นการประกาศที่น่าสนใจที่เดียว เนื่องจาก JBoss เองก็มีสนับสนุน JSF ซึ่งเป็น UI Framework พื้นฐานที่ทำงานร่วมกับ SEAM อยู่แล้ว ซึ่งก็เป็นที่ทราบกันเช่นกันว่า JBoss เองได้มีการใช้งาน GWT ในโครงการ JBPM และ Drools มาได้ระยะเวลาหนึ่งแล้ว คงต้องคอยดูว่าพี่ใหญ่คนนี้จะให้ความสำคัญและสนับสนุน GWT ต่อไปอย่างไร
ที่มา http://blog.softwhere.org/archives/567