วันอังคารที่ 28 ตุลาคม พ.ศ. 2551

update ข่าวสาร

1. Google Earth App สำหรับ iPhone สามารถ load ได้ที่ Apple Store สามารถใช้งานได้ทั้งแบบ Online และ Offline
http://www.macnewsworld.com/story/64949.html

2. Widows Live, google, yahoo สนับสนุน Open ID กันหมดแล้ว แล้วเราจะรอช้าอยู่ใย

3. Google ทำการเพิ่ม Gadget ของ Google Docs และ Google Calendar ใน GMail แล้วนะครับ ลองใช้กันดู

4. ICT ใช้งบ 100-500 ล้านบาท ในการ block web ที่หมิ่นเบื้องสูง


5. Yahoo Application Platform [ YAP ]

วันพุธที่ 15 ตุลาคม พ.ศ. 2551

Oracle :: SQL สำหรับการดึงข้อมูลล่าสุด

วันศุกร์ที่ 10 ตุลาคม พ.ศ. 2551

java.io.IOException :: Too many open file

วันพฤหัสบดีที่ 9 ตุลาคม พ.ศ. 2551

ทดลองใช้ JSR166y

พอดีไปเห็นบทความเกี่ยวกับ JSR166y ที่นี่ http://groovy.dzone.com/news/concurrency-jsr-166y-meets-gro

โดยเป้าหมายหลักของ JSR166y คือ lightweight task framework สำหรับ Java Platform ซึ่งใช้แนวคิดของ Fork and Join Framework เพื่อนำมาแก้ไขปัญหาการใช้งาน Thread ในระบบแบบขนาน เนื่องจาก Thread นั้นกินทรัพยากรของระบบมากจนเกินไป

๋JSR166y นี้เป็น library ตัวใหม่ที่วางแผนไว้ว่าจะเพิ่มเข้าไปใน JDK 7 ครับ

สำหรับ library นั้นสามารถ Download ได้ที่นี่ http://gee.cs.oswego.edu/dl/jsr166/dist/jsr166y.jar

ส่วน JavaDoc ก็ที่นี่ครับ http://gee.cs.oswego.edu/dl/jsr166/dist/jsr166ydocs/overview-summary.html


ผมลองทำการทดสอบใช้งานดังนี้
- ทำ application เพื่ออ่าน Rss Feed จากหลายๆ เว็บ ดังนี้

Environment ที่ใช้ทดสอบ
- Windows XP
- JDK 6


String[] url = {
"http://www.grails66.com/blog/feed/",
"http://www.rails66.com/blog/feed/",
"http://www.ajax66.com/blog/feed/",
"http://www.seam66.com/blog/?feed=rss2",
"http://www.ofbiz66.com/blog/?feed=rss2"
};

ForkJoinExecutor fje = ParallelArray.defaultExecutor();
ParallelArray p = ParallelArray.createFromCopy(url, fje);
p.replaceWithMapping(new RssFeed());
System.out.println(p.asList());


สร้าง class RssFeed สำหรับการทำงานในแต่ละ process ที่แตกออกมา ( Fork ) ดังนี้

class RssFeed implements Op {

@Override
public String op(String url) {
System.out.println(System.currentTimeMillis() + " : " + url);
return getData(url);
}
}

เมื่อทำการ run แล้วจะเห้นได้ว่าจะไม่ได้ทำการแบบ sequential เลย จะทำงานแบบ parallel ครับ ตรงนี้ทำงานดูดีครับ

หรืออาจจะกำหนด Pool ของ ForkJoin process ได้เองดังนี้

ForkJoinPool pool = new ForkJoinPool(3); // กำหนดเป็น 3
ParallelArray p = ParallelArray.createFromCopy(url, pool);

ทดสอบ run ก็จะได้ผลอีกแบบครับ


เอกสารเพิ่มเติม
http://groovy.dzone.com/news/concurrency-jsr-166y-meets-gro

ป้องกันการ run process แบบไม่สิ้นสุดใน Java

วันนี้ทำการทดสอบ migrate data process ซึ่งจะมีบาง process ทำการ run process ผ่าน java.lang.Process

