Friday 28 March 2008

iText จะจัดการ PDF ด้วย Java ง่ายๆนี้ไง

iText เป็น library สำหรับสร้าง PDF โดยจุดประสงค์จริงๆของ iText คือการที่ทำให้ Developer ที่พัฒนา Web Application หรือ application ต่างๆนั้นได้สร้าง file PDF ในรูปแบบ Dynamic ซึ่งทำให้การปรับเปลี่ยนแก้ไข เป็นได้ง่ายขึ้น iText ไม่ใช่สำหรับ end-user แล้วคงไม่ได้เอาไว้ใช้บน Desktop เพราะใช้ Arcrobat ซึ่งง่ายกว่าแต่กระนั้นการใช้ iText จะทำเกิดการ update file PDF นั้นอย่างอัตโนมัติได้โดยที่เราไม่ต้องแก้ไขเองเลยก็ทำได้ โดยเราสามารถใช้ iText ทำได้ดังนี้

  • ส่ง PDF ขึ้น Web Browser ได้
  • สร้าง Dynamic Content จาก XML หรือ Database
  • ใช้ PDF กับ Feature ต่างๆได้มากมาย
  • เพิ่ม bookmarks , เลขหน้า , ลายน้ำ etc. ได้
  • แยก , รวม , จัดการ หน้า PDF ได้
  • จัดการเติม PDF Form ได้
  • ทำ Digital Signature กับ PDF ได้
  • และอื่นๆ
iText นั้นยังมี Tutorial ที่ดูแล้วเข้าใจง่ายลองไปดูกันเลยที่นี้ http://itextdocs.lowagie.com/tutorial/ สำหรับคนใช้ JAVA โดยเฉพาะลองไปใช้ดูกันนะครับ

Download Page

Monday 10 March 2008

Security Testing ตอนที่ 1

Security Testing(ตอนที่ 1)

สวัสดีครับผม Mr. Invert prahs กลับมาเขียน blog แล้วครับหลังจากที่หายหน้าหายตาไปกันตั้งนานเพราะว่าไปลง Project กับคุณ tofu เลยไม่มีเวลาว่างมาเขียน blog (ปล. จริงๆก็อู้ด้วยส่วนหนึ่ง) แต่เชื่อแล้วจริงๆว่าถ้าคิดจะเขียน blog ก็เหมือนมีลูกจริงๆ เพราะว่าต้องค่อยป้อนบทความใหม่ๆเข้ามาเรื่อยๆ เหมือนมีห่วงผูกคอ เอาหละเริ่มออกทะเลไปไกลแล้วมาเข้าเรื่องกันดีกว่า ซึ่งอย่างที่ผมบอกไปว่าได้ไปลง project จริงๆจังๆกับคุณ tofu ซึ่งถือเป็น project แรกของผมกับคุณ tofu ทำให้ผมผู้ซึ่งเป็นเด็กจบใหม่ (จากปีที่แล้ว) ได้เห็นมุมมองเกี่ยวกับด้านการทำ Web Application ที่กว้างขึ้นและได้เรียนรู้หลายๆสิ่งหลายๆอย่างมากมายซึ่งถ้ามีเวลาว่างๆจะมานั่งเขียน blog มาเล่าให้ฟังว่าป็นยังไง ซึ่งเรื่องแรกที่ผมจะนำมาเล่าก็คือ Security Testing ผมเองก็เพิ่งจะรู้ว่าเวลาเขียน Web Application เกี่ยวกับเงินๆทองๆนี่มันยุ่งยากมันจุกจิกอย่างนี้นี่เอง
ในการทดสอบ Application ที่เราพัฒนานั้นนอกจากเราจะต้องทำการทดสอบ bug ของ Application แล้ว ถ้าหาก Application นั้นมีส่วนที่เกี่ยวข้องกับระบบการเงิน เราอาจจะต้องมีการทดสอบด้าน security ด้วยซึ่งการทดสอบ security นี้ไม่ว่าจะเป็น Windows Application (หรือบางคนจะเรียกว่า Desktop Application) หรือ Web Application นั้นจะมีลักษณะการทดสอบที่คล้ายๆกันเพียงการทดสอบ Web Application นั้นอาจจะมีเรื่องที่ยุ่งยากหรือจุกจิกกว่ากันเยอะ ซึ่งการทดสอบหลักๆจะแบ่งออกเป็น 7 หัวข้อหลักๆดังนี้

URL & Parameter Manipulation

