Monday, November 13, 2006

NJUG #2

วันนี้ไปงาน narisa java user group ที่จัดโดย comunities ของ www.narisa.com
มี roofimon เป็นหัวเรือใหญ่ แล้วก็ dean4j หรือ xcaliber เป็นผู้สนับสนุน
รูปแบบ work ใช้ได้เลย, นั่งพูดคุยกันในร้านอาหาร
โดยมีบรรยากาศเป็นแบบไม่เป็นทางการ
(งานนี้จัดที่ bangkok jazz house ตรงถนนพญาไท)
ดูรูปที่ Nonster ถ่ายได้ที่นี่ Link

เมื่อเปรียบเทียบกับงาน blognone แล้ว
ส่วนที่แตกต่างจาก blognone ก็คือ
ลักษณะการ present จะเป็นแบบโต้ตอบมากกว่า
นั่นคือมีการพูดเสริม หรือพูดถาม ณ ขณะที่ทำการ present
ไม่ต้องรอให้บรรยายจบ แล้วค่อยถาม
ซึ่งผมว่ามันดีกว่าบรรยายแบบ solo คนเดียว

ปัญหาหนึ่งที่ต้องเจอในการ meeting
ก็คือเรื่องการทำให้คนที่มาเจอกัน เกิดความคุ้นเคยกัน
และพูดคุยกันได้ (อันนี้เป็นปัญหาที่ codefest ของ nectec ก็เจอ)
บรรยากาศตอนแรก ระหว่างที่รอให้เริ่มงาน
คนที่คุยไม่เก่งอาจจะเกิดความรู้สึกอึดอัดได้
เพราะลักษณะการนั่งที่ค่อนข้างไกล้ชิด หันหน้าชนกัน
พวกนี้ต้องแก้โดยการมี คนที่มีลักษณะสบายๆ
มีบุคลิกเข้ากับคนง่าย
มาคอยเป็นคนเชื่อมประสานให้เกิดการพูดคุย
(หรือไม่ก็ต้องใช้วิธีมอมเหล้า)
โชคดีที่บุคลิกของ roofimon เขาเป็น type นี้อยู่แล้ว
ก็เลยช่วยให้บรรยากาศสบายขึ้น

ที่น่าสนใจอีกเรื่องก็คือ กลุ่มคนที่ไป ~20 คน
มีผู้ที่อ่าน blognone แค่ 3-4 คน
???

ส่วนเรื่องที่พูดคุยกัน ก็มีเรื่อง
Acegi กับ tapestry

เรื่อง Acegi นี้ ถึงเคยใช้แล้ว
แล้วก็เคย post ไว้ด้วย Acegi อีกที
แต่ก็ลืมไปเกือบหมดแล้ว
แถมกลับไปอ่าน ก็รู้สึกว่า ที่เรารู้ตอนนั้น มันเป็นแค่ short cut ให้พอทำงานได้
ไม่ได้ get idea จริงๆ ว่าอะไรเป็นอะไร
มานั่งฟังคราวนี้ คิดว่า get idea แล้ว
ขอบคุณวิทยากรด้วย
(กลับมา ก็ไปเปิด Reference ของ Acegi หน้า 18-19 อ่านทบทวนอีกที)

ส่วนเรื่อง tapestry ที่ผมพูด
เกิดความผิดพลาดขึ้น 2 อย่าง
อย่างแรกก็คือ
ผมนึกว่าจะมีการพูดเรื่อง JSF ก่อน
เลยฝากเนื้อหาทั้งหลายไว้ให้คนที่พูด JSF เป็นคนพูด
ปรากฎว่าหัวข้อ JSF งดไป
(ซวยละสิ ใครจะเกริ่นนำให้วะ)
ข้อผิดผลาดที่สองก็คือ
เจ้า linux มันต่อ projector แล้วกลายร่างเป็น mode 800x600 อีกแล้ว
ทำให้การ demo ที่เป็นกะว่าจะค่อยๆขึ้นรูปขึ้นร่าง มันทำไม่ได้
เพราะ eclipse dialog มันล้นจอ
ตัว layout manager ของ SWT ก็ดันไม่ได้ออกแบบมา กรณีที่จอเล็กว่าเนื้อหา
ก็เลยไม่มี scrollbar ขึ้นมาช่วย scroll

