<body><script type="text/javascript"> function setAttributeOnload(object, attribute, val) { if(window.addEventListener) { window.addEventListener("load", function(){ object[attribute] = val; }, false); } else { window.attachEvent('onload', function(){ object[attribute] = val; }); } } </script> <iframe src="http://www.blogger.com/navbar.g?targetBlogID=7355927&amp;blogName=Poonlap%27s+Linux+blog&amp;publishMode=PUBLISH_MODE_BLOGSPOT&amp;navbarType=BLUE&amp;layoutType=CLASSIC&amp;searchRoot=http%3A%2F%2Fpoonlap.blogspot.com%2Fsearch&amp;blogLocale=en_US&amp;homepageUrl=http%3A%2F%2Fpoonlap.blogspot.com%2F" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" height="30px" width="100%" id="navbar-iframe" allowtransparency="true" title="Blogger Navigation and Search"></iframe> <div></div>
 Poonlap's Linux blog  ใช้ซอฟต์แวร์เสรี, มีทางเลือก, ประเทืองปัญญา, พึ่งพาตนเอง.
 
     

เนื้อหาที่ผ่านมา

ลาก่อน blogspot
ใช้ ange-ftp กับ emacs
บันทึกด้วย script
ปีใหม่แล้วเวลาช้าลง 1 วินาที
เปรียบ Java กับ Ruby (ด้วยความหนาของหนังสือ)
แปลคำศัพท์ด้วย Longdo dictionary จาก Firefox
Object Oriented ใน ruby
พวกคำย่อ
ruby เบื้องต้น
del.icio.us/poonlap
 
      เนื้อหาในอดีต
06/01/2004 - 07/01/2004
07/01/2004 - 08/01/2004
08/01/2004 - 09/01/2004
09/01/2004 - 10/01/2004
10/01/2004 - 11/01/2004
11/01/2004 - 12/01/2004
12/01/2004 - 01/01/2005
01/01/2005 - 02/01/2005
02/01/2005 - 03/01/2005
03/01/2005 - 04/01/2005
04/01/2005 - 05/01/2005
05/01/2005 - 06/01/2005
06/01/2005 - 07/01/2005
07/01/2005 - 08/01/2005
08/01/2005 - 09/01/2005
09/01/2005 - 10/01/2005
10/01/2005 - 11/01/2005
11/01/2005 - 12/01/2005
12/01/2005 - 01/01/2006
01/01/2006 - 02/01/2006
02/01/2006 - 03/01/2006
03/01/2006 - 04/01/2006
 
      เชิ่อมโยง

รูปประกอบ (Flickr)
โค้ด
รูปประกอบ (อดีต)
deli.icio.us/poonlap

Thai Linux Working group
TLWG Planet
Blognone
Home at LTN
Bact's blog
Hui blog
Theppitak's blog
Noi's life & thoughts
Kitty.in.th
Sf-alpha
Vee blog
too - blogin'
Mk's blog
Pok's blogger
Vmlinix blog
Sothorn's Web log
คุณอุทัย
DrRider's Blog
Donga's memories

This page is powered by Blogger. Isn't yours?

Creative Commons License

ธนาบุตรโฟโต้บุ๊ค
อัดรูปดิจิตอล ทำสมุดภาพของคุณเอง
รอรับได้. ท่องเที่ยว แต่งงาน ฯลฯ
www.tanabutr.co.th/photobook

ลาก่อน blogspot

ที่อยู่ใหม่ของ Poonlap's Linux blog : http://mm.co.th/poonlap

ได้เวลาบอกลา poonlap.blogspot.com แล้วครับ. ไม่ใช่เลิกเขียน, แต่ไปเขียนต่อที่ http://mm.co.th/poonlap อย่างไรก็ตามก็ขอขอบคุณ blogger.com ที่ช่วยให้ผมเริ่มเขียน blog.