เป็นการ check ว่าในการส่ง parameter แบบ get ที่ส่งผ่าน URL หรือส่งผ่าน Hidden field นั้นมีข้อมูลที่สำคัญส่งมากับ URL parameter หรือไม่เพราะว่าอาจจะเป็นจุดบอดที่สามารถให้บรรดาเหล่า Hacker นั้นใช่จุดบอดเหล่านี้สาวเข้าไปถึงข้อมูลสำคัญของเราได้
ซึ่งถ้าหากว่าจำเป็นจริงๆที่จะต้องทำการส่งผ่าน URL parameter หรือ hidden field จริงๆก็ควรที่จะทำการ encrypt ข้อมูลที่ส่งผ่าน URL parameter หรือ hidden field เพื่อเพิ่มความปลอดภัยแต่ว่าถ้าเลี่ยงได้ก็ควรไปใช้ Session ในการเก็บข้อมูลเหล่านี้แทน
ข้อแนะนำเกี่ยวกับการ encrypt data เนื่องจาก algorithm ในการ encrypt data มีมากมายก็จริงแต่ algorithm ส่วนใหญ่มักจะมีคนแก้ได้แล้วเป็นส่วนมากดังนั้นในการหา algorithm encrypt data มาใช้ในงานที่ serious จริงๆ ควรที่จะหา encrypt data ที่มี salted hash techniques โดยสามารถเพิ่มความปลอดภัยของข้อมูลได้มากขึ้นเป็นร้อยเป็นพันเท่าครับ โดยการใส่ keyword เข้าไปผสมลงใน data ก่อนจะผ่านกรรมวิธีการ encrypt data เพื่อให้แก้ไขได้ยากยิ่งขึ้นซึ่งเราเรียก keyword ที่เราไปผสม data นี้ว่า salt (ซึ่งเป็นตัวเดียวกันกับคำว่า เกลือ ครับ ก็เหมือนเวลาที่เรากินอาหารแล้วอยากให้อาหารอร่อยขึ้นเราก็เหยาะเกลือลงไป แต่ในที่นี้เพื่อที่จะทำให้การถอด data ยากขึ้น) โดยถ้าสนใจอยากลองเล่นก็ลองไปดูตัวอย่างและวิธีการในเวบนี้ครับ http://www.securitydocs.com/library/3439 หรือถ้าต้องการดูอย่างมุมมองกว้างๆก็แนะนำเวบนี้เลย http://www.developerfusion.co.uk/show/4679/1/%20
หรือจะเป็นอีกวิธีคือเก็บข้อมูลที่เป็น URL Parameter ทั้งหมดลงไปใน hidden field ทั้งหมดจากนั้นก็ใส่ script ป้องกันการ view source ลงไปในหน้า page นั้น (เช่นที่เราเห็นกันบ่อยคือกันห้าม click ขวา) เพื่อป้องกันการรู้ชื่อ parameter ของ hidden field ในหน้านั้นๆ แต่ขอบอกว่าวิธีนี้ไม่ค่อยจะใช้ได้ผลสักเท่าไร เพราะว่าถ้าหากผู้ใช้ไปปิดความสามารถในการ run javascript ที่ browser แล้วก็ไม่สามารถกันได้อยู่ดี และ script ส่วนใหญ่จะไม่รองรับทุก browser ด้วยครับคือบางครั้งกัน IE กับ firefox ได้แต่อาจจะกัน Opera ไม่ได้ถ้าคนเขียนไม่ได้เขียนรองรับทุก OS

สรุป ถ้าจะกันปัญหาทางด้าน URL & Parameter Manipulation มีสองวิธีที่แก้ได้แน่นอนคือ เก็บข้อมูลที่เป็นความลับใส่ session หรืออีกวิธีก็ทำการ encrypt data เพื่อป้องกันไม่ให้แก้ข้อมูลออกได้ง่ายๆ

SQL Injection

เป็นการใส่คำสั่ง sql เพื่อรันให้ทำงาน โดยกรอกเข้าไปในช่องของ text box เพื่อทำอะไรบางอย่าง เช่น สามารถ login เข้าไป, หรือ รันคำสั่งเพื่อ drop table เป็นต้น ปัญหาแบบนี้จะเจอบ่อยครับในกรณีที่ programmer เขียน SQL ที่ใช้ใน program แบบไม่ได้ดักจับ escape characters บางตัว เช่น double quote (“), single quote (‘) เป็นต้น ซึ่งการที่เราไม่ได้ดักจับหรือจัดการ escape characters นั้นอาจจะทำให้เกิดผลดังตัวอย่างด้านล่างดังนี้

String sql = “select * from user where password = ‘” + password + ”’ ”;

ซึ่ง variable ที่ชื่อว่า password นั้นเป็นตัวรับค่าข้อมูลมาจาก user สมมติว่า user คนนั้นกรอกค่าลงไปดังนี้

