Sunday, February 10, 2008

Groovy และภาษาไทย

ผมเคยลองคอมไพล์โปรแกรมภาษา Java ที่ตั้งชื่อคลาสเป็นภาษาไทยไปเมื่อหลายเดือนก่อน และจากนั้นก็ได้ทดลองไปอีก 2-3 ครั้งกับ Groovy แต่ไม่สำเร็จ วันนี้ลองดูอีกรอบหลังจากอ่านเรื่อง easyb

รอบนี้ไปเจอว่าเป็นความสะเพร่าเองที่ไม่อ่านดูให้ดี ๆ ว่าเราสามารถระบุ encoding ให้ groovy และ groovyc ได้จาก command line
$ groovy --encoding UTF-8 Test.groovy

แล้วใน Test.groovy มี class ที่มีชื่อและ method เป็นภาษาไทย ปรากฎว่าทำงานได้ปกติเช่นเดียวกับ Java ครับ

มาถึงตรงนี้กลายเป็นว่ามีทางเลือกเพิ่มขึ้นในการอิมพลีเม้นต์ตัวรัน spec ภาษาไทย ว่าจะใช้ parser ที่ทำไว้แล้วหรือจะทำเป็น DSL ใน Groovy ดี (ตอนนี้เอียงกลับไปหา Groovy DSL) คงอาจจะต้องลองดูความเป็นไปได้อีกพักจึงจะสรุปได้ครับ

การพัฒนาที่ขับเคลื่อนด้วยพฤติกรรม (BDD) ด้วย easyb

easyb พัฒนาโดย Andrew Glover ซึ่งเป็นผู้แต่งร่วมของ Groovy in Action เป็นเฟรมเวิร์คสำหรับการพัฒนาที่ขับเคลื่อนด้วยพฤติกรรม - behaviour driven development หรือ BDD โดยแนวคิดก็คือทำให้ ข้อกำหนด ทำงานได้

easyb ใช้ภาษาเฉพาะทางที่พัฒนาบน Groovy ครับ ในตัวอย่างบนเวบไซต์จะเห็นว่ามีการ generate เรื่องที่เป็นภาษาอังกฤษออกมาจากโค้ดของ easyb ได้ด้วย (คิดว่า rspec ก็คงทำได้แบบเดียวกัน)

ในโลกของ Groovy มี easyb ให้ใช้แล้ว การทวนสอบข้อกำหนดกับลูกค้าเมื่อพัฒนาแอพพลิเคชั่นด้วย Groovy และ Grails คงจะทำได้สะดวกมากขึ้นทีเดียวครับ

Saturday, February 9, 2008

ประมวลเหตุการณ์หลังออก Grails 1.0

ก่อนอื่นต้องของแสดงความยินดีกับ Grails ที่ออกรุ่น 1.0 แ้ล้วครับ :-)

หลังจากชุลมุนกันอย่างหนักในช่วง Grails 1.0 ออก เนื่องจากมีคนพยายามจะ download Grails กันมากเสียจน server Codehaus รับไม่ไหว (ตอนหลังการรีลีส แม้แต่ กิลโยม ลาฟอร์จ ก็บอกว่าโหลดไม่ได้ รอบหน้าสงสัยคงต้องนัดกันก่อนนะครับ) กว่าจะได้ zip และ tar.gz ของ bin มาทำ mirror ก็ resume ด้วย wget -c ไปหลายรอบครับ

พอโหลดเสร็จ ผมก็เป็นคนแรกที่โพสต์ mirror ที่ไม่ broken หลายคนได้ binary ไปแล้วก็ mirror กันต่อ แล้วหลังจากนั้นทุกอย่างก็ไปได้อย่างราบรื่น

