วันศุกร์ที่ 30 กันยายน พ.ศ. 2554

Manually Build Pentaho Bi-Server on Debian

อ้างอิงจาก http://www.prashantraju.com/2010/03/customising-the-pentaho-user-console-part-3/ และ http://phytodata.wordpress.com/2011/01/17/how-to-build-the-pentaho-biserver/

เหตุเกิดก็ตอนที่ต้องการจะ build pentaho เพื่อแก้ไข menu ตาม page ที่อ้างอิงนั้นแหละ แต่ไม่อยากติดตั้ง Eclipe เพราะว่ามันใหญ่เกินไป

ก็เลยต้องทำการ build บน Debian   มาเริ่มกันเลย

ติดตั้ง package ที่จำเป็น
# aptitude  install sun-java6-bin sun-java6-jre sun-java6-jdk sun-java6-plugin sun-java6-fonts ant
# update-alternatives --config java

ติดตั้ง subversion
# aptitude install subversion


checkout pentaho
$ mkdir sources
$ svn co http://source.pentaho.org/svnroot/bi-platform-v2/tags/3.8.0-stable bi-3.8-stable

เริ่ม build กัน
$ cd bi-3.8-stable
$ cd bi-platform-build
$ ant -v publish-all

ผมใช้เวลาไปประมาณ 1 ชั่วโมง เพราะว่า internet มันช้าเกิน

แก้ไขส่วน Mantle
$ cd mantle
แล้วทำการแก้ไข menu ที่ต้องการตามเอกสารอ้างอิง
จากนั้นก็ compile ใหม่
$ ant
แล้วก็ copy mantle, mantleLogin และ mantle-3.5.0.stable.jar 

... เดี๋ยวขอเขียนไว้เท่านี้ก่อน รายละเอียดจะมาใส่ที่หลัง

วันอังคารที่ 20 กันยายน พ.ศ. 2554

postgresql cluster บน Debian

เป็นที่เข้าใจกันว่าหากทำการติดตั้ง PostgreSQL แล้ว package manager จะทำการกำหนดค่าต่าง ๆ ไว้ รวมถึง Folder ที่เก็บ Data

แต่โดยส่วนมากแล้วผมจะสร้าง partition ไว้สำหรับเก็บ Data ไว้ต่างหาก ทำให้เวลาจะใช้งาน PostgreSQL ทีไร ต้องมาทำการแก้ไขค่า configure ต่าง ๆ ยุ่ง

มาคราวนี้ทาง Package นั้นมีเครื่องมือต่าง ๆ ไว้ให้เล่นอีกมากมาย เช่น

  • pg_createcluster
  • pg_dropcluster
  • pg_upgradecluster
  • pg_ctlcluster
  • pg_lsclusters
ผมเลยขอย้าย Data Directory ไปไว้ที่ /db/PGDATA/8.4/main

เริ่มจาก ตรวจดูก่อนว่า cluster เดิมของเราอยู่ที่ไหน



# pg_lsclusters
Version Cluster   Port     Status     Owner        Data directory                         Log file
8.4         main      5432    online    postgres      /var/lib/postgresql/8.4/main    /var/log/postgresql/postgresql-8.4-main.log

ลบ cluster เดิมออก
# pg_dropcluster --stop 8.4 main

สร้าง Folder ไว้รอก่อน
# mkdir -p /db/PGDATA

สร้าง cluster 


# pg_createcluster -u postgres -d /db/PGDATA/8.4/main  --locale=en_US.utf8 --start --start-conf=auto  8.4 main 
Creating new cluster (configuration: /etc/postgresql/8.4/main, data: /db/PGDATA/8.4/main)...
Moving configuration file /db/PGDATA/8.4/main/postgresql.conf to /etc/postgresql/8.4/main...
Moving configuration file /db/PGDATA/8.4/main/pg_hba.conf to /etc/postgresql/8.4/main...
Moving configuration file /db/PGDATA/8.4/main/pg_ident.conf to /etc/postgresql/8.4/main...
Configuring postgresql.conf to use port 5432...