Pwd12345’ or ‘1’=’1

ซึ่งหากลองแทน variable password ลงใน variable sql ดูผลที่ได้ก็จะเป็นดังนี้

select * from user where password = ‘Pwd12345’ or ‘1’=’1’

ซึ่งถึงแม้ว่า password จะผิดแต่ว่า user ก็สามารถ login เข้าไปเพราะว่า or ‘1’=’1’ มันเป็นจริงเสมอนอกจาก SQL Injection จะเกิดขึ้นกับคำสั่ง SQL แล้วบางครั้งการเรียกใช้ store procedure ก็เกิด SQL Injection เหมือนกันถ้าหากว่าไม่ได้ระมัดระวังเรื่อง escape characters

วิธีป้องกัน ในบาง DB นั้นมี security ที่รองรับการป้องกัน SQL Injection อยู่แล้วเช่น MySQL ที่เพิ่งเริ่มมีใน version 5.0 โดยต้องใช้ method ชื่อ real_escape_chars() เพื่อช่วยในการจัดการเกี่ยวกับ escape characters หรือในบางภาษาก็มีการจัดการ escape characters ใน SQL ให้เรา เช่น ภาษา Java ซึ่งในภาษา Java นั้นก็จะมี Prepare Statement ที่ช่วยจัดการในเรื่องของการทำ Query แต่สำหรับภาษาไหนหรือ DB ตัวไหนที่ไม่ได้รองรับการป้องกัน SQL Injection ก็ควรที่จะต้องเขียน program ในส่วนที่จัดการ escape characters กันเอาเองซึ่งผมก็มีตัวอย่าง code ของ Java มาให้ดู

http://pastebin.com/f30a7a3be

ที่ผมให้ตัวอย่างมาให้ที่เป็นในกรณีของ Java นั้นไม่ได้หมายความว่าให้ใช้ตัวนี้แทน prepare statement นะครับยกตัวอย่างเพื่อเป็นแนวทางการเขียนเพื่อนำไปดัก Escape Characters ในภาษาอื่นครับ แต่ว่าการดัก Escape Characters นั้นส่วนใหญ่จะดักกันตรงที่เครื่องหมาย double quote (“), single quote (‘) และ semicolon (;) มากกว่าครับส่วนที่เหลือถ้าอยากจะดักเพิ่มก็แล้วแต่ความเหมาะสมครับ เช่น ใน MS SQL นั้นมี “--” แทน comment ซึ่งเราควรที่จะดักเพิ่ม เป็นต้น ซึ่งนอกจากวิธีที่ผมได้กล่าวมาแล้วนั้นยังมี trick เล็กๆน้อยๆอีกครับ คือการกำหนดสิทธิ user ให้มี role ตามที่ได้ใช้จริงๆเท่านั้นเพื่อป้องกันว่า เช่น บางครั้งการเขียน program เราอาจจะฝั่ง business process ใน store procedure ของฝั่ง DB ก็ได้ ซึ่งบางทีใน store procedure นั้นอาจจะมี business process ที่ต้องไปรัน command ของ OS ได้ ดังนั้น store procedure นั้นควรที่จะมอบสิทธิให้กับ user ที่ใช้จริงๆเท่านั้น เพราะว่าในตอนทดลองเราอาจจะขี้เกียจมานั่งกำหนดสิทธิให้สิทธิทุกอย่างหมดเลย ดังนั้นก่อนนำเข้าสู้ระบบนำไปใช้จริงก็อย่าลืมกำหนดสิทธิใหม่ด้วยครับ
ปล. Code ด้านบนนั้นที่จริงใช้ Regular Expression น่าจะดีกว่าครับในการตรวจจับแต่ว่าผมไม่เคยลองเล่น Regular Expression ของ Java ซักทีเคยเล่นแต่ javascript ครับใครที่เคยเล่นแล้วช่วยแนะนำผ่าน comment ได้ครับ

Cross-site scripting (XSS)

เป็นใส่ script บางอย่างเข้าไปในเว็บ เช่น อาจจะใส่ javascript เข้าไปในช่อง text box ดังนี้ <script>alert(“Hello World -Popup”)</script> เพื่อสร้าง popup window แต่ว่าบางครั้ง hacker อาจจะนำ script บางอย่างเข้าไปเพื่อหวังผลบางอย่าง เช่น ดึงข้อมูล cookie ออกมาจาก client site โดยใช้ javascript, vbscript หรือภาษา script อื่นๆ

