Special Report

ผมได้มีโอกาสเข้าร่วมโปรแกรม Google Summer of Code ปีนี้ โดยทำงานให้กับโครงการ Groovy ของ Codehaus

Google Summer of Code คือโปรแกรมส่งเสริมการพัฒนาซอฟต์แวร์เสรีที่ผลักดันด้วยทุนของกูเกิ้ล โดยผู้ที่สามารถจะเข้าร่วมโปรแกรมได้จะต้องมีสถานะเป็นนักเรียน/นิสิต/นักศึกษาในระดับใดก็ได้ตั้งแต่ปริญญาตรีจนถึงปริญญาเอก และทำงานให้กับองค์กรที่เข้าร่วมโครงการตลอดฤดูร้อน ซึ่งกินเวลาประมาณ 3 เดือน

เริ่มสมัคร

ตัวโปรแกรมจะแบ่งออกเป็น 3 ช่วง คือช่วงรับสมัคร และช่วงทำงานช่วงที่ 1 และ 2
ในช่วงรับสมัคร ผู้สมัครเข้าร่วมโปรแกรม จะเลือกงานจากข้อเสนอโครงการซึ่งมีองค์กรโอเพ่นซอร์สทั้งหลายมาเสนอไว้ ซึ่งแต่ละคนเลือกได้มากกว่าหนึ่งโครงการ และถ้าผู้สมัครได้รับเลือกจากหลาย ๆ โครงการ ก็จะมีการเรียงลำดับกันทีหลัง ซึ่งทำโดยทีมกูเกิ้ลและผู้ดูแลโครงการนั้น ๆ (mentor) ผมทำโครงการ Groovy Performance Tuning กับกิลโยม ลาฟอร์จ ซึ่งเป็นผู้จัดการโครงการของ Groovy จริง ๆ แล้วตัวข้อเสนอและไอเดียของโครงการนี้ผมร่างเองหมดแล้วก็ส่งให้กิลโยมเอาไป โพสต์ไว้ในหน้าข้อเสนอของ Groovy ซึ่งถ้าเรามีไอเดียมาเองและตัวองค์กรรับฟังแล้วนั้นก็จะไม่ค่อยมีปัญหาในการเข้าร่วมโปรแกรม ปีนี้ผู้ที่ผ่านมีประมาณ 1,100 คน โดยของ Codehaus นั้นใบสมัครผ่าน 7 และได้โควต้า 4 นั่นคือตัวข้อเสนออาจจะผ่านแต่ถ้าโควต้าขององค์กรนั้น ๆ ไม่พอเราก็จะไม่ได้เข้าร่วมโปรแกรม

เมื่อผ่านช่วงรับสมัคร ผู้สมัครก็จะเปลี่ยนสภาพเป็นผู้เข้าร่วมโครงการ(ผมจะเรียกว่านักเรียน) นักเรียนแต่ละคนก็จะได้รับอนุญาตให้เข้าร่วม private เมล์ลิ่งลิสต์ ซึ่งจะมีการโพสต์ข่าวสารเป็นระยะ ๆ จากผู้จัดการโปรแกรมจากกูเกิ้ล (เราเรียกเธอว่า LH) รวมทั้งมีกระทู้ไร้สาระมาเป็นระยะ ๆ จากเกรียนlnwทั้งหลาย

เมื่อผ่านช่วงแรกนักเรียนจะได้ 1. ของขวัญ ปีนี้เป็นหนังสือ Beautiful Code 2. บัตรเครดิตพร้อมเงินก้อนแรก จากกูเกิ้ล การ activate บัตรมีขลุกขลักเล็กน้อยเพราะต้องทำผ่านระบบโทรศัพท์อัตโนมัติ หลายคนรวมทั้งผม activate ด้วย Skype แต่บางคนบอกไว้ในลิสต์ว่าทำแล้วมีปัญหา ส่วนกระบวนการนำเงินจากบัตรออกมาใช้ก็ลำบากไม่แพ้กันเพราะชื่อบนบัตรไม่ใช่ชื่อตัวเราเองแต่เป็นคำว่า GSOC Student 2008 ดังนั้นการใช้บัตรซื้อของบนเวบไซต์หรือผ่าน Paypal ก็อาจจะมีปัญหา วิธีการที่ดีที่สุดคือการถอนเงินโดยตรงจากตู้ซึ่งค่าธรรมเนียมกูเกิ้ลจะเป็นคนจ่าย