โดยปัญหาที่พบคือ อาจจะมีบาง process ที่ทำงานไม่จบสักที [ ไม่มี signal ออกมาจาก process นั้น ]

ส่วน code ที่เป้นปัญหาคือ มัน
while( true ) {
try {
int process_status = process.waitFor();
break;
} catch( InterruptedException e ) {
}
}

ปัญหามันเกิดขึ้นมาเมื่อ process ไม่มี signal อะไรออกมา

ดังนั้น สามารถแก้ปัญหาได้โดยการใช้ Timer มาช่วย จะกำหนด timeout ได้ ดังนี้

Timer timer = new Timer();
timer.schedule(new InterruptProcess(Thread.currentThread()), 5000);
try {
exitStatus = proc.waitFor();
}
catch (InterruptedException e) {
proc.destroy();
}
finally {
timer.cancel();
}

และ Class InterruptProcess ซึ่งจะ extends มาจาก timerTask ดังนี้

class InterruptProcess
extends TimerTask {
Thread target = null;
InterruptProcess(Thread target) {
this.target = target;
}

/**
* run
*/
public void run() {
target.interrupt();
System.out.print("-|Run Interrupt|-");
}

}

จากตัวอย่าง ผมทำการกำหนด timeout = 5 วินาที ดังนั้นถ้า process มีเวลาทำงานมากที่สุดคือ 5 วินาทีเท่านั้น ส่วน process ที่ run เสร็จเร็วก็ไม่มีปัญหาอะไร

วันอาทิตย์ที่ 5 ตุลาคม พ.ศ. 2551

เริ่มต้นการพัฒนา Firefox Plug-in Application

หลังจากที่ทิ้งไปนานก็เลยกลับมาศึกษาการพัฒนา Firefox Plug-in Application กันหน่อย

โดยสามารถเริ่มการศึกษาได้ที่นี่
http://developer.mozilla.org/en/Building_an_Extension#Extending_the_Browser_with_XUL
และ slide ที่นี่อธิบายได้ดี
http://www.slideshare.net/skeevs/mozilla-firefox-extension-development/

ก่อนจะพัฒนานั้น ผมก็มานั่งศึกษาก่อนว่าโครงสร้างของ Firefox Plug-in เป็นอย่างไรบ้าง อนุญาตให้เราทำอะไรได้บ้าง

1. เทคดนโลยีที่ใช้ ประกอบไปด้วย
- JavaScript, AJAX, DOM, XML, CSS
- XUL (XML User Interface Language)
- xpcom ( Cross Platform Component Object Model )

2. Tools ที่ใช้ในการพัฒนา
- ผมเลือกใช้ Eclipse + XULBooster plug-in เหตุผลง่ายๆ คือ ฟรี และเป็น tools ที่ใกล้ตัวที่สุด

3. โครงสร้างของ Firefox Plug-in
นามสกุลของ file คือ xpi [ Mozilla/Firefox Browser Extension Archive ] สามารถเปิดด้วย winzip และ winrar ใน file xpi จะประกอบไปด้วย
- install.rdf [ ใช้สำหรับการ install plug-in จะอธิบายเกี่ยวกับ plug-in นั้น มี format เป็น xml ]
- chrome.manifest
- *.xul [ ส่วนแสดงผล ]
- *.js
- *.css
- *.xml
...

มีโครงสร้างของ files ดังรูป



4. ส่วนการแสดงผล จะสร้างด้วย XUL นั้นสามารถ custom ส่วนต่างๆ ของ Firefox หรือ Chrome UI ได้ดังนี้
- MenuBar
- Toolbox
- Toolbar
- Toolbar button
- Window
- Menu List
- Button
- Status Bar

5. มาทำความรู้จักกับ XUL กันหน่อย
- ย่อมาจาก XML User-interface Language
- โครงสร้างเป็น xml
- จะใช้เป็นส่วนการแสดงผล และการควบคุมการทำงานต่างๆ เช่น Layout, Input, Window

file xul นั้นสามารถ reference ได้ดังนี้
Chrome://my-plugin/content/test.xul