วิธีแก้ไข ใช้วิธีการ Convert HTML Tags ซึ่งผู้ที่กรอกเข้ามาถ้าหากมีส่วนหนึ่งส่วนใดให้แปลงตามรูปแบบในตารางด้านล่างนี้ก่อนค่อยนำเข้า database



ซึ่งวิธีนี้ข้อเสียเราต้องมานั่งเขียน program เพื่อแปลง code เองซึ่งค่อยข้างจะยุ่งยากนิดนึงแต่ก็อาจมีทางเลือกอีกในการกัน XSS คือใช้ Lightweight Markup Language หลายคนคงงงอาจจะยังไม่รู้แต่ถ้าผมบอกว่าตัวอย่างของ Lightweight Markup Language (LML) ที่เราได้เห็นนั้นก็คือ BB code นั้นเองซึ่งของ Java นี้ที่ผมลองหาดูก็ไปเจอตัวนี้เข้า PLink Textile ครับ น่าสนใจดีลองไปดูตัวอย่างตาม url นี้ครับ http://hobix.com/textile/ แต่วิธีนี้ค่อนข้างที่จะยุ่งยากครับเหมาะสำหรับช่องที่มีการกรอกข้อมูลยาวๆอย่างเช่นกระทู้ใน webboard ครับ แต่วิธีแก้ง่ายๆที่แนะนำคือ ให้ใช้ JSTL แทน JSP scriptlets เข้ามาช่วยในการแสดงผลลงในหน้า web คือใช้ <c:out> แทน <%= %> ครับเพราะว่าจะกันไว้ให้อยู่แล้วครับ Code Convert HTML Tags (ไว้เป็นแนวทางสำหรับภาษาอื่นครับแต่ว่ามันเป็น source ของ java นะครับ ที่ผมลองเขียนเอง) เข้าไปโหลดได้ที่นี่ครับ

http://pastebin.com/f7249386c

จากตัวอย่าง Code ด้านบนนั้นที่จริงใน Apache นั้นมี Opensource ที่รองรับ Convert HTML Tags อยู่ครับชื่อว่า class StringEscapeUtils อยู่ใน package Apache Commons ครับ http://commons.apache.org/lang/api/org/apache/commons/lang/StringEscapeUtils.html

ซึ่งจะทำให้เราไม่ต้องมาเขียน code ให้เหนื่อย (อันที่จริงผมลองค้นหาใน apache commons แล้วนะแต่ว่าตอนแรกไม่เจอเลยต้องมานั่งเขียนเองเพิ่งมาเจอที่หลัง) โดยใช้ method escapeHtml() มันก็จะจัดการให้เราโดยที่เราไม่ต้องไปเขียน code เองแล้วก็อย่างที่บอกไปด้านบนครับมันมี method escapeSql() ที่ไว้ใช้แก้ SQL Injection ด้วย เหอะๆๆ เพิ่งไปเจอครับตอนแรกที่ผมลองค้นดูนึกว่ามันแยกเป็น class แต่ว่าที่จริงมันเอาไปรวมอยู่ใน class เดียวกันแล้วแบ่งแยกเป็น method ครับ

Thursday 6 March 2008

JSP Tutorial ตอนที่ 1 : เริ่มต้นกับ JSP

JSP ​หรือ​ Java Server Page
เป็น​เทคโนโลยี​ Java ​อีกเทคโนโลยีหนึ่ง​ ​ซึ่ง​มีการทำ​งาน​อยู่​บนฝั่ง​ Server ​หรือ​ ​อาจเรียก​ได้​ว่า​เป็น​การทำ​งานแบบ​ Server side ​ขั้นตอนการทำ​งาน​จะ​เริ่มตั้งแต่การร้องขอ​ ​หรือ​ ​เกิด​ Request ​จาก​ Browser ​หรือ​ Client ​มาที่​ JSP ​บนฝั่ง​ Server ​จาก​นั้น​ Server ​ก็จำ​ทำ​การประมวลผล​ JSP ​เป็น​ servlet ​ก่อน​ ​แล้ว​ส่ง​ Response ​กลับไป​ให้​ Client ​ใน​รูปของ​ HTML

การติดตั้งเพื่อใช้งาน JSP

  • J2SDK ของทาง SUN
  • Tomcat ของทาง Apache (Sun ยกให้ Apache ดูแล)
ทาง PATH ที่เราต้องนำ .JSP ไปใส่ไว้ (นำไป Deploy)
จะต้องไปใน Path ที่เราติดตั้ง Tomcat ลงไปแล้วอยู่ใน folder webapps เช่น C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\test.jsp เพียงแค่นี้เราก็สามารถ run .jsp ของเราได้แล้วผ่าน http://localhost:8080/test.jsp ได้แล้ว (Port นี้แล้วแต่เราจะกำหนดโดย Default ที่ run จะเป็น 8080)