จากนั้นก็จะเข้าสู่ช่วงทำงาน ช่วงการทำงานสองช่วงจะคั่นด้วยการประเมินกลางภาคและปิดท้ายด้วยการประเมินปลายภาค ถ้าไม่ผ่านการประเมินกลางภาคก็จบ ไม่ได้เงินก้อนที่สองและไม่ต้องทำต่อ แต่ถ้าผ่านมาได้ก็ได้เงินก้อนที่สองเข้าทางบัตรเครดิตเหมือนเดิม และถ้าผ่านการประเมินปลายภาคก็ได้อีกก้อนที่เหลือ โดยการประเมินว่าผ่านหรือไม่นั้นทำโดยผู้ดูแลโครงการซึ่งเราที่เป็นนักเรียน จะต้องติดต่ออยู่เรื่อยๆ เพื่อขอคำปรึกษาบ้าง รายงานผลความก้าวหน้าบ้างเป็นต้น ซึ่งปกติจะเป็นสัปดาห์ละครั้ง สำหรับของ Codehaus จะมีเมล์ลิ่งลิสต์อีกตัวไว้รายงานความก้าวหน้า ช่วงหลัง ๆ ผมใช้วิธีส่งผ่าน twitter แทน (โดยใช้ hashtag #gsoc)

ปัญหาที่เจอเป็นเรื่องทางเทคนิค

เรื่องเชิงสังคมไม่ค่อยมีปัญหาเพราะความคุ้นเคยกับชุมชนของ Groovy อยู่แล้ว ปัญหาใหญ่กลายเป็นเรื่องทางเทคนิคแทน เพราะระบบการ dispatch เมธอดของ Groovy ตัวใหม่นั้นเร็วระดับนึงอยู่แล้ว (เร็วกว่า JRuby เล็กน้อยบน shootout benchmarks) การแก้ปัญหาด้วยวิธีเดิมตามที่เตรียมไว้ (callsite caching) ไม่ทำให้เร็วมากขึ้นอย่างมีนัยสำคัญ ก็เลยจำเป็นต้องหาวิธีการใหม่ ระหว่างการค้นก็ไปรื้อบทความมาอ่านหลายชิ้นรวมทั้งงานวิจัยเบื้องหลัง tracemonkey ด้วย แล้วก็บังเอิญไปเจอว่างานเก่าที่ทำไว้นั้นสามารถเอามาแก้ให้ทำงานกับ Java 5 ได้ (ความเข้ากันได้กับ Java 5 เป็นข้อกำหนดเบื้องต้นของ Groovy 1.6) ก็เลยเอาเทคนิคการคอมไพล์แบบ Just-in-time ที่คิดไว้มาเขียนให้ใช้ได้กับระบบ callsite caching ใน Groovy 1.6

ก็เห็นอยู่บ้างเหมือนกันสำหรับบางคนที่มีปัญหากับผู้ดูแลโครงการ ซึ่งตรงนี้ถ้าหากแก้ไขเองไม่ได้ วิธีแก้ปัญหาคือแจ้งโดยตรงไปที่ LH เพื่อจัดการเจรจาหรือไม่ก็เปลี่ยนผู้ดูแลเป็นคนอื่นจากองค์กรเดียวกัน ผมเข้าใจว่าเป็นปกติของ Geek ที่จะโค้ดมากกว่าพูด บางทีบางครั้งจุดนี้ก็อาจจะเป็นข้อด้อยซึ่งผมเองก็เรียนรู้ที่จะสื่อสารให้มากขึ้นเช่นกัน อย่างไรก็ตามช่วงเวลาฤดูร้อนก็กำลังจะจบลงแล้วครับ ตอนนี้อยู่ในระยะประเมินปลายภาค และผลลัพธ์งานผมที่ได้จากเทคนิคการ JIT ก็ค่อนข้างน่าประทับใจ (อ่านต่อ)

สิ่งที่ได้

อาจจะสังเกตว่าผมไม่ได้ระบุเรื่องขอบเขตเวลาและเรื่องค่าตอบแทนที่ได้จากกูเกิ้ล เพราะอยากให้ไปหาอ่านต่อเองจากตัวโปรแกรม(หรือข่าวเก่าจาก sugree) สิ่งสำคัญที่ได้คือ 1. เสื้อยืด Google Summer of Code (สำคัญมาก) 2. การอนุญาตให้อ้างอิงกูเกิ้ลได้ใน Resume และ CV ในฐานะ work contractor 3. ประสบการณ์เข้าร่วมกับทีมโอเพ่นซอร์ส (สำหรับคนที่ไม่เคยเป็น contributor)

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

Hiring! บริษัทที่น่าสนใจ

Carmen Software company cover
Carmen Software
Hotel Financial Solutions
Next Innovation (Thailand) Co., Ltd. company cover
Next Innovation (Thailand) Co., Ltd.
We are web design with consulting & engineering services driven the future stronger and flexibility.
KKP Dime company cover
KKP Dime
KKP Dime บริษัทในเครือเกียรตินาคินภัทร
Kiatnakin Phatra Financial Group company cover
Kiatnakin Phatra Financial Group
Financial Service
Fastwork Technologies company cover
Fastwork Technologies
Fastwork.co เว็บไซต์ที่รวบรวม ฟรีแลนซ์ มืออาชีพจากหลากหลายสายงานไว้ในที่เดียวกัน
Thoughtworks Thailand company cover
Thoughtworks Thailand
Thoughtworks เป็นบริษัทที่ปรึกษาด้านเทคโนโยลีระดับโลกที่คว้า Great Place to Work 3 ปีซ้อน
Iron Software company cover
Iron Software
Iron Software is an American company providing a suite of .NET libraries by engineer for engineers.
CLEVERSE company cover
CLEVERSE
Cleverse is a Venture Builder. Our team builds several tech companies.
Nipa Cloud company cover
Nipa Cloud
#1 OpenStack cloud provider in Thailand with our own data center and software platform.
Bangmod Enterprise company cover
Bangmod Enterprise
The leader in Cloud Server and Hosting in Thailand.
CIMB THAI Bank company cover
CIMB THAI Bank
MOVING FORWARD WITH YOU - CIMB is the leading ASEAN Bank
Bangkok Bank company cover
Bangkok Bank
Bangkok Bank is one of Southeast Asia's largest regional banks, a market leader in business banking
MuvMi (Urban Mobility Tech Co.,Ltd.) company cover
MuvMi (Urban Mobility Tech Co.,Ltd.)
Shape the future of urban mobility towards affordable, clean, and safe solutions
T.N. Digital Solution Co., Ltd. company cover
T.N. Digital Solution Co., Ltd.
TNDS has been involving in every first move of banking’s major digital transformation.
KBTG - KASIKORN Business-Technology Group company cover
KBTG - KASIKORN Business-Technology Group
KBTG - "The Technology Company for Digital Business Innovation"
Siam Commercial Bank Public Company Limited company cover
Siam Commercial Bank Public Company Limited
"Let's start a brighter career future together"
Icon Framework co.,Ltd. company cover
Icon Framework co.,Ltd.
Global Standard Platform for Real Estate แพลตฟอร์มสำหรับธุรกิจอสังหาริมทรัพย์ครบวงจร มาตรฐานระดับโลก
REFINITIV company cover
REFINITIV
The Financial and Risk business of Thomson Reuters is now Refinitiv
H LAB company cover
H LAB
Re-engineering healthcare systems through intelligent platforms and system design.
The Gang Technology Co., Ltd. company cover
The Gang Technology Co., Ltd.
We're a Digital Agency that helps our customers transform their business into digital with ease.
LTMH company cover
LTMH
LTMH มุ่งเน้นการพัฒนาผลิตภัณฑ์ที่สามารถช่วยพันธมิตรของเราให้บรรลุเป้าหมาย
Seven Peaks company cover
Seven Peaks
We Drive Digital Transformation
Wisesight (Thailand) Co., Ltd. company cover
Wisesight (Thailand) Co., Ltd.
The Best Choice For Handling Social Media · High Expertise in Social Data · Most Advanced and Secure
MOLOG Tech company cover
MOLOG Tech
We are Modern Logistic Platform, Specialize in WMS, OMS and TMS.
Data Wow Co.,Ltd company cover
Data Wow Co.,Ltd
We enable our clients to realize increased productivity by solving their most complex issues by Data
LINE Company Thailand company cover
LINE Company Thailand
LINE, the world's hottest mobile messaging platform, offers free text and voice messaging + Call
LINE MAN Wongnai company cover
LINE MAN Wongnai
Join our journey to becoming No.1 food platform in Thailand

KnightBaron Sun, 24/08/2008 - 13:16

จริงๆ ตอนแรกผมก็ว่าจะสมัครปีนี้ด้วยเหมือนกันนะ แต่ติดปัญหาเรื่องเรียนต่อ บลาๆ เลยต้องชวดไป ปีหน้าไม่มีอะไรแล้ว ยังไงก็ต้องสมัครให้ได้ครับ!

Yume Nikki

sugree Mon, 25/08/2008 - 01:22

ดันพลาดไปเป็น mentor ซะตั้งแต่แรก จะกลับมาเป็น student ก็น่าเกลียด

mk Mon, 25/08/2008 - 02:40

เชื่อว่ามีคนอ่านจำนวนหนึ่ง อยากรู้แต่ไม่อยากถาม ผมเลยขอถามรายละเอียดในบางจุด

  1. Groovy คืออะไร?
  2. ไปรู้จักกับชุมชน Groovy ได้อย่างไร? คือถ้าเป็นคนใช้ธรรมดา มันไม่น่าจะไปรู้จักนักพัฒนาโครงการได้
  3. ทำไมถึงเลือกทำโครงการนี้ (performance tuning)
  4. มีความรู้พื้นฐานอยู่แล้วหรือเปล่า เท่าที่เขียนเห็นมีเทคนิคชื่อเท่ๆ หลายอัน รู้เรื่องพวกนี้มาจากไหน
  5. อะไรคือ JIT

cblue Mon, 25/08/2008 - 05:48

In reply to by mk

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

Groovy คืออะไร?

Groovy เป็นภาษา dynamic ที่รันบน Java Virtual Machine (JVM)
ซึ่งยืมลักษณะเด่นทางภาษาหลาย ๆ อย่างมาจาก Python, Ruby และคงความเข้ากันได้กับ Java ไว้
อาจมองได้ว่า Groovy เป็นภาษาทางเลือกซึ่งออกแบบมาเพื่อให้คนเขียน Java ได้รับรู้รสชาติของภาษา dynamic แบบไม่ต้องเรียนรู้มากนัก สำหรับเวบเฟรมเวิร์คตัวชูโรงบนภาษา Groovy คือ เกรลส์ (Grails) - ชื่อภาษาไทยโดย @bact ซึ่งทำงานในลักษณะเดียวกับ Rails แต่ห่อไลบรารี่หนัก ๆ อย่าง Spring กับ Hibernate ไว้เพื่อให้พัฒนาเวบได้ด้วยความรู้สึกเดียวกับ Rails (ผมปูพื้นเรื่องเกรลส์นิดหน่อยเพราะเกี่ยวกับคำตอบข้อสอง)

ไปรู้จักกับชุมชน Groovy ได้อย่างไร? คือถ้าเป็นคนใช้ธรรมดา มันไม่น่าจะไปรู้จักนักพัฒนาโครงการได้

ผมเริ่มจากเล่น Groovy บ้างเล็กน้อย และด้วยความที่มันคล้ายและง่ายกว่าเมื่อมองจากมุมของ Java มา ก็เลยตามใช้ไปเรื่อย ๆ จนกระทั่งเกรลส์ออกมาก็ไปเข้าทีมพัฒนาปลั๊กอินของเกรลส์
ถัดมาอีกหน่อยก็เริ่มเอา Groovy มาใช้ทำงานวิจัย จากนั้นก็ขยับมาสร้าง Groovy AOP
จากตอนนั้นก็เริ่มคลุกคลีอยู่ใน developer เมล์ลิ่งลิสต์ของ Groovy (และ JRuby บ้าง)

ทำไมถึงเลือกทำโครงการนี้ (performance tuning)

หลัก ๆ เลยคืองานที่ทำอยู่ใช้ Groovy และมันยังเร็วได้ไม่ถูกใจ เลยต้องทำเอง(ก็เข้าแนวคิด do-it-yourself) เพราะจะเอา Groovy ไปใช้ทำงานด้าน High Performance Computing เนื่องจากความง่ายเชิงภาษาในลักษณะเดียวกับ Python และ idiom ทางภาษาที่ตนเองคุ้นเคยกว่า รวมทั้งคุ้นเคยกับ Java bytecode มาแล้วในระดับนึง

แรงบันดาลใจอีกส่วนคือ Python Psyco ที่ให้ความเร็วที่เหลือเชื่อ เลยคิดว่าเราก็น่าจะทำให้ Groovy เร็วขึ้นได้บ้าง

มีความรู้พื้นฐานอยู่แล้วหรือเปล่า เท่าที่เขียนเห็นมีเทคนิคชื่อเท่ๆ หลายอัน รู้เรื่องพวกนี้มาจากไหน

ศึกษาเอาระหว่างเรียน ป. เอก (ยังไม่จบ)
แรกสุดเลยเมื่อ 3 ปีก่อนไม่ได้ตั้งใจจะทำทางด้านนี้ เริ่มจับด้าน Aspect-Oriented Programming เป็นหลัก พออ่านไปทำไปเริ่มเข้าใจว่าข้อจำกัดบางอย่างแก้ไขไม่ได้ด้วยหลักการทางวิศวกรรมซอฟต์แวร์ (SE) อย่างเดียวแต่เกี่ยวข้องกับภาษาและตัวรันไทม์ (ในที่นี้คือภาษา Groovy และ JVM)
สุดท้ายก็วกกลับมาที่เดิมเพราะไปเจอว่ามันคือแนวคิดทาง SE ที่แฝงอยู่ในตัวภาษา dynamic ที่หายังไงก็จะหาไม่เจอใน C หรือ Java

คำเช่น dispatch, callsite, callsite caching และ trace เป็นศัพท์เฉพาะที่เจอได้ในงานทางด้านรันไทม์

อย่าง dispatch จริง ๆ แล้วคือการที่ a เรียกใช้ (call) b

จุด a เรียกใช้ b ก็เรียกกันว่า call site (แปลตรงตัว)

มีการเติม caching เข้ามาเพราะว่าเป็นกลไกที่ใช้เพิ่มความเร็วของจุดดังกล่าว

ส่วน trace เป็นเทคนิคอีกเรื่องนึงที่เพิ่งเกิดขึ้นไม่นาน ตามอ่านได้จากลิงค์ที่ให้ไว้ครับ

อะไรคือ JIT

JIT ย่อมาจาก Just-In-Time เป็นคำที่มักใช้เพื่อสื่อถึงคอมไพเลอร์ (Just-In-Time Compiler) ที่อยู่ในตัวรันไทม์ เช่น JVM, .NET หรือ Flash Player เป็นต้น บางครั้งเรียกว่า dynamic compilation
ตัว JIT คอมไพเลอร์จะทำการแปลง intermediate language (bytecode, MSIL เป็นต้น - จำไม่ได้ว่าของ Flash เรียกว่าอะไร) เป็นภาษาเครื่องอีกทีก่อน และทำเรื่อย ๆ ระหว่างที่โปรแกรมทำงานอยู่ โปรแกรมบางส่วนที่ต้องทำบ่อย ๆ ก็อาจจะถูกคอมไพล์รอบสองรอบสาม และได้รหัสภาษาเครื่องที่เร็วขึ้น ๆ

พี่ใหม่พลังแรงสูงเกิน lol
ปกติผมอ่านบทความของพี่ใหม่แล้วต้องรวบรวมสมาธิมากนิดนึง เขียนเป็นภาษาไทยชัดๆแบบนี้ค่อยดีหน่อย :)

