Archive

Archive for April, 2008

คำช่วย ช่วยด้วย

April 28th, 2008

อาทิตย์ที่แล้วมีโอกาสไปเดินดูหนังสือที่ศูนย์หนังสือธรรมศาสตร์ เนื่องจากมีโอกาสแวะไปแถวนั้น จริงๆ แล้วเป็นพวกชอบไปเดินร้านหนังสือ แต่มาอยู่นอกเมืองซะขนาดนี้ เลยไม่ค่อยมีร้านหนังสือใหญ่ๆ ให้เดินดูเท่าไหร่ ขนาดศูนย์หนังสือมธ.ยังไม่ค่อยได้ไปเท่าไหร่เลย วันก่อนไปเจอหนังสือชื่อ “คำช่วย ช่วยด้วย” พิมพ์โดยส.ส.ท. เป็นหนังสืออธิบายการใช้คำช่วยในภาษาญี่ปุ่นได้ค่อนข้างดี มีตัวอย่างให้เห็นภาพเยอะ ทำให้เราซึ่งเป็นพวกเรียนภาษาญี่ปุ่นแบบมั่วๆ เข้าใจความหมายของคำช่วยได้เยอะขึ้นทีเดียว ปกติจะเรียนคำช่วยแค่ไม่กี่คำ ที่เหลือก็อาศัยความเคยชิน หรือไม่ก็ใช้จำเอาจากประโยคที่เคยได้ยิน ไม่เคยเรียนความหมาย หรือการใช้อย่างเป็นทางการ ทำให้บางทีใช้ไปโดยไม่เข้าใจความหมายของคำๆ นั้น

คำช่วย (หรือ 助詞 (อ่านว่า โจะชิ)) เป็นคำที่ใช้ต่อท้ายคำนามหรือวลีต่างๆ ในประโยค เพื่อระบุหน้าที่ของคำๆ นั้นในประโยค เนื่องจากไวยากรณ์ภาษาญี่ปุ่นไม่ใช้ตำแหน่งของคำกำหนดหน้าที่ของคำในประโยค เช่น พูดว่า “ฉันกินข้าว” ประโยคนี้ประกอบด้วย 3 คำ คือ ฉัน, กิน, ข้าว พอเราเห็นว่า “กิน” เป็นคำกริยา เราก็จะรู้ได้ทันทีว่า “ฉัน” เป็นประธานเพราะวางไว้ก่อนคำกริยา ส่วน “ข้าว” เป็นกรรมของประโยค แต่ภาษาญี่ปุ่นจะไม่ระบุตำแหน่งแบบนี้ เพราะไวยากรณ์กำหนดแค่ให้วางกริยาไว้ท้ายประโยค จะสร้างประโยคเป็น “ประธาน+กรรม+กริยา” หรือ “กรรม+ประธาน+กริยา” ก็ได้ เช่น ประโยค “ฉันกินข้าว” จะเขียนว่า “ฉันข้าวกิน” หรือ “ข้าวฉันกิน” ก็ได้ ด้วยเหตุนี้จึงเกิดการใช้ “คำช่วย” เพื่อขจัดความกำกวมเกี่ยวกับตำแหน่งออกไป โดยระบุว่า “ฉัน” เป็นประธาน และ “ข้าว” เป็นกรรมของประโยค เช่น 食べる จะเขียนเป็น 食べる ก็ได้ หมายความว่า “ฉันกินข้าว” เหมือนกัน แต่ส่วนใหญ่นิยมแบบแรกมากกว่า คือเอาประธานวางไว้ต้นประโยค จะว่าไปแล้วภาษาญี่ปุ่นนี่ก็ใช้ความเคยชิน (ความน่าจะเป็น/สถิติ) มาช่วยเยอะนะ อย่างพวกการเลือกใช้คำ เวลาเปิดพจนานุกรม ก็จะมีคำให้เลือกหลายคำ (เนื่องจากภาษาญี่ปุ่นมีคำประสมเยอะมาก) อาจจะมีความหมายแตกต่างกันเล็กน้อย หรือบางครั้งก็ความหมายเหมือนกัน แต่คำหนึ่งใช้เวลาเป็นทางการมากๆ คำหนึ่งใช้ในบทสนทนา จริงๆ ในพจนานุกรมน่าจะมีระบุพวกนี้ไว้ด้วยนะ ถ้าจะให้ดีระบุความน่าจะเป็นไว้ให้เลยก็น่าจะเข้าใจง่ายดี

