change JRE/JDK default version in Mac OS X to Java SE 6 (1.6)

(Update 2009.05.16: add JAVA_JVM_VERSION setting)

To build Nutch 1.0, you need JDK 1.6. Unless you’ll got [javac] class file has wrong version 50.0, should be 49.0 error message.

For a system that has more than one version of JDK installed.
It is possible to change to a desired version only at the time you need it (look for j16 script in this thread). I found myself more convenient with just changed the default version.

เปลี่ยนรุ่นปริยายของ Java Runtime และ JDK ใน Mac OS X ให้เป็น Java SE 6 (1.6)

  1. Install Java SE 6 first. ก่อนอื่น ถ้ายังไม่มี Java SE 6 ในเครื่อง ก็ให้ติดตั้งก่อน.
    โดย Java SE 6 จะอยู่ใน Java for Mac OS X 10.5 Update 2, ดาวน์โหลดได้ที่เว็บไซต์ developer.apple.com/java.
    หรือจะปรับรุ่นผ่าน Software Update ก็ได้.
  2. Run Java Preferences app to set the default version. หลังจากติดตั้งเรียบร้อยแล้ว ก็เรียกโปรแกรม Java Preferences ขึ้นมา (อยู่ใน /Applications/Utilities/Java/ หรือพิมพ์ชื่อลง spotlight เลยก็ได้) เพื่อเลือกว่าจะใช้รุ่นไหนก่อนหลัง. ใช้วิธี ลาก วาง. เสร็จแล้วก็ออกจากโปรแกรม.
  3. Point CurrentJDK dynamic link to 1.6. ไปตั้ง dynamic link ของไดเรกทอรี CurrentJDK ให้ชี้ไปหารุ่นที่ต้องการด้วย. เช่น ถ้าอยากให้ 1.6 เป็นรุ่นปริยาย ก็ทำแบบนี้ :
    cd /System/Library/Frameworks/JavaVM.framework/Versions
    sudo rm CurrentJDK
    sudo ln -s 1.6 CurrentJDK
  4. Set JAVA_JVM_VERSION environment variable. ใน ~/.profile ตั้งค่าตัวแปรสภาพแวดล้อม JAVA_JVM_VERSION เป็นรุ่นที่ต้องการ โดยเพิ่มบรรทัดนี้เข้าไป :
    export JAVA_JVM_VERSION=1.6
  5. [optional ไม่ทำก็ได้] Set JAVA_HOME environment variable. ใน ~/.profile อาจจะตั้งค่าตัวแปรสภาพแวดล้อม JAVA_HOME ไว้ด้วย เพิ่มบรรทัดนี้เข้าไป :
    export JAVA_HOME=/Library/Java/Home
  6. [optional แล้วแต่] Set Applet Preferences. ถ้าอยากแก้อะไรกุ๊ก ๆ กิ๊ก ๆ เกี่ยวกับการรันแอปเพล็ต ก็เข้าไปแก้ได้ที่แฟ้ม ~/Library/Caches/Java/deployment.properties. ดูวิธีที่ Java for Mac OS X 10.5 Update 2: Setting Java Applet preferences. เช่น อาจแก้ให้ใช้ font-smoothing/anti-alias กับทุกแอปเพล็ตเลย ก็เพิ่มบรรทัดนี้เข้าไป :
    javaplugin.smoothText=true

เสร็จแว้ว

แถม : สำหรับคนที่ใช้ MacPorts, Porticus เป็น GUI ที่สะดวกดี. (ประมาณ apt กับ Synaptic Package Manager, แต่ Porticus โง่กว่านิดนึง)

technorati tags: 

Robocode Thailand Contest 2009

Robocode Thailand Contest 2009 การแข่งขันการเขียนโปรแกรมจาวาเพื่อควบคุมหุ่นยนต์รถถัง