สาเหตุที่เปลี่ยนก็มีหลายอย่างเช่น เปลี่ยนแล้วคงจะจัดแยกประเภทเนื้อหาได้ดีขึ้นแน่ เพราะ blogspot ไม่มีความสามารถนี้. ส่วน web application ที่ใช้สร้าง blog ในครั้งนี้เป็น Drupal ก็ไม่มีเหตุผลอะไรมากว่าทำไมใช้อันนี้ (ก็เห็น Mk ใช้) แต่ก็ดูแล้วดีถึงแม้ว่า theme จะน้อยไม่สวยเท่า Mambo หรือ Joomla. หวังว่าจะใช้ module อื่นๆให้เป็นประโยชน์ด้วยเช่น

  • Glossary เอาไว้เขียนอธิบาย (ไม่้ใช่คำแปล) คำศัพท์ เช่น CSS คืออะไร, emacs คืออะไร ฯลฯ. จะได้เป็นแหล่งอ้างอิงได้ด้วย.
  • Book เป็นโมดูลในตัวไม่ต้องดาว์นโหลดเพิ่มเติม สำหรับเขียนหนังสือ. Post หลายอย่างที่เคยเขียนบางอันเป็น series เช่นการเรื่องเกี่ยวกับ เชลล์สคริปต์, CoLinux จะได้เป็นระเบียบอ่านได้ง่ายขึ้น.
ถ้ามีไอเดียอะไรก็อาจทำเรื่อยๆครับ. จะได้เป็นประโยชน์. แล้วเจอกันที่ http://mm.co.th/poonlap ครับ. ถ้าจะเขียน comment ที่ http://mm.co.th/poonlap ก็ทำได้ มันจะมีให้เติมคำในช่องคำถามกัน spam. ให้เขียนคำว่า bangkok ลงไปก็จะโพสได้ครับ.
ลาก่อน blogspot - Sunday, March 05, 2006 -

ใช้ ange-ftp กับ emacs

ที่อยู่ใหม่ของ Poonlap's Linux blog : http://mm.co.th/poonlap

เมื่อวานเขียน PHP แล้วรู้สึกว่า emacs มันไม่มี php-mode เลยไปลองหาดูจาก google ว่ามันน่าจะมีใครทำมานะ แล้วก็มีจริงๆด้วย. พอจะดาว์นโหลดมาใช้ก็เอะใจว่ามันน่าจะมีแพ็กเกจใน Debian อยู่แล้วเลยลอง
# apt-cache search php | grep emacs
html-helper-mode - A popular HTML editing mode for emacs
ดูไม่น่าใช่ ก็เลยเปลี่ยนคีย์เวิร์ดที่ใช้ค้นหา
# apt-cache search emacs | grep php
php-elisp - Emacs support for php files
หาสองแบบก็ให้สองคำตอบ. ดูแล้วน่าจะเป็นตัวที่สองเลย apt-get มาใช้.

ปัญหาต่อไปคือเจ้าไฟล์ php ที่ต้องการแก้นี้มันอยู่บน web hosting เซิร์ฟเวอร์ ซึ่งส่วนใหญ่เขาก็มีพวก Plesk ควบคุมให้ และก็มี ftp ให้ด้วย. ตอนแรกๆก็ไม่คิดอะไรมากเขียน php เสร็จก็อัปโหลดด้วย ftp client หรืออะไรก็ว่าไป. เขียนไปเขียนมาชักไม่สะดวก, มันน่าจะ save แล้วอัปโหลดขึ้น ftp ให้อัตโนมัติเลย. ทำให้นึกถึงเจ้า ange-ftp ใน emacs ขึ้นมา.

Ange-ftp เป็นวิธีการใช้ไฟล์ที่อยู่ใน ftp เซิร์ฟเวอร์เหมือนกับไฟล์ที่อยู่ในฮาร์ดดิสก์ธรรมดา. วิธีเปิดอ่านไฟล์ก็เหมือนกับเปิดไฟล์อื่นๆคือใช้ C-x C-f (find-file). ตรง mini-buffer แืทนที่จะใส่ชื่อไฟล์ก็ใส่เป็นชื่อและ ftp ไซด์แบบนี้

แล้วก็กด Enter มันจะถามรหัสผ่าน