อีกไม่ถึงชั่วโมง ผมก็ build ตัว installer เสร็จ พอดีมีคนเอา reference ของ Grails 1.0 ใน format .CHM มา post แทนที่จะได้ release เลย ผมก็ไปขอไฟล์เขามารวมในตัว installer ด้วย แล้วก็ build อีกรอบ
เสร็จแล้วก็แอบเอาลิงค์ไปปะไว้ในหน้า thai grails user ก่ิอนพร้อม ๆ กับ binary หลัก (บางท่านอาจจะแอบเห็น) แ้ล้วก็ติดต่อไปหา กิลโยม เพื่อให้โพสต์ลิงค์เข้าหน้าหลัก คิดว่าตอนนั้น เกรมคงแอบไปหลับแล้วเพราะเงียบไปเลย
;-)

จริง ๆ ก็กะไว้แล้วว่าจะวุ่น แต่ไม่คิดว่าจะวุ่นขนาดนี้
พอไปดูใน stat ของ server จำนวนคน download จาก mirror ผม ก็ปาเข้าไปเป็นพันในช่วงวันเดียว (ถึงวันนี้ 4583 + ~600 ของ installer for Windows และเพิ่มขึ้นเรื่อย ๆ) ก็เลยสรุปว่าได้คร่าว ๆ ว่าทั้งหมดอยู่ในระดับหมื่น download แล้วแน่ ๆ ครับ

สรุปว่า Grails 1.0 เปิดตัวได้ค่อนข้างแรง
บั๊กเล็ก ๆ น้อย ๆ หลุดออกมาบ้าง (ผมเก็บไป 2 แล้ว) แต่คิดว่า 1.0.1 จะออกมาแก้ไขในเวลาไม่นานและตัว snapshot ของ 1.0.1 ก็เสถียรมากด้วยครับ เพราะ feature frozen ไปแล้ว

Monday, December 17, 2007

สคริปต์สำหรับ generate code จาก XMI

สำหรับคนที่ยังไม่รู้จักหรือลืมไปแล้ว (เพราะผมทิ้งช่วงการทำ Geogia ไปประมาณ 3 เดือน) Geogia คือโครงการสำหรับพัฒนาระบบ ERP บน Grails โดยใช้แนวทางแบบ MDA รวมกับ domain-driven ที่มีอยู่ใน Grails

ตอนนี้ผม update ตัวโปรเจ็คอีกนิดหน่อยโดยเพิ่มสคริปต์สำหรับการสร้าง code ลงไปในตัว grials app ของ Geogia ซึ่งจะทำให้ภาพรวมของการพัฒนาง่ายขึ้น
โดย
- เพิ่ม script ตอนนี้หากใช้คำสั่ง 'grails xmi-gen' และตามด้วยชื่อ UML model, ตัว generate ก็จะสร้างไฟล์ .groovy ลงไปใน grails-app/domain ให้ซึ่งจะใช้ template จากไดเร็กทอรี่ src/java/templates
- เพิ่ม lib ที่เป็น dependency ของ GroovyMDA ลงไปในตัว grails app ของ Geogia
- ไฟล์ .zargo สำหรับเก็บ UML model จะวางไว้ในไดเร็กทอรี่ชื่อ uml

ผม fork ตัว GroovyMDA ออกมาทั้งตัว โดยใช้ revision 20 เพราะคิดว่าเท่านี้ก็น่าจะเพียงพอกับการใช้งานในการ generate code ทั่ว ๆ ไปของ Geogia แล้ว
อีกหนึ่งเหตุผลในการ fork ก็คือ Groovy เปลี่ยนไปเป็น 1.5 แล้ว แต่ binary ของ GroovyMDA ยังนิ่ง ๆ อยู่ การเอา source มา integrate ลองไปใน project เลย โดยให้เป็นกึ่ง ๆ plugin น่าจะยืดหยุ่นกว่า

Wednesday, December 12, 2007

Grails 1.0 RC3 และตัวติดตั้งบน Windows

Grails 1.0 RC3 ออกมาแล้วครับ
ปลายอาทิตย์นี้คงได้เห็น RC4 และก่อนปิดคริสต์มาส เราอาจได้มีโอกาสยลโฉมตัว 1.0 กัน

