JTCC: library ตัดกลุ่มของตัวอักษรไทย

Mar 19 2010 Published by admin under Uncategorized

TCC คือกลุ่มของตัวอักษรไทยที่ไม่สามารถแยกจากกันได้ตามหลักการเขียนของภาษาไทย เสนอครั้งแรกใน paper Character Cluster Based Thai Information Retrieval TCC หนึ่งอาจจะไม่เป็นคำหรือไม่เป็นพยางค์ด้วยซ้ำ ตัวอย่างต่อไปนี้เป็น TCC ทั้งสิ้น

จะ, กับ, เข้, เพราะ, อื้อ, รู้, ใส่

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

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

เร็วๆนี้ เพิ่งนำตัวตัด TCC ที่พัฒนาขึ้นมาปล่อยเป็น library (open-source) ชื่อ JTCC พัฒนาด้วยภาษา Java โดยใช้ parser generator ที่ชื่อ ANTLR ช่วยเพื่อสร้าง parser จาก grammar ของ TCC ที่เขียนไว้  หากสนใจก็เชิญนำไปใช้ได้ด้วย license GPLv3 ตัว library ยังไม่สมบูรณ์มากนัก แน่นอนยังมีจุดบกพร่อง (ดูได้ที่หน้า issue ในเว็บของ JTCC) หากมีข้อเสนอแนะหรือคำถามก็เชิญได้เลยครับ :)

เว็บหลักของ JTCC :  http://jtcc.googlecode.com

4 responses so far

Executable Jar กับ Netbeans 6.x

Mar 19 2010 Published by admin under Uncategorized

ปกติหากใช้ Netbeans ในการเขียน Java จะเห็นว่าทุกครั้งที่ build จะมีโฟลเดอร์ชื่อ dist เกิดขึ้นมาในโฟลเดอร์โปรเจค ซึ่งในนั้นจะมี jar ที่เกิดจากการ compile code ในโปรเจคของเรา และจะสามารถ double click เพื่อรันได้เลย (หรือใช้ java -jar บน command line) หากมีการตั้ง main class ไว้

ปัญหาคือว่าบางทีถึงแม้มีการตั้ง main class ใน Netbeans ไว้แล้ว แต่เจ้า jar ที่มันสร้างให้ดันไม่สามารถรันได้ นั่นคือ double click ก็ไม่ได้ ใช้ java -jar ก็บอกหา main class ไม่เจอ หากลองเปิดไฟล์ manifest ใน jar ดูจะพบว่ามันไม่ได้เขียน entry “Main-Class” ไว้ จึงไม่แปลกที่มันรันไม่ได้

เหตุผลที่มันไม่ใส่ไว้ให้มีหลายกรณี

  • import project มาจาก Eclipse มีที อาจมี config อะไรบางอย่างไม่ตรง
  • ตอนสร้างโปรเจคใน Netbeans เลือกเป็น Java library ไม่ได้เลือก Java application

วิธีแก้

เปิดไฟล์ PROJECTPATH/nbproject/project.properties เพิ่ม

manifest.file=manifest.mf

ลงไป แค่นี้ก็จะมี entry “Main-Class” ขึ้นมาใน manifest แล้ว jar ก็จะรันได้

อ้างอิง

4 responses so far

Method ของ Java กับ Google Web Toolkit

Oct 22 2009 Published by admin under Uncategorized

Google Web Toolkit (GWT) เป็น tool ตัวหนึ่งที่โปรแกรมเมอร์สามารถใช้ Java เขียน web application ที่ใช้ AJAX ได้ โดยเจ้า GWT นี้ทำหน้าที่เป็น compiler แปลงโปรแกรมภาษา Java ให้เป็น Javascript

ดูเผินๆเหมือนจะเป็นเครื่องมือที่ทรงพลังมาก แต่จริงๆแล้ว GWT ไม่ได้สามารถแปลงทุกอย่างใน Java ให้เป็น Javascript ได้ GWT ได้มีการกำหนดไว้แล้วว่า package ใด class ใด และลงไปถึง method ใดบางของ Java ที่สามารถใช้ได้ ทำให้บางทีก็ทำให้รู้สึกสับสนได้ว่า Java ที่เขียนอยู่มันจะรันเป็น Javascript ได้จริงหรือไม่ แต่หากทำอะไรไม่พิสดารมาก คือใช้ class พื้นๆพวกที่อยู่ใน java.utils หรือ java.lang พวกนี้จะไม่ค่อยมีปัญหาแต่อย่างใด เหตุที่ใช้คำว่าไม่ค่อยเพราะได้เรียนรู้อะไรบางอย่างเมื่อเร็วๆนี้ และเป็นประเด็นที่ทำให้ต้องเขียน post นี้ขึ้นมาเตือนตัวเอง