Robocode เป็นเกมที่แต่ละทีมจะพัฒนาโปรแกรมด้วยภาษาจาวา เพื่อควบคุมหุ่นยนต์รถถังให้ต่อสู้กันแบบอัตโนมัติ โดยแต่ละทีมไม่สามารถควบคุมหุ่นยนต์ของตัวระหว่างการแข่งขันได้ จึงเป็นเกมที่ฝึกทักษะการเขียนโปรแกรมและการนำอัลกอริทึม (algorithm) หรือวิธีการต่าง ๆ รวมถึง ปัญญาประดิษฐ์ (artificial intelligence – AI) มารวมกันเพื่อทำให้หุ่นยนต์มีประสิทธิภาพมากที่สุด เว็บไซต์วิชาการ.คอม เล็งเห็นประโยชน์ของเกม Robocode นี้ว่าจะช่วยฝึกทักษะต่าง ๆ ให้กับเยาวชนและผู้ที่สนใจ จึงร่วมกับศูนย์เทคโนโลยีอิเล็กทรอนิกส์และคอมพิวเตอร์แห่งชาติ (เนคเทค) และสถาบันเทคโนโลยีนานาชาติสิรินธร มหาวิทยาลัยธรรมศาสตร์ จัดการแข่งขัน Robocode Thailand Contest 2009 เพื่อค้นหาสุดยอดทีมกับสุดยอดหุ่นยนต์ประจำปีนี้ โดยการแข่งขันในรอบคัดเลือก จะดำเนินการผ่านเว็บไซต์วิชาการ.คอม ส่วนการแข่งขันในรอบสุดท้าย ซึ่งเป็นการชิงชนะเลิศระดับประเทศ จะจัดการแข่งขันในช่วงต้นปี 2009 ภายในงานมหกรรมการแข่งขันด้านไอซีที ซึ่งดำเนินการเป็นประจำทุกปีโดยเนคเทค

ผู้ที่สนใจสามารถดาวน์โหลดโปรแกรม Robocode ได้ที่ robocode.sf.net ศึกษาวิธีการพัฒนาหุ่นยนต์ได้จากบทความติว และส่งซอฟต์แวร์หุ่นยนต์ที่พัฒนาขึ้นเข้าแข่งขันได้ตั้งแต่วันนี้ โดยจะปิดรับสมัครและปิดให้อัปโหลดหุ่นยนต์ในวันที่ 20 มกราคม 2552

ที่มา : http://www.vcharkarn.com/robocode/

technorati tags:
,
,
,

super("Robot Wars");

ตอนนี้ที่ภาคกำลังสนุกกับ Robocode
น้อง ๆ ที่ลงเรียนแลบ AI (ปี 3) กับแลบ OOP (ปี 2)
ต้องส่งโปรแกรมหุ่นยนต์ลงแข่ง จัดเป็นทัวร์นาเมนต์ (กติกา) เดินไปไหนมาไหน หรือขึ้นรถ ก็จะต้องได้ยินคนคุยกันเรื่องหุ่นเป็นไงมั่ง แข่งกับของคนนั้นคนนี้แล้วเป็นไง (ดูตัวอย่างที่ idiotao, d0m3z) — ปีที่แล้วก็มีแข่งเหมือนกัน (ผมไม่ได้แข่งกะเค้าหรอก แพ้น้องเปล่า ๆ :P)

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

Robocode battle