ตรวจดูความเรียบร้อย
# pg_lsclusters 
Version   Cluster   Port     Status    Owner       Data directory                     Log file
8.4          main       5432    online   postgres     /db/PGDATA/8.4/main      /var/log/postgresql/postgresql-8.4-main.log


เรียกได้ว่าเหนื่อยน้อยลงเยอะ


5 Nov 2012:
วันนี้พอเอกสารอ้างอิง อีกอันทีนี่ http://people.debian.org/~mpitt/architecture.html


วันพุธที่ 27 กรกฎาคม พ.ศ. 2554

exfat

ผมมักจะมีปัญหากับ usbdisk โดยเฉพาะอย่างยิ่งเวลาต้องใช้งานทั้ง 3 ระบบ คือ Mac, Linux และ Windows

แรก ๆ ก็ใช้ file system เป็น fat แต่พอติดปัญหาเรื่องของขนาดของข้อมูลที่มีปริมาณมาก ๆ ก็ใช้งานไม่ได้ อีกทั้งเดี๋ยวนี้ไม่ค่อยมีเครื่อง Windows ใช้งานเท่าไหร่

สุดท้ายก็มาลงตัวที่ exFat  มันใช้ได้ทั้ง Windows, Linux และ Mac

ส่วนการใช้งาน exFat บน Linux นั้นต้องติดตั้ง package ตามนี้ก่อน

Debian # aptitude install scons
Debian # wget http://exfat.googlecode.com/files/fuse-exfat-0.9.5.tar.gz
Debian # cd fuse-exfat-0.9.5
Debian # scons install
Debian # mkdir /media/exfat
Debian # modprobe fuse
Debian # mount.exfat /dev/sda1 /media/exfat/
Debian # echo 'fuse' >> /etc/modules

เท่านี้เราก็สามารถใช้งาน usbdisk ที่เป็น exfat ได้แล้วครับ

วันพุธที่ 20 กรกฎาคม พ.ศ. 2554

Madoka

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

พอดีคนที่ต้องคุยด้วยไม่อยู่ ก็เลยได้คุยกับคนอื่นแทน เธอชื่อว่า "Madoka"

จำได้ว่าชื่อนี้เป็นตัวละครในหนังสือการ์ตูนเรื่อง "Orange Road"  

อิอิ  Ayukawa Madoka

วันจันทร์ที่ 4 กรกฎาคม พ.ศ. 2554

jpivot กับการพิมพ์เป็น pdf ภาษาไทย

เมื่อเราใช้งาน pentaho analysis (ที่จริงก็เป็น mondrian และ jpivot) เรามีวิธีที่จะพิมพ์หน้ากระดานวิเคราะห์ไปได้ 3 ทางคือ

  1. พิมพ์เป็นหน้า web
  2. พิมพ์เป็น pdf
  3. พิมพ์เป็น excel
แต่ถ้าคุณต้องการพิมพ์เป็น pdf หละก็ สำหรับภาษาไทย มันมีปัญหาตามมาคือ ตัวอักษรภาษาไทยจะเป็น "#####" นั่นเอง

ปัญหาที่ผมเจอนั้น เคยได้ให้น้องลองทำดูแล้ว แต่ก็ติดปัญหาตรงที่ไม่เข้าใจวิธีการ export เป็น pdf ของ jpivot คราวนี้ผมก็เลยต้องลงมือแก้ไขเอง มาดูวิธีการแก้ไขของผมว่ามันมีแนวอย่างไรบ้าง

ตั้งแต่ jpivot 1.6 นั้น มีการเพิ่มความสามารถในการกำหนดฟอนท์ได้  และก็โชคดีที่ว่า ผมใช้ jpivot 1.8 พอดี

แต่ก็โชคร้ายที่ลิงค์ของ "FOP Fonts Howto" ไม่สามารถเข้าใช้งานได้  (หลาย ๆ คนหยุดความพยายามที่ตรงนี้ แต่ผมไม่ ! ..)