mk Mon, 25/08/2008 - 22:58

In reply to by cblue

ถามต่อนะครับว่า หลายๆ คนในที่นี้ไม่ได้เรียนเอก ไม่ได้มีความรู้ทางทฤษฎีเยอะขนาดนั้น แต่ถ้าอยากสมัคร GSoC ด้วย จะต้องเจออะไรแบบนี้หรือเปล่า?

สมมติว่าถ้าเป็นเด็ก ม. ปลาย ไปสมัคร GSoC ของโครงการ Groovy งานที่ทำน่าจะเป็นอะไรได้บ้าง

cblue Tue, 26/08/2008 - 01:08

In reply to by mk

สำหรับ Groovy โดยทั่ว ๆ ไปงานจะเป็นไปในทิศทางเดียวกันคือการสร้าง Groovy wrapper ห่อของที่มีอยู่ในโลกของ Java ให้สามารถใช้ได้ง่ายขึ้น
ปีที่แล้วก็เช่น SwingX Builder ซึ่งเป็นภาษา DSL ที่ทำให้เขียน GUI ได้ง่ายกว่าการใช้ภาษา Java (ใช้ร่วมกับ Swing Builder)

ปีนี้มี Groovy Science
เป็นตัวจัดการ math แบบ symbolic แก้สมการติดตัวแปรอะไรทำนองนั้น