ตัวอย่างโปรแกรมของ JSP


<%! public java.util.Date date = new java.util.Date(); %>
Count <%=date%>



อธิบาย
<% เป็นตัวเปิด tag เพื่อที่จะเริ่มใช้ JSP %>เป็นตัวปิดไว้เลิกใช้ JSP 2 อันนี้ต้องใช้คู่กันเสมอ
public เป็น Access Modifier เหมือนของ Java J2SE กำหนดสิทธิ์การเข้าถึงโดยถ้าหากต้องการใช้ต้องเปิดปิด tag jsp ด้วย <%! %>
<%=date%>มีความหมายเหมือนกับ <% out.print(date); %>แบบนี้จะว่าเป็นแบบสั้นก็ว่าได้

วันนี้ผมก็มาปูทางคร่าวๆของ JSP กันซึ่งจะมีหลายตอน โดยจะค่อยๆสอนไปทีละนิดๆนะครับ ส่วนวิธีการติดตั้ง J2SDK และ Tomcat ผมหา Website สอนการติดตั้งดังนี้
  • http://www.jarticles.com/jsp/index.html
ไว้ผมจะมาเขียนต่อนะครับโดยผมจะเสนอแบบสรุปเป็นส่วนๆไปเลยนะครับ โดยผมคิดว่ามีหลายที่ทำ Tutorial ไว้ศึกษามามากแล้วไว้ผมจะเขียนประสบการณ์เกี่ยวกับ JSP โดยตรงเลยนะครับ

Object Oriented Programming (OOP) ฉบับย่อ

โดยในหัวข้อ OOP ฉบับย่อนี้ผมขออ้างอิงไปยังบทความของคุณ Thitipat นะครับซึ่งเขียนไว้เข้าใจง่ายแล้วก็คลอบคลุมด้วยครับผม โดยหัวข้อบทความก็คือ Object Oriented Programming (OOP) นั้นเองครับ โดยในมุมมองของผมเองนั้นพื้นฐานเหล่านี้เป็นหัวใจของ Java เลยก็ว่าได้ไม่ว่าจะเป็น

  • Encapsulation
  • Inheritance
  • Abstraction
  • Polymorphism
แล้วยังรวมไปถึงการเข้าถึงชั้นต่างๆ (Acess Modifier) พวก Public , Private , Protected ดังนั้นการเริ่มต้นศึกษา Java จะละเอียดซักหน่อยแต่ทำให้คุ้มค่า ในภายหลังอย่างแน่นอนครับ

ผู้พัฒนา Jython ถูกจ้างจากบริษัท Sun

Sun ได้จ้าง Frank Wierzbicki , ผู้นำ Project ของ Jython (Python บน JVM) และ Ted Leung ที่ถูกกล่าวขาลว่าเป็น Pythonista. Frank พูดว่านี้สิ่งที่เจ๋ง - ไม่ใช่เพียงแต่เขาใช้เวลามากขึ้นกับ Jython ได้แต่ยังมีสัญญาณที่จะนำ Python ไปอยู่บน Top-Level Support บน JVM ด้วย เช่นเดียวกับ Ruby ,Groovy และ Java

ในการเปลี่ยนแปลงของ JVM , Java ยังเป็นประเด่นหลักที่ focus แต่มันเปลี่ยนไปหลังจาก Charles Enebo และ Thomas Nutter (ผู้ทำ JRuby) ถูกจ้างและตอนนี้ Frank และ Ted (ผู้ทำ Jython) ได้เข้ามาจาก Java Virtual Machine จะกลายเป็น Java น้อยลงและเป็น Virtual Machine มากขึ้น ด้วย Frank และ Ted ที่ Sun เราอาจจะเห็น Django หรือ TurboGears (Framework ของ Python) จะถูกในส่วนของ Java Community อย่างที่ Rails เป็นจาก JRuby

การจ้างงานนี้หมายความว่า Jython จะถูกนำไปรวมใน Netbeans และอาจจะถูก release ใหม่ในปี 2008 นี้ซึ่งเป็นแถลงการณ์ที่ดี

Jython ยังคงช้ากว่า CPython แต่มากกว่านั้นจะเน้นความสำคัญไปที่ความถูกต้องมากกว่าความเร็ว - เมื่อความถูกต้องถูกสำเร็จคุณจะได้เห็นการเพิ่มขึ้นมากของความเร็วเหมือนที่ JRuby เพิ่มมากขึ้นเมื่อถูก focus ทั้งหมดนี้คือข่าวดีมากสำหรับความสำเร็จของ Frank และ Ted , และเราจะมองความสมบูรณ์ที่สนับสนุน Django และ TurboGears

