Thursday, May 12, 2005

JFugue Java API for Music Programming

project นี้มีมานานแล้ว พึ่งเห็นนี่แหล่ะ
เป็น api สำหรับการเล่น note ดนตรี

ตัวอย่าง


import org.jfugue.Player;
import org.jfugue.Pattern;
/**
*
* @author pphetra
*/
public class Main {

/** Creates a new instance of Main */
public Main() {
}

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Player player = new Player();

// "Frere Jacques"
Pattern pattern1 = new Pattern("C5q D5q E5q C5q");

// "Dormez-vous?"
Pattern pattern2 = new Pattern("E5q F5q G5h");

// "Sonnez les matines"
Pattern pattern3 = new Pattern("G5i A5i G5i F5i E5q C5q");

// "Ding ding dong"
Pattern pattern4 = new Pattern("C5q G4q C5h");

// Put it all together
Pattern song = new Pattern();
song.add(pattern1);
song.add(pattern1);
song.add(pattern2);
song.add(pattern2);
song.add(pattern3);
song.add(pattern3);
song.add(pattern4);
song.add(pattern4);

// Play the song!
player.play(song);
}

}


กรณีที่ต้องการเล่นหลายโน็ตพร้อมกัน
new Pattern("C5+E5+G5")

กรณีที่เป็น chord
new Pattern("Cmaj5q")

เปลี่ยนเครื่องดนตรี ใช้ I (instrument) นำหน้าตามด้วย
ชื่อเครื่องดนตรี
I[Piano]


ที่มาของชื่อ JFugue
Fugue is a musical style in which a common theme, often called a statement, is played, then other voices join in and play subtle variations on the statement.


ใครที่ต้องการรู้ definition ของ JFugue ชัดๆ
ให้ตามไปที่นี่ JFugue Anatomy
เห็นแล้วปวดหัวเลย

ส่วนอันนี้สิเด็ด เอา DNA sequence มาแปลงเป็นเพลง
Red Blood DNA Sequences

Related link from Roti

Wednesday, May 11, 2005

prefuse "interactive information visualization"

วันนี้เห็น demo ของ prefuse
ชอบใจเลย link มาให้ดู

Related link from Roti

Tuesday, May 10, 2005

Linux Mainframe 's benchmark

ต่อเนื่องมาจาก

ด้วยความอยากรู้ว่าประสิทธิภาพของ linux บน mainframe
จะมีขนาดไหน ก็เลยทดลองหา benchmark ต่างๆมา
ทดลอง run ดู โดยมีเครื่องเปรียบเทียบคือ
  • Ibm Unix Server cpu powerpc 4 cpu ram 4GB, AIX, ibmjava1.3
  • Linux Mainframe 2 cpu, ram 3GB, SUSE Linux, ibmjava1.3
  • Labtop p4 2.4GHz 1 cpu ram 1 GB, ubuntu Linux, sunjava1.5



ตัวแรกก็คือ scimark2 ตัวนี้วัดกันที่ cpu ตัวเดียว
benchmark ตัวนี้มีจุดบกพร่องหน่อยตรงไม่ได้
ควบคุม jdk ให้เป็น version เดียวกัน

IBM Unix Server
Composite Score: 266.65277256015247
FFT (1024): 271.51941127067306
SOR (100x100): 216.80410690128483
Monte Carlo : 6.929870290609104
Sparse matmult (N=1000, nz=5000): 316.2934686121103
LU (100x100): 521.7170057260851


java.vendor: IBM Corporation
java.version: 1.3.1
os.arch: ppc
os.name: AIX


Linux Mainframe
Composite Score: 47.96155598565569
FFT (1024): 36.411169514987805
SOR (100x100): 90.41643126719151
Monte Carlo : 14.357907621051798
Sparse matmult (N=1000, nz=5000): 45.22218974459271
LU (100x100): 53.40008178045459

java.vendor: IBM Corporation
java.version: 1.3.1
os.arch: s390x
os.name: Linux
os.version: 2.4.19-3suse-SMP


Linux on laptop
Composite Score: 207.36273014140824
FFT (1024): 92.19030829632334
SOR (100x100): 362.3458191150928
Monte Carlo : 45.1455518873811
Sparse matmult (N=1000, nz=5000): 138.26159614289057
LU (100x100): 398.8703752653535

java.vendor: Sun Microsystems Inc.
java.version: 1.5.0_01
os.arch: i386
os.name: Linux
os.version: 2.6.10-5-386




ทดสอบ IO ด้วย Bonnie
benchmark อันนี้ java ไม่เกี่ยว ​
IBM Unix Server
              -------Sequential Output-------- ---Sequential Input-- --Random--
-Per Char- --Block--- -Rewrite-- -Per Char- --Block--- --Seeks---
Machine MB K/sec %CPU K/sec %CPU K/sec %CPU K/sec %CPU K/sec %CPU /sec %CPU
100 59947 96.6 248629 99.5 106319 33.2 77576 100.0 862010 101.0 92464.2 231.2


Linux Mainframe
              -------Sequential Output-------- ---Sequential Input-- --Random--
-Per Char- --Block--- -Rewrite-- -Per Char- --Block--- --Seeks---
Machine MB K/sec %CPU K/sec %CPU K/sec %CPU K/sec %CPU K/sec %CPU /sec %CPU
100 8307 100.0 86405 99.6 589488 103.6 8672 100.0 934170 100.4 53273.0 186.5


Linux on Labtop
              -------Sequential Output-------- ---Sequential Input-- --Random--