ทั้งสองโครงการก็เป็นตัวอย่างที่มีขึ้นเพื่อดึงความเป็น dynamic ของภาษา Groovy ออกมาใช้

cblue Tue, 26/08/2008 - 23:19

In reply to by snck

ตอนนั้นระบบปลั๊กอินของเกรลส์เสร็จใหม่ ๆ ช่วง รุ่น 0.4 เพิ่งออกครับ แล้วผมต้องใช้ SOAP ทำบางอย่างพอดี ก่อนหน้านั้นเอา XFire (SOAP stack ไม่ใช่เซิร์ฟเวอร์เกมนะครับ) ไปใช้ร่วมกับเกรลส์ไว้แล้วแต่ยังไม่ได้ทำเป็นปลั๊กอิน พอ 0.4 ออกก็เลยลองเขียนปลั๊กอินดู พอเขียนเสร็จผมก็เอาไปโพสต์ในเมล์ลิ่งลิสต์ของเกรลส์ครับ แล้ว เกรม รอชเชอร์ หัวหน้าโครงการของเกรลส์ก็เมล์มาหาบอกให้ไปสมัครเข้า Codehaus แล้วก็ตั้ง SVN repository ใหม่กัน

สำหรับคนที่อยากเข้าทีมปลั๊กอินของเกรลส์ก็ลองดูได้นะครับ สร้างตัวปลั๊กอินแล้วเอาไปโพสต์ดู และถ้าอยาก hack เกรลส์ตรง ๆ เลยผมก็พอมีไอเดียที่จะเล่าให้ฟังอยู่ครับ

cblue Wed, 27/08/2008 - 02:49

In reply to by Solotov

ได้เลยครับ

พอดีผมได้ลองอ่านโค้ดของ Apache OFBiz (ระบบ ERP ที่ @pphetra อยู่ในทีมนึงที่ fork มาทำต่อ ดูได้ที่ Codenone Projects) แล้วเคยจะลองพอร์ตมาเป็นเกรลส์ทั้งก้อน ระหว่างทดลองพอร์ตก็เจอว่าระบบ domain class ของเกรลส์ (ถ้าคุ้นเคยกับ Rails ให้นึกถึง ActiveRecord ไว้นะครับ) ซึ่งสร้างบน Hibernate นั่นไม่สนับสนุนการทำ view (ในมุมของ database คือ joined tables) แต่ตัว Hibernate จริง ๆ แล้วทำได้ เป็น feature ที่เรียกว่า subselect

feature นี้มี impact พอสมควรกับตัวเกรลส์ ซึ่งก็แปลว่า patch อาจจะเข้าไปอยู่ในเกรลส์ได้ไม่ยากนัก

ผมขอพูดถึงจุดที่น่าสนใจคร่าว ๆ นิดนึงเพื่อเป็นแนวทางให้พอจะเริ่มต้นได้

  1. อ่านกลไกการทำ subselect ของ Hibernate
  2. อ่านการเขียน mapping Hibernate ในเกรลส์ เริ่มแกะได้จากคลาส org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsDomainBinder และคลาสใน package เดียวกันครับ

vi Mon, 25/08/2008 - 11:01

คารวะพี่ใหม่หนึ่งจอก เขียนเป็นภาษาไทยอย่างงี้ค่อยยังชั่วได้ความรู้ดีขอบคุณครับ