หลังจากนั้น emacs ก็จะลิสไดเรกทอรีใน ftp ให้ แล้วเราก็เลือกไฟล์ที่ต้องการเปิดมาใช้ได้เลยเหมือนกับไฟล์ธรรมดาที่อยู่ในเครื่องตัวเอง. แก้ไขเสร็จแล้วเราก็แค่ save เหมือนกับเซฟไฟล์ธรรมดาคือกด C-x C-s แล้ว ange-ftp มันก็อัปโหลดไฟล์ที่แก้ไขแล้วไปให้ ftp โดยอัตโนมัติ. สะดวกดีครับ.

นอกจากความสะดวกเรื่อง download/upload แล้วตอนเลือกเปิดไฟล์ ถ้าเขียน /user@ftp.somewhere.com: แล้วกด Tab Tab แน่นอนว่า emacs ก็จะเติมเต็มชื่อไฟล์ที่เป็นไปได้ให้ด้วยเหมือนกับการเปิดไฟล์ธรรมดา. เป็นเทคนิคเก่าๆที่ใช้ได้ดีเสมอครับ.

ใช้ ange-ftp กับ emacs - Wednesday, February 15, 2006 -

บันทึกด้วย script

ที่อยู่ใหม่ของ Poonlap's Linux blog : http://mm.co.th/poonlap

ไม่ได้เขียน blog ตั้งนาน มาเขียนอีกทีก็เกินเดือนไปแล้ว. ช่วงที่ผ่านมามีอะไรหลายอย่างที่ต้องทำ อันหนึ่งคือจัดคอร์สอบรม Perl Programming 15 วันให้กับบริษัทพัฒนาซอฟต์แวร์แห่งหนึ่ง. ถ้าเทรนคนเดียวก็อ่วมแน่, ดีที่ไม่ได้เทรนคนเดียว.

เข้าเรื่องคือใน UNIX มันมีคำสั่งที่ช่วยเก็บทุกอย่างที่พิมพ์หรือแสดงในเทอร์มินอลที่ชื่อว่า script. โปรแกรมนี้จะเริ่มเชลล์ตัวใหม่และบันทึกทุกอย่างที่เขียนหรือที่แสดงทางหน้าจอลงในไฟล์ แล้วเอามาดูได้ทีหลัง. ตรงนี้ก็มีประโยชน์ถ้าเราทำอะไรๆที่สำคัญๆแล้วอยากจะมาดูทีหลังว่าทำอะไรไปบ้างก็ใช้คำสั่งนี้. ที่ผมชอบใช้ก็จะเป็นตอนนี้ต้องติดตั้งโปรแกรมอะไรบางอย่าง, แทนที่จะจดบันทึกว่าทำอย่างไรบ้างก็ให้ script บันทึกไว้แล้วเอามาดูทีหลัง.

คำสั่ง script ถ้าสั่งโดยไม่มีอาร์กิวเมนต์ก็จะเก็บบันทึกสิ่งที่แสดงบนหน้าจอไว้ในไฟล์ typescript

$ script
Script started, file is typescript
$ ls
bin/    dev/     home/    lost+found/  opt/   sbin/  typescript
boot/   etc/     initrd/  media/       proc/  sys/   usr/
cdrom/  floppy/  lib/     mnt/         root/  tmp/   var/
$ exit
exit
Script done, file is typescript
ในตัวอย่างหลังจากที่สั่ง script แล้วก็สั่งคำสั่ง ls ต่อ. ก็หมายความว่าผลลัพธ์ของ ls ก็จะถูกบันทึกในไฟล์ typescript
$ cat typescript
Script started on Mon Feb 13 21:02:35 2006
$ ls
bin/    dev/     home/    lost+found/  opt/   sbin/  typescript
boot/   etc/     initrd/  media/       proc/  sys/   usr/
cdrom/  floppy/  lib/     mnt/         root/  tmp/   var/
$ exit

