20 October 2005

ทำไมต้องทำงานดึกๆ

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

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

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

10 October 2005

วัดเบญจมบพิตร ดุสิตวนาราม

เมื่อวันเสาร์ที่ผ่านมา มีโอกาสหาเรื่องไปถ่ายรูปพระอุโบสถวัดเบญจมบพิตร หลังจากไม่ได้จับกล้องมาเป็นเวลาหลายเดือน ดีหน่อยที่อากาศค่อนข้างเป็นใจ คือฝนไม่ตก หลังจากตกมาหลายวัน

05 October 2005

ผ่านไปหกเดือน

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

ใช้ภาษาญี่ปุ่นบน FC4

การติดตั้งระบบรับคีย์ภาษาญี่ปุ่นบน FC4 ก็ทำได้ไม่ยาก เพียงแค่ไปที่ส่วน extras ซึ่งรวบรวมแพคเกจเพิ่มเติม ที่อยู่นอกเหนือจากแพคเกจที่มาพร้อมกับ distro เลือกดาวน์โหลดแพคเกจต่อไปนี้
  1. uim-0.4.9.1-1.fc4.i386.rpm
  2. uim-anthy-0.4.9.1-1.fc4.i386.rpm
  3. uim-gnome-0.4.9.1-1.fc4.i386.rpm
  4. uim-gtk2-0.4.9.1-1.fc4.i386.rpm
  5. anthy-6700b-1.fc4.i386.rpm
จากนั้นก็ติดตั้งทั้งหมด โดยใช้คำสั่ง rpm -ivh ก็เป็นอันเสร็จ ส่วนวิธีใช้งาน ก็แค่เพิ่ม uim applet เข้าไปใน panel ที่ไหนซักที แล้วก็เลือกใช้ anthy ก็จะสามารถพิมพ์ภาษาญี่ปุ่นได้ทันที ดังรูป

Firefox Thai บน Fedora Core 4

ตอนนี้กลับมาใช้ Fedora Core อีกครั้งหนึ่ง หลังจากเลิกใช้ไปนานมาก เนื่องจากกำลังเตรียมแล็บสำหรับนักศึกษา ซึ่งปัจจุบันเครื่องของห้องแล็บที่จะใช้สอน ลง Fedora Core 4 เอาไว้ ก็เลยต้องลงไว้ใช้ที่เครื่องตัวเองบ้าง เพื่อไม่ให้ป้องกันปัญหา วิธีติดตั้ง หรือวิธีใช้งานอะไรบ้างอย่างไม่เหมือนกัน หลังจากติดตั้ง FC4 เรียบร้อยแล้ว ก็ต้องทำการปรับแต่งพอสมควร เพื่อให้ใช้งานได้สะดวก ซึ่งสิ่งแรกที่ต้องทำก็คือ อยากให้ Mozilla Firefox ตัดคำไทยได้ เนื่องจากใช้มานานจนติดซะแล้ว เวลาใช้ตัวที่ตัดคำไม่ได้ ก็จะรู้สึกว่าแปลก รำคาญตาชอบกล

หลังจากลองหาดูที่ LTN แล้ว ไม่มีข้อมูลแพคเกจสำหรับ FC4 เลย ก็คิดว่าคงจะต้องทำเอง แต่เนื่องจาก Linux TLE 7.0 รุ่นล่าสุด ใช้ FC3 อยู่แล้ว ก็กะจะโหลด srpm มาคอมไพล์เอา คิดว่าคงไม่มีปัญหาอะไร ลองไปหาดู ก็เจอ srpm รุ่นล่าสุด (1.0.7) ที่ทางทีม TLE เตรียมไว้ คิดในใจว่าอย่างนี้ก็ง่ายสิ แค่คอมไพล์สร้าง binary rpm ใหม่ก็เสร็จแล้ว

แต่พอทำจริงๆ ปรากฏว่ามี error เกิดขึ้นระหว่างคอมไพล์ โดยบอกว่า หา libnss3.so ไม่เจอ โอ้ว... จะให้แก้เองก็รู้สึกว่าไม่มีความสามารถ และเสียเวลาด้วย คาดว่าน่าจะมีปัญหาระหว่างระบบ FC3 กับระบบ FC4 ซึ่งแค่ตัวคอมไพเลอร์ก็ต่างกันแล้ว สุดท้ายเลยไปเจอ srpm สำหรับ FC4 เลยเอามาเป็นตัวเริ่มต้น จากนั้นก็ลองเปิดไฟล์ spec ของทางทีม TLE เห็นว่ามีการใช้ patch 3 ตัว คือ mozilla-icuthai-6.patch, firefox-1.0-config-tle2.patch, และ firefox-1.0rc-config-tle.patch ก็จัดการเพิ่มเข้าไปในไฟล์ spec ของ FC4 แล้วก็ทำการสร้างแพคเกจด้วย คำสั่ง

# rpmbuild -bb firefox.spec