ส่วนเรื่องคำช่วย พูดไปแล้วก็ดูเหมือนไม่ยากเท่าไหร่ แค่ระบุหน้าที่ของคำเท่านั้น แต่เอาเข้าจริง คำช่วยพวกนี้เอาไปใช้ในระบุความหมายต่างๆ ที่ซับซ้อนมากกว่าระบุหน้าที่ของคำในประโยค เช่น ระบุทิศทางของการกระทำ ระบุเพื่อเน้นคำ เน้นความหมาย ใช้กันจิปาถะมาก ดังนั้นคำช่วยจึงเป็นเหมือนยาขมอีกตัวหนึ่งของคนเรียนภาษาญี่ปุ่น เพราะเปลี่ยนคำช่วยแค่คำเดียว ความหมายก็อาจจะเปลี่ยนไปในทางกลับกันเลยก็ได้ เช่น 廊下出る แปลว่าออกไปที่ระเบียง เนื่องจากใช้คำช่วย “に” ซึ่งทำหน้าที่ระบุปลายทาง ถ้าเปลี่ยนคำช่วยนี้เป็น “を” ซึ่งใช้ระบุกรรมของกริยา ประโยค 廊下出る จะแปลว่าออกจากระเบียง (ไปที่อื่น) แทน

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

Uncategorized ,

ITS325 Computer Architecture

April 21st, 2008

เนื่องจากเทอมหน้าจะเปลี่ยนไปสอนวิชา Computer Architecture วิชาเทอมต้นนี่เปลี่ยนมาหลายวิชาแล้ว ทำงานมาสามปี ไม่เคยสอนซ้ำกันซักปี ปีแรกสอนภาษาซีครึ่งหนึ่ง อีกครึ่งสอนวิชา Foundation of Information Systems วิชาที่หายไปจากหลักสูตรแล้ว ปีที่สองก็ไปสอน DBMS ครึ่งหนึ่ง กับ Intelligent Systems อีกครึ่งหนึ่ง วิชาหลังนี่แปลงกายมาเป็น Artificial Intelligence ในหลักสูตรใหม่ แถมย้ายไปอยู่เทอมหลัง ปีที่แล้วกลับไปสอนภาษาซีอีกครั้งหนึ่งแต่คราวนี้สอนเต็มตัวเลย ปีหน้าด้วยเหตุการณ์หลายๆ อย่าง เลยทำให้ได้ไปสอน Computer Architecture แทน ก็เลยต้องเตรียมตัวกันพอสมควร

Computer Architecture มีเป้าหมายให้นักศึกษาเข้าใจหลักการทำงานพื้นฐานภายในระบบคอมพิวเตอร์ ผมยังเชื่อว่าวิชานี้เป็นความรู้พื้นฐานที่สำคัญสำหรับนักศึกษาที่เรียนทางด้านนี้ แม้ว่าปัจจุบันระบบซอฟท์แวร์จะทำสิ่งต่างๆ ซ้อนไว้หลายชั้น จนเราแทบจะไม่จำเป็นต้องสนใจหรือเข้าใจว่าระบบทำงานยังไง เราก็สามารถสร้างซอฟท์แวร์หรือแอพพลิเคชันได้ แต่สุดท้ายถ้าอยากทำซอฟท์แวร์ที่ใช้ประสิทธิภาพสูงสุดของระบบจริงๆ ก็จำเป็นที่จะต้องเข้าใจสิ่งต่างๆ เหล่านี้

