Thursday, September 20, 2007

Eclipse oAW

กลับจากงาน NJUG4 ด้วยความค้างคาใจในเรื่อง MDA
ด้วยความที่ Robert ไม่ยอมแสดงตัวอย่างเจ๋งๆใน MagicDraw ให้ดู

เมื่อวันก่อนอ่านพบใน Eclipse Planet ว่ามี project 's annoucement ที่ชื่อ OpenArchitecture Ware (oAW)
ซึ่งเป็น Framework สำหรับ MDA ที่ integrate เข้ากับพวก MDD projects ของ Eclipse (เช่น EMF)
ก็เลยได้ฤกษ์ทดลองเสียเลย

มาลองดู step ของการใช้ oAW
ตั้งแต่ define MetaModel ไปจนถึง การ generate Source code

  • step แรกเริ่มต้นกันที่ การสร้าง MetaModel ก่อน (M2)
    ที่มาของ MetaModel ใน oAW มีได้ 2 แบบหลักๆคือ
    1. จาก EMF
    เมื่อก่อนเคยสงสัยมานานแล้วว่า EMF ไว้ทำอะไร
    หลังจากไปฟัง Robert พูดมา และกลับมาอ่านเอกสารของ EMF
    ทำให้เริ่มมองภาพ EMF ออกมากขึ้น
    ตัว EMF จริงๆแล้วก็คือ Implementation ตัวหนึ่งของ MOF (Meta Object Facility)
    แต่ implement แค่ subset บางส่วน, และเพื่อไม่ให้สับสนกับ MOF
    ส่วน subset model ที่ EMF implement เขาก็เลยตั้งชื่อว่า Ecore
    (ปัจจุบัน MOF 2.0, subset ที่ EMF support เขาตั้งชื่อว่า EMOF)

    วิธีสร้าง MetaModel ก็มีหลายแบบ เช่น
    • define มันตรงๆเลย ด้วย Editor ของ EMF
    • export มาจากพวก UML Tool ที่ support XMI format
    • model ด้วย Java Code + Annotation
    • ใช้ XSD ในการ define


    2. สร้างจาก xText
    อันนี้น่าสนกว่าวิธีที่ 1 เยอะ
    ถ้าอ่าน overview ของ xText จะเห็นว่า
    เขาประกาศตัวเป็น Textual DSL development framework
    การสร้าง MetaModel ใน xText ก็จะใช้การเขียน Grammar rules แทน

    ตัวอย่างของ MetaModel ที่ oAW ใช้ใน tutorial ก็มีหน้าตาแบบนี้
    เป็นตัวอย่างของการ define MetaModel ของ Simple Class Diagram



  • ขั้นตอนถัดไป ก็คือการสร้าง Model (ที่เป็น instance ของ MetaModel ที่ได้จากขั้นตอนแรกของเรา)
    ถ้าเราใช้ MetaModel จาก EMF ในขั้นนี้ เราเลือกทางเลือกได้หลายทาง
    เช่น ให้ EMF generate Editor ให้เรา เพื่อที่เราจะได้ใช้ Editor ตัวนั้นสร้าง Model
    หรือจะไปพวกตระกูล GMF สร้าง Graphic Editor มาเพื่อที่จะมาสร้าง Model ก็ได้

    แต่ถ้าเลือก choice ของ xText
    ในขั้นนี้ เราก็จะให้ xText generate Text Editor ให้เรา
    แล้วเราก็ใช้ Text Editor นั้น เขียน DSL ของเราได้เลย

  • ขั้นถัดไป ก็คือการ กำหนด build script ที่ใช้ในการ generate
    oAW เรียก script พวกนี้ว่า Workflow
    ตัวนี้ดูแล้ว ได้อารมณ์เหมือนเขียน Ant เลย
    <workflow>
    <property file="workflow.properties"/>

    <!-- ให้ parser อ่าน Model ของเรา โดยอ้างอิง MetaModel ด้วย -->
    <component id="xmiParser"
    class="org.openarchitectureware.emf.XmiReader">
    <modelFile value="${modelFile}"/>
    <metaModelPackage value="data.DataPackage"/>
    <outputSlot value="model"/>
    <firstElementOnly value="true"/>
    </component>

    <!-- validate model โดยใช้พวก OCL script -->
    <component
    class="org.openarchitectureware.check.CheckComponent">
    <metaModel id="mm" class="org.openarchitectureware.type.emf.EmfMetaModel">
    <metaModelPackage value="data.DataPackage"/>
    </metaModel>
    <checkFile value="checks"/>
    <emfAllChildrenSlot value="model"/>
    </component>

    <!-- ลบ source file ที่เคยถูก generate ไว้ -->
    <component id="dirCleaner"
    class="org.openarchitectureware.workflow.common.DirectoryCleaner" >
    <directories value="${srcGenPath}"/>
    </component>

    <!-- generate file โดยใช้ template ที่ระบุ -->
    <component id="generator"
    class="org.openarchitectureware.xpand2.Generator">

    <metaModel id="mm"
    class="org.openarchitectureware.type.emf.EmfMetaModel">
    <metaModelPackage value="data.DataPackage"/>
    </metaModel>

    <expand value="templates::Root::Root FOR model"/>

    <outlet path="${srcGenPath}/">
    <postprocessor
    class="org.openarchitectureware.xpand2.output.JavaBeautifier"/>
    </outlet>

    </component>
    </workflow>


  • ในการ generate source code สิ่งที่ต้องมีก็คือ Template Engine
    หน้าตาของ oAW template มีหน้าตาแบบนี้
    ให้ความรู้สึกเหมือน XSL
    «DEFINE Root FOR data::DataModel»
    «EXPAND Entity FOREACH entity»
    «ENDDEFINE»

    «DEFINE Entity FOR data::Entity»
    «FILE name + ".java"»
    public class «name» {
    «EXPAND Attribute FOREACH attribute»
    }
    «ENDFILE»
    «ENDDEFINE»

    «DEFINE Attribute FOR data::Attribute»
    private «type» «name»;
    «ENDDEFINE»