Script done on Mon Feb 13 21:02:37 2006
คำสั่ง script รับอาร์กิวเมนต์เป็นชื่อไฟล์ที่ต้องการบันทึกด้วย เช่น script log.txt ก็จะเป็นการบันทึกสิ่งที่พิมพ์หรือแสดงในไฟล์ชื่อ log.txt. นอกจากนั้นยังมีตัวเลือก -t สำหรับแสดงเวลาที่พิมพ์หรือแสดงสิ่งต่างๆบนเทอร์มินอลด้วย. วิธีใช้ต้องรีไดเรก STDERR ไปเก็บไว้ในไฟล์เองเช่น
$ script -t log.txt 2> time.info
ตัวอย่างเป็นการบันทึกเทอร์มินอลไว้ในไฟล์ log.txt และเก็บข้อมูลที่เกี่ยวกับเวลาที่พิมพ์หรือแสดงไว้ในไฟล์ time.info
$ cat time.info
0.561127 20
0.060456 2
0.003580 1
2.395590 1
0.131139 2
0.116827 63
0.015795 60
0.001355 62
0.001024 20
0.002928 2
0.014579 6
ดูไฟล์ time.info แล้วก็ไม่ค่อยรู้เรื่องเท่าไรนักเพราะจริงๆแล้วไม่ได้ให้เราดู แต่ไฟล์นี้จะใช้กับโปรแกรม scriptreplay ซึ่งเหมือนกับเปิดวิดิโอให้เราดู. อัีนนี้ต้องลองดูเองครับ.
$ scriptreplay time.info log.txt
จำได้ว่าแต่ก่อน (เมื่อหลายสิบปีที่แล้ว) คำสั่ง script มันก็เก็บแค่ไฟล์ แต่เดี๋ยวนี้มีแบบ replay ให้ดูด้วย. เข้าท่าดีครับ.
บันทึกด้วย script - Monday, February 13, 2006 -

ปีใหม่แล้วเวลาช้าลง 1 วินาที

ที่อยู่ใหม่ของ Poonlap's Linux blog : http://mm.co.th/poonlap

เคยเห็นข่าวอยู่เหมือนกันว่าปีนี้ 2006 จะมีการปรับเวลาให้เดินช้าลง 1 วินาที. ประจวบเหมาะกับไปอ่าน blog ของคุณ Satoru มีเรื่องน่าสนใจที่เขาทดลองเรื่องนี้บน Linux (Debian).

เขาบอกว่าปี 1999 ก็มีการเพิ่มเวลาหนึ่งวินาทีเหมือนกันกับปีนี้แหละ ก็ได้ความรู้มาจาก blog ของเขาว่าต้องเซ็ตตัวแปรสภาพแวดล้อม TZ ไปที่ /usr/share/zoneinfo/right/Asia/Bangkok (ในกรณีของบ้านเรา) ก่อนที่จะเช็คเรื่องเวลานี้ได้. ผมไม่ได้หาข้อมูลเพิ่มเติมแต่เดาว่า /usr/share/zoneinfo/right นี่เป็นที่เก็บข้อมูลเวลาที่ได้รับการปรับเปลี่ยนให้ถูกต้องแล้ว ซึ่งมันจะแตกต่างจากตั้งค่า TZ ไปที่ /usr/share/zoneinfo/Asia/Bangkok

ตัวอย่างที่คุณ Satoru แสดงให้ดูเป็นแบบนี้ (ผมเปลี่ยนตรงเวลาให้เป็น 7 โมงเช้าเพราะประเทศไทยเรามัน GMT+7).

$ TZ=/usr/share/zoneinfo/Asia/Bangkok ruby -e 'p Time.mktime(1999,1,1,7) -1'
Fri Jan 01 06:59:59 ICT 1999
$ TZ=/usr/share/zoneinfo/right/Asia/Bangkok ruby -e 'p Time.mktime(1999,1,1,7) -1'
Fri Jan 01 06:59:60 ICT 1999
จะเห็นว่าถ้าใช้ TZ^/usr/share/zoneinfo/right/Asia/Bangkok มันจะเพิ่มเวลาให้หนึ่งวินาที. ที่นี้ลองมาดูของปีนี้กัน
$ TZ=/usr/share/zoneinfo/right/Asia/Bangkok ruby -e 'p Time.mktime(2006,1,1,7) -1'
Sun Jan 01 06:59:59 ICT 2006
ปรากฏว่ายังไม่มีการเพิ่มเวลาให้.