ปัญหาของการเรียนวิชานี้ก็คือ ส่วนใหญ่จะเน้นไปที่ทฤษฎี หรือวิธีการต่างๆ จนบางครั้ง นักศึกษาคิดว่าเป็นวิชาท่องจำ หรือบางครั้งก็เน้นไปที่การออกแบบฮาร์ดแวร์ ซึ่งอาจจะไม่เหมาะกับนักศึกษาที่เพิ่งเริ่มเรียนปีที่สองในมหาวิทยาลัย และยังเป็นเทอมแรกที่เรียนวิชาเฉพาะสาขาด้วย นอกจากนี้นักศึกษาที่จะสอนก็เป็นนักศึกษาสาขาวิทยาการคอมพิวเตอร์ กับเทคโนโลยีสารสนเทศ ที่จะเรียน Digital Circuits ในเทอมเดียวกัน แถมเป้าหมายของหลักสูตรก็อยากจะให้นักศึกษาเหล่านี้จบไปทำงานในสาขาทางด้านซอฟท์แวร์ หรือไปทางในเชิงทฤษฎี

สุดท้ายก็ไปเจอหนังสือ Computer Systems: A Programmer’s Perspective ที่พัฒนาโดยอาจารย์จาก CMU ที่เจอปัญหาคล้ายๆ กัน เลยเปลี่ยนวิธีการสอนใหม่ เป็นการเรียนรู้สถาปัตยกรรม หรือการทำงานของคอมพิวเตอร์ ผ่านทางการเขียนโปรแกรม และการทดลองด้วยภาษาซี เพื่อทำให้ผู้เรียนกลายเป็นโปรแกรมเมอร์ที่เข้าใจการทำงานของระบบคอมพิวเตอร์ และสามารถเขียนโปรแกรมที่ดึงความสามารถของระบบออกมาได้เต็มที่ จริงๆ แล้ว Matt ก็เคยใช้หนังสือเล่มนี้สอนเมื่อสามปีก่อนเหมือนกัน ได้เวลาเริ่มทำสไลด์ประกอบการสอนแล้ว คงจะได้สนุกกับวิชานี้อีกเทอมหนึ่งล่ะ ถ้ามีเวลาอยากสอนเขียนโปรแกรมที่ใช้พวก SSE หรือ MMX เพิ่มด้วยนะ แต่หวังว่าคงจะไม่ใช่คนสอนสนุกอยู่คนเดียวนะ :)

teaching ,

Ruby กับ Prolog

April 10th, 2008

ช่วงนี้ได้อ่านหนังสือ “The Ruby Programming Language” ทำให้มีโอกาสได้รู้เทคนิค หรือฟีเจอร์ของภาษา Ruby หลายอย่าง แม้ว่าจะใช้ Ruby มาตั้งแต่สมัยอยู่ญี่ปุ่น แต่ยังไม่เคยมีโอกาสอ่านหนังสือจริงๆ จังๆ ส่วนใหญ่ก็ใช้ไปแบบงูๆ ปลาๆ เหตุผลเดียวที่ใช้ก็คือรู้สึกว่า syntax ค่อนข้างคงที่ไม่กำกวม แถมยังเป็น OOP ทำให้ง่ายต่อการทำงานบางอย่าง วันนี้เพิ่งอ่านเจอว่าเราสามารถเขียน method ที่รับอาร์กิวเมนต์จำนวนไม่คงที่ได้ โดยใช้วิธีการกำหนดพารามิเตอร์เพิ่มหนึ่งตัว นอกเหนือจากพารามิเตอร์ปกติ และให้ใส่เครื่องหมาย * ไว้ข้างหน้าพารามิเตอร์ตัวนั้น เช่น

def min(first, *rest) 
  min=first
  rest.each {|x| min=x if x<min}
  return min
end

method นี้จะหาค่าต่ำที่สุดของอาร์กิวเมนต์ทั้งหมดที่รับมา เช่น

>> min(4,2,1,5)
=> 1

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

