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 ]
วันอังคารที่ 28 ตุลาคม พ.ศ. 2551
วันพุธที่ 15 ตุลาคม พ.ศ. 2551
Oracle :: SQL สำหรับการดึงข้อมูลล่าสุด
SQL สำหรับการดึงข้อมูลล่าสุด โดยใช้บน Oracle Database เป็นดังนี้
ตัวอย่าง จะเป็นการดึงข้อมูล 10 records ล่าสุด
SELECT *
FROM (SELECT ROWNUM rno , my_column
FROM some_table)
WHERE rno > (SELECT (MAX (ROWNUM) - 10)
FROM some_table)
ซึ่งสามารถทำการ ordered หรือเรียงลำดับของ ROWNUM ดังนี้
ROW_NUMBER () OVER (ORDER BY some_column ASC) AS rno
อย่าลืมใส่ index ด้วยนะครับ เพื่อความเร็วของ query ครับ
Related link from Roti
วันศุกร์ที่ 10 ตุลาคม พ.ศ. 2551
java.io.IOException :: Too many open file
ปัญหามีไว้ให้แก้จริงๆ ด้วย
Problem
java.io.IOException :: Too many open file
วิเคราะปัญหา
- มีการ access มายังระบบ 400,000 ครั้ง ซึ่งวิเคราะจาก Access Log ของระบบ
- ใช้คำสั่ง lsof [ List of open file ] ใน Linux เพื่อดูว่าแต่ละ process ทำการเปิด file อยู่เท่าไร ดังนี้
>lsof -p
สาเหตุของปัญหาที่อาจจะเกิดขึ้นได้
- มีการเปิด file หรือ IO จำนวนมากที่ OS จะรับได้
การแก้ไขปัญหา
- มีการเปิด file ใน code แต่ไม่ทำการปิด file ???
- มีการแตก process ย่อยจากการใช้คำสั่ง Runtime.getProcess() ซึ่งคุณรูไหมว่า จะมีการเปิด Stream/Pipe ไว้ 3 ช่องทางคือ
stdin, stdout, stderr [ Input, Output, Error ] ดังนั้นควรจะต้องปิดทั้ง 3 ท่อหรือช่องทางไปด้วย เช่น
process.getInputStream().close();
process.getOutputStream().close();
process.getErrorStream().close();
- ในระดับ OS สามารถกำหนด จำนวนสูงสุดในการเปิด file [ เป็นการต่อลมหายใจของระบบเท่านั้น ]
ซึ่งสามารถดูจำนวนได้ด้วยคำสั่ง
>ulimit -a
ดูในส่วนของ open files และสามารถแก้ไขค่าได้
Website Reference
https://support.bea.com/application_content/product_portlets/support_patterns/wls/TooManyOpenFilesPattern.html
Related link from Roti
วันพฤหัสบดีที่ 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
โดยเป้าหมายหลักของ 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.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
ทดสอบ 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 เสร็จเร็วก็ไม่มีปัญหาอะไร
โดยปัญหาที่พบคือ อาจจะมีบาง 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 แบบง่ายๆ ครับ
โดยสามารถเริ่มการศึกษาได้ที่นี่
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 โดยสามารถกำหนดไว้ใน
เมื่อลองศึกษามาบ้าง ผมก็ลองสร้าง 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
แว่วๆๆ ว่า คนแถวๆ 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
สมัครสมาชิก:
บทความ (Atom)