แค่นี้ก็ได้แนวทางการ Generate code แบบง่ายแล้ว
(รายละเอียดมันเยอะกว่านี้
มีทั้งเรื่อง การ validate model โดยใช้ OCL,
การสร้าง helper code ที่ template สามารถใช้ช่วยในการ generate source code)

อืมม์ นี่แค่เริ่มต้น
เนื่องจากเห็นมองเห็นภาพรวมแล้ว
ทำให้รู้สึกสนุก และอยากหัดใช้ project ในตระกูล Eclipse MDD มากขึ้น
ตัว xText ที่เป็น Textual DSL ก็น่าใช้
พวกรุ่นหลังของ GMF ก็ออกมาง่ายมากขึ้นทุกที
ทำให้เราสร้าง Graphice Editor ได้ง่ายขึ้นเรื่อยๆ

์์Note: ต้องขอบคุณงาน NJUG มาก
เพราะถ้าไม่ได้ไปฟัง Robert พูด
ตอนที่เห็น oAW ก็คงไม่ได้ปิ๊งขนาดนี้หรอก

Related link from Roti

Monday, September 17, 2007

น้องใหม่ กับ CruiseControl

เห็น Roof เปรยว่าอยากจะใช้ cruisecontrol
วันนี้ก็เลย capture ผลการใช้ในเดือนที่ผ่านมา มาให้ดู



เนื่องจากเดือนที่ผ่านมามีน้องใหม่เข้าร่วมโปรเจค 3 คน
เป็นสภาวะที่เหมาะมากสำหรับการใช้ cruise
เพราะน้องใหม่ส่วนใหญ่จะไม่ค่อยสนใจเรื่อง build รวม (แค่หัดใช้ framework ก็แย่แล้ว)
การใช้ cruise ก็เป็นวิธีที่ดีในการช่วยสร้าง discipline ให้น้องๆ
วิธีการก็ง่ายมาก
  1. ติดตั้ง cruisecontrol
  2. ลง cruisecontrol monitor ที่เป็น firefox extension
  3. ระหว่างทำงาน ผมก็คอยชำเลืองดู monitor, พอมันแดงปุ๊บ ผมก็จะพูดออกมาดังๆ "build fail โว้ย" เพื่อให้ทุกคนรับรู้
  4. ดูใน svn log ว่าก่อน fail มีใคร commit เข้ามาล่าสุด
  5. ประกาศเสียงดัง "xxx คุณ commit อะไรเข้ามาน่ะ" ด้วยน้ำเสียงเหี้ยมๆ

ข้อมูลเชิงสถิติ
  1. เปอร์เซนต์ของน้องใหม่ที่ทำ build fail คิดเป็น 100%
  2. สาเหตุหลักๆมี 2 เรื่อง
    1. commit ไม่ครบ เช่น commit interface แต่ไม่ commit Implementation
    2. มีปัญหากับ Fixtures ของ Testcase, (เป็นปัญหาเพราะใช้ test database รวม, ไม่เข้าใจ concept, อีกทั้งความผิดทางฝั่งพี่ๆ ที่ยังขี้เกียจสอนน้อง install database กับสอนการใช้งาน, ซึ่งจะทำให้น้องๆมี sandbox database ของตัวเอง)
  3. ถ้าดูจาก graph, ระยะเวลาปรับนิสัย ใช้เวลาประมาณ 3 อาทิตย์

Related link from Roti