คุณ Satoru เขียนไว้ว่าข้อมูลการเพิ่มเวลาของปีนี้อยู่ใน glibc 2.3.6 ถ้าไปเอา glibc ตัวใหม่มาคอมไพล์แล้วตั้งค่าให้ถูกต้องก็จะโอเคครับ.

Reference:

    http://namazu.org/~satoru/blog/archives/000093.html
ปีใหม่แล้วเวลาช้าลง 1 วินาที - Sunday, January 08, 2006 -

เปรียบ Java กับ Ruby (ด้วยความหนาของหนังสือ)

ที่อยู่ใหม่ของ Poonlap's Linux blog : http://mm.co.th/poonlap

ไม่ได้เปรียบเทียบทางเทคนิค, แต่เปรียบเทียบด้วยความหนาของหนังสือว่าเรื่องแบบเดียวกันสิ่งที่ต้องเรียนรู้, กับปริมาณโค้ดมันต่างกันเยอะ. ดูแล้วค่อนข้างเวอร์ไปนิด, กึ่งลำเอียง. แต่ยกนิ้วให้คนออกไอเดียนี้ครับ. แต่ที่เขียนเปรียบเทียบจริงจังหน่อยเรื่อง Java web application กับ Ruby on Rails ก็เห็นว่าที่นี่ (ภาษาญี่ปุ่น) อธิบายไว้ดีครับ.

เปรียบ Java กับ Ruby (ด้วยความหนาของหนังสือ) - Friday, December 16, 2005 -

แปลคำศัพท์ด้วย Longdo dictionary จาก Firefox

ที่อยู่ใหม่ของ Poonlap's Linux blog : http://mm.co.th/poonlap

ต่อยอดจาก blog อันที่แล้วที่เกี่ยวกับการ search คำด้วยการเลือกคำ, คลิ้กขวาแล้วสั่งค้นหา. คือ Mk แนะนำมาว่าให้ลองใช้ Dictionary Search extension ของ Firefox ดู. ใช้ได้ดีทีเดียว.

ขั้นตอนก็เหมือนกับการติดตั้ง extension ทั่วไปคือคลิ้กไฟล์ติดตั้ง extension .xpi ที่อยู่ที่หน้า installation ได้เลย. อาจจะต้องอนุญาตให้ Firefox ติดตั้ง extension นั้น. รีสตารท์ Firefox หนึ่งครั้งแล้วจะใช้ได้.

ต้องปรับค่าเล็กน้อย. ไปที่ Tools, extensions. เลือก DictionarySearch แล้วกด Options. ใส่คำว่า
Search Longdo Dictionary "$"
ในช่อง Text: ของ Dictionary 2. ตรง "$" จะแทนด้วยคำที่ highlight ตอนที่ใช้. และกรอก
http://dict.longdo.org/?search=$&service=
ตอนใช้ก็ highlight คำที่ต้องการแปล, คลิ้กขวา, แล้วเลือก "Search Longdo Dictionary ...". Firefox จะเปิด Tab ใหม่แล้วไปที่เว็บไซด์ http://dict.longdo.org แปลคำนั้นให้. เท่าที่ทดสอบดูมันโอเคนะ. Longdo มันแปลคำญี่ปุ่นได้ด้วยแต่ extension ตัวนี้ไม่เวิร์ก. อีกอย่าง, ไม่รู้ว่าเป็นไปได้หรือเปล่าคือมันน่าจะไปขึ้นที่ side-bar หรือไม่ก็ popup หน้่าต่างใหม่แต่เป็นหน้าต่างเล็กๆ. จะได้ไม่ต้องเปลี่ยน Tab ไปดูคำแปล.
แปลคำศัพท์ด้วย Longdo dictionary จาก Firefox - Tuesday, December 13, 2005 -

Object Oriented ใน ruby

ที่อยู่ใหม่ของ Poonlap's Linux blog : http://mm.co.th/poonlap

