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