วันพฤหัสบดีที่ 16 ธันวาคม พ.ศ. 2553
วันพุธที่ 3 พฤศจิกายน พ.ศ. 2553
Selenium IDE simulate Test Tools ครับ
details :Selenium IDE is an integrated development environment for Selenium tests. It is implemented as a Firefox extension, and allows you to record, edit, and debug tests. Selenium IDE includes the entire Selenium Core, allowing you to easily and quickly...
reference :http://release.seleniumhq.org/selenium-ide/1.0.6/
https://addons.mozilla.org/en-US/firefox/addon/2079/
คำอธิบายเพิ่มเติม สำหรับจำลอง Test ที่ต้องการ volume เยอะๆ
reference :http://release.seleniumhq.org/selenium-ide/1.0.6/
https://addons.mozilla.org/en-US/firefox/addon/2079/
คำอธิบายเพิ่มเติม สำหรับจำลอง Test ที่ต้องการ volume เยอะๆ
วันอังคารที่ 2 พฤศจิกายน พ.ศ. 2553
การ set ให้ RAD7.0 run ใน Mode profile
Rational Application Developer 7.0 base on Eclipse
WAS6.0 or higher
jdk1.4,jdk1.5
output:
ต้องการ run debug ใน mode profile เพื่อต้องการ จับ ว่ามี package,class,method หรือ process ไหนใช้เวลาเท่าไร เพื่อมาใช้วิเคราะห์ Application ที่เราพัฒนา มีการใช้ memory เท่าโดนเรียกกี่ครั้ง ใช้ CPU เท่า
ปัญหา: เมื่อ Run WAS6.1 ใน mode profile แล้วได้
Error message
\DEV\IBM\SDP70\runtimes\base_v61\profiles\AppSrv02\logs\server1 should contain failure information
วิีธีแก้ไข :
ให้หาไฟล์ piAgent.dll แล้วนำ path ไป set path ให้กับ JVM
ตัวอย่าง :
D:\DEV\IBM\SDP70Shared\plugins\org.eclipse.hyades.execution.win32.x86_4.2.0.v200606131519\piAgent.dll
ก็นำ path D:\DEV\IBM\SDP70Shared\plugins\org.eclipse.hyades.execution.win32.x86_4.2.0.v200606131519
ไป set ที่ path ของ System ของ windows ก็ได้ จากนั้นทำการ Restart WAS ถ้ายัง Start อยู่
จากนั้นก็สามารถ ดู โปรไฟล์เลอร์ต่างๆได้ตามต้องการ เพื่อนำมาวิเคราะห์ปัญหาหรือเพื่อปรับจูน JVM ต่อไป
WAS : Websphere Application Server
WAS6.0 or higher
jdk1.4,jdk1.5
output:
ต้องการ run debug ใน mode profile เพื่อต้องการ จับ ว่ามี package,class,method หรือ process ไหนใช้เวลาเท่าไร เพื่อมาใช้วิเคราะห์ Application ที่เราพัฒนา มีการใช้ memory เท่าโดนเรียกกี่ครั้ง ใช้ CPU เท่า
ปัญหา: เมื่อ Run WAS6.1 ใน mode profile แล้วได้
Error message
วิีธีแก้ไข :
ให้หาไฟล์ piAgent.dll แล้วนำ path ไป set path ให้กับ JVM
ตัวอย่าง :
D:\DEV\IBM\SDP70Shared\plugins\org.eclipse.hyades.execution.win32.x86_4.2.0.v200606131519\piAgent.dll
ก็นำ path D:\DEV\IBM\SDP70Shared\plugins\org.eclipse.hyades.execution.win32.x86_4.2.0.v200606131519
ไป set ที่ path ของ System ของ windows ก็ได้ จากนั้นทำการ Restart WAS ถ้ายัง Start อยู่
จากนั้นก็สามารถ ดู โปรไฟล์เลอร์ต่างๆได้ตามต้องการ เพื่อนำมาวิเคราะห์ปัญหาหรือเพื่อปรับจูน JVM ต่อไป
WAS : Websphere Application Server
วันจันทร์ที่ 1 พฤศจิกายน พ.ศ. 2553
Setting/Increase JVM heap size
Java programs executes in JVM uses Heap of memory to manage the data.
if your java program requires a larg amount of memory , it is possible that the virttual machine will begin to throw OutOfMemoryError instances when
attempting instantiate and object the default heap size if 1 MB and can increase as much as 16 MB
=======Setting/Incrase JVM heap size================
it is possible to increase heap size allocated by the java virtual machine (JVM) by using command line option.
Following are few options available to change Heap Size.
-Xms : set initial Java heap size
-Xmx : set maxinum Java heap size
-Xss : set java thread stack size
For Example, you can set mininum heap to 64 MB and maximum heap 256 MB for a Java program helloWorld.
java -Xms64m -Xmx256m HelloWorld
t is possible to read the default JVM heap size programmatically by using totalMemory() method of Runtime class. Use following code to read JVM heap size.
public class GetHeapSize {
public static void main(String[]args){
//Get the jvm heap size.
long heapSize = Runtime.getRuntime().totalMemory();
//Print the jvm heap size.
System.out.println("Heap Size = " + heapSize);
}
}
อ้างอิง : http://viralpatel.net/blogs/2009/01/jvm-java-increase-heap-size-setting-heap-size-jvm-heap.html
if your java program requires a larg amount of memory , it is possible that the virttual machine will begin to throw OutOfMemoryError instances when
attempting instantiate and object the default heap size if 1 MB and can increase as much as 16 MB
=======Setting/Incrase JVM heap size================
it is possible to increase heap size allocated by the java virtual machine (JVM) by using command line option.
Following are few options available to change Heap Size.
-Xms
-Xmx
-Xss
For Example, you can set mininum heap to 64 MB and maximum heap 256 MB for a Java program helloWorld.
java -Xms64m -Xmx256m HelloWorld
t is possible to read the default JVM heap size programmatically by using totalMemory() method of Runtime class. Use following code to read JVM heap size.
public class GetHeapSize {
public static void main(String[]args){
//Get the jvm heap size.
long heapSize = Runtime.getRuntime().totalMemory();
//Print the jvm heap size.
System.out.println("Heap Size = " + heapSize);
}
}
อ้างอิง : http://viralpatel.net/blogs/2009/01/jvm-java-increase-heap-size-setting-heap-size-jvm-heap.html
วันพุธที่ 13 ตุลาคม พ.ศ. 2553
การ Encoding ในภาษา Java
เวลาเขียนเว็บในหน้า page JSP
เรามักจะกำหนด Encoding เพื่อเข้าระหัสให้อ่านภาษาไทยได้ดังนี้
TIS-620 (ALL)
ISO-8859-1 (for IE)
สำหรับ การประกาศเช่น
<%@page language="java" contentType="text/html"%>
<%@page pageEncoding="TIS-620"%>
........
<head>
<title>Test Encode</title>
<meta http-equiv="Content-Type" content="text/html; charset=TIS-620"/>
ซึ่งเป็นการเ้้ข้าระหัส encode/decode ภาษาไทยเท่าไร ภาษาต่างประเทศอื่นจะไม่ support
ดังนั้นเพื่อแก้ปัญหาดังกว่าเราจึงทำการเข้า ระหัสด้วย UTF-8 ซึ่งเป็นการเข้าระหัสทุกภาษาบนโลกใบนี้เค้าว่าอย่างนั้น
ตัวอย่าง
<%@page language="java" contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
........
<head>
<title>Test Encode</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
สำหรับในหน้า display สามารถแสดงภาษาได้ครับแต่ ถ้าเรากรอกข้อมูลภาษาไทยเช่น ใน text box ข้อมูล นั้นจะเป็น ภาษาต่างดาว
และวิธีที่ผมใช้การแปลงเข้าระหัสใหม่ดังนี้
String var_name = "ภาษาต่างดาว ผกดหำพหกดดพะ";
new String(var_name.getBytes("ISO-8859-1"), "UTF-8");
เพียงเท่านี้ก็สามารถอ่านภาษาไทยและภาษาอื่นได้แล้วครับ
เรามักจะกำหนด Encoding เพื่อเข้าระหัสให้อ่านภาษาไทยได้ดังนี้
TIS-620 (ALL)
ISO-8859-1 (for IE)
สำหรับ การประกาศเช่น
<%@page language="java" contentType="text/html"%>
<%@page pageEncoding="TIS-620"%>
........
<head>
<title>Test Encode</title>
<meta http-equiv="Content-Type" content="text/html; charset=TIS-620"/>
ซึ่งเป็นการเ้้ข้าระหัส encode/decode ภาษาไทยเท่าไร ภาษาต่างประเทศอื่นจะไม่ support
ดังนั้นเพื่อแก้ปัญหาดังกว่าเราจึงทำการเข้า ระหัสด้วย UTF-8 ซึ่งเป็นการเข้าระหัสทุกภาษาบนโลกใบนี้เค้าว่าอย่างนั้น
ตัวอย่าง
<%@page language="java" contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
........
<head>
<title>Test Encode</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
สำหรับในหน้า display สามารถแสดงภาษาได้ครับแต่ ถ้าเรากรอกข้อมูลภาษาไทยเช่น ใน text box ข้อมูล นั้นจะเป็น ภาษาต่างดาว
และวิธีที่ผมใช้การแปลงเข้าระหัสใหม่ดังนี้
String var_name = "ภาษาต่างดาว ผกดหำพหกดดพะ";
new String(var_name.getBytes("ISO-8859-1"), "UTF-8");
เพียงเท่านี้ก็สามารถอ่านภาษาไทยและภาษาอื่นได้แล้วครับ
Java Get System Date
public static String getSystemDate(String format) {
try {
return (String) (new SimpleDateFormat(format, Locale.US)).format(new Date());
}
catch (Exception e) {
e.printStackTrace();
return null;
}
}
try {
return (String) (new SimpleDateFormat(format, Locale.US)).format(new Date());
}
catch (Exception e) {
e.printStackTrace();
return null;
}
}
Object Oriented Programming
Object Oriented Programming เป็นการเขียนโปรแกรมโดยการมองสิ่งต่างๆ เป็นวัตถุ ซึ่งใน Realworld สิ่งต่างๆ รอบๆ ตัวเราก็เป็นวัตถุ โดยมีแนวคิดที่ว่า สิ่งที่ประกอบกันเป็นวัตถุนั้นจะประกอบไปด้วย
* Attribute(ลักษณะที่สามารถอธิบายได้ว่าวัตถุนี้คืออะไร อย่างเช่น คนสิ่งที่อธิบายได้ว่าเป็นคน อาจจะเป็น มีหู ตา จมูก ปาก แขน ขา อะไรพวกนี้)
* Method(พฤติกรรมของวัตถุนั้นว่าสามารถทำอะไรได้ พูดง่ายๆ การกระทำนั่นแหละ)
เราสามารถทำการ Implement ได้โดยการทำให้อยู่ในรูปของ Class ซึ่งเปรียบเหมือนกับต้นแบบที่ไว้ สร้าง Object (Class ไม่ใช่ object นะ) คุณสมบัติที่สำคัญของ OOP ก็คือ
1. Encapsulation
เป็นการห่อหุ้ม Attribute ไว้ด้วย Method หมายความว่าการที่เราต้องการเข้าไป เปลี่ยนแปลงหรือใช้ค่า Attribute นั้นต้องกระทำผ่าน Method ยกตัวอย่างเช่นเด็กหญิงนิดกับเด็กหญิงหน่อยเป็นเพื่อนกัน มีอยู่วันหนึ่งนิดเดินเหยียบเท้าหน่อย หน่อยรู้สึกไม่พอใจ (ตอนนี้ค่า Attribute อารมณ์ของหน่อยเพิ่มขึ้น) แต่นิดยังไม่รู้ เมื่อหน่อยแสดงสีหน้าไม่พอใจ เมื่อนิดเห็นแบบนั้นนิดรู้สึกผิด(หน่อยก็ยังไม่รู้เพราะ นิดคิดอยู่ในใจ) จึงกล่าวขอโทษ หน่อยได้ยินแบบนั้นจึงหายโกรธ
ตัวหนา คือ Method
ตัวหนาเอียง คือ Attribute
จะเห็นได้ว่าค่า Attribute นั้นก็คือค่าที่อยู่ภายในการที่จะให้ Object อื่นรับรู้ได้ก็จำเป็นที่จะ ต้องแสดงค่านั้นออกมาผ่านทาง Method สิ่งที่ส่งออกมาให้ Object อื่นรับรู้นั้นเราเรียกว่า Message จากตัวอย่างจะเห็นว่ามีการเปลี่ยนแปลงค่า Atrribute ตอนที่นิดเหยียบเท้าหน่อยนั้น การเหยียบเท้าคือ Method ที่แสดงออกมาทำให้อารมณ์ ซึ่งเป็น Attribute อยู่ภายในเปลี่ยนแปลง และ การกล่าวขอโทษก็เป็น Method ที่ทำการเปลี่ยนแปลงค่า Attribute ดังนั้นภาพของ Object ในหัวก็จะเป็นลักษณะที่ Method ห่อหุ้ม Attribute ไว้ วัตถุทุกตัวจะแสดงออกให้รับรู้ถึงสิ่งที่อยู่ภายในหรือสิ่งที่ต้องการผ่าน ทางการกระทำ
2. Inheritance
เป็นการทำให้ Class สามารถสืบทอดต่อกันได้ โดยลักษณะของการสืบทอดนั้นก็เพื่อเพิ่มเติมความสามารถให้สามารถทำงานได้ มากกว่าคลาสแม่ที่สืบทอดมา เช่น คลาสของคนสืบทอดมาจากคลาสของสัตว์เลี้ยงลูกด้วยนม โดยที่ Method พื้นฐานของสัตว์เลี้ยงลูกด้วยนมนั้น สมมุติให้มีเพียง กินอาหาร สืบพันธุ์ ขับถ่าย Class ของคนที่สืบทอดมาจากสัตว์เลี้ยงลูกด้วยนม สิ่งที่คนทำได้แตกต่าง เช่น การพูด ก็จะถูกเพิ่มเข้าไปในคลาสของคน สรุปว่าคนสามารถ กิน,สืบพันธุ์,ขับถ่าย และ พูด ได้
3. Abstraction
เป็นการสร้าง Method แบบลอยๆ ขึ้นมายังไม่ได้ระบุรายละเอียดว่า Method นั้น ทำงานอย่างไรจะมีการระบุการทำงานในส่วนของ Subclass ที่รับสืบทอดมา สาเหตุที่มีการทำแบบนี้ก็เพื่อให้สามารถใช้ Polymorphism ได้นั่นเอง
4. Polymorphism
คือสภาวะที่ Method มีหลายรูปแบบ เป็นวิธีการกำหนดรูปแบบการกระทำที่เหมือนกันแต่ได้ผลที่แตกต่างกัน สมมุติว่ามี คลาสแม่(Superclass) ที่เป็นคลาสของสัตว์เลี้ยงลูกด้วยนม โดยมีคลาสลูก(Subclass) คือ คลาสของคนกับสุนัข ซึ่งทั้งคนกับสุนัขมี Method ที่ใช้ในการเปล่่งเสียงซึ่งการเปล่งเสียงระหว่างคนกับสุนัขนั้นไม่เหมือนกัน แต่มันก็คือการเปล่งเสียง ดังนั้นเมื่อได้รับ Message ที่บอกให้ทำการเปล่งเสียงทั้งคนและสุนัขก็สามารถเปล่งเสียงได้เพียงแต่มี เสียงที่แตกต่างกันเท่านั้นเอง เพื่อให้สามารถเข้าใจได้ง่ายเราก็จะสร้าง Method ที่ชื่อว่า เปล่งเสียง( ) มาเพียงชื่อเดียวแล้วใช้หลักการ polymorphism นี้เพื่อให้สามารถเปล่งเสียงได้หลายๆ รูปแบบ
การสร้างโครงสร้างการ Design แบบ OO ที่ดีนั้นควรพยายามสร้างตามหลักข้างบนให้ได้นะครับ จะช่วยได้มากเลยทีเดียว แต่ที่แน่ๆ พยายามทำให้คลาสของเรามีลักษณะที่เป็น Encapsulation ตามข้อแรกให้ได้ครับ
นี่ก็เป็นหลักการในการเขียนโปรแกรมแบบ OO ที่ผมสรุปมาจากความเข้าใจของตัวเองนะครับไม่ได้อ้างอิงมาจากที่ไหน ถ้ามีส่วนใดที่ผิดก็แสดงความคิดเห็นมาได้ครับ คราวต่อไปจะมาเล่าเรื่องปัญหาที่เกิดจากการ Design ให้ฟังครับ
ที่มา:http://thitipat.wordpress.com/2007/02/04/object-oriented-programming-oop/
* Attribute(ลักษณะที่สามารถอธิบายได้ว่าวัตถุนี้คืออะไร อย่างเช่น คนสิ่งที่อธิบายได้ว่าเป็นคน อาจจะเป็น มีหู ตา จมูก ปาก แขน ขา อะไรพวกนี้)
* Method(พฤติกรรมของวัตถุนั้นว่าสามารถทำอะไรได้ พูดง่ายๆ การกระทำนั่นแหละ)
เราสามารถทำการ Implement ได้โดยการทำให้อยู่ในรูปของ Class ซึ่งเปรียบเหมือนกับต้นแบบที่ไว้ สร้าง Object (Class ไม่ใช่ object นะ) คุณสมบัติที่สำคัญของ OOP ก็คือ
1. Encapsulation
เป็นการห่อหุ้ม Attribute ไว้ด้วย Method หมายความว่าการที่เราต้องการเข้าไป เปลี่ยนแปลงหรือใช้ค่า Attribute นั้นต้องกระทำผ่าน Method ยกตัวอย่างเช่นเด็กหญิงนิดกับเด็กหญิงหน่อยเป็นเพื่อนกัน มีอยู่วันหนึ่งนิดเดินเหยียบเท้าหน่อย หน่อยรู้สึกไม่พอใจ (ตอนนี้ค่า Attribute อารมณ์ของหน่อยเพิ่มขึ้น) แต่นิดยังไม่รู้ เมื่อหน่อยแสดงสีหน้าไม่พอใจ เมื่อนิดเห็นแบบนั้นนิดรู้สึกผิด(หน่อยก็ยังไม่รู้เพราะ นิดคิดอยู่ในใจ) จึงกล่าวขอโทษ หน่อยได้ยินแบบนั้นจึงหายโกรธ
ตัวหนา คือ Method
ตัวหนาเอียง คือ Attribute
จะเห็นได้ว่าค่า Attribute นั้นก็คือค่าที่อยู่ภายในการที่จะให้ Object อื่นรับรู้ได้ก็จำเป็นที่จะ ต้องแสดงค่านั้นออกมาผ่านทาง Method สิ่งที่ส่งออกมาให้ Object อื่นรับรู้นั้นเราเรียกว่า Message จากตัวอย่างจะเห็นว่ามีการเปลี่ยนแปลงค่า Atrribute ตอนที่นิดเหยียบเท้าหน่อยนั้น การเหยียบเท้าคือ Method ที่แสดงออกมาทำให้อารมณ์ ซึ่งเป็น Attribute อยู่ภายในเปลี่ยนแปลง และ การกล่าวขอโทษก็เป็น Method ที่ทำการเปลี่ยนแปลงค่า Attribute ดังนั้นภาพของ Object ในหัวก็จะเป็นลักษณะที่ Method ห่อหุ้ม Attribute ไว้ วัตถุทุกตัวจะแสดงออกให้รับรู้ถึงสิ่งที่อยู่ภายในหรือสิ่งที่ต้องการผ่าน ทางการกระทำ
2. Inheritance
เป็นการทำให้ Class สามารถสืบทอดต่อกันได้ โดยลักษณะของการสืบทอดนั้นก็เพื่อเพิ่มเติมความสามารถให้สามารถทำงานได้ มากกว่าคลาสแม่ที่สืบทอดมา เช่น คลาสของคนสืบทอดมาจากคลาสของสัตว์เลี้ยงลูกด้วยนม โดยที่ Method พื้นฐานของสัตว์เลี้ยงลูกด้วยนมนั้น สมมุติให้มีเพียง กินอาหาร สืบพันธุ์ ขับถ่าย Class ของคนที่สืบทอดมาจากสัตว์เลี้ยงลูกด้วยนม สิ่งที่คนทำได้แตกต่าง เช่น การพูด ก็จะถูกเพิ่มเข้าไปในคลาสของคน สรุปว่าคนสามารถ กิน,สืบพันธุ์,ขับถ่าย และ พูด ได้
3. Abstraction
เป็นการสร้าง Method แบบลอยๆ ขึ้นมายังไม่ได้ระบุรายละเอียดว่า Method นั้น ทำงานอย่างไรจะมีการระบุการทำงานในส่วนของ Subclass ที่รับสืบทอดมา สาเหตุที่มีการทำแบบนี้ก็เพื่อให้สามารถใช้ Polymorphism ได้นั่นเอง
4. Polymorphism
คือสภาวะที่ Method มีหลายรูปแบบ เป็นวิธีการกำหนดรูปแบบการกระทำที่เหมือนกันแต่ได้ผลที่แตกต่างกัน สมมุติว่ามี คลาสแม่(Superclass) ที่เป็นคลาสของสัตว์เลี้ยงลูกด้วยนม โดยมีคลาสลูก(Subclass) คือ คลาสของคนกับสุนัข ซึ่งทั้งคนกับสุนัขมี Method ที่ใช้ในการเปล่่งเสียงซึ่งการเปล่งเสียงระหว่างคนกับสุนัขนั้นไม่เหมือนกัน แต่มันก็คือการเปล่งเสียง ดังนั้นเมื่อได้รับ Message ที่บอกให้ทำการเปล่งเสียงทั้งคนและสุนัขก็สามารถเปล่งเสียงได้เพียงแต่มี เสียงที่แตกต่างกันเท่านั้นเอง เพื่อให้สามารถเข้าใจได้ง่ายเราก็จะสร้าง Method ที่ชื่อว่า เปล่งเสียง( ) มาเพียงชื่อเดียวแล้วใช้หลักการ polymorphism นี้เพื่อให้สามารถเปล่งเสียงได้หลายๆ รูปแบบ
การสร้างโครงสร้างการ Design แบบ OO ที่ดีนั้นควรพยายามสร้างตามหลักข้างบนให้ได้นะครับ จะช่วยได้มากเลยทีเดียว แต่ที่แน่ๆ พยายามทำให้คลาสของเรามีลักษณะที่เป็น Encapsulation ตามข้อแรกให้ได้ครับ
นี่ก็เป็นหลักการในการเขียนโปรแกรมแบบ OO ที่ผมสรุปมาจากความเข้าใจของตัวเองนะครับไม่ได้อ้างอิงมาจากที่ไหน ถ้ามีส่วนใดที่ผิดก็แสดงความคิดเห็นมาได้ครับ คราวต่อไปจะมาเล่าเรื่องปัญหาที่เกิดจากการ Design ให้ฟังครับ
ที่มา:http://thitipat.wordpress.com/2007/02/04/object-oriented-programming-oop/
transaction what is it:?
ntroduction
มารู้จักการทำ Transaction กันก่อนน่ะครับ ว่ามันมีไว้ทำอะไร แล้วมีความจำเป็นมากแค่ไหนที่เราต้องใช้มัน
เริ่ม แรกก็ให้ลองนึกถึงการแข่งรถแรลลี่วิบากก่อนน่ะครับ จะมีการเล่น game ซึ่งจะมี check point เป็นจุด ๆ ไว้ ผู้เข้าแข่งขันจะต้องทำการเก็บ check point ไว้
การทำTransaciton มันก็คล้าย ๆ กันครับ คือจะมีการกำหนดจุด Check point ไว้ก่อน (เหมือนกับเจ้าของ game แรลลี่กำหนด) ถ้าผู้แข่งขัน (user) สามารถไปถึงจุด check point จุดนั้นได้ก็ถือว่า ผ่าน game นั้น ๆ ไปได้ครับ
Why we use this?
เอ๋ !! แล้วเจ้า Transaction เนี่ย เราจะทำไปทำไมกันน่ะ?
ตัวอย่างที่พอจะเห็นภาพชัด ๆ ก็คือ ลองนึกถึงระบบธนาคารดูน่ะครับ สมมติว่าคุณนำเงินไปฝากธนาคารจำนวน 1,000,000 บาท (มันก็มากเอาการอยู่) ในขณะที่พนักงานกำลัง save ข้อมูลจำนวนเงินฝากของเราลงไปใน database ที่ online อยู่ ถ้าเกิดในขณะนั้นมีเหตุการณ์ขัดข้องเกิดขึ้น เช่น ไฟดับ (บางคนอ้างว่า มี UPS ไม่ใช่เหรอ) งั้น ถ้าเกิดมีคนสะดุดสายไฟ UPS (มั่วไปเรื่อยนิ...) หรือถ้า Network down ขึ้นมา เอาเถอะ เอาเป็นว่ามีเหตุขัดข้องแล้วกัน ในขณะนั้น ถ้ามีการ save ข้อมูลของลูกค้าใน ตารางหลายๆ ตาราง ถ้ามีลูกค้าหลาย ๆ คน มันก็คงยากเอาการที่จะตรวจสอบว่า ก่อนที่ไฟจะดับนั้น มันได้ทำการ save ข้อมูลลงไปถึงตารางไหนแล้ว ถ้าเกิดมัน save เงินคุณได้ 500,000 บาท (ติ้งต่าง ว่า ไม่สามารถ save ทีละ 1,000,000 บาทได้) เมื่อคุณไปดูผลการฝากเงินของคุณ คุณก็จะเห็นเงินเพียง 500,000 บาท ทั้ง ๆ ที่คุณเอามา 1,000,000 บาท ซึ่งคุณคงไม่พอใจเป็นแน่
แต่ว่าหากมีการทำ Transaction เพื่อป้องกันในจุดนี้ การประมวลผลการฝากเงินของคุณจะถูกยกเลิกทันที ซึ่งมันก็คงไม่เสียหายอะไร เพราะว่าไม่มีการทำรายการ การฝากเงินของคุณ คุณก็รับเงินคืนแล้วก็ฝากใหม่แค่นั้นเอง
Transaction method หลัก ๆ
method ที่ต้องเจอแน่นอนในการทำ Transaction คือ
1. BeginTrans - ใช้เริ่มต้นการกำหนด Transaction ใหม่ เหมือนกับการตั้ง Check point นั้นเอง
2. CommitTrans - ใช้ในการบันทึกการเปลี่ยนแปลงและจบการทำ Transaction เหมือนกับผ่าน check point แล้ว
3. RollbackTrans - ใช้ในการ ยกเลิกการเปลี่ยนแปลงที่เกิดขึ้นในระหว่างการทำ Transaction และจบการทำ Transaction นั้น ๆ ด้วย เมื่อจบแล้ว เราอาจจะเริ่มทำ Transaction ใหม่ได้อีก
ที่มา:http://www.thaiadmin.org/board/index.php?topic=74217.0
มารู้จักการทำ Transaction กันก่อนน่ะครับ ว่ามันมีไว้ทำอะไร แล้วมีความจำเป็นมากแค่ไหนที่เราต้องใช้มัน
เริ่ม แรกก็ให้ลองนึกถึงการแข่งรถแรลลี่วิบากก่อนน่ะครับ จะมีการเล่น game ซึ่งจะมี check point เป็นจุด ๆ ไว้ ผู้เข้าแข่งขันจะต้องทำการเก็บ check point ไว้
การทำTransaciton มันก็คล้าย ๆ กันครับ คือจะมีการกำหนดจุด Check point ไว้ก่อน (เหมือนกับเจ้าของ game แรลลี่กำหนด) ถ้าผู้แข่งขัน (user) สามารถไปถึงจุด check point จุดนั้นได้ก็ถือว่า ผ่าน game นั้น ๆ ไปได้ครับ
Why we use this?
เอ๋ !! แล้วเจ้า Transaction เนี่ย เราจะทำไปทำไมกันน่ะ?
ตัวอย่างที่พอจะเห็นภาพชัด ๆ ก็คือ ลองนึกถึงระบบธนาคารดูน่ะครับ สมมติว่าคุณนำเงินไปฝากธนาคารจำนวน 1,000,000 บาท (มันก็มากเอาการอยู่) ในขณะที่พนักงานกำลัง save ข้อมูลจำนวนเงินฝากของเราลงไปใน database ที่ online อยู่ ถ้าเกิดในขณะนั้นมีเหตุการณ์ขัดข้องเกิดขึ้น เช่น ไฟดับ (บางคนอ้างว่า มี UPS ไม่ใช่เหรอ) งั้น ถ้าเกิดมีคนสะดุดสายไฟ UPS (มั่วไปเรื่อยนิ...) หรือถ้า Network down ขึ้นมา เอาเถอะ เอาเป็นว่ามีเหตุขัดข้องแล้วกัน ในขณะนั้น ถ้ามีการ save ข้อมูลของลูกค้าใน ตารางหลายๆ ตาราง ถ้ามีลูกค้าหลาย ๆ คน มันก็คงยากเอาการที่จะตรวจสอบว่า ก่อนที่ไฟจะดับนั้น มันได้ทำการ save ข้อมูลลงไปถึงตารางไหนแล้ว ถ้าเกิดมัน save เงินคุณได้ 500,000 บาท (ติ้งต่าง ว่า ไม่สามารถ save ทีละ 1,000,000 บาทได้) เมื่อคุณไปดูผลการฝากเงินของคุณ คุณก็จะเห็นเงินเพียง 500,000 บาท ทั้ง ๆ ที่คุณเอามา 1,000,000 บาท ซึ่งคุณคงไม่พอใจเป็นแน่
แต่ว่าหากมีการทำ Transaction เพื่อป้องกันในจุดนี้ การประมวลผลการฝากเงินของคุณจะถูกยกเลิกทันที ซึ่งมันก็คงไม่เสียหายอะไร เพราะว่าไม่มีการทำรายการ การฝากเงินของคุณ คุณก็รับเงินคืนแล้วก็ฝากใหม่แค่นั้นเอง
Transaction method หลัก ๆ
method ที่ต้องเจอแน่นอนในการทำ Transaction คือ
1. BeginTrans - ใช้เริ่มต้นการกำหนด Transaction ใหม่ เหมือนกับการตั้ง Check point นั้นเอง
2. CommitTrans - ใช้ในการบันทึกการเปลี่ยนแปลงและจบการทำ Transaction เหมือนกับผ่าน check point แล้ว
3. RollbackTrans - ใช้ในการ ยกเลิกการเปลี่ยนแปลงที่เกิดขึ้นในระหว่างการทำ Transaction และจบการทำ Transaction นั้น ๆ ด้วย เมื่อจบแล้ว เราอาจจะเริ่มทำ Transaction ใหม่ได้อีก
ที่มา:http://www.thaiadmin.org/board/index.php?topic=74217.0
Threads แบบงงๆ
threads คือ: เปรียบเหมือนกับ process ของระบบปฏิบัติการ หรือสิ่งที่สามารถทำงานโปรแกรมได้ (ตามความเข้าใจ) ซึ่งในระบบปฏิบัติการในปัจจบันส่วนใหญ่จะรองรับการทำงานเเบบ mutiple-tasking ก็จะประมาณว่าระบบปฏิบัติการจะจัดการหรือให้โปรแกรมทำงานพร้อมๆกันได้โดยการ สลับกันทำงานซึ่งจะดูเหมือนว่าโปรแกรมทำงานพร้อมๆกัน
สถานะของ threads ?วงชีวิตของ threads:
เมื่อ วัตถุของ threads ถูกสร้างขึ้น threads จะยังไม่ทำงานคือจะอยู่ใน status New จนกว่าวัตถุนั้นจะถูกเรียก start() ก็จะทำให้ threads เปลี่ยน status เป็น runnable คือ รอเข้าทำงานในหน่วยประมวลจนถึงเวลาที่ threads เข้าไปทำงานในหน่วยประมวลผลก็จะเปลี่ยนเป็น status running ซึ่งจาก status runnable ไปเป็น status running จะเกิดได้เองและเร็วมากจนกว่า threads ทำงานจนจบก็จะเข้าสู่ status terminated
NEW:เป็นการสร้างวัตถุซึ่งจะยังไม่ทำงานอะไรเลยเหมือนวัตถุทั่วไป
RUNNABLE:คือ status รอคิวเพื่อเข้าไปทำงานในหน่วยประมวล
BLOCKED: status ตอนที่ threads กำลังจะ lock เพื่อ synchronized หรือ กลับสู่ synchronized เมื่อเรียก wait()
WAITING:status กำลังรอเหตุการณ์ที่กำลังจะเกิดขึ้น ประมาณนี้
TIMED_WAITING: status กำลังรอให้ถึงเวลาที่กำหนดจะเกิดขึ้นเพราะมีการใช้ sleep(),wait(),join() แบบกำหนดเวลา
TERMINATE: ดิเอ็น;
============================
start(): เริ่มทำงาน
yield(): ยีลด เรียกเมื่อ threads ที่ำลังทำงานอยู่สามารถหยุดออกมารอที่ status runnableและกลับไปทำงานใหม่ได้อีกเมื่อมีโอกาสเพื่อให้ threads อื่นเข้าไปทำงานบ้าง
sleep():เป็นการหน่วงเวลาให้โปรแกรมทำงานช้าลงหรือให้ thread ออกจาก สถานะ running ไปสู่ timed_waiting แล้วจะกลับมาสู่ runnable อีก
interupt:เรียกเพือขัดจังหวะ thread ที่เป้นเจ้าของ
suspend()/resume(): ก็เป้นการเรียกเพือให้ thread ที่กำลังทำงานอยู่หยุดให้เป้น สถานะ runnable แต่ไม่สามารถกลับเข้ามาทำงานได้อีกจนกว่าจะเรียก resume()
stop():
สถานะของ threads ?วงชีวิตของ threads:
เมื่อ วัตถุของ threads ถูกสร้างขึ้น threads จะยังไม่ทำงานคือจะอยู่ใน status New จนกว่าวัตถุนั้นจะถูกเรียก start() ก็จะทำให้ threads เปลี่ยน status เป็น runnable คือ รอเข้าทำงานในหน่วยประมวลจนถึงเวลาที่ threads เข้าไปทำงานในหน่วยประมวลผลก็จะเปลี่ยนเป็น status running ซึ่งจาก status runnable ไปเป็น status running จะเกิดได้เองและเร็วมากจนกว่า threads ทำงานจนจบก็จะเข้าสู่ status terminated
NEW:เป็นการสร้างวัตถุซึ่งจะยังไม่ทำงานอะไรเลยเหมือนวัตถุทั่วไป
RUNNABLE:คือ status รอคิวเพื่อเข้าไปทำงานในหน่วยประมวล
BLOCKED: status ตอนที่ threads กำลังจะ lock เพื่อ synchronized หรือ กลับสู่ synchronized เมื่อเรียก wait()
WAITING:status กำลังรอเหตุการณ์ที่กำลังจะเกิดขึ้น ประมาณนี้
TIMED_WAITING: status กำลังรอให้ถึงเวลาที่กำหนดจะเกิดขึ้นเพราะมีการใช้ sleep(),wait(),join() แบบกำหนดเวลา
TERMINATE: ดิเอ็น;
============================
start(): เริ่มทำงาน
yield(): ยีลด เรียกเมื่อ threads ที่ำลังทำงานอยู่สามารถหยุดออกมารอที่ status runnableและกลับไปทำงานใหม่ได้อีกเมื่อมีโอกาสเพื่อให้ threads อื่นเข้าไปทำงานบ้าง
sleep():เป็นการหน่วงเวลาให้โปรแกรมทำงานช้าลงหรือให้ thread ออกจาก สถานะ running ไปสู่ timed_waiting แล้วจะกลับมาสู่ runnable อีก
interupt:เรียกเพือขัดจังหวะ thread ที่เป้นเจ้าของ
suspend()/resume(): ก็เป้นการเรียกเพือให้ thread ที่กำลังทำงานอยู่หยุดให้เป้น สถานะ runnable แต่ไม่สามารถกลับเข้ามาทำงานได้อีกจนกว่าจะเรียก resume()
stop():
String vs StringBuffer&StringBuilder in Java แบบงงๆ
#String ต่างจาก StringBuffer ตรงที่ String มีลักษณะเป็น immutable(read only) คือไม่สามารถเปลี่ยนแปลงค่าที่อยู่ภายในได้หลังจากที่ถูกสร้างขึ้นมาแล้ว
#ส่วน StringBuffer ออกแบบมาเพื่อให้แก้ไขค่าภายในตัวได้หลังจากที่สร้างขึ้นมาแล้วก็เป็นลักษณะ mutable
ถึง แม้ว่า String จะมี method บางอย่างให้เราใช้เหมือนกับว่าจะเปลี่ยนแปลงค่าของ String นั้นได้ อย่างเช่น concat(), replace(), replaceAll(), toUpperCase(), toLowerCase(), trim() แต่ผลที่ได้จากการเรียกใช้ method เหล่านี้จะเป็น String object ตัวใหม่ ถ้าเราเรียกใช้ method เหล่านี้บ่อยครั้ง จะทำให้มี String object เกิดขึ้นมาใหม่เกินความจำเป็น ซึ่งจะทำให้ประสิทธิภาพการทำงานของโปรแกรมลดลงได้
ใน ทางกลับกัน StringBuffer จะมี method สำหรับเปลี่ยนแปลงค่าในภาย StringBuffer โดยที่จะไม่มีการสร้าง object ใหม่ขึ้นมา ทำให้การทำงานมีประสิทธิภาพมากกว่า อย่างเช่น append(), insert(), replace() และ reverse()
ดังนั้น ในกรณีที่เรามี String ที่เราต้องการแก้ไขค่าในภายหลัง เราควรใช้ StringBuffer แทน String
ใน Java 1.5 ได้มีการเพิ่ม class ใหม่ที่ชื่อว่า StringBuilder ขึ้นมา เพื่อทำหน้าที่เหมือนกับ StringBuffer แต่ StringBuilder จะต่างจาก StringBuffer ตรงที่ StringBuilder นั้นจะไม่เป็น thread-safe1 จุดประสงค์ที่ได้มีการเพิ่ม class นี้เข้ามาก็เพื่อให้ใช้แทน StringBuffer ในกรณีที่มีเพียง thread เดียวเท่านั้นใช้งาน StringBuffer object นั้น เนื่องจาก StringBuilder ไม่ต้องทำ thread synchronization จึงทำงานเร็วกว่า StringBuffer นี่หมายความว่าถ้าเรามีเพียง thread เดียวที่ใช้งาน object ที่เก็บค่า String เราก็ใช้ StringBuilder แต่ถ้ามีมากกว่า 1 thread มาใช้งาน object นี้ เราก็ใช้ StringBuffer แทน
#thread-safe1 หมายความว่า ส่วนของ code, method, หรือ class นั้นถูกออกแบบมาให้ thread มากกว่า 1 thread เข้ามาทำงานในส่วน code นั้น, ใน method นั้น หรือ class นั้น โดยสามารถทำงานได้ถูกต้อง ไม่มีปัญหาจากการทำงานแบบ parallel กันของ thread เหล่านั้น ปัญหาที่เกิดจากการทำงานของ thread มากกว่า 1 thread เราจะเรียกว่า race condition ในการที่จะทำให้ code, method หรือ class มีคุณสมบัติที่เป็น thread safe นั้น จะต้องมีการทำให้ thread หลาย ๆ thread นั้นทำงานประสานกันหรือที่เรียกว่า thread synchronization โดยการใช้ keyword synchronized
อ้างอิง :ref: จำได้มาจากเว็บไหน
#ส่วน StringBuffer ออกแบบมาเพื่อให้แก้ไขค่าภายในตัวได้หลังจากที่สร้างขึ้นมาแล้วก็เป็นลักษณะ mutable
ถึง แม้ว่า String จะมี method บางอย่างให้เราใช้เหมือนกับว่าจะเปลี่ยนแปลงค่าของ String นั้นได้ อย่างเช่น concat(), replace(), replaceAll(), toUpperCase(), toLowerCase(), trim() แต่ผลที่ได้จากการเรียกใช้ method เหล่านี้จะเป็น String object ตัวใหม่ ถ้าเราเรียกใช้ method เหล่านี้บ่อยครั้ง จะทำให้มี String object เกิดขึ้นมาใหม่เกินความจำเป็น ซึ่งจะทำให้ประสิทธิภาพการทำงานของโปรแกรมลดลงได้
ใน ทางกลับกัน StringBuffer จะมี method สำหรับเปลี่ยนแปลงค่าในภาย StringBuffer โดยที่จะไม่มีการสร้าง object ใหม่ขึ้นมา ทำให้การทำงานมีประสิทธิภาพมากกว่า อย่างเช่น append(), insert(), replace() และ reverse()
ดังนั้น ในกรณีที่เรามี String ที่เราต้องการแก้ไขค่าในภายหลัง เราควรใช้ StringBuffer แทน String
ใน Java 1.5 ได้มีการเพิ่ม class ใหม่ที่ชื่อว่า StringBuilder ขึ้นมา เพื่อทำหน้าที่เหมือนกับ StringBuffer แต่ StringBuilder จะต่างจาก StringBuffer ตรงที่ StringBuilder นั้นจะไม่เป็น thread-safe1 จุดประสงค์ที่ได้มีการเพิ่ม class นี้เข้ามาก็เพื่อให้ใช้แทน StringBuffer ในกรณีที่มีเพียง thread เดียวเท่านั้นใช้งาน StringBuffer object นั้น เนื่องจาก StringBuilder ไม่ต้องทำ thread synchronization จึงทำงานเร็วกว่า StringBuffer นี่หมายความว่าถ้าเรามีเพียง thread เดียวที่ใช้งาน object ที่เก็บค่า String เราก็ใช้ StringBuilder แต่ถ้ามีมากกว่า 1 thread มาใช้งาน object นี้ เราก็ใช้ StringBuffer แทน
#thread-safe1 หมายความว่า ส่วนของ code, method, หรือ class นั้นถูกออกแบบมาให้ thread มากกว่า 1 thread เข้ามาทำงานในส่วน code นั้น, ใน method นั้น หรือ class นั้น โดยสามารถทำงานได้ถูกต้อง ไม่มีปัญหาจากการทำงานแบบ parallel กันของ thread เหล่านั้น ปัญหาที่เกิดจากการทำงานของ thread มากกว่า 1 thread เราจะเรียกว่า race condition ในการที่จะทำให้ code, method หรือ class มีคุณสมบัติที่เป็น thread safe นั้น จะต้องมีการทำให้ thread หลาย ๆ thread นั้นทำงานประสานกันหรือที่เรียกว่า thread synchronization โดยการใช้ keyword synchronized
อ้างอิง :ref: จำได้มาจากเว็บไหน
วันจันทร์ที่ 6 กันยายน พ.ศ. 2553
เมื่อ จบ course
หลังจากที่อดทนแบกสังขาร อดหลับอดนอน เพื่อไปร่ำเรียนวิชาหาความรู้ ตั้งแต่ มีนา 53 - จนถึง สิงหา 53 กับสี่วิชา
ก็ได้จบลงด้วยการ สอบ เมื่ออาทิตย์ที่ผ่านมา ความรู้ที่ร่ำเรียนมารวมเวลา 6 เดือน ก็มารวบรวมนำความรู้มาวัดโดยการสอบซึ่งจะมีการออกใบ transcript ให้โดยวัดจากผลการสอบ
การที่ได้เรียนหลักสูตรนี้ทำให้ได้มุมมองและความรู้มากมาย มี skill หลายๆอย่างที่ได้พัฒนาในหลักสูตรนี้เช่น ในเรื่องการวาง architechture ของระบบ ,programming, design ,skill ทางด้าน admin config อาจจะรวมไปถึง techology ที่เกี่ยวกับ ภาษา java เช่น framework ต่างๆมากมายที่เกิดขึ้นและนำความสะดวกสบายทำให้ชีวิต developer ง่ายขึ้นทันตาเห็น ไม่ว่าจะเป็น strust,spring,jsf,hibernate และอื่นๆอีกมากมาย ซึ่งแต่งละองค์กรได้มีการเลือก framework มาประยุกต์ให้เข้ากับ bussiness เพื่อความสะดวกรวดเร็วในการ พัฒนา
ท้ายที่สุดแล้วไม่ว่าเราจะใช้เทคโนโลยีอะไร สิ่งที่เราเอามาเป็นตัวแปรสำคัญในการเลือกเทคโนโลยีคือ ลูกค้า ความรวดเร็วในการพัฒนา งบประมาณ การเรียนรู้ รวมไปถึงการบำรุงรักษาและแก้ไข และรวมไปถึงปัจจัยอื่นๆในการพัฒนาอีกด้วย
สำหรับใน course นี้สิ่งที่ผมได้เรียนรู้ก็จะเป็นในเรื่อง architechture และ programming ทำให้เรามองภาพรวมของระบบมากขึ้น
============จบ==========
ก็ได้จบลงด้วยการ สอบ เมื่ออาทิตย์ที่ผ่านมา ความรู้ที่ร่ำเรียนมารวมเวลา 6 เดือน ก็มารวบรวมนำความรู้มาวัดโดยการสอบซึ่งจะมีการออกใบ transcript ให้โดยวัดจากผลการสอบ
การที่ได้เรียนหลักสูตรนี้ทำให้ได้มุมมองและความรู้มากมาย มี skill หลายๆอย่างที่ได้พัฒนาในหลักสูตรนี้เช่น ในเรื่องการวาง architechture ของระบบ ,programming, design ,skill ทางด้าน admin config อาจจะรวมไปถึง techology ที่เกี่ยวกับ ภาษา java เช่น framework ต่างๆมากมายที่เกิดขึ้นและนำความสะดวกสบายทำให้ชีวิต developer ง่ายขึ้นทันตาเห็น ไม่ว่าจะเป็น strust,spring,jsf,hibernate และอื่นๆอีกมากมาย ซึ่งแต่งละองค์กรได้มีการเลือก framework มาประยุกต์ให้เข้ากับ bussiness เพื่อความสะดวกรวดเร็วในการ พัฒนา
ท้ายที่สุดแล้วไม่ว่าเราจะใช้เทคโนโลยีอะไร สิ่งที่เราเอามาเป็นตัวแปรสำคัญในการเลือกเทคโนโลยีคือ ลูกค้า ความรวดเร็วในการพัฒนา งบประมาณ การเรียนรู้ รวมไปถึงการบำรุงรักษาและแก้ไข และรวมไปถึงปัจจัยอื่นๆในการพัฒนาอีกด้วย
สำหรับใน course นี้สิ่งที่ผมได้เรียนรู้ก็จะเป็นในเรื่อง architechture และ programming ทำให้เรามองภาพรวมของระบบมากขึ้น
============จบ==========
วันศุกร์ที่ 30 กรกฎาคม พ.ศ. 2553
Example Use Java parse xml to Object : ตัวอย่างการ parse xml String ให้เป็น Object
ปัจจุบัน xml เป็นภาษาที่จำเป็น(ณ ตอนนี้)สำหรับการสื่อสารหรือแลกเปลี่ยนข้อมูลระหว่าองค์กร หรือระหว่าง โปรแกรมกับโปรแกรม ตัวอย่างใช่พวก web service เป็นต้น ปัญหาที่ตามคือการที่ต้อง convert ภาษา xml ให้อยุ่ในรูปของภาษานั้นๆ เช่น เป็น php ,c# หรือ java สำหรับตัวอย่างนี้คือการ parse ค่า xml String ให้เป็น Object โดยมีการใช้ xpath มาช่วยมีตัวอย่างดังนี้
1.xml String format
2.bean Object
3.การ parse โดยใช้ xpath ในการเข้าถึง tree node ใน xml
1.xml String format
<request>
<person>
<id>01</id>
<fname>jame</fname>
<lname>closeling</lname>
<email>jame@ai-prosoft.com</email>
<tel>+6684101312x</tel>
<salary>25000</salary>
</person>
</request>
****************************
2. สร้าง bean สำหรับเก็บ object attribute ของ person ดังนี้
package com.ai.zon;
/*TODO:
* author :pradoem 2010-07-31
* */
public class Person {
//attribute
private String id;
private String fname;
private String lname;
private String email;
private String tel;
private String salary;
//method access getting/setting
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getFname() {
return fname;
}
public void setFname(String fname) {
this.fname = fname;
}
public String getLname() {
return lname;
}
public void setLname(String lname) {
this.lname = lname;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getSalary() {
return salary;
}
public void setSalary(String salary) {
this.salary = salary;
}
//toString
@Override
public String toString() {
return "Person [email=" + email + ", fname=" + fname + ", id=" + id
+ ", lname=" + lname + ", salary=" + salary + ", tel=" + tel
+ "]";
}
}
************************************
3.การ parse โดยใช้ xpath ในการเข้าถึง tree node ใน xml
package com.ai.zon;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
public class TestXxm2Obj {
/**
* @author pradoem 2010-07-30
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//การเรียนใช้งาน
String xml = "01 jame closeling jame@ai-prosoft.com +6684101312x 25000 ";
Person obj = xml2Obj(xml);
System.out.println("*************************");
System.out.println("Object to String values is :"+obj.toString());
}
//method get ค่าจาก tag xml โดย parse parameter doc,xpath,tag_name และ จะ return ค่า value กลับไป
private static String getNodeValuesXml(Document doc,XPath xpath, String preFix)
{
String ret="";
try
{
// คำสั่งชุดนี้สำหรับการใช้ xpath ในการเข้าถึง tag name value และ node name value
XPathExpression expr = xpath.compile(preFix);
Object result = expr.evaluate(doc, XPathConstants.NODESET);
NodeList textNameNodesList = (NodeList) result;
for (int i = 0; i < textnode =" textNameNodesList.item(i);" ret="textNode.getNodeValue();">>getNodeValuesXml:", ex.fillInStackTrace());
return ret;
}//try
}//method
//method convert xml 2 object
private static Person xml2Obj(String xml)
{
Person obj = null;
try
{
//ตรวจสอบ String xml ก่อนว่ามีค่าหรือป่าว
if((xml == null) || xml.equals(""))
return null;
//สร้าง instance Document
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
//โดยค่าเริ่มต้นสำหรับ support Namespace เป็น false แต่เรา set เป็น true
// เพื่อให้สนับสนุน XML namespaces
domFactory.setNamespaceAware(true);
// ปรกาศ doc - builder
DocumentBuilder builder;
try
{
//สร้าง doc - builder มีการ ดักจับ try-catch เพื่อสร้างไม่สำเร็จ
builder = domFactory.newDocumentBuilder();
}
catch (ParserConfigurationException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
return obj;
}
//prepared String to byte array for sax
//ตรงไปตรงมาครับ อ่านข้อมูล xml String ให้เป็น byte array
ByteArrayInputStream bArrStream = new java.io.ByteArrayInputStream(xml.getBytes());
//InputSource เป็น object ของ sax สำหรับรับค่า input ที่เป้น byte array เพื่อเตรียมโหลดเข้า Doc sax
InputSource input = new InputSource(bArrStream);
//โหลด xml เข้าใน Doc
Document doc= builder.parse(input);
//ประกาศและสร้าง instance xpath
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
//สร้าง object person
obj = new Person();
//คำสั่ง xpath สำหรับกาเข้าถึง value ใน tag xml /request/person/id/text()
// ใช้คำสั่ง //id/text() ถ้าแบบนี้ไม่ต้องรู้ว่า tag root ก่อนหน้าเป็นอะไร ให้ค้นหา tag id ทั้งหมด
obj.setId(getNodeValuesXml(doc,xpath,"//id/text()"));
obj.setFname(getNodeValuesXml(doc,xpath,"//fname/text()"));
obj.setLname(getNodeValuesXml(doc,xpath,"/request/person/lname/text()"));
obj.setEmail(getNodeValuesXml(doc,xpath,"/request/person/email/text()"));
obj.setTel(getNodeValuesXml(doc,xpath,"/request/person/tel/text()"));
obj.setSalary(getNodeValuesXml(doc,xpath,"/request/person/salary/text()"));
return obj;
}
catch (SAXException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
return obj;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return obj;
}
catch(Exception e)
{
System.out.println(e.fillInStackTrace());
return obj;
}
}
}
************************
//ผลลัพท์ของโปรแกรมที่เป็น object
****************************
Object to String values is :Person [email=jame@ai-prosoft.com, fname=jame, id=01, lname=closeling, salary=25000, tel=+6684101312x]
เราสามารถใช้คำสั่ง . ในการเอาไปใช้งานได้ดังนี้
System.out.println("ID :"+obj.getId());
อันนี้อาจเป็นตัวอย่างง่ายๆสำหรับการ parse xml ให้เป็น object ซึ่งจริงๆแล้วมีหลายวิธี และมี libraries สำหรับการ parse xml สำหรับ ภาษา java เยอะแยะมากมาย
นี่เป็น demo case study สำหรับ การ parse xml เพื่อไปใช้งานจริง
1.xml String format
2.bean Object
3.การ parse โดยใช้ xpath ในการเข้าถึง tree node ใน xml
1.xml String format
<request>
<person>
<id>01</id>
<fname>jame</fname>
<lname>closeling</lname>
<email>jame@ai-prosoft.com</email>
<tel>+6684101312x</tel>
<salary>25000</salary>
</person>
</request>
****************************
2. สร้าง bean สำหรับเก็บ object attribute ของ person ดังนี้
package com.ai.zon;
/*TODO:
* author :pradoem 2010-07-31
* */
public class Person {
//attribute
private String id;
private String fname;
private String lname;
private String email;
private String tel;
private String salary;
//method access getting/setting
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getFname() {
return fname;
}
public void setFname(String fname) {
this.fname = fname;
}
public String getLname() {
return lname;
}
public void setLname(String lname) {
this.lname = lname;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getSalary() {
return salary;
}
public void setSalary(String salary) {
this.salary = salary;
}
//toString
@Override
public String toString() {
return "Person [email=" + email + ", fname=" + fname + ", id=" + id
+ ", lname=" + lname + ", salary=" + salary + ", tel=" + tel
+ "]";
}
}
************************************
3.การ parse โดยใช้ xpath ในการเข้าถึง tree node ใน xml
package com.ai.zon;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
public class TestXxm2Obj {
/**
* @author pradoem 2010-07-30
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//การเรียนใช้งาน
String xml = "
Person obj = xml2Obj(xml);
System.out.println("*************************");
System.out.println("Object to String values is :"+obj.toString());
}
//method get ค่าจาก tag xml โดย parse parameter doc,xpath,tag_name และ จะ return ค่า value กลับไป
private static String getNodeValuesXml(Document doc,XPath xpath, String preFix)
{
String ret="";
try
{
// คำสั่งชุดนี้สำหรับการใช้ xpath ในการเข้าถึง tag name value และ node name value
XPathExpression expr = xpath.compile(preFix);
Object result = expr.evaluate(doc, XPathConstants.NODESET);
NodeList textNameNodesList = (NodeList) result;
for (int i = 0; i < textnode =" textNameNodesList.item(i);" ret="textNode.getNodeValue();">>getNodeValuesXml:", ex.fillInStackTrace());
return ret;
}//try
}//method
//method convert xml 2 object
private static Person xml2Obj(String xml)
{
Person obj = null;
try
{
//ตรวจสอบ String xml ก่อนว่ามีค่าหรือป่าว
if((xml == null) || xml.equals(""))
return null;
//สร้าง instance Document
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
//โดยค่าเริ่มต้นสำหรับ support Namespace เป็น false แต่เรา set เป็น true
// เพื่อให้สนับสนุน XML namespaces
domFactory.setNamespaceAware(true);
// ปรกาศ doc - builder
DocumentBuilder builder;
try
{
//สร้าง doc - builder มีการ ดักจับ try-catch เพื่อสร้างไม่สำเร็จ
builder = domFactory.newDocumentBuilder();
}
catch (ParserConfigurationException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
return obj;
}
//prepared String to byte array for sax
//ตรงไปตรงมาครับ อ่านข้อมูล xml String ให้เป็น byte array
ByteArrayInputStream bArrStream = new java.io.ByteArrayInputStream(xml.getBytes());
//InputSource เป็น object ของ sax สำหรับรับค่า input ที่เป้น byte array เพื่อเตรียมโหลดเข้า Doc sax
InputSource input = new InputSource(bArrStream);
//โหลด xml เข้าใน Doc
Document doc= builder.parse(input);
//ประกาศและสร้าง instance xpath
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
//สร้าง object person
obj = new Person();
//คำสั่ง xpath สำหรับกาเข้าถึง value ใน tag xml /request/person/id/text()
// ใช้คำสั่ง //id/text() ถ้าแบบนี้ไม่ต้องรู้ว่า tag root ก่อนหน้าเป็นอะไร ให้ค้นหา tag id ทั้งหมด
obj.setId(getNodeValuesXml(doc,xpath,"//id/text()"));
obj.setFname(getNodeValuesXml(doc,xpath,"//fname/text()"));
obj.setLname(getNodeValuesXml(doc,xpath,"/request/person/lname/text()"));
obj.setEmail(getNodeValuesXml(doc,xpath,"/request/person/email/text()"));
obj.setTel(getNodeValuesXml(doc,xpath,"/request/person/tel/text()"));
obj.setSalary(getNodeValuesXml(doc,xpath,"/request/person/salary/text()"));
return obj;
}
catch (SAXException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
return obj;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return obj;
}
catch(Exception e)
{
System.out.println(e.fillInStackTrace());
return obj;
}
}
}
************************
//ผลลัพท์ของโปรแกรมที่เป็น object
****************************
Object to String values is :Person [email=jame@ai-prosoft.com, fname=jame, id=01, lname=closeling, salary=25000, tel=+6684101312x]
เราสามารถใช้คำสั่ง . ในการเอาไปใช้งานได้ดังนี้
System.out.println("ID :"+obj.getId());
อันนี้อาจเป็นตัวอย่างง่ายๆสำหรับการ parse xml ให้เป็น object ซึ่งจริงๆแล้วมีหลายวิธี และมี libraries สำหรับการ parse xml สำหรับ ภาษา java เยอะแยะมากมาย
นี่เป็น demo case study สำหรับ การ parse xml เพื่อไปใช้งานจริง
วันพฤหัสบดีที่ 29 กรกฎาคม พ.ศ. 2553
ตัวอย่าง การ Set & Get Properties File ใน java
บางครั้งในการสร้าง application ขึ้นมาไม่ว่าจะเป็น web หรือ win บางครั้ง application ของเราต้องการค่าเริ่มต้นสำหรับการ run application ซึ่งเราสามารถ กำหนดได้หลายรูปแบบใช่ set ค่าไว้ที่ xml ไฟล์ หรือทำเป็นค่า fix ที่เป็น final หรืออ่านค่าจาก INI ไฟล์ สำหรับตัวอย่างนี้คือการค่า Properties มาใช้งาน(เหมือนกับการอ่านค่าจาก INI ไฟล์)
1.ตัวอย่างการอ่านค่า properties
2.ตัวอย่างการเขียนไฟล์ properties
3.ตัวอย่างไฟล์ properties
1.ตัวอย่างการอ่านค่า properties
package com.test.test;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
public class AppGetProp
{
public static void main( String[] args )
{
Properties prop = new Properties();
try {
//load a properties file
prop.load(new FileInputStream("config.properties"));
//get the property value and print it out
System.out.println(prop.getProperty("database"));
System.out.println(prop.getProperty("dbuser"));
System.out.println(prop.getProperty("dbpassword"));
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
************************************
2.ตัวอย่างการเขียนไฟล์ properties
package com.test.test;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
public class AppSetProp {
public static void main( String[] args )
{
Properties prop = new Properties();
try {
//set the properties value
prop.setProperty("database", "localhost");
prop.setProperty("dbuser", "mkyong");
prop.setProperty("dbpassword", "password");
//save properties to project root folder
prop.store(new FileOutputStream("config.properties"), null);
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
************************************
สำหรับ path file : /project_name/config.properties
3.ตัวอย่างไฟล์ properties
#Wed Jul 21 00:20:09 ICT 2010
dbpassword=password_xxx
database=localhostx
dbuser=user_xxx
*************************************
1.ตัวอย่างการอ่านค่า properties
2.ตัวอย่างการเขียนไฟล์ properties
3.ตัวอย่างไฟล์ properties
package com.test.test;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
public class AppGetProp
{
public static void main( String[] args )
{
Properties prop = new Properties();
try {
//load a properties file
prop.load(new FileInputStream("config.properties"));
//get the property value and print it out
System.out.println(prop.getProperty("database"));
System.out.println(prop.getProperty("dbuser"));
System.out.println(prop.getProperty("dbpassword"));
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
************************************
2.ตัวอย่างการเขียนไฟล์ properties
package com.test.test;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
public class AppSetProp {
public static void main( String[] args )
{
Properties prop = new Properties();
try {
//set the properties value
prop.setProperty("database", "localhost");
prop.setProperty("dbuser", "mkyong");
prop.setProperty("dbpassword", "password");
//save properties to project root folder
prop.store(new FileOutputStream("config.properties"), null);
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
************************************
#Wed Jul 21 00:20:09 ICT 2010
dbpassword=password_xxx
database=localhostx
dbuser=user_xxx
*************************************
ตัวอย่าง code Gen UUID แบบที่สองเป็น number 14 หลัก
ตัวอย่าง output uuid : 30460064698217
*********************************************
ตัวอย่าง code
package com.test.test;
import java.util.Random;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.security.SecureRandom;
/**
* Classname : GenID
* Description : Generate unique id (lengths of number is 16)
*
* @version 1.0
*/
public class GenID{
private static GenID Myself;
private static Random MyRand;
private static SecureRandom MySecureRand;
private String strGen_id;
static {
MySecureRand = new SecureRandom();
long nSecureInitializer = MySecureRand.nextLong();
MyRand = new Random(nSecureInitializer);
}
/**
* get date and month
*/
private static String getDateMonth(){
Calendar calendar = new GregorianCalendar();
return(Integer.toString(calendar.get(Calendar.DATE))+
Integer.toString(calendar.get(Calendar.MONTH)));
}
/**
* get random long
*/
private static String getRandLong(){
long nRrand = MySecureRand.nextLong();
if (nRrand<0){
nRrand = nRrand * (-1);
}
return(Long.toString(nRrand));
}
/**
* get current time
*/
private static String getCurrentTime(){
long nTime = System.currentTimeMillis();
return(Long.toString(nTime));
}
/**
* scamble
* 1. random long (2 to 7) and reverse
* 2. current time (4 to 9) and reverse
* 3. date time (0 to 1)
*/
private static String JScamble(){
StringBuffer strScam_rand = new StringBuffer(getRandLong().substring(2,8));
StringBuffer strScam_ctime = new StringBuffer(getCurrentTime().substring(4,10));
StringBuffer strScam_dmy = new StringBuffer(getDateMonth().substring(0,2));
return(strScam_dmy.toString()+strScam_ctime.reverse().toString()+strScam_rand.reverse().toString());
}
private GenID(){
strGen_id = null;
}
/**
* Generate unique id
* @return String (lengths=14)
* @see java.lang.String
*/
public String getId(){
strGen_id = JScamble();
return strGen_id;
}
/**
* The default method used to retrieve an instance of GenID,
*/
public static GenID getInstance() {
if (Myself == null) {
synchronized (GenID.class) {
Myself = new GenID();
}
}
return Myself;
}
}
*********************************************
ตัวอย่าง code
package com.test.test;
import java.util.Random;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.security.SecureRandom;
/**
* Classname : GenID
* Description : Generate unique id (lengths of number is 16)
*
Example usage:
* GenID hGenid = GenID.getInstance();
* String strUid = hGenid.getId();
* @version 1.0
*/
public class GenID{
private static GenID Myself;
private static Random MyRand;
private static SecureRandom MySecureRand;
private String strGen_id;
static {
MySecureRand = new SecureRandom();
long nSecureInitializer = MySecureRand.nextLong();
MyRand = new Random(nSecureInitializer);
}
/**
* get date and month
*/
private static String getDateMonth(){
Calendar calendar = new GregorianCalendar();
return(Integer.toString(calendar.get(Calendar.DATE))+
Integer.toString(calendar.get(Calendar.MONTH)));
}
/**
* get random long
*/
private static String getRandLong(){
long nRrand = MySecureRand.nextLong();
if (nRrand<0){
nRrand = nRrand * (-1);
}
return(Long.toString(nRrand));
}
/**
* get current time
*/
private static String getCurrentTime(){
long nTime = System.currentTimeMillis();
return(Long.toString(nTime));
}
/**
* scamble
* 1. random long (2 to 7) and reverse
* 2. current time (4 to 9) and reverse
* 3. date time (0 to 1)
*/
private static String JScamble(){
StringBuffer strScam_rand = new StringBuffer(getRandLong().substring(2,8));
StringBuffer strScam_ctime = new StringBuffer(getCurrentTime().substring(4,10));
StringBuffer strScam_dmy = new StringBuffer(getDateMonth().substring(0,2));
return(strScam_dmy.toString()+strScam_ctime.reverse().toString()+strScam_rand.reverse().toString());
}
private GenID(){
strGen_id = null;
}
/**
* Generate unique id
* @return String (lengths=14)
* @see java.lang.String
*/
public String getId(){
strGen_id = JScamble();
return strGen_id;
}
/**
* The default method used to retrieve an instance of GenID,
*/
public static GenID getInstance() {
if (Myself == null) {
synchronized (GenID.class) {
Myself = new GenID();
}
}
return Myself;
}
}
ตัวอย่าง code Gen UUID แบบที่1
บางครั้งเราต้องการใช้ค่าจาก system ที่ gen auto id ไม่ซ้ำกัน หรือเรียกกันว่า unique identifier (uuid)
ตัวอย่าง code ที่สามารถใช้งานได้ตามข้างล่าง
**************************************************
//output :6f5c9761-4728-4cf6-aace-0321f0027bcf ก็จะประมาณนี้
package com.test.test;
import java.util.Locale;
import java.util.Random;
/**
* A simple UUID.
*/
public final class UUID
{
public static void main(String args[])
{
System.out.println(nextUUID());
}
/**
* The characters to generate this UUID with.
*/
private static final char[] HEX = new char[] {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f'
};
/**
* Index into the UUID to set its type.
*/
private static final byte INDEX_TYPE = 6;
/**
* Index into the UUID to set its variation.
*/
private static final byte INDEX_VARIATION = 8;
/**
* The specific type of the UUID.
*/
private static final byte TYPE_RANDOM_BASED = 4;
/**
* The rnd generator.
*/
private static final Random RANDOM = new Random();
/**
* The string representing this UUID.
*/
private final String uuid;
/**
* Constructs a new UUID with the specified bytes.
*/
private UUID(byte[] bytes) {
this.uuid = genString(bytes);
}
/**
* Constructs a new UUID with the specified string.
*
* The size of the string must be 32, but no other characters
* are checked.
*/
public UUID(String uuid) {
this.uuid = uuid.toLowerCase(Locale.US);
if(uuid.length() != 36)
throw new IllegalArgumentException();
}
/**
* Returns the next UUID.
*/
public static UUID nextUUID() {
byte[] bytes = new byte[16];
RANDOM.nextBytes(bytes);
bytes[INDEX_TYPE] &= (byte) 0x0F;
bytes[INDEX_TYPE] |= (byte) (TYPE_RANDOM_BASED << sb =" new" i =" 0;" i="="4" i="="6" i="="8" i="="10)" hex =" info[i]">> 4]);
sb.append(HEX[hex & 0x0F]);
}
return sb.toString();
}
/**
* Generates the string of this UUID.
*/
public String toString() {
return uuid;
}
/**
* Determines if this UUID is the same as another.
*/
public boolean equals(Object o) {
if(o == this)
return true;
else if (o instanceof UUID) {
UUID other = (UUID)o;
return uuid.equals(other.uuid);
}
return false;
}
/**
* The hashCode of this UUID.
*/
public int hashCode() {
return uuid.hashCode();
}
}
ตัวอย่าง code ที่สามารถใช้งานได้ตามข้างล่าง
**************************************************
//output :6f5c9761-4728-4cf6-aace-0321f0027bcf ก็จะประมาณนี้
package com.test.test;
import java.util.Locale;
import java.util.Random;
/**
* A simple UUID.
*/
public final class UUID
{
public static void main(String args[])
{
System.out.println(nextUUID());
}
/**
* The characters to generate this UUID with.
*/
private static final char[] HEX = new char[] {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f'
};
/**
* Index into the UUID to set its type.
*/
private static final byte INDEX_TYPE = 6;
/**
* Index into the UUID to set its variation.
*/
private static final byte INDEX_VARIATION = 8;
/**
* The specific type of the UUID.
*/
private static final byte TYPE_RANDOM_BASED = 4;
/**
* The rnd generator.
*/
private static final Random RANDOM = new Random();
/**
* The string representing this UUID.
*/
private final String uuid;
/**
* Constructs a new UUID with the specified bytes.
*/
private UUID(byte[] bytes) {
this.uuid = genString(bytes);
}
/**
* Constructs a new UUID with the specified string.
*
* The size of the string must be 32, but no other characters
* are checked.
*/
public UUID(String uuid) {
this.uuid = uuid.toLowerCase(Locale.US);
if(uuid.length() != 36)
throw new IllegalArgumentException();
}
/**
* Returns the next UUID.
*/
public static UUID nextUUID() {
byte[] bytes = new byte[16];
RANDOM.nextBytes(bytes);
bytes[INDEX_TYPE] &= (byte) 0x0F;
bytes[INDEX_TYPE] |= (byte) (TYPE_RANDOM_BASED << sb =" new" i =" 0;" i="="4" i="="6" i="="8" i="="10)" hex =" info[i]">> 4]);
sb.append(HEX[hex & 0x0F]);
}
return sb.toString();
}
/**
* Generates the string of this UUID.
*/
public String toString() {
return uuid;
}
/**
* Determines if this UUID is the same as another.
*/
public boolean equals(Object o) {
if(o == this)
return true;
else if (o instanceof UUID) {
UUID other = (UUID)o;
return uuid.equals(other.uuid);
}
return false;
}
/**
* The hashCode of this UUID.
*/
public int hashCode() {
return uuid.hashCode();
}
}
ปัญหา java call Function return type boolean ใน oracle
สำหรับคนที่เคยใช้ ฐานข้อมูล oracle คงหนีไม่พ้นเรื่องการเขียน pl/sql ซึ่งก็เป็นจุ่นเด่นของ oracle เค้าว่าอย่างนั้น แต่มีนักพัฒนาไม่น้อยที่
ไม่จำเป็นต้องรู้จักหรือต้องเรียนรู้การเขียน pl/sql รู้แต่เพียงว่าเรียกใช้ procedure/function pl/sql เท่านั้น
ปัญหาอย่างหนึ่งระหว่าง java กับ oracle คือการเรียกใช้ function ใน oracle ที่มี Return type เป็น boolean ซึ่งเค้าว่ากันว่า java ยังไม่ support
การเรียกใช้ Return type ที่เป็น boolean นี่อาจเป็นวิธีทางแก้อีก หนึ่งทางเลือกสำหรับนักพัฒนาคือการเขียน pl/sql ครอบระหว่างการเรียนใช้ function ของ orcle
ซึ่งในตัวอย่างประกอบไปด้วย
1. pl/sql function ที่ return ค่าเป็น boolean
2. การเรียกใช้โดยใช้ java
--สร้าง ประกาศ function และสร้าง package
create or replace
PACKAGE PKG_TEST AS
FUNCTION F_GET_TEST_BOOL(P_SALARY1 IN NUMBER, P_SALARY2 OUT VARCHAR2) RETURN BOOLEAN;
END PKG_TEST;
/***********************************************/
--สร้าง body และสร้าง function F_GET_TEST_BOOL โดย return type ที่เป็น boolean
create or replace
PACKAGE BODY PKG_TEST AS
FUNCTION F_GET_TEST_BOOL(P_SALARY1 IN NUMBER, P_SALARY2 OUT VARCHAR2)
RETURN BOOLEAN AS
B_RESULT BOOLEAN := TRUE;
BEGIN
IF P_SALARY1>1500 THEN
P_SALARY2 := 'salary1 > 1500 bath';
ELSE
P_SALARY2 := 'salary1 < 1500 bath';
B_RESULT := FALSE;
END IF;
RETURN B_RESULT;
END F_GET_TEST_BOOL;
END PKG_TEST;
//เรียกใช้ จากโดย java set parameter in,out,และ return type
package com.test;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import oracle.jdbc.OracleTypes;
public class TEST_CALL_FBOOL {
//สร้าง connection method เพื่อ connec oracle
private static Connection conn()
{
String conStr;
Connection conn;
try
{
//สร้าง url connection
conStr = "jdbc:oracle:thin:@localhost:1521:orcl";
//register class dirver
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
//connection & return
return conn = DriverManager.getConnection(conStr, "system", "root");
}
catch(Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//การเรียนใช้
P_CALL_FUNCTION_BOOL();
}
//สร้าง method สำหรับ เรียกใช้ fuction PL/SQL
public static void P_CALL_FUNCTION_BOOL()
{
//ประกาศ call prepared
CallableStatement cstmt = null;
//ประกาศ connection
Connection conn = null;
try {
//connection
conn =conn();
// -------------------------------------------------------------
// Call PL/SQL Function to retrieve {?= call function(?,?...n)}
// -------------------------------------------------------------
//F_GET_TEST_BOOL(P_SALARY1 IN NUMBER, P_SALARY2 OUT VARCHAR2)
//วิธีแก้ไขสำหรับการเรียน function จาก pl/sql ที่มี return type เป็น boolean เราจะทำการเขียน pl/sql คลอบ function ที่ต้องการเรียกใช้
//และมีการ return type เป็น varchar แทน ในตัวอย่าง ประกาศ ตัวเเปรที่ชื่อ B_VAL เป็น boolean เพื่อรับค่าจาก function ที่ return type เป็น boolean
//โดย function มี argument ที่เป็น IN(P_SALARY1) และ OUT(P_SALARY2) จากนั้น ก็ทำการ check if B_VAL เป็นจริงหรือไม่ ถ้าเป็นจริงให้ ตัวแปร ? มีค่าเป็น "T" String เพื่อ Return
//ค่าให้ java ใช้งาน
// prepared call
cstmt = conn.prepareCall("DECLARE B_VAL BOOLEAN; " +
"BEGIN B_VAL := PKG_TEST.F_GET_TEST_BOOL(?,?);" +
"IF (B_VAL) THEN ? := 'T'; END IF; END;");
//register input parameters
cstmt.setInt(1,1000);
//register output parameters
cstmt.registerOutParameter(2, OracleTypes.VARCHAR);
//register Return type
cstmt.registerOutParameter(3, OracleTypes.VARCHAR);
// Execute and retrieve the returned values
cstmt.execute();
System.out.println("******************************************8");
String result1 = cstmt.getString(2); //OUT parameter
String result2 = cstmt.getString(3); //Return type เื่พื่อทำไป check แล้วใช้งานต่อไป(ที่ได้จากการเรียก function)
//หมายเหตุ ถ้าเป็น True จะได้ String = 'T' แต่ถ้าเป็น False มีค่าเป็น null
System.out.println("Result Output param:"+result1);
System.out.println("Result Return Type:"+result2);
//close
cstmt.close();
conn.close();
}
catch (SQLException e)
{
System.out.println("'ERROR':"+e.toString());
}
}
}
ตัวอย่างสำหรับการเรียกใช้ function ของ pl/sql ที่มีการ Return type เป็น boolean โดยใช้ ภาษา java
ไม่จำเป็นต้องรู้จักหรือต้องเรียนรู้การเขียน pl/sql รู้แต่เพียงว่าเรียกใช้ procedure/function pl/sql เท่านั้น
ปัญหาอย่างหนึ่งระหว่าง java กับ oracle คือการเรียกใช้ function ใน oracle ที่มี Return type เป็น boolean ซึ่งเค้าว่ากันว่า java ยังไม่ support
การเรียกใช้ Return type ที่เป็น boolean นี่อาจเป็นวิธีทางแก้อีก หนึ่งทางเลือกสำหรับนักพัฒนาคือการเขียน pl/sql ครอบระหว่างการเรียนใช้ function ของ orcle
ซึ่งในตัวอย่างประกอบไปด้วย
1. pl/sql function ที่ return ค่าเป็น boolean
2. การเรียกใช้โดยใช้ java
--สร้าง ประกาศ function และสร้าง package
create or replace
PACKAGE PKG_TEST AS
FUNCTION F_GET_TEST_BOOL(P_SALARY1 IN NUMBER, P_SALARY2 OUT VARCHAR2) RETURN BOOLEAN;
END PKG_TEST;
/***********************************************/
--สร้าง body และสร้าง function F_GET_TEST_BOOL โดย return type ที่เป็น boolean
create or replace
PACKAGE BODY PKG_TEST AS
FUNCTION F_GET_TEST_BOOL(P_SALARY1 IN NUMBER, P_SALARY2 OUT VARCHAR2)
RETURN BOOLEAN AS
B_RESULT BOOLEAN := TRUE;
BEGIN
IF P_SALARY1>1500 THEN
P_SALARY2 := 'salary1 > 1500 bath';
ELSE
P_SALARY2 := 'salary1 < 1500 bath';
B_RESULT := FALSE;
END IF;
RETURN B_RESULT;
END F_GET_TEST_BOOL;
END PKG_TEST;
//เรียกใช้ จากโดย java set parameter in,out,และ return type
package com.test;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import oracle.jdbc.OracleTypes;
public class TEST_CALL_FBOOL {
//สร้าง connection method เพื่อ connec oracle
private static Connection conn()
{
String conStr;
Connection conn;
try
{
//สร้าง url connection
conStr = "jdbc:oracle:thin:@localhost:1521:orcl";
//register class dirver
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
//connection & return
return conn = DriverManager.getConnection(conStr, "system", "root");
}
catch(Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//การเรียนใช้
P_CALL_FUNCTION_BOOL();
}
//สร้าง method สำหรับ เรียกใช้ fuction PL/SQL
public static void P_CALL_FUNCTION_BOOL()
{
//ประกาศ call prepared
CallableStatement cstmt = null;
//ประกาศ connection
Connection conn = null;
try {
//connection
conn =conn();
// -------------------------------------------------------------
// Call PL/SQL Function to retrieve {?= call function(?,?...n)}
// -------------------------------------------------------------
//F_GET_TEST_BOOL(P_SALARY1 IN NUMBER, P_SALARY2 OUT VARCHAR2)
//วิธีแก้ไขสำหรับการเรียน function จาก pl/sql ที่มี return type เป็น boolean เราจะทำการเขียน pl/sql คลอบ function ที่ต้องการเรียกใช้
//และมีการ return type เป็น varchar แทน ในตัวอย่าง ประกาศ ตัวเเปรที่ชื่อ B_VAL เป็น boolean เพื่อรับค่าจาก function ที่ return type เป็น boolean
//โดย function มี argument ที่เป็น IN(P_SALARY1) และ OUT(P_SALARY2) จากนั้น ก็ทำการ check if B_VAL เป็นจริงหรือไม่ ถ้าเป็นจริงให้ ตัวแปร ? มีค่าเป็น "T" String เพื่อ Return
//ค่าให้ java ใช้งาน
// prepared call
cstmt = conn.prepareCall("DECLARE B_VAL BOOLEAN; " +
"BEGIN B_VAL := PKG_TEST.F_GET_TEST_BOOL(?,?);" +
"IF (B_VAL) THEN ? := 'T'; END IF; END;");
//register input parameters
cstmt.setInt(1,1000);
//register output parameters
cstmt.registerOutParameter(2, OracleTypes.VARCHAR);
//register Return type
cstmt.registerOutParameter(3, OracleTypes.VARCHAR);
// Execute and retrieve the returned values
cstmt.execute();
System.out.println("******************************************8");
String result1 = cstmt.getString(2); //OUT parameter
String result2 = cstmt.getString(3); //Return type เื่พื่อทำไป check แล้วใช้งานต่อไป(ที่ได้จากการเรียก function)
//หมายเหตุ ถ้าเป็น True จะได้ String = 'T' แต่ถ้าเป็น False มีค่าเป็น null
System.out.println("Result Output param:"+result1);
System.out.println("Result Return Type:"+result2);
//close
cstmt.close();
conn.close();
}
catch (SQLException e)
{
System.out.println("'ERROR':"+e.toString());
}
}
}
ตัวอย่างสำหรับการเรียกใช้ function ของ pl/sql ที่มีการ Return type เป็น boolean โดยใช้ ภาษา java
Get วันทีปัจจุบันโดยใช้ java.util.date ตาม format
ในการเขียนโปรแกรมทุกภาษาสิ่งที่โปรแกรมเมอร์หลีกเหลี่ยงไม่พ้นคือการที่ต้องไปยุ่งเกี่ยวกับ วันเวลา วันที่ เดือน หรือ calendar ซึ่งในตัวอย่างนี้คือการนำค่าวันที่ปัจจุบันมาใช้งานตาม format (ซึ่งจริงๆมีหลายวิธีที่ได้มาซึ่งวันที่ปัจจุบัน)ดูตัวอย่างใน code ด้านล่าง
package com.test;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class TestDate2 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//กำหนด format
String format = "yyyyMMdd";
//เรียกใช้
System.out.println("Current System Date is :"+getSystemDate(format));
}
//ประกาศ method สำหรับ return ค่าวันที่ปัจจบัน หรือ system date โดยรับ argument เป็น String format เช่น yyyyMMdd,yyyy-MM-dd
public static String getSystemDate(String format) {
try
{
//ประกาศและสร้าง instance dateFormat
DateFormat dateFormat = new SimpleDateFormat(format,Locale.US);
//ประกาศและสร้าง instance Date
Date date = new Date();
//return date String ที่มีการกำหนด format แล้ว
return dateFormat.format(date).toString();
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
}
}
แค่นี้ก็ได้วันที่ในแบบ format ที่ต้องการ
package com.test;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class TestDate2 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//กำหนด format
String format = "yyyyMMdd";
//เรียกใช้
System.out.println("Current System Date is :"+getSystemDate(format));
}
//ประกาศ method สำหรับ return ค่าวันที่ปัจจบัน หรือ system date โดยรับ argument เป็น String format เช่น yyyyMMdd,yyyy-MM-dd
public static String getSystemDate(String format) {
try
{
//ประกาศและสร้าง instance dateFormat
DateFormat dateFormat = new SimpleDateFormat(format,Locale.US);
//ประกาศและสร้าง instance Date
Date date = new Date();
//return date String ที่มีการกำหนด format แล้ว
return dateFormat.format(date).toString();
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
}
}
แค่นี้ก็ได้วันที่ในแบบ format ที่ต้องการ
วันพฤหัสบดีที่ 3 มิถุนายน พ.ศ. 2553
Tomcat JNDI Datasource:use MySQL [pooling by application server] แบบงงๆ
- ในส่วนของ JNDI ก็สามารถทำได้หลายวิธีก็แล้วแต่ว่าจะให้เป็น Server Pool (ใช้ร่วมกันกับทุก application) หรือ เฉพาะ application pool ซึ่งคล้ายกัน
แต่จะใช้ได้เฉพาะ Application ตัวที่เรา config ไว้เท่านั้น
สำหรับการ config Server pool และ App pool ต่างก้นที่ตำแหน่งการเก็บของ context.xml ซึ่งเป็น config file
#-สำหรับ Server pool แก้ไขไฟล์ context.xml ที่ $TOMCAT_INSTALL_PATH/conf/ อันนี้จะไม่กล่าวถึงครับ
-สำหรับ App pool ให้เพิ่มไฟล์ context.xml ที่ $META-INF/
แก้ไข tag ดังนี้
-สำหรับ App pool ให้เพิ่มไฟล์ context.xml ที่ $META-INF/
แก้ไข tag ดังนี้
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/web-app" docBase="web-app" debug="5" reloadable="true" crossContext="true">
<Resource name="jdbc/Datasource_DBPerson" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="root" password="root" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/db_person"/>
</Context>
-แก้ไข web.xml ที่ WEB-INF
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/Datasource_DBPerson</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
code เรียกใช้งานที่เป็น servlet
Connection m_connection = null;
try
{
String jndi_name = "jdbc/Datasource_DBPerson" ;
// Use JNDI
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource) envCtx.lookup(jndi_name);
m_connection = ds.getConnection();
System.out.println("JNDI WORKS!..........") ;
PreparedStatement stmt = m_connection.prepareStatement("select * from person_test" );
ResultSet rs = stmt.executeQuery();
System.out.println( "
Web nerds:
" ); while (rs.next())
{
System.out.println( "
" + rs.getString( "fname" ) +" is a Web Nerd.
" ); }
rs.close();
m_connection.close() ;
}
catch (SQLException se)
{
System.out.println("SQL Error : "+ se.toString());
}
catch (Exception ne)
{
System.out.println("Other Error : "+ ne.toString());
}
อย่าลืมนำ jar (mysql-connector-java-5.0.7-bin.jar สำหรับ mysql 5.0 ขึ้นไป) ไฟล์สำหรับติดต่อ database ไปวางไว้ที่ WEB-INF/lib/
ด้วยน่ะคับ
อ้างอิง: http://gotoknow.org/blog/naidherng/289144
วันอังคารที่ 18 พฤษภาคม พ.ศ. 2553
ปัญหาเรื่อง Sun Java™ System Application Server Platform Edition 8.2 เกิด Error "org.apache.commons.discovery.jdk.JDKHooks."
ปัญหาเรื่อง Sun Java™ System Application Server Platform Edition 8.2 เกิด Error "org.apache.commons.discovery.jdk.JDKHooks." ตามข้างล่าง เกิดจาก App server ไม่สามารถเข้าถึง เป็นปัญหาเรื่อง permission ของ JDK
Environment:
-JDK 1.4_2
-SunAppServer 8.2
[#|2010-05-18T13:25:50.546+0700|SEVERE|sun-appserver-pe8.2|javax.enterprise.system.container.web|_ThreadID=20;|StandardWrapperValve[action]: Servlet.service() for servlet action threw exception
java.lang.ExceptionInInitializerError
at org.apache.commons.discovery.jdk.JDKHooks.(JDKHooks.java:75)
at org.apache.commons.discovery.tools.DiscoverSingleton.find(DiscoverSingleton.java:412)
at org.apache.commons.discovery.tools.DiscoverSingleton.find(DiscoverSingleton.java:378)
at org.apache.axis.components.logger.LogFactory$1.run(LogFactory.java:45)
at java.security.AccessController.doPrivileged(Native Method)
at org.apache.axis.components.logger.LogFactory.getLogFactory(LogFactory.java:41)
at org.apache.axis.components.logger.LogFactory.(LogFactory.java:33)
at org.apache.axis.handlers.BasicHandler.(BasicHandler.java:43)
at org.apache.axis.client.Service.getAxisClient(Service.java:104)
at org.apache.axis.client.Service.(Service.java:113)
at com.mfec.web.ws.WebService.verifyCreditCardProcess(WebService.java:38)
at com.mfec.web.struts.action.CreditCardInputAction.execute(CreditCardInputAction.java:347)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:415)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:767)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:860)
at sun.reflect.GeneratedMethodAccessor117.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:249)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAsPrivileged(Subject.java:500)
at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:282)
at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:165)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:257)
at org.apache.catalina.core.ApplicationFilterChain.access$000(ApplicationFilterChain.java:55)
at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:161)
at java.security.AccessController.doPrivileged(Native Method)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:263)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:173)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:132)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:933)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:189)
at com.sun.enterprise.web.connector.grizzly.ProcessorTask.doProcess(ProcessorTask.java:604)
at com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:475)
at com.sun.enterprise.web.connector.grizzly.ReadTask.executeProcessorTask(ReadTask.java:371)
at com.sun.enterprise.web.connector.grizzly.ReadTask.doTask(ReadTask.java:264)
at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:281)
at com.sun.enterprise.web.connector.grizzly.WorkerThread.run(WorkerThread.java:83)
Caused by: java.security.AccessControlException: access denied (java.lang.RuntimePermission createClassLoader)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:269)
at java.security.AccessController.checkPermission(AccessController.java:401)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:524)
at java.lang.SecurityManager.checkCreateClassLoader(SecurityManager.java:586)
at java.lang.ClassLoader.(ClassLoader.java:210)
at org.apache.commons.discovery.jdk.PsuedoSystemClassLoader.(PsuedoSystemClassLoader.java:73)
at org.apache.commons.discovery.jdk.JDK12Hooks.findSystemClassLoader(JDK12Hooks.java:215)
at org.apache.commons.discovery.jdk.JDK12Hooks.(JDK12Hooks.java:73)
... 48 more
|#]
วิธีแก้ปัญหา: ให้ทำการแก้ไข permision ของ "java.policy"
path : C:\Program Files\Java\j2sdk1.4.2_04\jre\lib\security ให้ทำการ grant permision โดยเพิ่ม data เข้าไปดังนี้
.....
// start add by pradoem 20100518 sun app 8.2
permission java.lang.RuntimePermission "createClassLoader";
permission java.lang.RuntimePermission "getClassLoader";
permission java.util.PropertyPermission "org.apache.commons.discovery.log.level", "read";
permission java.util.PropertyPermission "axis.EngineConfigFactory","read";
permission java.util.PropertyPermission "org.apache.axis.EngineConfigurationFactory" ,"read";
permission java.util.PropertyPermission "axis.ClientConfigFile","read";
permission java.util.PropertyPermission "axis.ServerConfigFile","read";
permission java.util.PropertyPermission "axis.xml.reuseParsers","read";
permission java.util.PropertyPermission "axis.attachments.implementation","read";
//end
.........
จากนั้นทำการ Restart Application Server ครับก็จะไม่เกิด Errors ดังกว่าแล้วครับ
Environment:
-JDK 1.4_2
-SunAppServer 8.2
[#|2010-05-18T13:25:50.546+0700|SEVERE|sun-appserver-pe8.2|javax.enterprise.system.container.web|_ThreadID=20;|StandardWrapperValve[action]: Servlet.service() for servlet action threw exception
java.lang.ExceptionInInitializerError
at org.apache.commons.discovery.jdk.JDKHooks.
at org.apache.commons.discovery.tools.DiscoverSingleton.find(DiscoverSingleton.java:412)
at org.apache.commons.discovery.tools.DiscoverSingleton.find(DiscoverSingleton.java:378)
at org.apache.axis.components.logger.LogFactory$1.run(LogFactory.java:45)
at java.security.AccessController.doPrivileged(Native Method)
at org.apache.axis.components.logger.LogFactory.getLogFactory(LogFactory.java:41)
at org.apache.axis.components.logger.LogFactory.
at org.apache.axis.handlers.BasicHandler.
at org.apache.axis.client.Service.getAxisClient(Service.java:104)
at org.apache.axis.client.Service.
at com.mfec.web.ws.WebService.verifyCreditCardProcess(WebService.java:38)
at com.mfec.web.struts.action.CreditCardInputAction.execute(CreditCardInputAction.java:347)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:415)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:767)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:860)
at sun.reflect.GeneratedMethodAccessor117.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:249)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAsPrivileged(Subject.java:500)
at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:282)
at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:165)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:257)
at org.apache.catalina.core.ApplicationFilterChain.access$000(ApplicationFilterChain.java:55)
at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:161)
at java.security.AccessController.doPrivileged(Native Method)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:263)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:173)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:132)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:933)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:189)
at com.sun.enterprise.web.connector.grizzly.ProcessorTask.doProcess(ProcessorTask.java:604)
at com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:475)
at com.sun.enterprise.web.connector.grizzly.ReadTask.executeProcessorTask(ReadTask.java:371)
at com.sun.enterprise.web.connector.grizzly.ReadTask.doTask(ReadTask.java:264)
at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:281)
at com.sun.enterprise.web.connector.grizzly.WorkerThread.run(WorkerThread.java:83)
Caused by: java.security.AccessControlException: access denied (java.lang.RuntimePermission createClassLoader)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:269)
at java.security.AccessController.checkPermission(AccessController.java:401)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:524)
at java.lang.SecurityManager.checkCreateClassLoader(SecurityManager.java:586)
at java.lang.ClassLoader.
at org.apache.commons.discovery.jdk.PsuedoSystemClassLoader.
at org.apache.commons.discovery.jdk.JDK12Hooks.findSystemClassLoader(JDK12Hooks.java:215)
at org.apache.commons.discovery.jdk.JDK12Hooks.
... 48 more
|#]
วิธีแก้ปัญหา: ให้ทำการแก้ไข permision ของ "java.policy"
path : C:\Program Files\Java\j2sdk1.4.2_04\jre\lib\security ให้ทำการ grant permision โดยเพิ่ม data เข้าไปดังนี้
.....
// start add by pradoem 20100518 sun app 8.2
permission java.lang.RuntimePermission "createClassLoader";
permission java.lang.RuntimePermission "getClassLoader";
permission java.util.PropertyPermission "org.apache.commons.discovery.log.level", "read";
permission java.util.PropertyPermission "axis.EngineConfigFactory","read";
permission java.util.PropertyPermission "org.apache.axis.EngineConfigurationFactory" ,"read";
permission java.util.PropertyPermission "axis.ClientConfigFile","read";
permission java.util.PropertyPermission "axis.ServerConfigFile","read";
permission java.util.PropertyPermission "axis.xml.reuseParsers","read";
permission java.util.PropertyPermission "axis.attachments.implementation","read";
//end
.........
จากนั้นทำการ Restart Application Server ครับก็จะไม่เกิด Errors ดังกว่าแล้วครับ
วันจันทร์ที่ 19 เมษายน พ.ศ. 2553
ผ้าป่าสามัคคีระหว่างวันที่ 11-16 เมษา ทอด ณ วัดบ้านโพนไฮ มุกดาหาร
เริ่มจากวันอาทิตย์ที่ 11 เมษายน 53 เวลา 16 นาฬิกาหลังจากที่นัดชุมนุมประชุมกันเรื่องการจัดทำผ้าป่าสามัคคีเพื่อสมทบทุนสร้างอุโบสถ วัดบ้านโพนไฮ ต.หนองแคน อ.ดงหลวง จ.มุกดาหาร
(บ้านเกิดผมเองครับ 55) หลังจากที่มีการพูดคุยกันและได้มีการบอกกล่างขออนุโมทนาบุญจากเพื่อนๆที่ทำงาน เพื่อนๆของเพื่อนของเพื่อนอีกที ก็มีสายผ้าป่าทั้งหมด 34 สาย บางสายก็มีกรรมการน้อยบางสายก็มีกรรมการเยอะคละกันไป ซึ่งได้มีการรวบรวมเพื่อจัดพิมพ์ซอง ดังนี้ ประธานกรรมการ จำนวน 40 คน รองประธาน จำนวน 42 คน คณะกรรมการ อีก 1260 คน และซองเล็กอีก 1175 รวมซองทั้งหมด 2517 ซอง
แล้วก็นำไปแจกจ่ายตามสายต่างๆที่รับผิดชอบ แล้วก็ตามเก็บซองที่แจกไปเพื่อรวบรวมนำไปอนุโมทนาบุญ
ทางคณะผู้จัดทำก็ได้ลงมติกันว่าปีนี้คนกลับบ้านกันเยอะก็เลยได้จัดรถทัวว์สำหรับคณะผ้าป่า ซึ่งรถจอดรับสองจุด จุดแรกคือ lotus อ่อนนุช จุดที่สองคือ วงเวียนใหญ่ หลังจากนั้นรถก็เริ่มเิิดินทางออกจากกรุงจากจุดที่สองคือจุดวงเวียนใหญ่ออกทางปิ่นเกล้า ไปบางบัวทองมุ่งไปมุกดาหาร เวลาออกประมาณ 5.30 น. สำหรับที่นั่งไม่เต็มครับเหลือหลายที่มาก ตลอดระยะเวลาการเดินทางกลับก็ต้องจอดรถเป็นระยะๆเพื่อทำธุระส่วนตัว ก็เฮฮาปาตี้ตามประสาเพื่อนฝูงที่ไม่ได้เจอกันนาน กว่าจะเดินทางถึงบ้านเวลาประมาณ 9.50 น.ของวันที่ 12 ซึ่งทางบ้านก็ได้มีการต้อนอย่างดีเป็นการรับผ้าป่าที่อบอุ่น ก็มีการเรียนเชิญรับประทานอาหารเครื่องดื่มต่างๆจากนั้นทางคณะผ้าป่าทั้ง 41 คนก็พักผ่อนตามอรรถยาศัยบางคนก็กลับไปเจอหน้าพ่อหน้าแม่บางคนก็ไปเต้นรำวงที่ทางบ้านเค้าจัดให้เป็นรำวงสามัคคีเพื่อต่อยอดผ้าป่าในครั้งนี้
จากกำหนดการวันที่ 13 คือวันถวายต้นผ้าป่า ตอนเช้าทางคณะผ้าป่าได้มีการนัดรวมตัวกันซึ่งทางชาวบ้านได้มีการแห่กองยาวและฟ้อนภูไท ตอนรับคณะผ้าป่าในครั้งนี้ก็ม่วนซื่น ตั้งแต่เด็กเล็ก พ่อแก่แม่ม่ายต่างๆก็มาร่วมแห่ต้อนผ้าป่าด้วยกัน ก็เป็นประเพณีอีกอย่างหนึ่งบรรยากาศสนุกๆสนานมากครับพอถึงวัดก็แห่รอบวัดอีกสามรอบ จากนั้นทางคณะผ้าป่าและชาวบ้านก็เข้าไปทำพิธีสวดมนต์ไหว้พระและต่อยอดผ้าป่าสามัคคีเพื่อถวายต่อไป สำหรับพิธีการก็มีต่อยอดไหว้พระ รับศีล แล้วก็ถวายภัตาหารแด่พระภิกษุสงฆ์ แล้วจากนั้นจึงถายต้นผ้าป่า ยอดรวมหลังจากหักค่าใช้จ่ายแล้วได้ยอด 190100.50 บาท เส็ดแล้วก็มีการรับประทานอาหารร่วมกันช่วงบ่ายได้มีการรดน้ำดำหัวผู้ใหญ่เพื่อขอพร จากผู้เฒ่าผู้แก้ในหมู่บ้าน ก็สนุกสนานทั้งเด็กและผู้ใหญ่จากนั้นช่วงบ่ายแก่ๆได้มีกิจกรรมกีฬา ฟุตบอล แม่บ้าน-ก็ทีมเยาวชนหญิง ต่อด้วยทีมหมู่บ้านชาย กับทีมจากกรุงเทพ เป็นกิจกรรมเพื่อกระซับความสามัคคีกัน จากนั้นก็แยกย้ายกันทำธุระส่วนตัว
วันที่ 16 ก็นัดรวมตัวกันแล้วก็นำรถผ้าป่า เดินทางกลับกรุงเทพฯ
ก็ทั้งสนุกทั้งเหนื่อยสำหรับงานนี้ครับแต่ก็ผ่านไปได้ด้วยดี ^_^
(บ้านเกิดผมเองครับ 55) หลังจากที่มีการพูดคุยกันและได้มีการบอกกล่างขออนุโมทนาบุญจากเพื่อนๆที่ทำงาน เพื่อนๆของเพื่อนของเพื่อนอีกที ก็มีสายผ้าป่าทั้งหมด 34 สาย บางสายก็มีกรรมการน้อยบางสายก็มีกรรมการเยอะคละกันไป ซึ่งได้มีการรวบรวมเพื่อจัดพิมพ์ซอง ดังนี้ ประธานกรรมการ จำนวน 40 คน รองประธาน จำนวน 42 คน คณะกรรมการ อีก 1260 คน และซองเล็กอีก 1175 รวมซองทั้งหมด 2517 ซอง
แล้วก็นำไปแจกจ่ายตามสายต่างๆที่รับผิดชอบ แล้วก็ตามเก็บซองที่แจกไปเพื่อรวบรวมนำไปอนุโมทนาบุญ
ทางคณะผู้จัดทำก็ได้ลงมติกันว่าปีนี้คนกลับบ้านกันเยอะก็เลยได้จัดรถทัวว์สำหรับคณะผ้าป่า ซึ่งรถจอดรับสองจุด จุดแรกคือ lotus อ่อนนุช จุดที่สองคือ วงเวียนใหญ่ หลังจากนั้นรถก็เริ่มเิิดินทางออกจากกรุงจากจุดที่สองคือจุดวงเวียนใหญ่ออกทางปิ่นเกล้า ไปบางบัวทองมุ่งไปมุกดาหาร เวลาออกประมาณ 5.30 น. สำหรับที่นั่งไม่เต็มครับเหลือหลายที่มาก ตลอดระยะเวลาการเดินทางกลับก็ต้องจอดรถเป็นระยะๆเพื่อทำธุระส่วนตัว ก็เฮฮาปาตี้ตามประสาเพื่อนฝูงที่ไม่ได้เจอกันนาน กว่าจะเดินทางถึงบ้านเวลาประมาณ 9.50 น.ของวันที่ 12 ซึ่งทางบ้านก็ได้มีการต้อนอย่างดีเป็นการรับผ้าป่าที่อบอุ่น ก็มีการเรียนเชิญรับประทานอาหารเครื่องดื่มต่างๆจากนั้นทางคณะผ้าป่าทั้ง 41 คนก็พักผ่อนตามอรรถยาศัยบางคนก็กลับไปเจอหน้าพ่อหน้าแม่บางคนก็ไปเต้นรำวงที่ทางบ้านเค้าจัดให้เป็นรำวงสามัคคีเพื่อต่อยอดผ้าป่าในครั้งนี้
จากกำหนดการวันที่ 13 คือวันถวายต้นผ้าป่า ตอนเช้าทางคณะผ้าป่าได้มีการนัดรวมตัวกันซึ่งทางชาวบ้านได้มีการแห่กองยาวและฟ้อนภูไท ตอนรับคณะผ้าป่าในครั้งนี้ก็ม่วนซื่น ตั้งแต่เด็กเล็ก พ่อแก่แม่ม่ายต่างๆก็มาร่วมแห่ต้อนผ้าป่าด้วยกัน ก็เป็นประเพณีอีกอย่างหนึ่งบรรยากาศสนุกๆสนานมากครับพอถึงวัดก็แห่รอบวัดอีกสามรอบ จากนั้นทางคณะผ้าป่าและชาวบ้านก็เข้าไปทำพิธีสวดมนต์ไหว้พระและต่อยอดผ้าป่าสามัคคีเพื่อถวายต่อไป สำหรับพิธีการก็มีต่อยอดไหว้พระ รับศีล แล้วก็ถวายภัตาหารแด่พระภิกษุสงฆ์ แล้วจากนั้นจึงถายต้นผ้าป่า ยอดรวมหลังจากหักค่าใช้จ่ายแล้วได้ยอด 190100.50 บาท เส็ดแล้วก็มีการรับประทานอาหารร่วมกันช่วงบ่ายได้มีการรดน้ำดำหัวผู้ใหญ่เพื่อขอพร จากผู้เฒ่าผู้แก้ในหมู่บ้าน ก็สนุกสนานทั้งเด็กและผู้ใหญ่จากนั้นช่วงบ่ายแก่ๆได้มีกิจกรรมกีฬา ฟุตบอล แม่บ้าน-ก็ทีมเยาวชนหญิง ต่อด้วยทีมหมู่บ้านชาย กับทีมจากกรุงเทพ เป็นกิจกรรมเพื่อกระซับความสามัคคีกัน จากนั้นก็แยกย้ายกันทำธุระส่วนตัว
วันที่ 16 ก็นัดรวมตัวกันแล้วก็นำรถผ้าป่า เดินทางกลับกรุงเทพฯ
ก็ทั้งสนุกทั้งเหนื่อยสำหรับงานนี้ครับแต่ก็ผ่านไปได้ด้วยดี ^_^
วันพฤหัสบดีที่ 1 เมษายน พ.ศ. 2553
tomcat use connection pool with msyql
java use apache DBCP connection pooling with mysql Database
create connection pool โดย Database Connection Pool (DBCP) Configurations
environment:
#tomcat 5.5.x
#Eclipse IDE 3.2 or hiher
#MySQL 5.0.x
#jdk 1.5 or hiher
library request :
jdbc mysql connection j :->>mysql-connector-java-5.0.7-bin.jar find download on internet
apache dbcp commons-dbcp-current-bin :->>commons-dbcp-1.4.jar find downloa on internet
step #1:
create your own 'context.xml' file and put in your app_namexxx/META-INF/ location
<Context path="/web-app-pooling" docBase="web-app-pooling" debug="5" reloadable="true" crossContext="true">
<Resource name="jdbc/Datasource_DBPerson" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="root" password="root" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/db_person"/>
</Context>
Context path= web application name
docBase = web application name
step #2
เพิ่ม tag resource เข้าไปในไฟล์ web.xml (app_namexxx/WEB-INF/)
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/Datasource_DBPerson</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
step #3
ให้นำเอาไฟล์ mysql-connector-java-5.0.7-bin.jar ไปวางไว้ที่ TOMCAT_HOME/common/lib/ เพื่อให้ webapp server โหลดและทำงาน
ส่วนไฟล์ commons-dbcp-1.4.jar ให้ add เข้าไปใน lib ตามมปรกติ (app_namexxx/WEB-INF/lib/)
step #4
เรียกใช้งาน ผ่าน connection pooling สร้างไว้ดังนี้
javax.naming.InitialContext context = new InitialContext();
// Look up the data source
javax.sql.DataSource dataSource =(javax.sql.DataSource)context.lookup ("java:comp/env/jdbc/Datasource_DBPerson");
// Get a connection from the pool
java.sql.Connection conn = dataSource.getConnection();
PreparedStatement stmt = conn.prepareStatement("select * from person_test" );
ResultSet rs = stmt.executeQuery();
while (rs.next())
{
System.out.println("id:"+rs.getString("id"));
System.out.println("fname:"+rs.getString("fname"));
System.out.println("email:"+rs.getString("email"));
.......
}
rs.close();
conn.close();
}
catch ( javax.naming.NamingException e )
{
e.printStackTrace();
}
catch ( java.sql.SQLException e )
{
e.printStackTrace();
}
======END =======
test for you
** หมายเหตุสร้าง project โดยใช้ Eclipse IDE
เพิ่มเติม:http://forums.sun.com/thread.jspa?threadID=639243
create connection pool โดย Database Connection Pool (DBCP) Configurations
environment:
#tomcat 5.5.x
#Eclipse IDE 3.2 or hiher
#MySQL 5.0.x
#jdk 1.5 or hiher
library request :
jdbc mysql connection j :->>mysql-connector-java-5.0.7-bin.jar find download on internet
apache dbcp commons-dbcp-current-bin :->>commons-dbcp-1.4.jar find downloa on internet
step #1:
create your own 'context.xml' file and put in your app_namexxx/META-INF/ location
<Context path="/web-app-pooling" docBase="web-app-pooling" debug="5" reloadable="true" crossContext="true">
<Resource name="jdbc/Datasource_DBPerson" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="root" password="root" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/db_person"/>
</Context>
Context path= web application name
docBase = web application name
step #2
เพิ่ม tag resource เข้าไปในไฟล์ web.xml (app_namexxx/WEB-INF/)
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/Datasource_DBPerson</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
step #3
ให้นำเอาไฟล์ mysql-connector-java-5.0.7-bin.jar ไปวางไว้ที่ TOMCAT_HOME/common/lib/ เพื่อให้ webapp server โหลดและทำงาน
ส่วนไฟล์ commons-dbcp-1.4.jar ให้ add เข้าไปใน lib ตามมปรกติ (app_namexxx/WEB-INF/lib/)
step #4
เรียกใช้งาน ผ่าน connection pooling สร้างไว้ดังนี้
javax.naming.InitialContext context = new InitialContext();
// Look up the data source
javax.sql.DataSource dataSource =(javax.sql.DataSource)context.lookup ("java:comp/env/jdbc/Datasource_DBPerson");
// Get a connection from the pool
java.sql.Connection conn = dataSource.getConnection();
PreparedStatement stmt = conn.prepareStatement("select * from person_test" );
ResultSet rs = stmt.executeQuery();
while (rs.next())
{
System.out.println("id:"+rs.getString("id"));
System.out.println("fname:"+rs.getString("fname"));
System.out.println("email:"+rs.getString("email"));
.......
}
rs.close();
conn.close();
}
catch ( javax.naming.NamingException e )
{
e.printStackTrace();
}
catch ( java.sql.SQLException e )
{
e.printStackTrace();
}
======END =======
test for you
** หมายเหตุสร้าง project โดยใช้ Eclipse IDE
เพิ่มเติม:http://forums.sun.com/thread.jspa?threadID=639243
วันจันทร์ที่ 29 มีนาคม พ.ศ. 2553
Mini master of Java Technology #6 [27-03-2010]
วันเสาร์ที่ 27 มีนา 53 เป็นวันเเรกของการเปิดเรียน mini master of java tech #6 จำนวนนักเรียนทั้งหมดในรุ่นประมาณ 36 คน มาจาก บริษัทเอกชน นักเรียน ผู้ที่สนใจทั่วไป และพนักงานของ รัฐ ซึ่งทาง คณะสารสนเทศของ พระจอมเกล้าลาดกระบัง ได้เปิดสอนจำนวนปีละ 1 รุ่น(หรือป่าวไม่รู้) มีนักศึกษาประมาณ 7-10 % ของจำนวนผู้ที่เข้า อบรมสำหรับเนื่อหาที่เปิดอมรมมีดังนี้
1 Java101: Intermediate JAVA Programming Language
2 Java201: Web Component Development with Servlet and JSP
3 Java301: Business Component Development with EJB
4 Java401: Java Web Services and Service-Oriented Architecture
สำหรับวิทยากรผู้บรรยาคือ อาจารย์ รศ.ดร. ธนาชาติ
สำหรับสถานที่ ตึกชินวัตร3 ที่ทำการ คณะสารสนเทศ พระจอมเกล้าลาดกะบัง
เริ่มแรกวิทยากรได้บรรยาถึง เรื่องทั่วไป techno ต่างๆทั้งในโลกของ .NET และ ในโลกของ Java
ถ้าเป็นฝั่ง .NET ทุกอย่างต้อง เป็น .NET ตั้งแต่ OS จำถึง tools ที่ใช้ในการ dev สำหรับ Java ก็มี OS ทั้งที่เป็น Open source จนไปถึงตัวที่ต้องเสียตัง และก็มี tools สำหรับ dev อีกหลายตัวที่เป็นของ ฟรีแล้วก็เสียตังด้วย ก็จบ break แรกไป
สำหรับ break ที่สอง ท่านได้กล่าวถึงแนวโน้มในการพัฒนา โปรแกรม( trend ) ว่าจะเป็นอย่างไรบ้าง
วิทยากรก็ได้กล่าวถึงว่าทุกอย่างต่อไปจะอยู่ในรูปของ web application การพัฒนาโปรแกรม บน android
iphone/blackberry ต่างๆจะเพิ่มความต้องการมากขึ้น บริการต่างๆที่ทำงานผ่านอุปกรณ์เหล่านี้จะมีปริมาณมากขึ้น และได้มีการกล่าวถึง คราวคอมพิวติ้ง(cloud computing ) ว่ามีอะไรบ้างในประเทศไทยสามารถเกิดขึ้นได้หรือไม่ ประมาณว่าถ้าเป็นประเทศไทย cloud computing ที่จะเกิดขึ้นได้เฉพาะ ในส่วนของ software .... จำไม่ได้
จากนั้นภาคบ่ายวิทยากรได้กล่าวถึง รายวิชาที่เปิดสอนเเบบกริ่นนำ จากนั้นก็เริ่มเปิดสอนด้วยการเล่าประวัติ ของภาษา java (oak) รุ่นแรกๆ และทีมพัฒนาดังนี้ (ฉบับย่อ)
เริ่มแรก ทีมพัฒนาของ james Gosling(บิดาแห่ง java) ได้พัฒนาชุดคำสั่งสำหรับอุปกรณ์ไฟฟ้าที่มี os ต่างกันโดยแนวคิดคือการต้องการให้ ชุดคำสั่ง สามารถ run งาน ตามอุปกรณ์ไฟฟ้าต่าง platform กันได้
จึงมีการพัฒนา visual machine ขึ้นเพื่อเป็นตัวจำลองให้ สามารถ run งานได้แม้จะต่าง platform [1995]
ต่อมาได้มีการเปิดตัวอย่างเป็นทางการโดยใช้ชื่อว่า oak ในปี คศ 1996 แต่ไม่ประสบความสำเร็จเท่าที่ควร
แต่ตอนนี้ technology ของ internet ได้มีการขยายตัวพอสมควรและได้ีมีการเปิด ให้มีการ download ใช้งานกันอย่างเเพร่งหลายสำหรับอุปกรณ์คอมพิวเตอร์จึงเป็นจุ่ดเปลี่ยนทำให้ภาษา java โด่งดัง และได้มีการออก version อีกหลายรุ่นตามมา 1.1,1.2,1.3,1.4,1.5 =jdk5, และ1.6/ jdk 6
จุดเด่งของ ภาษา่ java มีหลายข้อแต่จำไม่ได้ เช่น
-เป็นอะไรที่เป็น Enterprise สำหรับองกรค์ใหญ่ๆ
-มีความปลอดภัย
-scale ได้
-performance
-reuse
-OOP
etc..
จากนั้นก็ได้พูดถึงการทำงานของตัวแปรภาษา java ว่าทำงานอย่างไรบ้างโดยเรื่องการการเขียน โปรแกรม class เป็นนามสกุล .java แล้วจะถูก compile ด้วย javac และ run งาน โดย java
โดยกระบวนดังกล่าวเมื่อได้ source.java จะถูก compile ให้เป็น byte code ต่อมาเมื่อจะใช้งาน jvm(java visual machine) จะ load byte code เพื่อ run งาน ตาม คำสั่ง
ช่วงท้ายวิทยากรได้แนะนำ tools สำหรับ course นี้ และมี workshop สำหรับ test ในชั่วโมงนี้ด้วยโดยการแนะนำ tools netbean และ app server อย่าง glass fish และ เจ้าเมว tomcat ที่เป็น web server
ก็อยู่ในช่วงเริ่มต้นก็ถือว่าทุกอย่าง OK เป็นการแนะนำเล่าประวิติศาสตร์ ของ java
สุดท้าย:คือจำไม่ได้ที่ท่านสอนเพราะผ่านมาหลายวันแล้ว 555+
1 Java101: Intermediate JAVA Programming Language
2 Java201: Web Component Development with Servlet and JSP
3 Java301: Business Component Development with EJB
4 Java401: Java Web Services and Service-Oriented Architecture
สำหรับวิทยากรผู้บรรยาคือ อาจารย์ รศ.ดร. ธนาชาติ
สำหรับสถานที่ ตึกชินวัตร3 ที่ทำการ คณะสารสนเทศ พระจอมเกล้าลาดกะบัง
เริ่มแรกวิทยากรได้บรรยาถึง เรื่องทั่วไป techno ต่างๆทั้งในโลกของ .NET และ ในโลกของ Java
ถ้าเป็นฝั่ง .NET ทุกอย่างต้อง เป็น .NET ตั้งแต่ OS จำถึง tools ที่ใช้ในการ dev สำหรับ Java ก็มี OS ทั้งที่เป็น Open source จนไปถึงตัวที่ต้องเสียตัง และก็มี tools สำหรับ dev อีกหลายตัวที่เป็นของ ฟรีแล้วก็เสียตังด้วย ก็จบ break แรกไป
สำหรับ break ที่สอง ท่านได้กล่าวถึงแนวโน้มในการพัฒนา โปรแกรม( trend ) ว่าจะเป็นอย่างไรบ้าง
วิทยากรก็ได้กล่าวถึงว่าทุกอย่างต่อไปจะอยู่ในรูปของ web application การพัฒนาโปรแกรม บน android
iphone/blackberry ต่างๆจะเพิ่มความต้องการมากขึ้น บริการต่างๆที่ทำงานผ่านอุปกรณ์เหล่านี้จะมีปริมาณมากขึ้น และได้มีการกล่าวถึง คราวคอมพิวติ้ง(cloud computing ) ว่ามีอะไรบ้างในประเทศไทยสามารถเกิดขึ้นได้หรือไม่ ประมาณว่าถ้าเป็นประเทศไทย cloud computing ที่จะเกิดขึ้นได้เฉพาะ ในส่วนของ software .... จำไม่ได้
จากนั้นภาคบ่ายวิทยากรได้กล่าวถึง รายวิชาที่เปิดสอนเเบบกริ่นนำ จากนั้นก็เริ่มเปิดสอนด้วยการเล่าประวัติ ของภาษา java (oak) รุ่นแรกๆ และทีมพัฒนาดังนี้ (ฉบับย่อ)
เริ่มแรก ทีมพัฒนาของ james Gosling(บิดาแห่ง java) ได้พัฒนาชุดคำสั่งสำหรับอุปกรณ์ไฟฟ้าที่มี os ต่างกันโดยแนวคิดคือการต้องการให้ ชุดคำสั่ง สามารถ run งาน ตามอุปกรณ์ไฟฟ้าต่าง platform กันได้
จึงมีการพัฒนา visual machine ขึ้นเพื่อเป็นตัวจำลองให้ สามารถ run งานได้แม้จะต่าง platform [1995]
ต่อมาได้มีการเปิดตัวอย่างเป็นทางการโดยใช้ชื่อว่า oak ในปี คศ 1996 แต่ไม่ประสบความสำเร็จเท่าที่ควร
แต่ตอนนี้ technology ของ internet ได้มีการขยายตัวพอสมควรและได้ีมีการเปิด ให้มีการ download ใช้งานกันอย่างเเพร่งหลายสำหรับอุปกรณ์คอมพิวเตอร์จึงเป็นจุ่ดเปลี่ยนทำให้ภาษา java โด่งดัง และได้มีการออก version อีกหลายรุ่นตามมา 1.1,1.2,1.3,1.4,1.5 =jdk5, และ1.6/ jdk 6
จุดเด่งของ ภาษา่ java มีหลายข้อแต่จำไม่ได้ เช่น
-เป็นอะไรที่เป็น Enterprise สำหรับองกรค์ใหญ่ๆ
-มีความปลอดภัย
-scale ได้
-performance
-reuse
-OOP
etc..
จากนั้นก็ได้พูดถึงการทำงานของตัวแปรภาษา java ว่าทำงานอย่างไรบ้างโดยเรื่องการการเขียน โปรแกรม class เป็นนามสกุล .java แล้วจะถูก compile ด้วย javac และ run งาน โดย java
โดยกระบวนดังกล่าวเมื่อได้ source.java จะถูก compile ให้เป็น byte code ต่อมาเมื่อจะใช้งาน jvm(java visual machine) จะ load byte code เพื่อ run งาน ตาม คำสั่ง
ช่วงท้ายวิทยากรได้แนะนำ tools สำหรับ course นี้ และมี workshop สำหรับ test ในชั่วโมงนี้ด้วยโดยการแนะนำ tools netbean และ app server อย่าง glass fish และ เจ้าเมว tomcat ที่เป็น web server
ก็อยู่ในช่วงเริ่มต้นก็ถือว่าทุกอย่าง OK เป็นการแนะนำเล่าประวิติศาสตร์ ของ java
สุดท้าย:คือจำไม่ได้ที่ท่านสอนเพราะผ่านมาหลายวันแล้ว 555+
สมัครสมาชิก:
บทความ (Atom)