Saturday, April 12, 2008

My History

เห็นใน feed มาพักใหญ่แล้ว
มาเล่นกันบ้างดีกว่า

$ history|awk '{a[$2]++} END{for(i in a){printf "%5d\t%s\n",a[i],i}}'|sort -rn|head
130 git
102 cd
74 ls
42 gitk
22 vi
19 svn
15 sudo
11 exit
11 df
8 echo

อ้าววันๆใครทำอะไรกันบ้าง มา show ให้ดูกันดีกว่า

Related link from Roti

Friday, April 11, 2008

Passing xml stream into BIRT

BIRT สามารถกำหนด datasource ได้หลายแบบ
ในบางสถานะการณ์ผมก็จะเลือกใช้ xml
ในคู่มือส่วนใหญ่ก็จะระบุว่า ถ้าเลือก xml ก็ต้องกำหนด location ของ xml
ซึ่งอาจเป็น url หรือ local file ก็ได้

ปัญหาก็คือ ผมอยากจะ pass xml stream ของผมเข้าไปที่ Engine ตรงๆ
ไม่อยากจะทำเป็น temporary file (ขี้เกียจจัดการ)
แล้วก็ไม่อยากทำเป็น url ด้วย (มีประเด็นเรื่อง security เพิ่มขึ้น)

พยายามมองหาวิธีในคู่มือ ก็หาไม่เจอ
สุดท้ายก็เลยต้องเปิด Krugle เพื่อค้นหาจาก source แทน
หลังจาก zoom ตาม hirarchy ของ class ไปเรื่อยๆ
(ไล่ข้าม project เลย, ปรากฎว่ามันอยู่ใน project Data Tools Platform)
ก็ไปเจอเจ้า Connection ซึ่งมี code แบบนี้
    public void open( Properties connProperties ) 
throws org.eclipse.datatools.connectivity.oda.OdaException
{
...

if ( appContext != null
&& appContext.get( Constants.APPCONTEXT_INPUTSTREAM ) != null
&& appContext.get( Constants.APPCONTEXT_INPUTSTREAM ) instanceof InputStream )
is = XMLDataInputStreamCreator.getCreator( (InputStream) appContext.get( Constants.APPCONTEXT_INPUTSTREAM ) );
else if ( file != null )
is = XMLDataInputStreamCreator.getCreator( file );
else
throw new OdaException( Messages.getString( "Connection.PropertiesMissing" ) );

...
}


ไล่เปิดดู Constants.APPCONTEXT_INPUTSTREAM สักหน่อยว่าค่าเป็นอะไร
แล้ว fix ลงโปรแกรมเราไปเลย
(ไม่ต้องการเพิ่ม dependency ด้วยการอ้างถึง class Constants,
แต่แน่นอนอนาคตถ้า upgrade birt ก็อาจ run ไม่ผ่านเอาดื้อๆได้)

Related link from Roti