ตอนนี้ผมตาม update ตัวติดตั้ง Grails บน Windows แบบติด ๆ เช่นกันครับ
สำหรับตัวติดตั้งบน Windows มีคนโหลดไปทั่วโลกร่วม 200 300 400 ยังไม่มีใครด่าว่าติดตั้งไม่ได้
ถ้าใช้กันอยู่ มาใส่ comment ให้รู้กันนิดหน่อยนะครับ ว่ามัน work จริง ๆ ผมจะได้ไปยืนยันกับทาง grails.org ครับ

โหลดทั้ง Grails 1.0-RC3 หรือตัวติดตั้งบน Windows ได้จาก http://grails.org ครับ

Monday, November 26, 2007

พฤติกรรมของ test mode ใน Grails

ใน Grails เราสามารถปรับแต่ง mode การทำงานได้เป็น 3 mode ก็คือ development สำหรับใช้พัฒนา, test สำหรับใช้ทดสอบ และ production สำหรับใช้งานจริง

พฤติกรรมของแต่ละ mode จะแตกต่างกันเล็กน้อย และเราสามารถตั้งค่าบางอย่างเช่น data source ให้กับแต่ละ mode ของ Grails

Grails จะทำงานใน test mode เมื่อผู้ใช้ต้องการจะทดสอบระบบด้วยคำสั่ง


$ grails test-app



ซึ่งจะเกี่ยวข้องกับการทดสอบเชิงหน่วย (unit tests) และเชิงรวม (integration tests)

จุดสำคัญก็คือ Grails มีแนวคิดของ test isolation นั่นหมายถึง ทุก ๆ การทดสอบจะถูกตั้งสมมติฐานไว้ว่าไม่มีการเกี่ยวข้องกัน เป็นผลให้องค์ประกอบที่ใช้ร่วมกันเช่นข้อมูลในฐานข้อมูลจะถูกลบทุก ๆ ในแต่ละการทดสอบ

ดังนั้นเมื่อต้องการทดสอบการทำงานใน test mode จึงจำเป็นต้องแยก data source ออกมาเป็นฐานข้อมูลเฉพาะสำหรับ test และหากเราใช้ BootStrap ในการเตรียมการข้อมูลแล้วนั้น ใน method setUp ของทุก ๆ test case จะต้องมีการเรียกใช้ closure init ของ BootStrap ไว้ทุกครั้ง


class MyTests extends GroovyTestCase {
void setUp() {
new BootStrap().init()
}

void testSomething() { ... }
}

Thursday, November 1, 2007

สรุปหลังสร้าง application ด้วย Grails

ผมได้มีโอกาสสร้าง Grails application สำหรับ production อีกครั้ง เป็น application เล็ก ๆ และครั้งนี้มีเวลาทำเพียง 1 สัปดาห์เศษ

GUI layer ผมใช้ OpenLaszlo อย่างเคย เพราะต้องการ application เป็น AJAX และคุ้นมือกับ OpenLaszlo มาพอสมควรแล้ว
เหตุที่ทำไมไม่ใช้เฟรมเวิร์คอื่น เช่น GWT เหตุผลหลักเพราะไม่ agile, compile-debug cycle สำหรับ GUI layer นั้นดูจะทำได้ช้า (term of agility) กว่า OpenLaszlo
ผมไม่ใช้ UI ที่เป็น JavaScript framework เช่น YUI, Ext หรือ Dojo เพราะทนปวดหัวไม่ไหว
OpenLaszlo อยู่กลาง ๆ ระหว่าง GWT และ JavaScript framework ทั้งหลาย เพราะมี compiler ที่ช่วย check error ได้พอสมควร, ใช้ tag (box model แบบ XUL), ภาษาก็เป็น JavaScript (จริง ๆ แล้ว OpenLaszlo ก็ใช่ว่าจะ debug ง่าย แต่อย่างน้อยก็ง่ายกว่า JavaScript ล้วน ๆ)