6. การใช้งาน JavaScript ใน xul
นั้นสามารถ reference ได้ดังนี้

โดย JavaScript นั้นสามารถจัดการ event ต่างๆ ใน XUL UI , จัดการ DOM Tree และการติดต่อผ่าน xpcom ได้

7. Localization [ L10n ] สนับสนุนหลายๆ ภาษาได้ ซึ่งจะเป็นส่วน label โดยสามารถกำหนดไว้ใน /local/

เมื่อลองศึกษามาบ้าง ผมก็ลองสร้าง Firefox plug-in บ้างโดยความต้องการง่ายๆ คือ
1. ทำการดึงข้อมูลจาก feed ของ paw66.com จากที่นี่ http://www.paw66.com/sandbox/aggregator/rss

2. นำมาแสดงผลในส่วน Status Bar ของ Firefox

3. เมื่อ click ขวาที่ status bar แล้วจะมี menu ขึ้นมาให้เลือกคือ
- ดึงข้อมูลล่าสุด
- เกี่ยวกับ paw66

4. เมื่อ click ซ้ายจะ เปิด tab ใหม่เพื่อเปิด url ของ feed นั้นๆ
รูปแสดงการใช้งาน plugin ที่ผมลองทำดู


ผม upload plug-in ไว้ที่นี่ http://www.pai-pa.com/somkiat/ff/paw66-feed.xpi

นี่ก็คือการลองสร้าง Firefox plug-in application แบบง่ายๆ ครับ

วันพุธที่ 1 ตุลาคม พ.ศ. 2551

เพิ่ม Search ของคุณลงใน FireFox กันไหม

ว่างๆ ไม่มีไรทำเลยหาเรื่องใส่ตัวสักหน่อย

แว่วๆๆ ว่า คนแถวๆ office จะไปจ้างใครไม่รู้ทำ FireFox Plugin เพื่อช่วยให้เข้าใช้งาน web app ง่ายมากขึ้น ได้ฟังแล้วมันฟุ้งซ่านขึ้นมาทันที ของมันไม่ได้ยากเลย ยังจะจ้างกันอีก ก็เลยลองเริ่มขั้นตอนแรกให้หายงงก่อน คือ เพิ่ม Search ของ Web ที่จะทำลงไปยัง FireFox ก่อนดีกว่า ซึ่งจะไปเพิ่มตรงนี้ ดังรูป




จะเพิ่มยังไง ??

1. ขั้นแรก ต้องบอกก่อนผมใช้ Firefox 3.0.3 นะครับ
2. ไปที่ C:\Program Files\Mozilla Firefox\searchplugins [ ติดตั้งที่ drive ไหนก็ไปตามนั้นครับ ส่วนผมติดตั้งไว้ที่ drive c: ]
3. ใน folder นี้จะมี xml หลายๆ ตัว ดังนั้นผมเอาบ้าง สร้าง my_search.xml เลย หน้าตาของ xml จะประมาณนี้ครับ

http://gist.github.com/14072


ส่วนที่สำคัญคือ
- Image จะเป็น data image ที่เป็น base64 ครับ ใครอยากลองแปลงก็ตาม url นี้ หรือแปลงเองก็ได้นะ ใช้ js ง่ายๆ
http://www.greywyvern.com/code/php/binary2base64

- Url ให้ใส่ end point url ของ search ที่คุณต้องการครับ และสามารถใส่ parameter ได้ด้วย
- {searchTerms} คือข้อมูลที่จะกรอกมาจากหน้าของ FireFox

4. ทำการ restart Firefox ครับ แล้วจะเห็นประมาณนี้















5. เลือกใช้กันหน่อย อิอิอิ แต่ไม่ซะใจ ตั้งให้เป็น Default Search ไปเลยครับ
- ไปที่ about:config
- แก้ไขค่าของ key browser.search.order.1 เป็น Custom Search
- restart Firefox แล้วจะได้แบบนี้



เป็นอันเสร็จสิ้นครับผม


Website References

http://www.greywyvern.com/code/php/binary2base64
http://labnol.blogspot.com/2006/09/learn-to-create-firefox-search-plugin.html