แปลจาก TheServerSide

ความเป็นมาและประสิทธิภาพของ PL/SQL

PL/SQL เป็นการนำคำสองคำคือ PL และ SQL มารวมกัน
PL ย่อมาจาก Procedure Language พัฒนาโดย Oracle เพื่อเป็นส่วนเพิ่ม (extension) ใน standard SQL ให้ทำงานแบบ procedural กับฐานข้อมูล PL/SQL เป็นตัวเชื่อมระหว่าง database technology และ procedural programming language, PL/SQL เป็นเครื่องมือใช้พัฒนาระบบงานที่เพิ่มความสามารถให้กับ SQL ของ Oracle ทำให้พัฒนาระบบงานที่สลับซับซ้อน และเข้าถึงจัดการข้อมูลในฐานข้อมูลได้เป็นอย่างดี ด้วยความสามารถของ PL/SQL เราสามารถใช้คำสั่ง
DML เช่น insert, delete, update, select กับข้อมูล ใช้คำสั่ง loop ทำงานแบบวนซ้ำ ใช้ if และ case ตรวจสอบเงื่อนไข

คำสั่ง SQL นำมาใช้ใน PL/SQL ได้ ใน PL/SQL block มีได้หลาย SQL statements เมื่อส่ง SQL statements ไปประมวลผลที่ตัวจัดการฐานข้อมูลมันถูกส่งไปในลักษณะของ block SQL (Structured Query Language) คือภาษาที่มีลักษณะเหมือนประโยคบรรยายถึงสิ่งที่ต้องการ โดยไม่สนใจวิธีเพื่อให้ได้มาของสิ่ง
ที่ต้องการว่าเป็นอย่างไร ข้อดีคือทำให้ระบบงานที่พัฒนาไม่สนใจว่าข้อมูลจัดเก็บจริงอย่างไร (physically stored) การทำงานของ SQL เกือบทั้งหมดกระทำที่ database server แต่ SQL มีข้อจำกัดคือในการทำงานจริงบางอย่าง การทำงานให้เสร็จโดยใช้ SQL query เพียงประโยคเดียวอาจทำได้ยาก หรือทำไม่ได้นักพัฒนาระบบงานพบว่าบ่อยครั้งต้อง execute หลาย queries เพื่อให้ได้ผลลัพธ์ที่ต้องการ และอาจต้องประมวลผลผลลัพธ์ที่ได้จาก query หนึ่งก่อนที่จะทำงานในขั้นตอนต่อไปได้

ประสิทธิภาพของ PL/SQL
ถ้าไม่มี PL/SQL, RDBMS จะประมวลผล SQL statement ครั้งละ 1 statement ทำให้ประมวลผลล่าช้า ถ้าทำงานบน network มีผู้ใช้หลายคนสั่ง run SQL statement พร้อมกันในเวลาเดียวกันจะทำให้เพิ่ม traffic บน network และ disk I/O ทำงานเพิ่มขึ้น ถ้ามี PL/SQL เราส่ง SQL statement ในลักษณะของ block (มีหลาย SQL statements ในหนึ่ง block) ไปประมวลผลที่ RDBMS engine วิธีนี้ทำให้ลดการติดต่อสื่อสารระหว่างโปรแกรมที่พัฒนากับ RDBMS และลด traffic บน network ไปในตัว



จากรูป เปรียบเทียบการส่ง SQL statement ไปประมวลผลระหว่าง PL/SQL ของ Oracle กับ SQL ของโปรดักท์อื่น Oracle ส่งไปเป็น block ใน block ประกอบด้วยหลาย SQL statements เมื่อตัวจัดการฐานข้อมูล (RDBMS) ได้รับ SQL code ที่มาเป็น block ทำให้การประมวลผลทำได้เร็วกว่ารับมาครั้งละ statement แล้วประมวลผล วิธีนี้ทำให้ PL/SQL เพิ่มประสิทธิภาพการประมวลของ RDBMS

อ้างอิ​งจากหนังสือ​ของคุณบรรศักดิ์​ ​เกิดชัยฤทธิ์
เล่ม "พัฒนา​ Web Applications ​ด้วย​ Oracle Developer Suite 10g"

Tuesday 4 March 2008

ความแตกต่างระหว่าง Default , Public , Private , Protected ใน Java (J2SE)