ผมออกแบบ layout ของ UI โดยใช้ Photoshop แล้วแยก layer ออกเป็นชิ้น ๆ (ไม่ได้ merge แล้ว slice) save แยกเป็น .png
แล้วเอามารวมกันใน code ของ OpenLaszlo

approach รอบนี้เป็น prototype-driven สร้าง UI เสร็จแล้ว define XML ที่ต้อง bind ด้วยระหว่าง client กับ server
เป็น local XML dataset ของ OpenLaszlo ไว้ก่อน (feature นี้ช่วยได้มากสำหรับ prototyping)
จากนั้นเอาก็ดูจาก schema ของมันไปเขียน code ของ controller และใช้เตรียมโดเมนคลาส

ผมใช้ Grails 1.0-RC1 ไม่ลง plugin เพิ่มเลยนอกจาก Quartz 0.2 (ใช้มันทำ job scheduling) เพราะ application คราวนี้หลัก ๆ เป็น Ajax อย่างที่บอก
- ฝั่ง admin แทบไม่ทำอะไรเลย ใช้ scaffolding ล้วน ๆ
- ด้านที่เชื่อมต่อกับ OpenLaszlo ใช้ REST ล้วน ๆ โดย render XML ออกจาก controller โดยตรง ใช้วิธียิง error code พวก 200, 500 ออกไปให้ UI layer จัดการ check เอาเอง ตรงนี้แยกเป็น 2 กลุ่ม กลุ่มทำงานแบบ RPC กับกลุ่ม CRUD เลยทำให้ได้สร้าง controller framework เล็ก ๆ ของฝั่ง OpenLaszlo ออกมาใช้โดยปริยาย เป็น controller แบบพิเศษนิดหน่อยคือต้องทำงานกับ event

ไม่มี SQL เลยแม้แต่บรรทัดเดียว :)
ไม่ได้ใช้ DTO pattern เพราะใช้ XML เป็น media แทน
การ update data จากฝั่ง client มา server ใช้ก้อน XML แล้วแปลงเป็น Map ด้วย XMLParser ของ Groovy
แล้วส่งให้ GORM ผ่าน obj.properties (มองมุมนี้ก็ยัง preserve data-hiding อยู่ครับ)

ใช้ Java Mail เป็นตัวส่ง mail ผ่าน SSL server (SMTP ของ Google App for your domain)
application มี File upload ตัวรับเป็นกลไลของ Spring (แต่ไม่ต้อง config อะไรเพิ่มใน Grails)

การ authen ใช้ MD5 มีการ encode ตั้งแต่ฝั่ง client แล้วเทียบ password ที่ digest แล้วกับฝั่ง server เพื่อเลี่ยงการใช้ SSL
มีพิเศษตรงการ sync กับ .htaccess ของ Apache httpd เพื่อให้ password คุมการเข้าถึง directory ให้ด้วย
เรื่องสนุกมีอยู่ว่าต้องไปแกะ code htdigest.c ว่ามัน digest อะไร เพราะตอนแรกลองแล้ว ค่า hash ออกมาหน้าตาไม่เหมือนกัน

server ตอนนี้ deploy ลง Jetty 6 เนื่องจากอีกซักพักจะสร้าง Comet app เพื่อแทนที่การ pooling จากฝั่ง UI ที่ใช้อยู่ในปัจจุบัน
ตอนนี้ยังเรียกใช้ ContinuationSupport ใน Grails controller ไม่ได้

สรุปเบา ๆ ว่ารอบนี้ agile กว่าทุกครั้งและงานเสร็จทันเวลา ข้อเสียที่ยังแก้ไม่ตกคือตอนทำยังเปลือง CPU/Memory อยู่เพราะต้ิอง run ทั้ง Grails app และ OpenLaszlo