พอ config dialog ไม่ได้ ก็ทำให้ขั้นตอนมันขาดไปขั้นหนึ่ง
จะหันไปแก้ xml file ด้วยมือ ก็ไม่แน่ใจว่าจะหาเจอหรือเปล่า
(Note:
กลับมาบ้าน แล้วยังติดใจอยู่ ลองใช้คำสั่ง grep -R หาดู
จึงรู้ว่าตัว config นี้มันเก็บไว้ใน directory
WORKSPACE_NAME/.metadata/.plugins/org.eclipse.debug.core/lauches/
)
ผลก็เลย demo ไม่ได้ตามที่เตรียม step ไว้
ก็เลยขอติดเป็นการบ้านไว้กับคนที่ไป NJUG ในครั้งนี้
ว่าคราวหน้าจะจัดเป็น workshop ให้แล้วกัน
(พูดอีกอย่าง ก็คือ จะเตรียมตัวให้มากกว่านี้)

Related link from Roti

Wednesday, November 08, 2006

อันเนื่องมาจากการเดิน

เห็น bact' เขา post เรื่องเดินเล่นทองหล่อตอนดึกแล้ว
ขอร่วมเล่าบ้าง

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

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

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

หน้าร้อน เป็นหน้าที่ไม่น่าเดินสักเท่าไร
แต่ไอร้อนที่รมผิว มันก็ทำให้นึกถึงช่วงวัยเด็กของเรา
(ปิดเทอมหน้าร้อน)
พอถึงช่วงปลายหน้าร้อน
่ช่วงนี้ก็เป็นช่วงที่กิ่งอ่อนเริ่มแทงยอดออกมา
ช่วงนี้ต้นไม้จะสวยไปอีกแบบ
(ลำต้นสีดำจากฝุ่น กับใบอ่อนสีเขียวสด)

บรรดาตัวละคร ระหว่างทางก็มี
นกกระจอก, นกเอี้ยงสาลิกา ขาด้วน
อีกา 2 ตัว, นกเขาเล็ก, นกเขาใหญ่
ผมชอบดูพฤติกรรมของนกอยู่แล้ว
ก็เลยมีความสุขกับการได้สังเกตเจ้าพวกนี้

ส่วนตัวละครที่เป็นคนนั้น ผมชอบพี่ที่เป็นคนกวาดถนนของ กทม. มากเลย
เขาไม่ได้แค่ทำให้ถนนสะอาด
แต่เขาเป็นคนปลูกดอกไม้ ดูแลต้นไม้ตามทางเดิน

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

Related link from Roti

Tuesday, November 07, 2006

Wirble

Wirble เป็น set ของ library ที่ช่วยให้เราใช้ irb (ruby interactive shell)
ได้อย่างมีความสุขมากยิ่งขึ้น
feature
  • สามารถเรียกใช้ ri จากใน irb ได้เลย
  • output ที่ได้มีสีสรรสวยงาม (colorize)
  • persistent command history

Related link from Roti

Friday, November 03, 2006

XBRL

XBRL ย่อมาจาก Extensible Business Reporting Language
เป็นความพยายามที่จะกำหนดมาตรฐานข้อมูลของงบการเงิน
ประเด็นก็คือ เขาต้องการให้ข้อมูลไหลจากที่หนึ่ง(publisher) ไปยังอีกที่หนึ่ง(consumer) ได้เร็วขึ้น
ใครได้ลองเล่นดู จะพบคำตอบว่าเมื่อบัญชีเจอกับ xml จะเกิดอะไรขึ้น