ปรากฎว่าทุกอย่างราบรื่นดี เลยได้แพคเกจ rpm สำหรับ Mozilla Firefox รุ่น 1.0.7 เมื่อลองติดตั้งก็สามารถตัดคำได้ดี เป็นอันเสร็จสิ้นภารกิจ ต้องขอขอบคุณทีม TLE ด้วยที่ช่วยทำ patch ไว้ให้ ส่วนไฟล์ spec ที่แก้ไขก็เอาไปวางไว้ที่นี้แล้วด้วย

31 August 2005

LaTeX กับข้อสอบ

ช่วงนี้งานเต็มไปหมด ทำให้โอกาสเขียนบลอก วันนี้กลับมาเขียนอีกครั้ง เพราะว่าอยากจะจดสิ่งที่เพิ่งทำขึ้นเก็บไว้เป็นบันทึกช่วยจำ เรื่องก็เกิดจากเวลาสอบใกล้เข้ามาทุกทีแล้ว ทำให้ต้องรีบออกข้อสอบ เพราะไปสอนวิชาพื้นฐานสำหรับปีหนึ่ง ซึ่งจะต้องออกข้อสอบเป็นแบบปรนัย เนื่องจากมีนักเรียนเยอะมาก ตรวจข้อสอบไม่ไหว แต่การออกข้อสอบแบบปรนัยให้ดีก็เป็นเรื่องที่ลำบากมาก ต้องคิดว่าทำอย่างไรถึงจะวัดความรู้ของนักเรียนได้ ไม่ใช่ว่าแค่ไปเดาๆ แล้วก็สอบผ่าน แถมจำนวนข้อก็จะเยอะมาก ทำให้ต้องรีบทำเตรียมไว้ตั้งแต่เนิ่นๆ เมื่อวานเลยเริ่มคิดเรื่องข้อสอบ แล้วก็คิดว่าจะเอาอะไรเขียนดี ตอนแรกก็กะจะใช้เวิร์ดโปรเซสเซอร์ทั่วๆ ไป แต่ก็ฉุกคิดขึ้นได้ว่าถ้าใช้โปรแกรมพวกนั้น คงจะมีปัญหามากมาย เพราะข้อสอบนั้นคงจะต้องแก้ไขเยอะมาก แถมออกข้อสอบเขียนโปรแกรมด้วย จะต้องมีบางส่วนยกโปรแกรมมา แล้วให้นักเรียนตอบคำถามจากโปรแกรม สุดท้ายเลยคิดถึง LaTeX ลองไปหาๆ ดู ก็เจอ style file สำหรับข้อสอบแบบ Multiple choice อยู่อันหนึ่ง แต่ยังไม่ถูกใจ ลองปรับดู ก็ลำบากเหมือนกัน สุดท้ายเลยทำเองใหม่ทั้งหมดเลย โดยอาศัยความรู้จากไฟล์ที่ได้มา ได้เป็นคลาสใหม่ ตั้งชื่อง่ายๆ ว่า mcexam.cls เป็นอันว่าเสร็จสิ้น คราวนี้ก็เริ่มออกข้อสอบได้ซะที

คลาส mcexam นี้ออกแบบมาสำหรับเขียนข้อสอบวิชาเขียนโปรแกรมโดยเฉพาะ ใช้ความสามารถของแพคเกจ fancyvrb เพื่อดึงซอร์สโค้ดมาจากไฟล์โดยตรง ทำให้สะดวกในการตรวจสอบความถูกต้อง เพราะสามารถเอาซอร์สไปลองก่อน แล้วก็ดึงมาใส่ข้อสอบได้ทันที โดยไม่จำเป็นต้องเสียเวลาตัดแปะ ซึ่งอาจจะทำให้เกิดความผิดพลาดได้ง่าย แถมการใช้ LaTeX ยังทำให้การจัดลำดับข้อสอบทำได้ง่าย เนื่องจากไม่จำเป็นต้องกำหนดเลขข้อเอง ลองดูตัวอย่างผลลัพธ์ได้

29 July 2005

AJAX: Simple sample

วันนี้นั่งลองเขียน php เพื่อลอง XMLHttpRequest โดยทำตามตัวอย่างเพื่อค้นหาข้อมูลในทันทีที่ผู้ใช้กรอกข้อมูล ที่นิยมทำกันในปัจจุบันโดยเฉพาะโปรแกรมดิกชันนารี เนื่องจากสามารถตอบสนองผู้ใช้ได้รวดเร็วกว่า ผู้ใช้ทราบได้ทันทีในขณะที่พิมพ์ว่ามีข้อมูลนี้อยู่หรือไม่ เว็บนี้ประกอบด้วยหลายส่วนคือ

  1. index.html ซึ่งเป็นส่วนติดต่อกับผู้ใช้
  2. ajax.js ซึ่งเป็น Javascript เพื่อติดต่อกับ server
  3. ajax.php เป็น php ส่วนติดต่อกับ database โดยส่วนนี้จะติดต่อกับ ajax.js เพื่อส่งผลลัพท์ไปแสดงผลใน index.html

ส่วนแรก index.html ก็เหมือนกับ html/php ทั่วๆไป คือเป็น form รับข้อมูลจากผู้ใช้