-Per Char- --Block--- -Rewrite-- -Per Char- --Block--- --Seeks---
Machine MB K/sec %CPU K/sec %CPU K/sec %CPU K/sec %CPU K/sec %CPU /sec %CPU
100 32729 91.3 146186 76.7 294090 91.9 41498 99.2 815416 93.9 844.4 2.0



สุดท้ายทดสอบด้วย volano โดยทดสอบแค่ loopback อย่างเดียว
IBM Unix Server
VolanoMark version = 2.5.0.9
Messages sent = 20000
Messages received = 380000
Total messages = 400000
Elapsed time = 16.817 seconds
Average throughput = 23785 messages per second


Linux Mainframe
VolanoMark version = 2.5.0.9
Messageon = 2.5.0.9
Messages sent = 20000
Messages received = 380000
Total messages = 400000
Elapsed time = 35.91 seconds
Average throughput = 11139 messages per second


Linux on Labtop
VolanoMark version = 2.5.0.9
Messages sent = 20000
Messages received = 380000
Total messages = 400000
Elapsed time = 34.923 seconds
Average throughput = 11454 messages per second


ผลลัพท์ของ benchmark ก็เป็นตัวชี้นำให้เห็น
performance ได้ระดับหนึ่ง
เนื่องจากตัว Application ที่ย้ายขึ้นไป มีลักษณะเป็น
business application ไม่ได้ตั้งหน้าตั้งตา
คำนวณแต่อย่างไร
นอกจากนั้น IO ก็ไม่ได้ระดมยิงเข้ามา
มากมายนัก (ส่วนใหญ่เป็น read เสียมากกว่า)

ไว้คอยดูตอน run จริงทั่วประเทศ
ว่าจะเป็นอย่างไร เมื่อเทียบกับของเดิม
ที่อยู่บน IฺBM Unix Server

Related link from Roti

CLI0125E Exception ใน WebSphere

สืบเนื่องมาจากการย้าย Application server
จาก Aix ขึ้นไปบน Linux Mainframe

ผลการทดสอบ ปรากฎว่าพบปัญหา
[9/5/2005, 16:25:13:275 ICT] 3d24ec3d SystemOut     O 16:25:13,273 ERROR [UnEmpl
   oyInfoFindCmd] COM.ibm.db2.jdbc.DB2Exception: [IBM][CLI Driver] CLI0125E Functi
   on sequence error. SQLSTATE=HY010
   COM.ibm.db2.jdbc.DB2Exception: [IBM][CLI Driver] CLI0125E Function sequence err
   or. SQLSTATE=HY010
    at COM.ibm.db2.jdbc.app.SQLExceptionGenerator.throw_SQLException(SQLExce
   ptionGenerator.java:273


ก็เลยต้องไปใล่ค้นใน net ดู
ปรากฎว่าเป็นปัญหาประเภทว่า
เรา select ค่ามาใส่ result set (cursor เปิดอยู่)
จากนั้นเราก็ iterate ไปตาม result
โดยใช้ rs.next()
โดยแต่ละค่าที่ iterate จะมีการเปิด statement
ใหม่เพื่อที่จะ select ค่า (จากอีก table หนึ่ง)
ตรงนี้แหล่ะที่เป็นปัญหา
เข้าใจว่า พอเราทำอีก statement หนึ่ง
ตัว cursor ก็จะปิดไป ทำให้พอ iterate
ไปยัง result ตัวถัดไป ก็จะเกิด Exception นี้ขึ้น

ทางแก้ไข
ต้องเข้าไป set datasource property

    Name: connectionAttribute
    Type: java.lang.String
    Value: cursorhold=1


ประเด็นที่น่าสนใจ
ทำไมใน Aix ไม่ต้อง set ก็ run ได้

อ้างอิง
To resolve a CLI0125E error, can I set the CURSORHOLD property to 1 (TRUE) for a DB2 V8.1 datasource (using WebSphere Application Server V5.0.2), as is recommended for a DB2 V7.1 datasource in earlier versions of WebSphere?
A: Yes, this solution is still valid for WebSphere Application Server V5.0.2 and a DB2 V8.1 datasource.

The performance ramifications of this setting are minimal. Currently, if the transaction is completed or closed, the cursors are not destroyed in the memory. However, they are destroyed when a specific CLOSE CURSOR is issued. Therefore, if your code follows good programming practices (that is, OPEN a cursor, FETCH rows, CLOSE cursor), and if the code does the CLOSE CURSOR for every OPEN CURSOR, then setting the CURSORHOLD property should not be a performance concern.

Related link from Roti

Sunday, May 08, 2005

เปิด blog เพิ่ม

วันนี้ผมเปิด blog ใหม่
สำหรับเนื้อหาในส่วนของ ERP โดยเฉพาะครับ
ตัว blog อยู่ที่นี่ครับ Link

ตัวเนื้อหา ก็จะเป็น short note ในการที่จะ
พยายามทำเข้าใจระบบ ERP ต่างๆที่มีอยู่
(เท่าที่จะหาคู่มือมาอ่านได้)
โดยจะเริ่มต้นที่ SAP ก่อน
(ยิ่งเห็นว่าค่า Train มันแพงมาก
ก็ยิ่งอยากรู้ว่ามันทำอะไรได้แค่ไหน)

ซึ่งผลลัพท์สุดท้ายที่ต้องการ
ก็คือการพัฒนาระบบ ERP ดีๆสักระบบ
ที่พัฒนาโดยคนไทยเอง
(คงไม่ใช่การลอกหรอกนะ แต่เป็นการ
ศึกษาจุดดี หรือข้อจำกัดของคนอื่นเสียมากกว่า)

Related link from Roti