สิ่งที่อยากเน้นคือ มีบาง method ของบาง class ใน Java ที่สนับสนุนโดย GWT (แปลว่าใช้แล้วมันยอม compile ให้) แต่พอ compile ออกมาเป็น Javascript แล้วทำงานไม่เหมือนกับใน Java อันนี้อันตรายมาก เนื่องจากโปรแกรมเมอร์อาจเผลอตัวเขียนแบบไม่ทันคิดจนทำให้เกิด bug แบบหากันทั้งวันได้ ตัวอย่างดีๆเลยอันหนึ่งคือ String.replaceAll(x, y)  ซึ่งทำหน้าที่แทนทุก string x ด้วย string y method นี้ทำงานได้แต่ว่าต้องใช้ regex ใน format ของ Javascript ซึ่งหากไม่ได้ดูจากคู่มือดีๆคนที่ใช้ regex แบบ Java ไปอาจเกิด bug ได้

สรุป: จะใช้ method อะไรใน GWT อ่าน API Document ซักหนึ่งรอบก่อน ถึงแม้ method นั้นเราจะคุ้นเคยแล้วก็ตาม

2 responses so far

Error อย่างไม่คาดคิดจากไฟล์ใน classpath

Aug 20 2009 Published by admin under Uncategorized

ในการเขียนโปรแกรม Java คำว่า classpath หมายถึงตำแหน่งที่จะให้ Java ไปหา class เพื่อเรียกใช้ในโปรแกรม ปกติแล้วเวลาเขียนโปรแกรม Java เสร็จก็มักจะสร้างเป็น JAR เพื่อให้พกพาได้ง่าย แล้วเวลาเรียกใช้ก็สร้าง shell script เพื่อเรียก jar อีกที จะได้เรียก script นั้นแล้วก็รันเลย ต่อไปนี้เป็นตัวอย่างคำสั่งใน script ที่มักใช้บ่อย

java  -cp "lib/*:myProgram.jar" my.package.name.MyMain

คำสั่งข้างบนคือ สั่งรัน class ชื่อ MyMain ซึ่งอยู่ใน package my.package.name โดยที่ MyMain นี้อยู่ใน JAR ที่เราแพคมาแล้ว -cp คือการกำหนด classpath ว่าให้ Java ไปหา class เพื่อรันที่ไฟล์ในโฟลเดอร์ lib (เขียนว่า lib/* แปลว่า ทุกไฟล์ในโฟลเดอร์ lib) รวมทั้ง class ที่อยู่ใน myProgram.jar ด้วย จะเห็นว่าการกำหนด path ของแต่ละตำแหน่งต้องขั้นด้วย : (colon) รูปแบบการกำหนด classpath อาจต่างไปเล็กน้อยสำหรับใน Windows คำสั่งข้างบนใช้กับ Linux

ที่เขียนโพสนี้ไม่ได้ตั้งใจจะอธิบายเรื่อง classpath แต่จะจดความไม่รู้ของตัวเอง ที่ทำให้ต้องนั่งเสียเวลาหาเป็นชั่วโมง :( เรื่องมีอยู่ว่ามีเหตุผลที่ต้องแก้ code พอแก้เสร็จก็ upload JAR ขึ้นไปบน server เพื่อจะรันตามปกติ ที่นี้ตอนรันปรากฏว่า output ดันเป็นเหมือนกับตอนที่ยังไม่แก้ code เลย ทั้งๆที่ก็แก้แล้ว ไล่หาอยู่นาน ทำยังไงมันก็ไม่เปลี่ยน

ปัญหาเป็นอะไรที่เล็กมา คือ JAR ที่อัพโหลดไปดันไปอยู่ผิดที่ แทนที่จะอยู่แค่ (เน้นคำว่า”แค่”) นอกโฟลเดอร์ lib มันดันไปอยู่ในโฟลเดอร์ lib ด้วย กลายเป็นว่ามี JAR 2 อันซึ่งอยู่ใน classpath ทั้งคู่เลย ซึ่งดูเผินๆไม่น่าจะมีอะไร Java ก็เลือกอันไหนก็ได้ แต่เรื่องของเรื่องคือ Java เลือกใช้อันที่อยู่ในโฟลเดอร์ lib ครับ แล้วเผอิญว่าอันนั้นมันเป็นอันเก่า ที่ยังไม่แก้…!

บทเรียน: โปรแกรมรันได้ไม่ได้แปลว่า classpath ถูกต้องแล้ว วาง JAR ดีๆอย่าเบลอ

No responses yet

Older posts »