ลองดูฟีเจอร์นี้ของ Ruby แล้ว ก็รู้สึกว่าไม่ต่างจากรูปแบบลิสต์ [head|tail] ของ Prolog คือลิสต์ถูกแบ่งเป็นสองส่วน ได้แก่ ส่วนหัว กับส่วนที่เหลือ (ตรงนี้จะต่างจากภาษา C ที่ใช้วิธีกำหนดทั้งหมดไว้ในอะเรย์ แล้วระบุจำนวนอาร์กิวเมนต์มาให้) เลยอยากจะลองเขียน method reverse สำหรับสลับลำดับข้อมูลในลิสต์เรียงกลับจากลำดับเดิม โดยใช้วิธี recursive แบบ Prolog ดู

reverse([],[]).
reverse([H|T], R) :- reverse(T,TR), append(T,[H],R).
def reverse(first, *rest) 
  if rest.empty?
    return [first] 
  else 
    return reverse(*rest) << first
  end
end

ลองเทียบกันดูในแง่ความหมาย จะเห็นว่่าเหมือนกันเป๊ะๆ แถมยังใช้เครื่องหมายคล้ายๆ กันอีก จุดที่แตกต่างที่สุดก็เห็นจะอยู่ที่ลักษณะของ reverse ใน Ruby เป็นฟังก์ชันมีการส่งค่ากลับ ส่วน reverse ของ Prolog เป็น predicate แสดงความสัมพันธ์ระหว่าง list สองอัน

เป็นอันสิ้นสุดการทดลองของวันนี้แต่เพียงเท่านี้

programming , ,

Ruby กับ UTF8

April 10th, 2008

คิดว่าคงจะรู้กันโดยทั่วไปแล้ว ว่าเราสามารถใช้ Ruby กับ String ที่เข้ารหัสแบบ UTF-8 ได้ ที่ว่าใช้ได้นี่หมายความว่า ได้ข้อมูล (ข้อความ) มา ก็สามารถเก็บลงไปในตัวแปรได้เลย ไม่เกิดปัญหาอะไร แต่โดยการทำงานจริงๆ แล้ว Ruby ไม่ได้สนับสนุน UTF-8 หรือการเข้ารหัสข้อความแบบใดๆ ทั้งสิ้น เพียงแค่พิจารณาว่า String ก็คือลำดับของตัวอักษร ที่ตัวอักษรหนึ่งตัวมีขนาดเท่ากัน (จะเป็น 1 ไบต์ หรือ 2 ไบต์ ก็แล้วแต่การใช้งาน) ดังนั้นจึงใช้กับ UTF-8 ที่เก็บตัวอักษรแต่ละตัวด้วยที่ไม่เท่ากันไม่ได้

พอดีช่วงนี้กำลังเขียน Ruby เพื่อจัดการข้อความภาษาไทย และพยายามออกแบบให้จัดการกับภาษาอื่นๆ ได้ด้วย ก็เลยต้องเก็บทุกอย่างไว้เป็น UTF-8 จะได้ไม่เสียเวลาแปลงข้อมูล เสร็จแล้วทีนี้จะต้องเข้าถึงตัวอักษรแต่ละตัวเพื่อคำนวณค่าอะไรบางอย่าง จะใช้ [] ก็ไม่ได้แล้ว เพราะจะได้ตัวอักษรไม่ตรงตัว สุดท้ายเลยต้องไปหา gem ที่ช่วยจัดการ UTF-8 มาลองใช้ด้วย เท่าที่ลองหาดูก็เจอ

  • icu4r เป็น binding ที่ทำให้ Ruby ใช้ความสามารถของ ICU ได้ โดยสร้าง class ใหม่ชื่อ UString มาใช้โดยเฉพาะ ดูท่าทางจะใช้ได้ดี แต่ก็มีข้อเสียอยู่ที่ติดตั้งยาก ต้องลง ICU ไว้ในระบบก่อน สุดท้ายเลยเลิกไป
  • utf8proc เป็น module อีกอันหนึ่ง ที่เพิ่มส่วนขยายให้คลาส String ซึ่งก็มีข้อจำกัดในฟังก์ชันการทำงาน แถมยังไม่ค่อยมีเอกสารเท่าไหร่
  • character-encodings อันนี้ไปเจอทีหลังสุด ฟีเจอร์ต่างๆ ก็ดูดี ใช้งานไม่ยุ่งยาก (แต่อาจจะหาเอกสารยากเหมือนกัน) แต่คนเขียนพยายามบอกว่ามันคือส่วนหนึ่งที่อาจจะรวมเข้าไปใน Ruby 2.0 เลยเลือกใช้อันนี้