ตัวโครงสร้างของ XBRL ออกแบบไว้ดีเหมือนกัน
โดยแยกส่วนระหว่าง content กับ representation ออกจากกัน
นั่นคือ ตัว item ที่รายงาน จะอยู่ในรูป flat (list เรียงกันไปเป็นตับ)
ส่วน representation จะแยกออกไปอยู่ในอีกกลุ่ม file หนึ่ง (แน่นอนว่าเป็น xml)

แน่นอนเล่ามาแค่นี้ ไม่น่ามีความซับซ้อนอะไรมาก
ความซับซ้อน จะเริ่มต้นที่ว่า
representation นั้นสามารถทำการ override ได้
เช่นมาตรฐานระดับ country กำหนดว่า รูปแบบการ present เป็น แบบนี้

+ A
- sub1
- sub2
- sub3

แต่บริษัทเราอยาก present เป็นแบบนี้แทน

+ A
- sub1
+ B
+ sub2
+ sub3

XBRL เปิดโอกาสให้เรา override รูปแบบการนำเสนอได้
(ซึ่งจะเห็นได้ว่า การเปลี่ยนรูปแบบนำเสนอนี้
ไม่ได้ทำให้ข้อมูลระดับ item loss ไป)

ผมลองดูข้อมูล XBRL ของบริษัทในอเมริกาบริษัทหนึ่ง
แล้วทดลอง plot graph ความสัมพันธ์ระหว่าง xml, xsd ต่างๆ
ได้หน้าตา graph ออกมาดังนี้
สีเหลืองคือระดับที่บริษัททำ
สีเขียวคือระดับประเทศ
สีแดงคือมาตรฐานกลาง(ระดับโลก)

รูปแรกเป็นระดับ link ที่เราเห็นที่ระดับ syntax ของ xml



รูปนี้มาจากรูปเดิม แต่เป็นเพิ่ม link ระดับ semantic ที่เกิดจากการ extend เข้าไปด้วย



Note: อเมริกานี้มันทำอะไรซับซ้อนดีจริงๆ
แล้วใครคือผู้ได้ประโยชน์จากเรื่องแบบนี้

Update: เอารูป xbrl intance ของเกาหลีมาให้ดู
เห็นมันสวยดี

Related link from Roti

rails application in one exe file

ใครอยาก pack Rails Application ให้เหลือแค่ single execute file
แล้ว run บน native แบบนี้

C:\rails> demo.exe

อ่าน "Distributing Rails Applications"
Note: ใช้ SQLite เป็น Database

Related link from Roti

Tuesday, October 31, 2006

Lift

Tom White เขาพูดถึง Lift, Framework ที่ใช้ช่วยในการ testing
เขายกตัวอย่างใน post Lift Off
เปรียบเทียบวิธีเดิมที่ใช้ HttpUnit เทียบกับที่ใช้ Lift

HttpUnit
public class HttpUnitGoogleTest extends TestCase {

public void testGoogleImageSearch() throws Exception {
WebConversation conversation = new WebConversation();
WebResponse page = conversation.getResponse("http://www.google.com/");
assertEquals(page.getTitle(), "Google");
page = page.getLinkWith("Images").click();
WebForm form = page.getForms()[0];
form.setParameter("q", "kizoom");
page = form.submit();
assertTrue(page.getText().contains("<b>Kizoom</b> summer party"));
boolean foundImage = false;
for (WebImage i : page.getImages()) {
if (i.getSource().endsWith("summer04.jpg")) {
foundImage = true;
break;
}
}
assertTrue(foundImage);
}

}


Lift
public class GoogleTest extends NavigatingLiftTestCase {

public void testGoogleImageSearch() throws Exception {
goTo("http://www.google.com/");
assertThat(page, has(title("Google")));
clickOn(link("Images"));
enter("kizoom", into(textField()));
clickOn(button("Search Images"));
assertThat(page, has(text("Kizoom summer party")));
assertThat(it, has(image().withUrlThat(endsWith("summer04.jpg"))));
}
}