ในส่วนของ Java ถ้าไม่พูดถึง Access Modifier เลยก็คงไม่ได้นะครับ จะว่าเป็นพระเอกของ Encapsulation กับ Information Hiding เลยทีเดียว วิธีใช้ Access Modifier สำหรับทั้ง 4 อย่างนี้ก็สามารถใช้ได้ตั้งแต่

  • class
  • local variable
  • global variable
  • method
  • constructor
ความแตกต่างของ Access Modifier ทั้ง 4 อันนี้ผมจะอธิบายแบบง่ายๆตามที่ผมได้เรียนมานะครับ

public หรือสาธารณะเมื่อเราประกาศแบบนี้แล้ว class อื่นสามารถเข้าถึง class , variable หรือ method นี้ได้โดยอิสระ

private หรือส่วนตัวเมื่อเราใช้การประกาศแบบนี้แล้ว class อื่นๆจะไม่สามารถเข้าถึงได้เลยและถึงแม้จะทำการ inheritance ก็ไม่สามารถเข้าถึง variable , method ได้ (แต่ส่วนใหญ่ variable จะเข้าถึงได้ผ่านทาง method ถ้า inheritance มาแล้วมีการทำ get set)

protected หรือเก็บไว้ให้ลูกดังนั้นตัวแม่ ไม่สามารถใช้งานในส่วนนี้ได้ ผู้เรียกใช้ก็ไม่สามารถใช้งานได้ ยกเว้นแต่ทำการ inheritance มันแล้วเรียกจากตัวลูกจะถูกสามารถเรียกใช้งานได้

สุดท้าย default (หรือปกติที่ไม่ต้องเติมอะไรเลย) จะสามารถถูกเข้าถึงได้เกือบเหมือน public แต่จะต่างตรงที่จะสามารถถูกเข้าถึงได้จาก package เดียวกันเท่านั้น

โดยในการทำ Encapsulation และ Information Hiding ทุก Access Modifier 4 ตัวนี้มีความสำคัญในการออกแบบมากโดยวันนี้ผมก็ทิ้งท้ายด้วยตาราง Modifier-Element : Matrix in Java

Monday 3 March 2008

ความแตกต่างระหว่าง SOAP กับ REST

วันนี้ผมจะมาอธิบายความแตกต่างระหว่าง SOAP กับ REST แบบง่ายๆชาวบ้านๆเลยนะครับโดยทั้ง SOAP และ REST เกี่ยวข้องกับ Web Service ทั้งนั้นครับ โดย SOAP ย่อมาจาก "Simple Object Access Protocol" และ REST "Representational State Transfer" ผมขอยืมคำพูดจาก Blognone หน่อยนะครับผมว่าเขาอธิบายได้ดี

"ใน​การพัฒนา​เว็บเซอร์วิส​นั้น​เรา​สามารถ​เลือกที่​จะ​พัฒนา​แบบ​ SOAP ​หรือ​แบบ​ REST ​ก็​ได้​ ​ถ้า​เราพัฒนา​ SOAP Web services ​เรา​จะ​ต้อง​มีการส่งข้อ​ความ​ XML (เอกซ์​เอ็มแอล) ​ตามรูปแบบที่กำ​หนด​ไว้​โดย​โปรโตคอล​ SOAP ​อีก​ทั้ง​ต้อง​มี​เอกสารอธิบายการเรียก​ใช้​เว็บเซอร์วิสประกอบ​ ​ซึ่ง​เอกสารที่อธิบายนี้​จะ​เขียน​โดย​ใช้​ภาษา​ WSDL (วิสเดิล) ​ใน​แง่ของ​ผู้​เรียก​ใช้​ ​จะ​ต้อง​มีการ​เข้า​ใจเอกสารที่อฺธิบายการเรียก​ใช้​ SOAP Web services ​หรือ​มี​เครื่องมือที่​จะ​เข้า​ใจ​และ​เรียก​ใช้​ได้​อย่างถูก​ต้อง​ ​ใน​ขณะที่​ REST Web service ​จะ​เป็น​รูปแบบของซอฟต์​แวร์ที่มองว่าข้อมูลต่าง​ ​ๆ​ ​เป็น​ Resource ​ซึ่ง​คน​สามารถ​เรียก​ใช้​ได้​ผ่านทางโปรโตคอล​ HTTP ​และ​ข้อมูลที่ส่งกลับมา​ให้​ผู้​ใช้​เป็น​ข้อมูลรูปแบบ​ XML ​ใด​ ​ๆ​ ​ก็​ได้​ ​ใน​แง่ของ​ผู้​เรียก​ใช้​ REST Web service ​ก็ขอเพียงแค่​ให้​ทราบ​ URL ​ของ​ REST Web service ​และ​การอ่านข้อมูล​ XML ​ก็​จะ​ดึงข้อมูลที่ตนเอง​ต้อง​การ​ได้"