ตอนผมหัดเขียนโปรแกรมใหม่ ๆ ก็เคยเล่นเกมทำนองนี้
ชื่อ P-ROBOTS (download #1, download #2 – ไม่แน่ใจว่าอันไหนใหม่กว่า) ต่างกันตรงเป็นภาษาปาสคาล (ภาษายอดนิยมในสมัยนั้น สำหรับเริ่มเรียนเขียนโปรแกรม) และเป็นเท็กซ์โหมด ไม่ใช่กราฟิกโหมดอย่าง Robocode — แต่จำได้ว่า แค่นั้นก็สนุกแล้ว ดูตัว # วิ่งไปวิ่งมา

เว็บ RoboWiki
รวบรวมเรื่องเกี่ยวกะ RoboCode พร้อมข้อมูลเกี่ยวกับหุ่นยนต์ตัวดัง ๆ ไว้ครบครัน (บางตัวมีซอร์สโค้ดให้ด้วย)
โค้ดหุ่นหลายตัวเข้าขั้น |nw มาก ๆ
มีเอาเทคนิคการวิเคราะห์เชิงสถิติ หรือพวก ข่ายงานประสาทเทียม ไปใช้ด้วย จริงจังมาก แบบว่าทำนายเส้นทางการเดินของคู่ต่อสู้ได้ เขามีจัดเป็นลีกแข่งด้วยนะ

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

ข้างล่างนี่เป็นเอกสารที่อาจารย์ + น้องปี 4 เค้าทำให้น้องปี 2,3

technorati tags:
,
,

Fixing Java GUI on Hardy Heron

เพิ่งลง Hardy Heron เมื่อคืนก่อน ปรากฎว่า NetBeans 6.0 รันไม่ได้

ปัญหาอยู่ที่ libmawt ของ JVM มันลิงก์กันไม่ได้กับ libxcb/libX11 ของ Hardy Heron แนว ๆ นี้ ดูจาก backtrace อ่ะนะ เราก็ไม่รู้ว่าจะแก้ยังไงหรอก

ไปเจอ workaround ที่ Ubuntu Forums ลองดูแล้ว ใช้ได้ เอามาแบ่งกัน

If you have problem with Java GUI apps (for example, NetBeans) on Hardy Heron (Ubuntu 8.04 LTS pre-release), try run this line in your terminal (as root) รันคำสั่งนี้ในเทอร์มินัล:

for 32-bit Ubuntu:
$ sudo sed -i 's/XINERAMA/FAKEEXTN/g' /usr/lib/jvm/java-6-sun-1.6.0.04/jre/lib/i386/xawt/libmawt.so

for 64-bit Ubuntu:
$ sudo sed -i 's/XINERAMA/FAKEEXTN/g' /usr/lib/jvm/java-6-sun-1.6.0.04/jre/lib/amd64/xawt/libmawt.so

(Notes: the path name may not be exactly as ones shown above, you may need to change to version number and/or the architecture of your JVM. Look your /usr/lib/jvm for the exact name to use. อย่าลืมเปลี่ยนชื่อพาธให้ตรงกับ JVM ที่อยู่ในเครื่องของเรา)

If that doesn’t work for you, try add this line into your .bash_profile file ถ้าไม่เวิร์กก็ลองเพิ่มบรรทัดนี้เข้าไปที่ .bash_profile:

export LIBXCB_ALLOW_SLOPPY_LOCK=true

ผมลองวิธีแล้วแล้วมันใช้ได้นะ NetBeans 6.0 + JVM 1.6.0.04 + Hardy Heron Alpha 4 — WORKSFORME

ตอนนี้กำลังลองเล่น Google Web Toolkit มีสำหรับ NetBeans ด้วยนะ (gwt4nb)

สวัสดีปีใหม่จีน

technorati tags:
,
,

NetBeans 6.0 + Groovy plug-in

NetBeans 6.0 ออกแล้ว เย่
ความสามารถใหม่ที่ชอบมากของรุ่นนี้ก็คือตัว run profile ที่ Eclipse มีตั้งนานแล้ว แต่ NetBeans เพิ่งจะมี

มีหลายแพ็คเกจให้เลือก ถ้าจะเขียน Java SE ทั่ว ๆ ไป ก็ขนาดแค่ 21 MB เท่านั้น

แพ็คเกจอื่น ๆ ก็มี Web/Java EE, Mobility/Java ME, Ruby/Rails, C/C++ หรือโหลดแบบครบเซ็ตเลยก็ได้
แพ็คเกจต่าง ๆ สามารถโหลดเพิ่มเติม/ปรับรุ่นได้ภายหลัง ด้วยตัว update manager ของ NetBeans

และสำหรับคนที่เขียน Groovy/Grails ลองดู Groovy plug-in (อยู่ระหว่างการพัฒนา ถ้าอยากใช้ตอนนี้ต้อง svn มา build เอง)

technorati tags:
,
,

Open source Java port for Mac OS X

Open Source Java 6 port สำหรับ Mac OS X มาแล้ว (รุ่น Developer Preview Release 2) ใช้ได้ทั้งบน Mac OS X 10.4 และ 10.5 ทั้ง 32-bit และ 64-bit

Java 6 port สำหรับ Mac OS X ตัวนี้ ไม่ได้มาจาก Apple แต่มาจากนักพัฒนาอิสระชื่อ Landon Fuller
โดยใช้โค้ดจาก BSD Java port (Mac OS X มีหลายส่วนที่พัฒนาจาก BSD) ซึ่งใช้สัญญาอนุญาต Java Research License (มาจากเจรจาระหว่างโครงการ FreeBSD และ Sun)

Landon มีแผนจะส่งโค้ดนี้เข้าโครงการ BSD Java port ต่อไป และโครงการ BSD Java port เองก็มีเป้าหมายที่จะรวมงานของตนเข้ากับโครงการ OpenJDK
(ซึ่งใช้สัญญาอนุญาต GPLv2+Classpath Exception)

ในเว็บไซต์ของ Landon Fuller มีโชว์ Puzzle Pirates ที่รันบน Java 6 port ตัวนี้ด้วย ผมชอบเกมนี้มาก เคยติดงอมแงมอยู่พักนึง
นอกจากนี้ก็มีภาพ Eclipse (ตัวอย่างของแอพพลิเคชั่น SWT) ที่ใช้ Carbon ด้วย

Charles Nutter นักพัฒนา JRuby ได้ทดสอบ Open Source Java 6 port ตัวนี้กับ JRuby
พบว่าในการทดสอบเลขคำนวณจำนวนเต็ม (fibonacci test)
JRuby trunk บน open source Java 6 port มีประสิทธิภาพดีกว่าบน Apple JDK 6 preview และตามหลัง Ruby 1.9 (native) ไม่ไกลนัก
และหากให้ JRuby trunk บน open source Java 6 port ทำงานในโหมด frameless execution แล้วมันจะมีประสิทธิภาพดีกว่า Ruby 1.9 อยู่เล็กน้อย

ส่วนในการทดสอบ MatrixBenchmark
JRuby บน open source Java 6 port ทำงานเร็วกว่า Ruby 1.9 อยู่ราว 25%

แบบนี้นักพัฒนา (จาวา) จำนวนหนึ่งอาจจะยังใช้ Mac OS X 10.4 ต่อไปได้อีกสักพักใหญ่ ๆ เลยล่ะ ไม่ต้องง้อ Apple แล้วเรื่อง JDK — เว้นว่าถ้าอยากจะเขียนโปรแกรมที่ใช้หน้าตาแบบ Cocao ด้วย Java อันนั้นก็อีกเรื่องนึง แต่ถ้าเป็นเรื่องที่ไม่เกี่ยวกับ UI ก็สบายแล้ว

(ตะกี้ได้กิน “ก๊อบ กอบ” ครั้งแรกในรอบหลายปี ได้รสชาติที่ต่างไปจากเลย์จริง ๆ เบื่อเลย์ ตอนแรกจะหยิบเทสโต แต่เหลือบไปเห็นก๊อบ กอบ ซะก่อน ได้เยอะกว่าด้วย มากกว่าตั้ง 10 กรัม :P)

[ ลิงก์ Landon Fuller | ผ่าน Slashdot ]

technorati tags: 

con/prefusing graph

prefuse MD

พยายามจะวาดกราฟด้วย prefuse
ยังงง ๆ อยู่ ยังไม่ได้อย่างที่อยากได้

อยากจะ:

  • เปลี่ยนขนาดโหนด ตามค่าที่กำหนด (เช่น คำเจอบ่อย ก็วงใหญ่, เจอน้อย ก็วงเล็ก)
  • ให้ลิงก์มีป้ายแปะด้วย
  • ลูกศรมันหายไปไหนหว่า~

หาคำสั่งไม่เจอ เอกสารเขายังไม่เสร็จดี

technorati tags:
,
,
,

JPF – Java Plugin Framework

Java Plugin Framework จะช่วยให้เราสามารถโหลดไลบรารีเข้า/ออก ได้ตามต้องการ/เฉพาะเวลาที่ต้องการใช้ ทำให้ประหยัดหน่วยความจำ นอกจากนี้ยังทำให้เราสามารถจัดการไลบรารีได้สะดวกขึ้น

technorati tags:

GATE experiment at KIND Lab, SIIT

งานทดลองสุดสัปดาห์ที่ผ่านมา

POS-tagged document in GATE

เมื่อวานทดลองเขียน wrapper ครอบ Stanford Log-linear Part-Of-Speech Tagger ให้กลายเป็นปลั๊กอินสำหรับใช้กับ GATE (หลังจากตั้งท่ามานาน)

pipeline ในรูป มี 3 Processing Resources คือ tokensier, splitter และ tagger

tokensier คือ net.siit.gate.DictionaryBasedTokeniser เป็นตัวตัดคำธรรมดา ๆ ใช้พจนานุกรม1 และออกแบบให้ตัดได้คำที่ยาวที่สุด (longest-matching) ทำงานกับ AnnotationSet ของ GATE โดยตรง — จะสร้าง AnnotationSet ชื่อ “Token” ขึ้นมา

splitter คือ ANNIE Sentence Splitter เป็นตัวแบ่งประโยค โดยใช้กฎ (ภาษา JAPE เป็นลักษณะ regular expression over annotation) ตัวนี้มากับ GATE อยู่แล้ว และไม่ได้ออกแบบมาสำหรับภาษาไทย — เราเอามาใช้ไถ ๆ ไป เพื่อให้สร้าง AnnotationSet ชื่อ “Sentence” เท่านั้น (เป็นการ “สมมติว่ามี” จะได้ทดลองขั้นต่อไปได้)

tagger คือ net.siit.gate.StanfordPOSTagger เป็นตัวกำกับชนิดของคำ (Part-of-Speech) เป็น wrapper ไว้เรียกใช้/แปลงข้อมูลจาก edu.stanford.nlp.tagger.maxent.MaxentTagger ซึ่งเป็นตัวกำกับชนิดของคำแบบเรียนรู้จากชุดตัวอย่าง2 ตัว MaxentTagger จะรับข้อมูลเข้า/ส่งข้อมูลออกเป็น List<Sentence> ก็ต้องแปลงให้กลายเป็น AnnotationSet (เอาคำจากชุด “Token” โดยใช้ชุด “Sentence” ระบุขอบเขตประโยค3) เพื่อให้เข้ากับ GATE — ในขั้นตอนสร้าง List<Sentence> ตัว wrapper นี้ จะทึกทักเอาเองว่า Annotation ทั้งหมดใน AnnotationSet นั้น ไม่ทับซ้อนกัน (overlapping), ซึ่งจริง ๆ แล้ว ใน GATE นั้นอนุญาตให้ Annotation มันทับซ้อนกันได้ เช่น ถ้า Token ดันมีซ้อนกันเป็น [ab{cd]efg} แบบนี้ ตอนที่ตัว tagger (wrapper) แปลงเป็น Sentence จะได้ Sentence ที่บรรจุ Word = { “abcd”, “cdefg” }

ทั้งหมดเป็น Java (ในส่วนที่พัฒนาเอง ใช้ NetBeans)

ทั้งหมดนี้ ไม่มีอะไรเป็น “ของใหม่” เป็นเพียงการทดลองหยิบชิ้นส่วนหรืออัลกอริธึมที่คนอื่นทำไว้แล้ว มาลองประกอบเข้าด้วยกันในกรอบ (framework) ของ GATE เท่านั้น (ส่วนที่มีเสริมเข้าไป ก็เพื่อให้ประกอบสนิทกันเท่านั้น)

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

1 สามารถระบุพจนานุกรมตอนสร้าง instance ใหม่ได้ ปัจจุบันคำส่วนหนึ่งมาจากคลังข้อมูลเอกสารการแพทย์ที่ KIND Lab, SIIT ทำร่วมกับ เภสัช ศิลปากร อีกส่วนหนึ่งมาจากตัวตัดคำ KU Wordcut ของเกษตร (สุธี สุดประเสริฐ), ใช้ Trie เป็นโครงสร้างข้อมูลขณะตัดคำ (org.speedblue.util.Trie)

2 ชุดตัวอย่างนำมาจากคลังข้อความ ORCHID โดยเนคเทค (ทดสอบแปลงข้อมูลโดยใช้สคริปต์ Groovy บน JVM)

3 จริง ๆ แล้ว เราสามารถใส่คำทั้งหมดเข้าไปประมวลผลทีเดียวได้ (คือมี 1 ประโยคใน List<Sentence> และทุกคำในเอกสารบรรจุอยู่ในประโยคนั้น) แต่การทำแบบนั้น คิดว่าน่าจะเปลืองหน่วยความจำ อีกเรื่องคือ ยังไม่ได้ศึกษาโดยละเอียดว่า ขอบเขตของประโยค มีส่วนต่อการคำนวณหาค่าความน่าจะเป็นในการกำกับชนิดของคำของคลาส MaxentTagger หรือไม่ (ตั้งสมมติฐานไว้ว่า น่าจะมี จึงพยายามแบ่งประโยค)

technorati tags: