Ruby on Rails (Thai Edition)
หลังจากที่เราได้คุ้นเคยกับตัวภาษา Ruby ในเบื้องต้นแล้วนั้น บทความนี้จะเป็นรายละเอียดเพิ่มเติมในส่วนการนำไปใช้งานเพื่อสร้าง Business Application ต่างๆ จากภาษา Ruby ซี่งในปัจจุบัน นิยมที่จะใช้ รูปแบบหรือโครงร่าง Application (Framework) เพื่อทำให้เราสร้าง Application ได้รวดเร็วมากขึ้น และ Framework ที่นิยมมากที่สุดของ Ruby นั้นคือ Ruby On Rails ซึ่งในบทความนี้จะได้แนะนำให้รู้จักในรายละเอียดเบื้องต้น พร้อมกับประวัติความเป็นมาของ Ruby, Rails, JRuby และ JRuby on Rails
ก่อนที่จะเข้าสู่รายละเอียดของส่วนอื่นๆนั้น จะขอย้อนไปสรุปถึงรายละเอียดของภาษา Ruby ดังต่อไปนี้ (ข้อมูลละเอียดหาได้จากบทความอะไรคือ Ruby ตอนที่ 1 )
Ruby เป็นภาษาคอมพิวเตอร์ที่เป็นแบบ Object-Oriented Programming Language ที่ตัวของภาษาเองนั้นมีความง่าย ซึ่งทำให้การเขียนโปรแกรมนั้นมีความสนุกและมีความสละสลวย ตัวของภาษา Ruby นั้นสร้างมาจากการรวมเอาข้อดี ของภาษา script ต่างๆ มารวมกัน โดยการนำเอาความคิดเบื้องต้นส่วนของ Object-Oriented มาจากตัวภาษา Smalltalk ไปผนวกเข้ากับความสามารถด้าน Script ของภาษา Python ที่ใช้งานง่ายและเรียนรู้ได้รวดเร็ว และพร้อมทั้งรวมส่วนแนวคิดดีๆของภาษา Perl เข้ามาด้วย
Ruby ได้เริ่มต้นสร้างขึ้นมาช่วงต้นปี 1990 ในประเทศญี่ปุ่น ด้วยข้อดีของตัวภาษา Ruby ทำให้มีความแพร่หลายได้รวดเร็วมากๆในช่วงเวลา 2-3 ปีต่อมานั่นเอง
เราสามารถที่จะทดลองใช้และเรียนรู้ Ruby ได้อย่างรวดเร็วได้ที่ website
http://tryruby.hobix.com
และสามารถหาข้อมูลเพิ่มเติมได้ที่
http://www.ruby-lang.org/en/documentation
ในปี 2001 Jan Arne Peterson ได้สร้างตัวภาษา JRuby ขึ้นมาและมีการสานต่อโครงการโดยที่อ้างอิงจาก Code ของ Ruby 1.6 C มาเรื่อยๆ จนกระทั่งถึง Ruby 1.8 ในปัจจุบัน ซึ่งกลุ่มที่พัฒนานั้นก็มี Charless Nutter, Thomas Enebo, Ola Bini และ Nick Sieger และเมื่อเดือนกันยายน 2006, Sun Microsystems ได้จ้างทั้ง Nutter และ Enebo มารับหน้าที่รับผิดชอบหลักเกี่ยวกับโครงการ JRuby เพื่อพัฒนาให้ทันตาม Ruby ในรุ่นหลังๆ และพัฒนาให้มีความเข้ากันได้มากขึ้นเรื่อยๆ
JRuby เป็น Ruby interpreter ที่ทำงานอยู่บน Java Virtual Machine โดยสามารถทำงานบน Java SE version 1.4.2 เป็นต้นไป ซึ่งโครงงาน JRuby นี้เป็นการนำเอาคุณสมบัติต่างๆของภาษา Ruby มาปรับใช้ความสามารถของ Java ที่มีความแพร่หลายในระบบงานธุรกิจที่มีอยู่แล้วในปัจจุบัน ซึ่งเป็นการขยายความสามารถของ Ruby ให้มากขึ้นในการปรับไปใช้ใน Application ต่างที่ทำงานในระบบงานที่เป็นระบบงานธุรกิจที่มีอยู่
โครงการของ JRuby นั้นเป็น free software ที่มี License แบบ CPL/GPL/LGPL และในต้นปี 2006 มีการสร้าง JRuby เพื่อทำให้รองรับ Performance ที่ดีมากขึ้นและสามารถ Compile เป็น Java bytecode ได้ ซึ่งจะทำให้สามารถนำเอาภาษา Ruby ขึ้นไปใช้งานในระบบธุรกิจได้โดยมีการทำงานที่รวดเร็วเช่นเดียวกับภาษา Java
JRuby ได้ออกแบบเพื่อทำงานเข้ากับ Ruby แบบการผสมผสานของ Virtual Machine (Mix-mode virtual machine) ที่ทำให้ Code แบบ Ruby นั้นสามารถทำงาน Interpreted แบบตรงๆ ได้ กับ Java Virtual Machine และก็ยังรองรับการ compile แบบ Just-In-Time (JIT) ไปเป็น Java bytecode ได้ หรือรองรับวิธีการ Compile แบบ Ahead of time compiled (AOT- ลักษณะ precompile ก่อนจะถูกเรียกให้ทำงาน) แต่ในปัจจุบันนี้การพัฒนา JRuby นั้นเพิ่งจะสามารถรองรับการทำงานแบบ Interpreted mode เท่านั้นที่รองรับคุณสมบัติหรือ Ruby’s constructs ทั้งหมดได้ ในส่วนของ AOT/JIT ยังรองรับได้ Ruby’s contructs ได้เป็นบางส่วนเท่านั้น แต่ทั้งนั้นกลุ่มนักพัฒนาก็มีการพัฒนาเพิ่มขึ้นตลอดเรื่อยๆ ในทุกวันนี้
เมื่อนักพัฒนาต้องการสร้าง Application บนภาษา JRuby นั้นสามารถทำได้ง่ายมากกว่าภาษา Java ธรรมดาเพราะได้อาศัยโครงสร้างของตัว Ruby เป็นกลไกหลัก ทำให้มีความง่ายในการเขียน Code ซึ่งเป็นข้อเด่นที่ได้รับจากภาษา Ruby ดังตัวอย่างด้านล่างต่อไปนี้ที่แสดงตัวอย่างของการ Code ด้วยภาษา Java และภาษา JRuby ซึ่งผลของการทำงานจะได้ผลลัพธ์เหมือนกัน
ตัวอย่าง เมื่อพัฒนาด้วยภาษา Java
public class Filter {
public static void main(String[] args) {
List list = new java.util.ArrayList();
list.add(“Tim"
; list.add(“Ike"
; list.add(“Tina"
;
Filter filter = new Filter();
for (String item : filter.filterLongerThan(list, 3)) {
System.out.println( item );
}
}
public List filterLongerThan(List list, int length) {
List result = new ArrayList();
for (String item : list) {
if (item.length() <= length) { result.add( item ); }
}
ตัวอย่าง เมื่อพัฒนาด้วยภาษา JRuby
list = [‘Tim’, ‘Ike’, ‘Tina’]
list.select {|n| n.length > 3}.each {|n| puts n}
=> ‘Tina’
ดังตัวอย่างเบื้องต้นนั้น จะเห็นได้ว่าความง่ายในตัวภาษา JRuby ที่ได้มาจากคุณลักษณะของภาษา Ruby นั้นทำให้การพัฒนา Application ต่างทำได้รวดเร็วมากกว่าในตัวของ Java เมื่อต้องการการเขียน Code เพื่อทำงานเหมือนๆ กัน
JRuby นั้นเป็นการนำเอาข้อดีของ Ruby interpreter มาใช้เพื่อให้นักพัฒนามีความง่ายแบบภาษา Ruby ในการพัฒนาเช่นเดิมบน Java Virtual Machine เพื่อให้ได้ความสามารถของ Java platform โดยที่ JRuby ยังคงแนวความคิดของภาษา Ruby ทั้งหมดไม่ว่าจะเป็นส่วนของ Object-Oriented Programming (OOP) หรือแม้แต่คุณสมบัติที่ทำให้นักพัฒนาสนุกสนานกับ Ruby ในเรื่อง duck-typing ที่เป็นคุณสมบัติเด่นๆ อีกจุดหนึ่งของภาษา Ruby (ความสนุกสนานในการโต้ตอบแบบ Interactive สามารถไปทดลองคุณสมบัติของภาษา Ruby นี้ได้ที่ http://tryruby.hobix.com )
ตัวอย่างการเรียกใช้ Java จากภาษา JRuby
require 'java'
include_class "javax.swing.JFrame"
include_class "javax.swing.JLabel"
frame = JFrame.new()
frame.getContentPane().add(JLabel.new("This is an example."
)
frame.pack()
frame.setVisible(true)
ตัวอย่างข้างต้นนี้ เป็นการดึงเอา class ต่างๆ ไม่ว่า javax.swing.JFrame และ javax.swing.JLabel มาใช้โดยเราต้องประกาศที่จะใช้ Java จาก require ‘java’ หลังจากนั้นก็นำเอา object ที่สร้างไปใช้งานในรูปแบบลักษณะการเขียนแบบ Ruby นั่นเอง
และใน JRuby 0.9.1 นั้นการเรียกใช้จะทำได้ง่ายมากขึ้น โดยสามารถที่จะเรียกใช้ Object ต่างๆ ของ Java เองโดยที่ไม่ต้องประกาศ include เข้ามา ดังตัวอย่างต่อไปนี้
require 'java'
frame = javax.swing.JFrame.new()
frame.getContentPane().add(javax.swing.JLabel.new("This is an example."
)
frame.pack()
frame.set_visible(true)
สามารถทำได้โดยง่ายตามมาตรฐาน JSR 223 ผ่านวิธีการเรียกใข้งาน Scripting ของ Java 6 หรือ Apache Bean Scripting framework ได้ ซึ่งรายละเอียดสามารถศึกษาเพิ่มเติมได้จาก
https://scripting.dev.java.net/
http://jakarta.apache.org/bsf/
ในการใช้งาน JRuby นั้นจะต้องติดตั้งชุด software เพื่อทดลองใช้หรือเพื่อการพัฒนาดังต่อไปนี้
ติดตั้ง Java Development Toolkit (JDK) ไม่ต่ำกว่า version 1.4.2
Download ตัวโปรแกรมจาก JRuby’s codehaus (http://jruby.codehaus.org)
unzip ตัวโปรแกรมที่ download และไปติดตั้งไว้ที่ Folder เช่น /home/user/jruby
เมื่อติดตั้งเสร็จจะต้องกำหนดค่าของ JAVA_HOME และ JRUBY_HOME เป็นตัวแปรค่า environment ในระบบปฏิบัติการ เช่น
JAVA_HOME=/usr/java/jdk1.5
JRUBY_HOME=/home/user/jruby
JRuby สามารถทำงานแบบ Scripting ใน Java application ได้โดย จะต้อง copy class ของ JRuby คือ jruby.jar (ใน JRuby package) ไปที่ใน classpath ของ Java runtime ที่ <JAVA_PATH>\jre\lib\ext หรือเราสามารถกำหนดเป็นตัวแปรค่า environment ได้ที่ CLASSPATH
เราสามารถที่จะหาข้อมูล JRuby เพิ่มเติมและทดลองใช้ได้ที่
http://jruby.codehaus.org
ข้อมูลเพิ่มเติมจาก Blog ผู้ร่วมพัฒนาได้ที่
Charles Nutter - http://headius.blogspot.com
Thomas Enebo - http://www.bloglines.com/blog/ThomasEEnebo
Ola Bini - http://ola-bini.blogspot.com
Nick Sieger - http://blog.nicksieger.com
ดังที่กล่าวในข้างต้นการสร้าง Application จากภาษาใดๆ ในยุคนี้ไม่ว่าเป็นภาษาคอมพิวเตอร์ใดๆ ก็มีการนำเอา Framework ที่มีการพัฒนาไว้อย่างแพร่หลายมาพัฒนาต่อเพื่อให้มีความรวดเร็วในการพัฒนา เป็นมาตรฐานในการสร้าง Business Application ต่างๆ Rails ก็เช่นกันได้รับการสร้างและพัฒนาเพื่อให้เป็น Framework ของภาษา Ruby และ Rails เองก็ได้รับความนิยมมากในกลุ่มของการพัฒนาภาษา Ruby
David Heinemeier ได้คิด Framework Rails จากโครงงาน Basecamp (http://basecamphq.com) ที่เป็น Project Management tool ในบริษัท 37signals (http://www.37signals.com) ที่เขาทำงานอยู่ ซึ่งบริษัท 37signals นี้เป็นบริษัทที่สร้างและจำหน่าย web application โดย David ได้สร้าง Rails เป็น Open-source project เพื่อให้นักพัฒนาต่างๆ ได้นำเอาไปใช้งานและพัฒนาต่อเนื่องจากโครงงานเริ่มต้นที่เขาได้ทำ โดย Rails ได้ประกาศตัวเมื่อเดือนกรกฏาคม ในปี 2004 และปรัชญาในการสร้างของ David นั้นมีอยู่ว่า
1. “Don’t repeat yourself (DRY)”
การสร้าง Web application หนึ่งๆ นั้นหากจัดการเรื่องข้อมูลไม่เป็นกลุ่มก้อนจะทำให้เกิดความซับซ้อนมากๆ และทำให้นักพัฒนาต้องทำ Module ที่ซ้ำซ้อนกัน แต่หากเมื่อมีการจัดเก็บข้อมูลเป็นที่ชัดเจน จะทำให้มีความง่ายในการสร้าง ดังหลักการของการเขียน Program ที่ดีหรือ Best Practice การนำ Framework มาใช้งานจะช่วยลดปัญหาในจุดนี้ลงไปได้มาก เพราะ Framework จะเป็นตัวช่วยกำหนดอยู่แล้วทำให้นักพัฒนาไม่ต้องกังวลในจุดนี้มาก
ตัวอย่างเช่น ใน Rails นั้นการใช้ ActiveRecord นักพัฒนาไม่จำเป็นต้องกำหนดชื่อของ column ลงไปในการอ้างอิงใน class และปล่อยให้ Ruby เป็นฝ่ายจัดการดึงข้อมูลต่างๆ จาก database เอง เป็นต้น
2. “Convention over Configuration” (ข้อกำหนดบน config)
ในการใช้ Framework เพื่อสร้าง Web application ใดๆ นักพัฒนาเพียงต้องกำหนดสิ่งที่ต่างจาก Framework เท่านั้น เพื่อให้มีความรวดเร็วในการสร้าง Web application ตัวอย่างเช่น เมื่อสร้าง class “Sale” ใน Model เพื่อให้สอดคล้องกับชื่อของ Table ของ Database ที่มีชื่อว่า “Sales” แต่หากมีความต้องการที่จะปรับเปลี่ยนชื่อนั้น นักพัฒนาจะต้องเขียน code เพิ่มเติมในส่วนนั้นๆ เอง
3. “Agile development environment”
เพื่อให้มีความสะดวกในการพัฒนา Web application นั้นๆ Framework ต้องรองรับการทำงานพัฒนาได้ง่าย ซึ่งต้องมีเครื่องมือเพื่อเพิ่มความสะดวกในการสร้าง Code และต้องมีความสามารถในการปรับปรุงแก้ไขพร้อมทั้งสามารถที่จะทดสอบ Deploy ให้ง่ายต่อวงจรการพัฒนาด้วย
และจากปรัชญาดังกล่าวทั้งหมดเป็นที่มาทำให้ David ได้สร้าง Rails ขึ้นมาและ Opensource ให้นักพัฒนาต่างๆ ได้นำภาษา Ruby ไปพัฒนา Application ที่มี Rails เป็น Framework
ใน Rails นั้นใช้แนวความคิดสถาปัตยกรรมแบบ Model-View-Controller (MVC – ดูข้อมูลเพิ่มเติมได้ที่ http://en.wikipedia.org/wiki/MVC ) เพื่อจัดการโครงสร้างของ Application เช่นเดียวกับ Web application frameworks อื่นๆ ที่นิยมสร้างตามสถาปัตยกรรม MVC
Rails ใช้ scaffolding เป็นหัวใจหลักในการสร้างโครง Application ซึ่งทำให้การสร้างในส่วนของ logic และ views ที่ใช้สร้าง web แบบเบื้องต้น ทั่วไปทำได้ง่ายมากๆ โดยสามารถที่จะเรียกทดสอบได้โดยผ่านทาง Web Server ที่รองรับการทำงาน Rails
รูปที่ 1 ตัวอย่างโครงสร้างของ Rails
รูปที่ 1 จะเห็นโครงร่างของ Rails ที่มีการ Generate ไว้เพื่อรองรับการสร้าง Web application จากตัวอย่างเราได้สร้าง Framework ของ Web application ที่ชื่อว่า myblogs ซึ่งมีโครงสร้างรายละเอียดคร่าวๆ ดังนี้
app/controllers จะเป็น Directory ที่จัดเก็บส่วนควบคุม (controller) ของ class ทั้งหมด ซึ่งส่วนของควบคุมนี้จะรองรับ Request ต่างๆ จากผู้เรียกใช้งาน
app/views จะเป็น Directory ที่จัดเก็บส่วนของการแสดงผลทั้งหมด โดยข้อมูลต่างๆที่นำมาแสดงนั้น Application จะทำหน้าที่แปลงข้อมูลเหล่านั้นเป็น HTML เพื่อนำไปแสดงที่ Browser ของผู้เรียกใช้งาน
app/helpers จะเป็น Directory ที่เก็บส่วนของ Class ที่เป็น helper เพื่อเป็นองค์ประกอบอื่นๆเพิ่มเติมสำหรับ Class ของ Model, View หรือ Controller ทำให้เราสามารถเขียน Class Model, View หรือ Controller ได้เล็กลง
และเครื่องมือที่จะสร้าง Code ของ Application แบบง่ายๆ ใน Rails คือการสร้าง Scaffold ดังตัวอย่างดังต่อไปนี้

รูปที่ 2 การ Generate code ของ Ruby on Rails
ตัวอย่างข้างต้น Rails จะมีการสร้าง Files เพิ่มเติมในส่วนของ Model และ Controller จากตัวอย่างนั้น Rails จะสร้าง recipe.rb เก็บไว้ใน ../myblogs/app/models และสร้าง recipe_controller.rb ไว้ที่ ../myblogs/app/controllers
หลังจากที่ได้สร้าง Application ง่ายๆ จาก Rails แล้ว เราสามารถนำเอา Application ที่สร้างขึ้นมาทดลองใช้งาน โดยในการทำงานนี้จะต้องอาศัย Web server ที่เป็นตัวรองรับการทำงาน ปัจจุบันนี้ได้มีการพัฒนา Web server เพื่อรองรับการทำงานของ Rails หลายๆ ตัว และ Web Server ที่มีมากับชุดของ Rails เลยคือ “WEBrick” ซึ่งเราสามารถเรียกใช้ดังต่อไปนี้

รูปที่ 3 การเรียกการทำงานของ WEBrick ที่เป็น Web Server ในชุดของ Rails
และเมื่อ WEBrick Server ได้ทำงานแล้ว การทดสอบจะทำได้โดยผ่านทาง Web browser ทาง URL 0.0.0.0 ที่ Port 3000 ดังต่อไปนี้

รูปที่ 4 การเรียกใช้งาน WEBrick ผ่านทาง http://0.0.0.0:3000
และสามารถที่จะทดสอบกับ Web Application ที่เราทดลองทำได้โดย

รูปที่ 5 การเรียกใช้งาน Web application ที่ได้สร้างเป็นตัวอย่างผ่านทาง http://0.0.0.0:3000/recipe
เราสามารถที่จะหาข้อมูลและทดลองทำตามขั้นตอนได้ที่
http://www.onlamp.com/pub/a/onlamp/2006/12/14/revisiting-ruby-on-rails-revisited.html
พร้อมทั้งข้อมูลเพิ่มเติมได้ที่
http://www.rubyonrails.org/docs
เพื่อรองรับการทำงานที่เป็นระบบ Production และเพื่อให้เราสามารถนำ Rails ไปใช้งานในงานด้านธุรกิจได้จริงจังมากขึ้น จึงมีการพัฒนา JRuby on Rails เกิดขึ้น และนอกจากนั้น ยังมีหลายๆ เหตุผลที่นำ Rails มาทำงานบน Java Platform ดังต่อไปนี้
เป็นการทำให้ Rails มีประสิทธิภาพและความสามารถเพิ่มขึ้นด้วย Platform ของ Java โดย Rails สามารถใช้ J2EE application server ได้
ด้วยคุณสมบัติใหม่ของ JVM รุ่นใหม่ๆ และ JRuby ที่มีการพัฒนาต่อเนื่อง ทำให้ JRuby ทำงานได้เร็วกว่า MRI ที่เป็น Server ของ Rails
ทำให้มีการพัฒนาต่อเนื่องขยายกลุ่มของผู้ที่ใช้ Rails ไปยังนักพัฒนา Java ผ่านทาง JRuby
ในปัจจุบันนี้การนำ Rails มาใช้ความสามารถของ Java Platform เป็นที่ยอมรับในแง่การรองรับและการเชื่อมต่อในระบบที่ต้องมีความสามารถในการขยายตัว ตัวอย่างเช่นการเชื่อมต่อ Database ที่ขยายตัวได้มากหรือระบบ Legacy ที่มีความหลากหลายมากๆ
การพัฒนา J2EE application Server ในปัจจุบัน (Project Glassfish - https://glassfish.dev.java.net) สามารถรองรับการทำงานกับ Rails ได้ โดยที่ Rails จะใช้ความสามารถของ Java Platform ได้อย่างเต็มที่ เช่น
การติดต่อกับ Database Connection ต่างๆ
การใช้งาน Java Naming and Directory Interface (JNDI)
การติดต่อกับองค์ประกอบอื่นๆ ของ Java EE ดังเช่น
ปัจจุบันมีเครื่องมือรองรับการพัฒนา Rails บน J2EE platform มากข���้น เครื่องมือเหล่านั้นมีความสามารถทำให้เรียกหรือโปรแกรมให้ Rails ทำงานบน J2EE platform เสมือนเป็นการพัฒนาโปรแกรม Java บน J2EE platform
ตัวอย่างการใช้งานเครื่องมือในการพัฒนา Rails บน Java IDE
Java Developement Toolkit - JDK 1.5.0_07
NetBeans Java IDE - NetBeans IDE 6.0 M10 (http://www.netbeans.org/community/releases/60/index.html)
ด้วยโครงการ JRuby on Rails ยังอยู่ในสถานะเริ่มต้นและยังคงรอการพัฒนาเพื่อให้ IDE นั้นรองรับการทำงานที่สมบูรณ์มากขึ้น และต้องอาศัยความสามารถของ JRuby และ JVM แต่ก็มีแนวโน้มการพัฒนาที่รวดเร็วเช่นเดียวกับกลุ่มของ Ruby ที่มีความแพร่หลายมากๆ และได้รวมเอานักพัฒนาส่วนของ Java เข้าไปร่วมในโครงการด้วย
JRuby on Rails demo
http://blogs.sun.com/arungupta/entry/first_jruby_on_rails_app
http://blogs.sun.com/arungupta/entry/screencast_web6_first_jruby_app
JRuby on Rails project update
http://headius.blogspot.com/2006/03/jruby-progress-updates-jruby-on-rails.html
http://www.headius.com/jrubywiki/index.php/JRuby_on_Rails
JRuby on Rails demo on JBOSS
http://smartic.us/2007/8/11/smarticast-3-jruby-on-rails-on-jboss
JRuby on Rails information on Glassfish
http://blogs.sun.com/whacko/entry/deploying_a_ruby_on_rails
Posted at 11:21ก่อนเที่ยง ก.ย. 04, 2007 by wut in Thai Technical | Comments[0]