ถ้าจะว่าถึงความง่ายในการทำ Web Service ผมว่าทำง่ายพอๆกัน ถ้าคุณรู้จัก Tool ต่างๆแล้วรู้วิธีใช้ แต่ถ้าถามว่าอันไหนศึกษาแล้วทำได้ง่ายกว่าผมว่า REST จะง่ายมากครับเพียงคุณนำ Output ไปหุ้มด้วย XML เพียงเท่านี้คุณก็จะได้ Web Service แล้ว (แต่คนใช้ก็ต้องถอด xml ที่คนทำ web service ทำไว้ ซึ่งหา library มาใช้ง่ายมาก) ส่วน SOAP นั้นถ้าไม่ใช่ Tool Generate แล้วละก็ถือว่ามี Learning Curve ที่สูงเอาการเลย โดยภาษาที่ดังด้านนี้คือ .NET , PHP แล้วก็ Java (อันดับท้ายใน 3 เลยซะงั้น) ผมมี Resource มาฝากทุกท่านด้วยครับ

SOAP กับ REST คงยังต้องต่อสู้กันต่อไปกระแสคงบอกว่า SOAP จะดับแล้ว REST จะมาแทนที่แต่ผมว่าืัทั้ง 2 แบบมีจุดเด่นจุดด้อยของมันเอง เพียงแต่ REST มีจุดเด่นที่เรียนรู้และเข้าใจง่าย ทำให้คนส่วนใหญ่ชอบใช้งานแบบ REST มากกว่าก็เท่านั้นเอง...

วิธีการเก็บ Object ลง File แบบง่ายๆ (J2SE)

หลังจากหายหน้าหายตาไปหลายวัน จากที่ไปสอบมาผมก็ได้มีโอกาสมา อัพ Blog แห่งนี้ีอีกทีแล้วครับ ด้วยความที่ผมเป็นมือใหม่มากๆกับ Java และ Oracle บางทีผมหาเนื้อหามาก็อ่านแล้วไม่เข้าใจ เลยไม่อยากนำมาลงแบบผิดๆ โดยผมจะมุ่งเน้นไปที่ J2SE นะครับเพราะอย่างน้อยผมก็พอมีความรู้อยู่บ้างในเรื่องนี้

โดยผมจะอธิบายจาก SourceCode นะครับ

import java.io.*; // เป็นการนำ package java.io มาใช้ซึ่งมีตัวเก็บ object ลง file
public class WriteObject {
public static void main(String args[]){
try{
File outFile = new File("employee.dat");
FileOutputStream outFileStream = new FileOutputStream(outFile);
ObjectOutputStream outObjectStream = new ObjectOutputStream(outFileStream);
// 3 บรรทัดบนนี้ทำให้ทำการ write object ลง file ได้
outObjectStream.writeObject("String is an object");
// บรรทัดบนเป็นการ write object ลง file
outObjectStream.close();
File inFile = new File("employee.dat");
FileInputStream inFileStream = new FileInputStream(inFile);
ObjectInputStream inObjectStream = new ObjectInputStream(inFileStream);
// 3 บรรทัดบนเป็นการเปิด file เพื่อเอามาอ่านสังเกตุว่าเปลี่ยนจาก output เป็น input
String word = (String) inObjectStream.readObject();
// ต้อง casting ด้วยทุกครั้ง

inObjectStream.close();
System.out.println(word);
}catch(Exception e){
System.out.println(e.getMessage());
}
}
}

ผมใช้ String มาประกอบคำอธิบายเพราะง่ายแกความเข้าใจโดยถามว่าทำไมถึง write String ลงได้ในภาษา Java String เป็น Object ชนิดหนึ่งดังนั้นก็เลย write ลงได้เลย เสร็จแล้วที่ยุ่งเกี่ยวกับ io ในภาษา java จะต้องมีการ try กับ catch ทุกครั้งที่เปิดหรือปิดไฟล์ โดยผมใช้ catch แบบง่ายๆคือ exception (ใหญ่สุด) ลองนำไป implement ดูนะครับ object ไหนที่เราจะนำมา write ลง file จะต้องทำการ implements Serializable ดังตัวอย่างต่อไปนี้

class Employee implements Serializable {

}

แบบนี้เราก็ทำการ write object employee ลงไปใน file ได้แล้ว มีคำถามสงสัยเขียน comment ถามได้เลยครับผมจะรีบตอบให้เร็วที่สุด

ปล. เดียว 7 มีนาคมนี้ผมก็ไม่อยู่แล้วเจอกันอีกที 25 มีนาเลยครับ (ผมไปบวช)