รู้สึกว่าจะหลีกเลี่ยงที่จะไม่พูดถึง object oriented ไม่ได้ (ต้องพูด) เพราะใช้ ruby ไปแล้วมันต้องไปเกี่ยวข้องกับเรื่องนี้, ก็ต้องมีความรู้ปูพื้นเรื่องนี้ไว้ด้วย.

ทุกอย่างใน ruby เป็นอ็อบเ็จค (วัตถุ) หมด. อ็อบเจ็คหรืออินสแตนซ์ (instance) เกิดมาจากคลาส (class). ให้คิดว่าคลาสเป็นแม่พิมพ์ต้นแบบหรือเป็นประเภท (type) สำหรับแยกแยะวัตถุ (อ็อบเจค) ต่างๆ. คลาสหรือตัวแม่พิมพ์จะมีการกำหนดไว้ล่วงหน้าแล้วว่าอ็อบเจคที่จัดอยู่ในคลาสนั้นๆจะมีคุณสมบัติอะไร, ทำอะไรได้บ้าง. สมมติว่าเราตั้งคลาสที่ชื่อว่า Car. รถยนต์ก็ต้องมีล้อ, มีพวงมาลัย. นอกจากพวกส่วนประกอบแล้วก็ยังต้องมีกริยาหรือการกระทำ. เช่นรถยนต์ก็ต้องวิ่งได้. เวลาเขียนโปรแกรมพวกคุณสมบัติก็มักจะเก็บอยู่ในตัวแปร, ส่วนกริยาก็เป็นฟังก์ชัน. แต่ฟังก์ชันของคลาสเรามักจะเรียกว่าเมตธอต (method). การควบคุมอ็อบเจคนั้นมักจะเกิดจากการส่ง message ให้อ็อบเจคซึ่งก็คือการเรียกใช้เมตธอตนั่นเอง. เช่นมีตัวแปรชื่อ var เก็บอ็อบเจคของคลาส String. เราก็สามารถสั่งอ็อบเจคนั้นให้ทำงานต่างๆได้ถ้าเรารู้ว่าอ็อบเจคนั้นทำอะไรได้บ้าง. สมมติว่าเราต้องการสั่งให้ var มันแสดงจำนวนอักขระที่มีอยู่ในตัวมันก็ต้องรู้ว่าต้องใช้เมตธอต length. แล้วสั่ง

irb(main):001:0> var = "Hello world"
=> "Hello world"
irb(main):002:0> puts var.length
11
=> nil
การสั่งให้อ็อบเจคทำงานในภาษา ruby จะใช้เครื่องหมายจุด . แล้วตามด้วยชื่อเมตธอต.

ถ้าอยากรู้ว่าอ็อบเจคนั้นๆจัดอยู่ในคลาสอะไรก็ใช้เมตธอต class.

irb(main):007:0> var.class
=> String
ในแนวคิดเรื่อง object oriented จะมีแนวคิดเรื่องการสืบทอดหรือที่ภาษาอังกฤษเรียกว่า inheritant อยู่ด้วยคือคลาสต่างๆสามารถสืบทอดคุณสมบัติและการกระทำมาจากคลาสอื่นๆได้ด้วย. และีคลาสต้นตระกูลร่วมของคลาสทุกตัวได้แก่คลาสที่มีชื่อว่า Object. ในตัวอย่างข้างบน var เป็นตัวแปรที่เก็บอ็อบเจคของคลาส String ก็จริงแต่เมตธอต class ที่เรียกใช้นั้นสืบทอดมาจากคลาส Object ไม่ใช่เมตธอตที่กำหนดโดยคลาส String. เมตธอตของคลาส Object ที่น่าสนใจอีกตัวคือ to_s ย่อมาจาก to string ใช้แสดงข้อมูลของอ็อบเจคนั้นในรูปของสายอักขระ.
irb(main):017:0> 4
=> 4
irb(main):018:0> 4.class
=> Fixnum
irb(main):019:0> 4.to_s
=> "4"
irb(main):020:0> 4.to_s.class
=> String
จากตัวอย่างข้างบนจะเห็นว่าถ้ามีตัวเลขเช่น 4 ในโค้ด, ruby จะถือว่า 4 นี่คืออ็อบเจคซึ่งจัดอยู่ในคลาส Fixnum. ถ้าจะแปลงให้อยู่ในรูปของสายอักขระก็ใช้เมตธอต to_s. "4.to_s" นี่ถือว่าเป็นอ็อบเจคของคลาส String แล้วดังนั้นจะส่ง message ต่อไปอีกก็ได้เช่น "4.to_s.class" ก็จะได้ผลลัพธ์เป็น String.