การใช้งานก็ไม่ยาก ลองดูตามตัวอย่างนี้ได้เลย

require 'rubygems'
require 'encoding/character/utf-8'
s = +"สวัสดีครับ"
a = Array.new
s.each_char {|c| a << c}

แค่นี้เราก็แยกตัวอักษรแต่ละตัวจาก s ไปไว้ในอะเรย์ a ได้เลย ตัวอักษรแต่ละตัวก็ยังเก็บในฐานะ String เหมือนเดิม ถ้ามองในแง่ความสะดวกแล้ว การทำแบบนี้ก็ง่ายดี แต่ดูแล้วมันต้องแปลงไปแปลงมาอยู่หลายรอบเหมือนกัน

Uncategorized ,

ปิดเทอมใหญ่…ก็ยังไม่เลิกยุ่ง

April 9th, 2008

ช่วงนี้มีคนถามบ่อยๆ ว่า “ปิดเทอมแล้วอาจารย์ทำอะไร?” ส่วนใหญ่ก็จะตอบไปเรื่อยเปื่อยตามสิ่งที่กำลังทำอยู่ในตอนนั้น แต่พอลองมานั่งนึกจริงๆ จึงๆ ดูแล้วก็มีสิ่งที่ต้องทำอีกเยอะเหมือนกัน

  1. ช่วยทำระบบค้นหาคำแปลศัพท์เฉพาะทางอัตโนมัติให้เสร็จ อันนี้หมายถึงโปรแกรมที่ทำงานได้จริงผ่านเว็บ และเปเปอร์ที่เขียนไปได้เยอะแล้วด้วย
  2. ทำไอเดียเกี่ยวกับ SVM ที่มีอยู่ให้กลายเป็นจริง อยากส่งไปงาน ECML2008 ปลายเดือนนี้ ไม่รู้จะทันหรือเปล่า
  3. ปรับปรุงระบบเก็บข้อมูล KPI ของอาจารย์แต่ละคนใน SIIT ที่ทำเมื่อปีที่แล้วให้ดีขึ้น คงต้องทำให้เสร็จก่อนต้นเดือนพฤษภา
  4. เตรียมระบบและบทความเกี่ยวกับการแข่งขัน Robocode ที่จะจัดร่วมกับ vcharkarn.com เพราะใกล้เวลาจะต้องประกาศอย่างเป็นทางการแล้ว
  5. ทำระบบสนับสนุนการสอนของตัวเอง เช่น ระบบเช็คชื่อนักศึกษาที่เข้าเรียนผ่านเว็บ
  6. อ่านหนังสือ Beautiful Code ที่เพิ่งได้มาสดๆ ร้อนๆ
  7. อ่านหนังสือ CS:APP เพื่อจะได้เตรียมสอนวิชา Computer Architecture ในเทอมหน้า อันนี้อยู่ในโครงการ Learning by Teaching :) (เป็นการหาเรื่องใส่ตัวโดยใช่เหตุ)
  8. หาไอเดียใหม่ๆ มาสอนแล็บ Web Application Development ให้ได้ผลมากกว่านี้ หรือใช้เทคนิคที่ใหม่กว่าเดิม
  9. อ่านหนังสือ Ruby Programming Language เพื่อจะได้เขียน Ruby ให้แม่นๆ กว่านี้ คือจำพวก Syntax ไม่ค่อยได้ กับไม่ค่อยรู้รายละเอียดว่ามันคืออะไรด้วย ที่เขียนมาส่วนใหญ่ใช้เดาๆ เอา

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

teaching, university ,