<html>
<head>
<title>Test Ajax</title>
<script language="javascript" src="ajax.js"></script>
</head>
<body>
<form action="search.php" method="post">
<strong>Book name:</strong> 
<input type="text" name="bkname" autocomplete="off" 
id="bkname" onKeyUp="preSearch()" />
<br />
</form>
<div id="filling">&nbsp;</div>
<div id="result">&nbsp;</div>
</body>
</html>

ส่วนที่สองคือ ajax.js ซึ่งทำหน้าที่ติดต่อกับ ajax.php เพื่อแสดงผลการค้นหา โดยจะถูกเรียกมาทำงานตามฟังก์ชัน preSearch() ซึ่งกำหนดไว้ที่ onKeyUp ซึ่งเป็น event ที่จะเกิดขึ้นทุกครั้งที่ผู้ใช้กรอกข้อมูลเข้าไปหนึ่งตัวอักษร เพราะต้องการให้เว็บแสดงผลลัพธ์ทันทีในขณะที่กำลังกรอกข้อมูล

var xmlhttp = false;

if (window.XMLHttpRequest) {
 xmlhttp = new XMLHttpRequest();
 xmlhttp.overrideMimeType('text/xml');
}
else if (window.ActiveXObject) {
 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}

function preSearch() {
 var bkName = document.getElementById('bkname').value;
 if (bkName != "") {
   document.getElementById('filling').innerHTML = "Searching... ";
   var url = 'ajax.php?q='+bkName;
   xmlhttp.open('GET',url,true);
   xmlhttp.onreadystatechange = function() {
     if (xmlhttp.readystate == 4 && xmlhttp.status == 200) {
       document.getElementById('result').innerHTML = xmlhttp.responseText;
       document.getElementById('filling').innerHTML = "&nbsp;";
     }
     else {
       document.getElementById('result').innerHTML = "Error....";
       document.getElementById('filling').innerHTML = "&nbsp;";
     }
   };    
   xmlhttp.send(null);
 }
}

จากโปรแกรมข้างบน จะมีการเรียกใช้ XMLHttpRequest ซึ่งเป็น object จึงต้อง initialize ก่อน แต่ Internet Explorer กับ Gecko-based browser มีวิธีการเรียกใช้ XMLHttpRequest ไม่เหมือนกัน จึงต้องใช้วิธีข้างต้น ในการกำหนดค่าเริ่มต้น จากนั้น preSearch() จะเรียกข้อมูลที่ผู้ใช้กรอกไว้ โดยใช้ document.getElementById() ซึ่งฟังก์ชันนี้จัดว่าเป็นฟังก์ชันสำคัญฟังก์ชันหนึ่ง เพราะทำให้สามารถเข้าไปแก้ไขโครงสร้างส่วนต่างๆ ของเว็บได้ จากนั้นจะใช้ XMLHttpRequest เพื่อติดต่อไปยัง ajax.php และส่งข้อมูลที่ต้องการค้นหาไปให้ แล้วก็รอผลลัพธ์จาก ajax.php เพื่อนำมาแสดงผลใน id ที่ชื่อว่า result

ส่วนสุดท้ายคือ ajax.php ก็เป็นสคริปต์ php ทั่วๆ ไป ซึ่งจะรับ request แล้วก็จะไปค้นหาข้อมูลในฐานข้อมูล จัดรูปแบบให้เรียบร้อย เพื่อใช้เป็นผลลัพธ์

<?php 
 if (empty($_GET['q'])) {
       echo ' ';
   }
   else {
       $search = trim($_GET['q']);
       $link = mysql_connect('localhost', 'user', 'password')
           or die('Could not connect: '.mysql_error());
      mysql_select_db('bookstore') 
           or die('Could not select database:'.mysql_error());

      $query = "SELECT bkname,bkauthor FROM book WHERE bkname LIKE
'$search%'";
      $result = mysql_query($query) 
           or die('Query failed:'.mysql_error());
?>
       <table border="1"><tr><th>Title</th><th>Author</th></tr>
       <?php
       while($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
           echo('<tr>');
           foreach($line as $col) {
               echo("<td>$col</td>");
           }
           echo('</tr>');
       }
       ?>
       </table>
<?php
       mysql_free_result($result);
       mysql_close($link);
   }
?>

สรุป จะเห็นว่าส่วนที่เพิ่มเติมของเทคนิค AJAX ก็คือ การใช้ XMLHttpRequest เพื่อร้องขอข้อมูลเพิ่มเติม และการเข้าถึง DOM โดยใช้ document.getElementById เพื่อให้สามารถแก้ไข หรือเพิ่มเติมโครงสร้างของเว็บได้ ช่วยให้เว็บมีการตอบสนองผู้ใช้ได้ดียิ่งขึ้น จากเดิมที่ต้องแสดงผลใหม่ทั้งหน้า เป็นแสดงผลเฉพาะส่วน ตัวอย่างนี้แค่แสดงลักษณะง่ายๆ ของ AJAX แต่การนำไปใช้งานจริง คงจะมีสิ่งที่ต้องคำนึงถึงมากกว่านี้ ทั้งในเรื่องการจัดการส่วนการแสดงผลให้เหมาะสม