FOP นั้นแท้จริงแล้วเป็นหนึ่งในโครงการของ apache (Apache FOP)  เป็นการเปลี่ยนการแสดงผลของ xls formating objects ไปยัง ไฟล์ชนิดอื่น ๆ แต่หลัก ๆ คือ PDF ที่เราต้องการนั่นเอง

มาเร่ิมกัน

เริ่มจาก คุณต้องมี Java ก่อน แล้วก็ download อันนี้ http://xmlgraphics.apache.org/fop/download.html โดยผมเลือก download binary เพราะว่า แค่ต้องการนำมาใช้ไม่ใช่แก้ไข

super_server_: ~ user$ wget http://mirrors.issp.co.th/apache//xmlgraphics/fop/binaries/fop-1.0-bin.tar.gz
super_server_: ~ user$ tar xzvf fop-1.0-bin.tar.gz
super_server_: ~ user$ cd fop-1.0

font อะไรดี

ที่จริงแล้วเวลาจะเลือก Font ที่จะมาใช้นั้น ผมก็เลือกเอาจากในเครื่องที่ใช้นี่แหละ แค่ต้องหาให้ได้ว่าเราควรใช้ฟอนท์ประเภทใด (http://xmlgraphics.apache.org/fop/1.0/fonts.html)  ของผมเลือก TrueType Font

ก็ทำการ copy font ที่ต้องการมาทั้งในส่วนของ normal, bold, italic, bold italic

super_server_: ~ user/fop-1.0$ cp ../path/fonts/myfont*.ttf .

output ที่เราจะได้จากการใช้ fop คือ font metrics ที่เป็น xml

super_server_: ~ user/fop-1.0$ java -cp build/fop.jar:lib/avalon-framework-4.2.0.jar:lib/commons-logging-1.0.4.jar:lib/commons-io-1.3.1.jar:lib/xmlgraphics-commons-1.4.jar org.apache.fop.fonts.apps.TTFReader myfont.ttf myfont.xml

ก็ทำอย่างนี้ไปจนครบทุก font

# bold font
super_server_: ~ user/fop-1.0$ java -cp build/fop.jar:lib/avalon-framework-4.2.0.jar:lib/commons-logging-1.0.4.jar:lib/commons-io-1.3.1.jar:lib/xmlgraphics-commons-1.4.jar org.apache.fop.fonts.apps.TTFReader myfontb.ttf myfontb.xml

# italic font
super_server_: ~ user/fop-1.0$ java -cp build/fop.jar:lib/avalon-framework-4.2.0.jar:lib/commons-logging-1.0.4.jar:lib/commons-io-1.3.1.jar:lib/xmlgraphics-commons-1.4.jar org.apache.fop.fonts.apps.TTFReader myfonti.ttf myfonti.xml

# bold-italic font
super_server_: ~ user/fop-1.0$ java -cp build/fop.jar:lib/avalon-framework-4.2.0.jar:lib/commons-logging-1.0.4.jar:lib/commons-io-1.3.1.jar:lib/xmlgraphics-commons-1.4.jar org.apache.fop.fonts.apps.TTFReader myfontbi.ttf myfontbi.xml

ดังนั้นเราจะได้ไฟล์ที่ใช้งานมาคือ

  1. myfont.ttf
  2. myfont.xml
  3. myfontb.ttf
  4. myfontb.xml
  5. myfonti.ttf
  6. myfonti.xml
  7. myfontbi.ttf
  8. myfontbi.xml


ติดตั้ง

เมื่อได้ไฟล์ที่ต้องการทั้ง 8 ไฟล์แล้ว ก็นำไปไว้ที่ biserver-ce-3.8.0-stable/biserver-ce/tomcat/webapps/pentaho/WEB-INF/jpivot

# copy fonts and font-metrics ไปยัง jpivot/print

super_server_: ~ user/fop-1.0$ cp myfont*.* biserver-ce-3.8.0-stable/biserver-ce/tomcat/webapps/pentaho/WEB-INF/jpivot

# edit config file

super_server_: ~ user/fop-1.0$ cd biserver-ce-3.8.0-stable/biserver-ce/tomcat/webapps/pentaho/WEB-INF/jpivot
super_server_: ~ user/fop-1.0$ vi userconfig.xml

ในไฟล์ userconfig.xml ก็จะบอกวิธีการแก้ไขและตัวอย่างไว้ให้แล้วนะ ของผมแก้ไขเป็นดังนี้

















อันที่จริงแล้วแค่นี้ก็ดูเหมือนจะใช้ได้ตามที่มีผู้เขียนไว้ที่ http://wiki.pentaho.com/display/ServerDoc2x/Fonts+in+Pentaho แต่ไม่ใช่อย่างนั้น ภาษาที่ได้ออกมายังคงเป็น "####" เหมือนเดิม

fop มันทำงานตอนไหน

หลังจากทดลองแล้วไม่ได้ผล ผมจึงหยุดพักแล้วกลับมาเริ่มใหม่อยู่ 3-4 ครั้ง ก็ปรากฏว่าผลยังคงเหมือนเดิม นั้นคือ "####" หลาย ๆ คนคงท้อ และเลิกไป แต่ก็อีกแหละ ผมมีความรู้สึกว่า วิธีการที่เขียนไว้ http://wiki.pentaho.com/display/ServerDoc2x/Fonts+in+Pentaho มันยังขาดอะไรอยู่บางอย่าง จึงพยายามค้นหาว่าสิ่งนั้นคืออะไร สุดท้ายก็ได้คำตอบว่า ไฟล์ fo มันอยู่ไหน ตามนี้ (http://forums.pentaho.com/showthread.php?58744-JPivot-PDF-report-template&highlight=fo_mdxtable.xsl)

ไฟล์ fo ที่เป็นต้นแบบในการแสดงผลของ mdx table นั้นอยู่ที่  biserver-ce-3.8.0-stable/biserver-ce/tomcat/webapps/pentaho/WEB-INF/jpivot/table/fo_mdxtable.xsl

#edit font-family ให้เป็น font-family ที่เราต้องการใช้งาน
super_server_: ~ user$ vi biserver-ce-3.8.0-stable/biserver-ce/tomcat/webapps/pentaho/WEB-INF/jpivot/table/fo_mdxtable.xsl


ในที่สุดผมก็ได้ pdf ที่พิมพ์ภาษาไทยได้สวยงาม แม้ใน chart ของ jpivot เองก็ตาม


วันพุธที่ 29 มิถุนายน พ.ศ. 2554

ปัญหาที่ไม่อยากให้เกิด เมื่อมีการร่วมทำงานพัฒนากันหลายคน

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


  1. ระดับความสามารถในการจัดระเบียบ
  2. ความละเอียดรอบคอบส่วนบุคคล
  3. ระยะเวลาที่นักพัฒนาจะอยู่ดำเนินการ
  4. ระยะเวลาในการพัฒนาสู่ตลาด เพื่อให้เกิดรายได้

พอมาตอนนี้เข้าใจแล้วว่า มันเกิดอะไรบ้าง วันนี้ขอยกตัวอย่างแค่ indentation 


indentation มันก็คือ การจัดระเบียบของการ code ให้เรียบร้อยนั่นเอง ถึงแม้ว่าเราจะทำการกำหนดไว้แล้วว่าให้ใช้ indent 2 ช่องว่าง แต่เอาเข้าจริงแล้ว editor ที่มีความฉลาดมากไป ก็ยังกำหนดให้เป็น 1 tab อยู่ดี  คนที่ใช้ editor ของ unix ก็จะเข้าใจได้ดีว่าควรจัดการอย่างไร แต่สำหรับ windows แล้วดูเหมือนเค้าจะเข้าใจว่า ใช้ tab ก้ได้นี่หว่า 



วันศุกร์ที่ 10 มิถุนายน พ.ศ. 2554

iPad ขย่ม Browsers

ปัญหาของ Browser ในปัจจุบันมันมีมากมาย เช่น

  • มีหลายแพลทฟอร์ม Windows, Mac, Linux
  • มีหลายค่า IE, Safari, FireFox
  • มีหลายมาตราฐาน JAVA, Flash, Active X, AVI, MOV, MP3
หลายคน ไปเพลิดเพลินกับการพัฒนา Web App เพื่อให้ทำงานได้บน Web Browsers จนกระทั่งปัญหามันตามมาไม่หยุด เป็นต้นว่า ต้องคอย upgrade version ต้องแก้ปัญหาเรื่องของ Securities ของ Browser 

Apple เลยนำเสนอแนวทางใหม่ "เมื่อมีปัญหามาก ก็ไม่ใช้มันเลย"

ยกตัวอย่างเช่น ตอนนี้เราอยากอ่าน นิตยสารอะไร ค่ายอะไร เราก็ไป Download App ของ นิตยสารค่ายนั้น ๆ เอา ไม่เหมือนแต่ก่อนที่เราจำ URL ของ นิตยสาร


คราวนี้ Browser ก็จะเหลือแค่ Browse จริง ๆ แล้ว

วันพฤหัสบดีที่ 9 มิถุนายน พ.ศ. 2554

clouds

เมื่อได้ดู Apple Event 2011 Jun 06 สิ่งที่น่าติดตามคือ


  1. การเข้าถึงข้อมูลอาจไม่ได้ผ่าน web แต่เป็นอุปกรณ์ที่สามารถเข้าถึงได้ไม่ว่าจะทาง devices อะไร
  2. จากเดิมที่ต้องคอยทำ back up ของ back up ของหลาย ๆ อุปกรณ์ ก็เป็นเรื่องง่ายไป เพราะมันเป็น  background processes
  3. Mails เราไม่รู้ว่า Mail Server ที่ใช้คืออะไร แต่อยากได้ว่าเมื่อดูบนหลาย ๆ อุปกรณ์แล้วมันให้ข้อมูลอันเดียวกันก็พอ แล้วที่สำคัญมันคือไม่ได้ผ่าน Web ซะงั้น
  4. Browser อาจมีไว้เพื่อ Browse อย่างเดียวแล้ว

ผมหละทึ่งในความคิดของ App ดี ๆ ทำให้เวลาจ่ายเงินซื้อไม่คิดมาก


วันพุธที่ 1 มิถุนายน พ.ศ. 2554

เมื่อ real time ใกล้ที่จะเป็นจริง สิ่งต่าง ๆ ก็จะเกิดขึ้น

เมื่อก่อนต้องคอยตอบคำถามว่า real time application คืออะไร เดี๋ยวนี้ไม่ต้องคอยตอบว่ามันคืออะไร แค่บอกไปว่าตัวอย่างคือ facebook, google talk ก็พอ

วันศุกร์ที่ 15 เมษายน พ.ศ. 2554

py4j กับ mondrian

เนื่องจากส่วนตัวไม่ค่อยอยากหัดเขียน java ดังนั้นเวลาใช้งาน mondrian จึงเกิดปัญหามากมาย แต่พออ่านอันนี้แล้ว สำหรับสาวก python ก็สามารถใช้ python เรียก mondrian ได้เหมือนกันแฮะ

http://stackoverflow.com/questions/3793215/query-olap-mondrian-mdx-xmla-with-python-interface

วันอังคารที่ 12 เมษายน พ.ศ. 2554

คิดแบบเบ็ดเสร็จ ย้อนกลับมาหาวิธีการและแหล่งที่มา

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

ข้อมูลดิบเป็นข้อมูลที่ได้มาจากระบบ Point Of Sales แต่สิ่งที่อยากได้คือการวิเคราะห์ที่ได้จากข้อมูลนั้น วิธีการที่ดูแล้วจะช่วยให้หยิบข้อมูลในแต่ละมุม (dimension) มาเปรียบเทียบและหาคำตอบที่ต้องการก็คงไม่พ้นการใช้ Cube เพราะข้อมูลมันมีจำนวนมหาศาล

ลองนึก ๆ ดูแล้วที่เค้าเรียกว่าวงจรการวิเคราะห์​ (Cycle of Analysis) น่าจะจริง


  1. ลองนำข้อมูลที่ได้มาทำเป็น Data Warehouse
  2. แล้วเลือกชุดข้อมูลที่ต้องการมาทำ Cube
  3. ผลที่ได้จาก Cube จะบอกว่าเราจะทำอะไรต่อ
  4. แล้วก็กลับไปทำของ 2 อีกครั้ง 

แต่ก็เหมือนมันเป็นการแก้ปัญหาที่ปลายทางมาก ลองนึกใหม่ว่าทำอย่างนี้ได้หรือไม่
  1. ถามตัวเองว่าเมื่อทำระบบแล้วมันจะได้ข้อมูลอะไรบ้าง
  2. เมื่อได้ข้อมูลนั้น ๆ แล้วจะทำอย่างไร
  3. แล้วก็ออกแบบวิธีการที่จะได้มาซึ่งข้อมูล
  4. พัฒนาระบบ

วันจันทร์ที่ 4 เมษายน พ.ศ. 2554

Memory พอไหม

มาดูกันว่าค้นนี้เค้าตอบว่าอย่างไรบ้าง


> Mem:  16299476k total, 16198784k used,   100692k free,    73776k buffers
> Swap: 16787884k total,   148176k used, 16639708k free, 15585396k cached
>
>  PID   USER      PR  NI  VIRT    RES   SHR   S    %CPU  %MEM    TIME+    COMMAND
>  3401 postgres   20   0   4288m  3.3g    3.3g   S     0         21.1         0:24.73   postgres
>  3397 postgres   20   0   4286m  119m  119m  S     0        0.8           0:00.36   postgres


> PLease help me to understand how much memory does 1 Connection Uses and how
> to use Server parameters accordingly.

OK, first, see the 15585396k cached?  That's how much memory your OS
is using to cache file systems etc.  Basically that's memory not being
used by anything else right now, so the OS borrows it and uses it for
caching.

Next, VIRT is how much memory your process would need to load every
lib it might need but may not be using now, plus all the shared memory
it might need, plus it's own space etc.  It's not memory in use, it's
memory that might under the worst circumstances, be used by that one
process.  RES is the amount of memory the process IS actually
touching, including shared memory that other processes may be sharing.
 Finally, SHR is the amount of shared memory the process is touching.
so, taking your biggest process, it is linked to enough libraries and
shared memory and it's own private memory to add up to 4288Meg.  It is
currently actually touching 3.3G.  Of that 3.3G it is touching 3.3G is
shared with other processes.  So, the difference between RES and SHR
is 0, so the delta, or extra memory it's using besides shared memory
is ZERO (or very close to it, probably dozens or fewer of megabytes).

So, you're NOT running out of memory.  Remember when I mentioned
iostat, vmstat, etc up above?  Have you run any of those?





เดี๋ยวมารอดู iostat กันต่อ

วันอังคารที่ 8 กุมภาพันธ์ พ.ศ. 2554

Write locally, Read Globally

จากแนวคิดนี้ fb engineer ก็สามารถนำมาใช้งานกับระบบที่เรามีอยู่ได้ง่าย ๆ ก็คือการปล่อยการ update ข้อมูลเป็นของระบบฐานข้อมูลไป ส่วนการอ่านค่ามาใช้งานก็ให้อ่านได้จากหลาย ๆ ฐานข้อมูล

At Facebook, traditionally, writes are applied to one database and asynchronously replicated to databases across all regions. This makes sense as the write rate is normally much lower than the read rate (users consume content much more than they produce). A good way to think of this approach is "read locally, write globally".



Basic has no boundaries.