ทีนี้เรามาดูเรื่องการสร้างอ็อบเจค. อ็อบเจคสร้างยังไง? มันขึ้นอยู่กับคลาส, แต่ก็จะมีรูปแบบเป็นเขียนชื่อคลาสแล้วตามด้วยอาร์กิวเมนต์. ตัวอย่างเช่นจะสร้างอินสแตนซ์ของคลาส String ก็ต้องกำหนดข้อมูลของอ็อบเจคนั้นๆ.

irb(main):023:0> String("Hello")
=> "Hello"
irb(main):024:0> String "Hello"
=> "Hello"
irb(main):025:0> "Hello"
=> "Hello"
อย่าลืมว่ามันละไม่เขียนวงเล็บก็ได้. และคลาส String นี่มันพิเศษ, เวลาสร้างอินสแตนซ์ไม่ต้องเขียนชื่อคลาสก็ได้. เขียนสายอักขระในเครื่องหมายคำพูดได้เลย, ถือว่าเป็นการสร้างอ็อบเจคของคลาส String.

ในตัวอย่างข้างบนสร้างอินสแตนซ์ของคลาส String แล้วแต่ไม่มีตัวแปรเก็บอินสแตนซ์นั้นไว้. อินสแตนซ์ที่สร้างมามันก็หายไป. มันอาจจะยังไม่หายไปทันทีหรือหายไปทันที, อันนี้ไม่รู้. แต่ที่แน่ๆคือมีสิ่งที่เรียกว่า garbage collector (GC) ตรวจดูอยู่ว่าถ้ามีอินสแตนซ์ที่ไม่ได้ใช้มันก็จะลบออกไปจากหน่วยความจำ. ตรงนี้แหละทำให้เราืทำงานได้สะดวกขึ้น, ไม่ต้องมาสนใจเรื่องการจัดการหน่วยความจำเพราะมี garbage collector จัดการให้.

ถ้าไม่ต้องการให้อินสแตนซ์ที่สร้างมาหายไปเฉยๆก็เอาไปเก็บในตัวแปรซะ. โดยตัวชื่อตัวแปรได้เลยแล้วใช้เครื่องหมายเท่ากับ = จัดเก็บอ็อบเจคนั้นๆ.

irb(main):026:0> var = "Hello"
=> "Hello"
สังเกตว่าตัวแปรเหมือนกับชื่อซึ่งตั้งให้กับอ็อบเจค. ถ้าคิดในแง่ของโลกจริงๆทุกอย่างมันมีชื่อเสมอ. ของที่ไม่มีชื่อก็คือยังไม่ได้ตั้งชื่อให้แต่มีตัวตน. ก็เหมือนกับเราสร้างอินสแตนซ์ขึ้นมาแล้วไม่เก็บใส่ตัวแปร, อินสแตนซ์นั้นมีตัวตนจริงแต่ไม่มีชื่อ, เลยอ้างอิงไม่ได้ (หรืออ้างอิงลำบาก). ตัวแปรใน ruby สามารถสร้างได้ทันทีเลย, ไม่ต้องประกาศเหมือนกับตัวแปรที่ใช้ใน Java, C, C++. นอกจากจะแตกต่างตรงที่ไม่ต้องประกาศชื่อตัวแปรก่อนแล้วยังไม่ต้องระบุประเภทของตัวแปรด้วย. คือไม่ต้องบอกก่อนว่าตัวแปรชื่อ var นี่เป็นตัวแปรสำหรับอ็อบเจคประเภท (type) อะไร. ดังนั้นถ้าอยู่ๆเห็น var เฉยๆเราก็ไม่รู้หรอกว่าตัวแปรนั้นเก็บอ็อบเจคประเภทอะไรอยู่, จึงต้องใช้เมตธอต class ช่วยจะได้รู้.