Related link from Roti

DataProvider ใน TestNG

พึ่งเห็น feature นี้ใน TestNG
Note: สังเกตนะว่า test case method รับ parameter ได้ด้วย
@DataProvider(name = "test1")
public Object[][] createData1() {
return new Object[][] {
{ "Cedric", new Integer(36) },
{ "Anne", new Integer(37)},
};
}

@Test(dataProvider = "test1")
public void verifyData1(String n1, Integer n2) {
System.out.println(n1 + " " + n2);
}

ดูวิธีแบ่ง code กับ data สวยไปอีกแบบ

อย่างเมื่อก่อนถ้าผมต้อง test หลายๆ case หน้าตาที่ใช้ใน junit จะออกมาแบบนี้
public void testFormat() {
AST ast = parse(cmd, "(b10)");
assertFormat(ast, "b", null, "10");

ast = parse(cmd, "(c15)");
assertFormat(ast, "c", null, "15");

ast = parse(cmd, "(-c15)");
assertFormat(ast, "c", "-", "15");

...
...(ยาวไปอีก 1 หน้ากระดาษ)

Related link from Roti

Monday, October 30, 2006

รายงาน Blognone Tech Day #2

สนุกดีนะ
ไปงานคราวนี้ ได้รู้จักคนเยอะขึ้น
(ไม่ได้พาเมียและลูกไป ก็มีข้อดีเหมือนกัน
ทำให้คุยได้เต็มที่ขึ้น,
-คุณภรรยา ถ้าอ่านเจอตรงนี้กรุณาอย่าโกรธ
อันนี้เป็นข้อเท็จจริง)

เรื่อง Relax NG นี่เคยตามไปอ่าน สมัยที่ bact'
เคย post ไว้ แต่ก็ไม่ซาบซื้ง
เจอคุณ James เปิดตัวอย่างให้ดู 10 กว่าตัวอย่าง
ก็ Satori เลย

ส่วนคุณ Theppitak ก็หน้าตาเหมือนในรูปที่ลงไว้ใน blog เป๊ะเลย
หน้าเด็กอีกต่างหาก
เห็นแล้วต้องฟันธงเลย ต้องบุคลิกอย่างนี้เท่านั้นแหล่ะที่สามารถเข้าร่วมกับ ต้นน้ำ(upstream) ได้
(อันนี้เป็นคำชมนะ สำหรับคนที่คิดว่าประโยคมันกำกวม)

ส่วนตัว Opencare ก็พึ่งรู้ว่าใช้ ActiveMQ,
ซึ่งเป็น tool ที่ผมจับอยู่แล้ว
อันนี้แหล่ะที่ผมน่าจะ contributed ได้โดยไม่ใช่แรงมากนัก
ไว้จะเข้าไปดูว่าจะช่วยอะไรตรงไหนได้บ้าง

หัวข้อ Intellectual Property ของ Mk ก็ถือว่าเป็น present ที่ดีมาก
จังหวะ กับ flow ลงตัวมาก
(ช่วงนี้เล่านิทานให้ลูกฟังบ่อย
นิทานที่ดี จังหวะ ภาพ การเล่าเรื่อง
จะลงตัว ทำให้ทั้งคนเล่าก็สนุก คนฟังก็สนุก)

ZWSP ของลิ่ว เริ่มเห็นเป็นรูปเป็นร่างแล้ว
เห็นประเด็นเรื่อง editor แล้ว
ชักอยากลองเขียนเป็น emacs extension แบบที่คุณ James เขียน Relax NG แล้วสิ

WiMAX
ในที่สุดก็รู้ว่ามันคืออะไร,
(จริงๆแล้ว ปีนี้มีน้องฝึกงานที่มาขอ consult เรื่อง project จบ
ก็ทำเรื่อง WiMAX simulation)

OPLC
อันนี้ไม่ค่อยได้ฟัง เท่าไร เพราะต้องไปนั่งปรับ resolution ของ slide
เนื่องจาก projector มันไม่ยอมแสดงผล 1024x768

Emerging Technology
จากหัวข้อนี้ ผมสนใจ embed มากขึ้นแฮะ
สงสัยต้องขอไปฝึกงานที่บริษัทฯแฟน ที่เขาทำ electronic device แล้ว

ประเด็น Feedback ของงาน
ผมเชื่อว่า คนที่ไป blognone ทุกคน มี potential ที่จะเล่าเรื่องได้ทุกคน
ดังนั้นทำอย่างไรให้งาน blognone คราวหน้า ก้าวผ่านขนบเดิมๆ
ที่ว่า ความรู้มาจากการบรรยาย (พิธีกรนั่งโต๊ะพูด)
กลายเป็นการแลกเปลี่ยน อย่างไม่เป็นทางการ
ทุกคนสลับกันเป็นผู้เล่า และผู้ฟัง
แน่นอนว่า เราไม่สามารถเปลี่ยนวัฒนธรรมของเราได้อย่างทันทีทันใด
ดังนั้นช่วงแรกๆที่ทำ อาจจะต้องค่อยๆเปลี่ยนวิธีบรรยายก่อน
จากเดิมที่เป็นคนเดียวพูด ทำให้มันกลายเป็นการสนทนาของคนหลายๆคน
ไม่ใช่บรรยาย ถามตอบนะ แต่เป็นแบบ ร่วมกันเล่าเรื่อง
(มีแก่นเรื่อง แจกไปก่อน แล้วพวกที่ต้องสนทนา จะเตรียมในส่วนที่ตนสนใจ)

Related link from Roti

Tuesday, October 24, 2006

The Art of Complex Problem Solving

The Art of Complex Problem Solving
เอามาฝาก bact'
ไม้รู้ว่าเคยเห็นหรือยัง

Related link from Roti

กบตัวน่อย

เห็นที่ keng เขียนถึง DocWeb ใน Speed high, realiable low แล้ว
อดยิ้มไม่ได้ เพราะตัวเองก็เป็นเหมือนกัน
คำว่า "เป็น" นี้หมายถึง
อาการ "หืมห์ มีคนทำแบบนี้ด้วยหรือ. page แบบ dynamic แต่ไม่เก็บข้อมูลลง Database,
ทุกอย่างอยู่ใน log file หมด. ถ้า server ล่ม ก็แค่สั่ง rerun log file."

สมัยแรกๆที่ใช้ java อย่างเดียว เวลาเจอแนวทาง solution แบบนี้แล้ว
มักจะส่ายหัว แล้วก็มองข้ามไป
แต่หลังจากที่อ่านมาก ทดลองมากขึ้น (กับภาษาอื่นๆ)
ก็พบว่า "เออ เรานี่ กำหนดกรอบ มาครอบตัวเราไว้เองนี่หว่า"

อย่างเมื่อต้นเดือนที่เขียนถึง Prevayler
ซึ่งทำงาน เหมือนกับที่ James Gosling เขาใช้ใน DocWeb นั่นแหล่ะ
ถ้าเป็นเมื่อสมัย 2 ปีก่อน รับรองว่า แค่เข้าไปอ่าน feature ก็ยังไม่อ่านเลย
(เพราะโดนกรอบความคิดจำกัดไว้)

**UPDATE**
จาก Mailing list ของ Erlang
We are in the process of eliminating databases. Why did we use them in
the first place? You just do. If you are an engineer and I say I need
to store a lot of data and your answer is not "A database!", you fail
CS101. No one ever asks, "how do you want to access it, why do you
think you need a database".

Related link from Roti

Friday, October 20, 2006

IOC in Tapestry 5

ใน Tapestry 5 นี้
Howard (คนเขียน) เขาจะ implement IOC ขึ้นมาเอง
(เดิมใช้ Hivemind อยู่, ถ้าจะท้าวความให้ลึกอีกหน่อย
Hivemind เกิดขึ้นเพราะต้องการให้เป็น infrastructure ของ Tapestry)
ประเด็นก็คือ เขาไม่มีเวลาพอที่ maintain Hivemind ในรูป Generic IOC container
เพราะต้องการที่จะ customize IOC สำหรับ Tapestry โดยเฉพาะ

แนวของ IOC ตัวใหม่นี้ จะลดการใช้ XML ลง
ลองดูตัวอย่างการ inject แบบนี้ดู น่าสนใจดี
public static Indexer buildIndexer(
@InjectService("JobScheduler") JobScheduler scheduler,
@InjectService("FileSystem") FileSystem fileSystem)
{
IndexerImpl indexer = new IndexerImpl(fileSystem);

scheduler.scheduleDailyJob(indexer);

return indexer;
}


แน่นอน ข้างบนนี้เป็นทางเลือกแบบหนึ่ง
แบบที่คนจำนวนหนึ่งชอบ ก็คือ automatic wire โดยไม่ต้อง config เลย
ก็มีเหมือนกัน

Related link from Roti

ไปสัมมนา BiZIT

เมื่อวันพุธแอบเปลี่ยนบรรยากาศ แว่บไปงานสัมมนาของ BiZIT มา
ในงานก็เจอน้อง OHM ที่เปลี่ยนบรรยากาศมาจากโคราช
(เจอกัน เพราะเป็นพวกนั่งแถวหน้าเหมือนกัน เลยเจอกันง่ายหน่อย)

section ที่เข้าฟังก็มี
"IT Innovation for Business Empowering" ของ อาจารย์ยืน ภู่สุวรรณ
ที่ชอบสุดก็คือคำถามของ section นี้ มีคนถามประเด็นว่า
"ในยุคเริ่มต้นของ internet เรามี DNS เป็นตัว solve ว่าอะไร อยู่ที่ไหน
พอมาในยุค webservice เรามี UDDI ที่ใช้ solve เช่นกัน ว่าอะไรอยู่ที่ไหน
ที่นี้ ในยุคที่ platform เริ่มย้ายขึ้นมาอยู่บน web ,มันจะมีกลไกอะไรมาแบบนี้อีกไหม"
คำถามที่ดี คือคำถามที่ไม่มีคำตอบ

"บทบาทและทิศทางของ SOA ในองค์กร"
หัวข้อนี้ฟังแล้วเข้าใจแล้ว ว่า SOA คืออะไร,
SOA ก็คือ ดินแดนในฝัน(Utopia) ของพวกเราชาว IT
ถ้าใครอยากไปให้ถึงดินแดนนั้น
IBM มีแนวทางที่ถ้าท่านเลือกไปปฏิบัติแล้ว,
รับรองว่าจะเดินทางถึง SOA land แน่นอน.
Note: ไม่เลวร้ายขนาดนั้นหรอกนะ ผมแค่ล้อ IBM เล่น
ในการบรรยาย ก็มี issue ที่น่าสนใจเหมิือนกัน

"Digital Right Management on Multimedia Content"
อาจารย์พันธุ์ปิติ เปี่ยมสง่า แกพูดเก่งดีนะ
มีเสียงเล็กเสียงน้อย ฟังเพลินดี

"Multi-Threaded Chip Technology"
ฟังจบก็รู้ว่า มันน่าจะเร็ว
แต่ก็งงงวยเหมือนเดิมว่า multi thread ใน chip มันเป็นอย่างไร
(วิทยากรเขาเก่งนะ แต่เขาตั้งใจ จะไม่แตะด้าน technical มากเกินไป)

"RFID for Business Efficiency Improvement"
อ้า ฟัังแล้วได้ข้อสรุปว่า
RFID มันมีประเด็นเกี่ยวกับ characteristic ของ คลื่นวิทยุ
ความยากในการ implement ส่วนหนึ่งก็จะอยู่ที่ตรงนี้
เช่น align ของ เสาอากาศ ควรจะเป็นอย่างไร,
มีความชื้นสูง จะเกิดปัญหาอย่างไร

ปล.
ความรู้ที่ได้มากสุด ก็คือคุยกับ OHM แล้วล้วงเอาความลับ
ของการผลิต Harddisk ออกมา
(OHM เขาทำอยู่ seagate)
ใครที่ไปงาน blognone techday แล้วบังเอิญนั่งข้าง OHM
อย่าลืมชวนคุยเรื่อง Harddisk นะ
รับรองว่าได้ความรู้กลับมาเต็มที่แน่นอน

Related link from Roti

Pugs

Pugs คือ Perl6 ที่ implement ด้วย Haskell
มุมที่ผมสนใจ คงไม่ใช่เรื่อง perl6
แต่เป็นเรื่อง parser library ที่ Pugs ใช้
ซึ่งก็คือ Parsec กับ Happy

ในไทยมีคน blog เรื่อง Pugs แล้วด้วย
อ่านดูได้ที่นี่ Guruguru

Related link from Roti

Into the Ravines

Martin Fowler เขียน comment ดีๆไว้อีกแล้ว
คราวนี้เป็นเรื่องเกี่ยวกับ nature ของการเรียนรู้สิ่งใหม่ๆ
ImprovementRavine
แค่เปิดฉากเริ่มต้น ก็ชอบใจเสียแล้ว

If you care about what you do, you care about getting better at it.


The point is that when you try a new technique it'll often make you worse, at least initially. You have to work with something unfamiliar, perhaps also unlearn something else that gets in the way. During that period you performance has dipped. Only with perseverance can you get through this and reach a higher plateau.

Related link from Roti

Tuesday, October 17, 2006

Mercurial

ช่วงนี้มี project เล็กๆน้อยๆเต็มไปหมด
อยากทำ version control ได้
แต่ไม่อยากไปนั่ง create repository ที่ server
หรือลง subversion server ที่เครื่องตัวเอง
ก็เลยมองหา Revision Control ตระกูล Distributed มาลองใช้ดู

ลองใช้อยู่ 2 ตัวคือ Mercurial กับ Darcs
สุดท้ายก็ไปจบลงที่ Mercurial เพราะ
  • คำสั่งมันดูไกล้เคียงกับ svn ดี
  • เวลาจะ sync ข้ามเครื่อง
    ตัว Mercurial สามารถ start embed web server ได้เองเลย
    ไม่ต้องเสียเวลาไปทำ link ไว้ใน apache htdocs

Related link from Roti

Monday, October 16, 2006

คำชม

น่าสนใจนะ ระหว่างคำชม
"You are a good drawer" กับ
"You did a good job drawing"
อันไหนมี effect ต่อเด็กอย่างไร

Link

Related link from Roti

Migrator

ใครที่ได้ใช้ Rails แล้ว
เวลากลับมาใช้ Java ก็มักจะนำเอาบางอย่างติดมือกลับมาด้วย
อย่าง project Migrator นี้ก็เหมือนกัน
เกิดจากคนเขียนที่เคยใช้ Rails มาก่อน แล้วต้องกลับมาทำ java project

Project ที่แล้วของผม
ก็มีการนำเอา concept ของ Migration มา apply ใช้เหมือนกัน
เนื่องจากการพัฒนา ใช้ methodology แบบ Agile,
schema ของ Database จะค่อยๆ evolve
ก็เลยอยากให้สามารถเก็บ version ของ Database Schema ได้ด้วย
(เนื่องจาก script sql อยู่ใน codebase ที่เก็บลง version control)

Related link from Roti

Tuesday, October 10, 2006

Rails Multibyte Support

Changeset 5223 เพิ่ม feature ในการ support multibyte
ลองดูตัวอย่าง

>> $KCODE='UTF8'
=> "UTF8"
>> name = 'ภาษาไทย'
=> "ภาษาไทย"

>> name.length
=> 21
>> name.chars.length
=> 7

>> name.reverse
=> "\242\270룠蒹ಸ੸ಸ࠸\340"
>> name.chars.reverse
=> #<ActiveSupport::Multibyte::Chars:0x28ad624 @string="ยทไาษาภ">
>> name.chars.reverse.to_s
=> "ยทไาษาภ"

>> name[1..3]
=> "\270\240\340"
>> name[0..3]
=> "ภ\340"
>> name.chars[0..3].to_s
=> "ภาษา"

Related link from Roti

Monday, October 09, 2006

ทดสอบ Cometd

วันนี้ทดลองทดสอบ Cometd
โดย definition ของ Cometd ก็คือ

Cometd is a scalable HTTP-based event routing bus that uses a push technology pattern known as Comet.

สิ่งที่ Cometd พยายามทำ ก็คือ การกำหนดมาตรฐาน protocol สำหรับ client กับ cometd server
ตัว draft ของ Protocol สามารถดูได้ที่นี่
http://svn.xantus.org/shortbus/trunk/bayeux/protocol.txt

ตัว Cometd server ตอนนี้เห็นว่ามี implement ด้วย
python, http://svn.xantus.org/shortbus/trunk/cometd-twisted/
perl http://svn.xantus.org/shortbus/trunk/cometd-perl/
แล้วก็ Java
(ผมก็กะว่าจะทำ erlang version เหมือนกัน)

ในฝั่ง Java ตอนนี้มี Jetty เป็นหัวหอก
โดยใน jetty version 6 , jetty provide CometdServlet มาให้เลย (อยู่ใน directory extras)

ที่ Jetty เป็นหัวหอกในเรื่องนี้ ก็เพราะเขามี feature Continuations ที่คนอื่นยังไม่มี
เขาก็เลย implement และผลักดัน Cometd ได้อย่างไม่เกรงกลัวว่าจะทำให้เกิดปัญหา server overload
(เคยเขียนเรื่อง Jetty Continuations ไปแล้ว ตามอ่านได้ที่นี่ Link)

สำหรับในส่วน client ตอนนี้ก็มี Dojo ที่ implement ใน Trunk แล้ว
โดยอยู่ใน package dojo.io.cometd
ประเด็นที่น่าสนใจใน Dojo Cometd client ก็คือ
technique ของการ implement มีให้เลือกหลายแบบคือ
  • iFrame
  • mime-message-block
  • long-poll
  • callback-polling

ผมลองทดสอบแค่ long-poll
เท่าที่ลองทดสอบดูในเบื้องต้น ก็พบปัญหาว่า
jetty return response ในตอน handshake กลับมาไม่ตรงตาม Spec ใน protocol
(แทนที่จะ return array ครอบ json Object, มันกลับ return json Object มาเลย,
ผมใช้วิธี quickfix แก้ source code ใน dojo ให้ทำงานได้ไปก่อน)
ปัญหาอีกข้อที่เจอก็คือ ตัว Demo ยัง run ใน IE หรือ Safari ไม่ได้

Related link from Roti

Camlp4

วันนี้มีเหตุให้ต้อง compile โปรแกรมที่เขียนด้วย OCaml
ก็เลยทำให้ได้รู้จักกับ Camlp4

Camlp4 เป็นโปรแกรมที่เปิดให้เราสามารถ modify syntax ของ OCaml ได้
ทำให้เราสร้าง DSL หรือ customize OCaml syntax ได้

ไว้ให้ผมเป็น OCaml ก่อน แล้วจะเขียนอธิบายเรื่องนี้ให้ฟัง

Related link from Roti