ข้อสังเกตถัดไป. ถ้าเรามีตัวแปรของคลาส String อยู่เฉยๆเราจะรู้ได้อย่างไรว่าตัวแปรนั้นมีข้อมูลหรือเปล่า? ตรงนี้สามารถใช้เมตธอตของคลาส Object หรือเมตธอตของคลาส String ช่วยในเรื่องนี้.

irb(main):029:0> var.empty?
=> false
irb(main):030:0> var.nil?
=> false
เมตธอต empty? ใช้สำหรับตรวจสอบดูว่าเนื้อหาของสายอักขระนั้นมันว่างเปล่าหรือไม่. ปรกติชื่อเมตธอตที่ใช้ตรวจสอบมักจะส่งค่า true หรือ false กลับมาและชื่อเมตธอตลงท้ายด้วยเครื่องหมายคำถาม ?. ดูตอนแรกอาจจะแปลกๆ. ส่วน nil? ตรวจสอบว่ามันไม่มีตัวตนใช่หรือไม่. มาดูตัวอย่างจะเข้าใจง่ายกว่า.
irb(main):039:0> var = ""
=> ""
irb(main):040:0> var.empty?
=> true
irb(main):041:0> var.nil?
=> false
จากตัวอย่าง var มันมีตัวตน, แต่ empty ไม่ได้หมายความว่ามัน nil (ไม่มีตัวตน).

ปัญหาต่อไปคือเราจะรู้ได้อย่างไรว่ามีคลาสอะไรให้ใช้บ้างและคลาสนั้นๆมีเมตธอตอะไร? อันนี้อาจจะต้องไปอ่านเอกสาร ruby manual ก่อนรอบหนึ่งก็จะรู้ว่ามันมีคลาสมาตรฐานอะไรบ้างเช่น Object, String, Fixnum, ฯลฯ. หรือใช้คำสั่ง ri. คำสั่ง ri คล้ายๆกับ man ที่คอยจะบอกว่ามีคลาสอะไรทำอะไรได้บ้าง. ตัวอย่างการใช้เช่น

$ ri -l # แสดงคลาสทั้งหมด
OptionParser
OptionParser::accept
OptionParser::inc
...
$ ri Object#class
----------------------------------------------------------- Object#class
     obj.class    => class
------------------------------------------------------------------------
     Returns the class of _obj_, now preferred over +Object#type+, as an
     object's type in Ruby is only loosely tied to that object's class.
     This method must always be called with an explicit receiver, as
     +class+ is also a reserved word in Ruby.

        1.class      #=> Fixnum
        self.class   #=> Object
สรุป
  • คลาสเปรียบเสมือนแม่แบบ, ประเภทของวัตถุ.
  • อ็อบเจคจะมีประเภท (คลาส) เสมอ
  • คลาสที่สามารถสืบทอดคุณสมบัติกันได้และคลาสต้นตระกูลสูงสุดคือ Object.
  • ตัวแปรคือชื่อที่ตั้งให้อ็อบเจค
  • การสร้า้งอ็อบเจคหรืออินสแตนซ์ทำได้โดยการเขียนชื่อคลาสแล้วตามด้วยอาร์กิวเมนต์
  • ใช้คำสั่ง ri ดูรายชื่อคลาส, การใช้เมตธอต.
Object Oriented ใน ruby - Sunday, December 11, 2005 -

พวกคำย่อ

ที่อยู่ใหม่ของ Poonlap's Linux blog : http://mm.co.th/poonlap

คำย่อที่พึ่งเรียนรู้. ชอบย่อกันนัก, ทำให้ต้องเรียนรู้.
  • RoR นึกว่าอะไร มันคือ Ruby on Rails.
  • REST: Representational State Transfer.
  • CRUD: Create, Retrieve, Update, Delete.
พวกคำย่อ - -


 
Search this blog:


Google Home - Blogger - Blogger Templates

© 2005 Poonlap's Linux blog