Thursday, 30 August 2007

5 วิธีที่ทำให้ Javascript เร็วขึ้น

ไม่พูดพร่ำทำเพลงไปดู 5 วิธีนี้เลยครับ

1. ใช้วิธีบีบอัด file ด้วย compressor

การใช้ composser ในที่นี้คือการนำ file javascript ที่มีอยู่ ไปให้ "JS Compressor" กรองคำต่าง ๆ เหล่านี้ออกไปเช่น white space, comment หรืออื่น ๆ การบีบอัดนี้จะทำให้ขนาด file ของ javascript ลดลงได้มากถึง 50% ผลที่ตามมาคือช่วยให้การโหลด javascipt เร็วขึ้น "ตัว JS Compresor" ที่แนะนำคือ JSMin จะให้ดูการทำงานของ compressor คร่าว ๆ ดังนี้

source code ที่ยังไม่บีบอัด


// is.js

// (c) 2001 Douglas Crockford
// 2001 June 3


// is

// The -is- object is used to identify the browser. Every browser edition
// identifies itself, but there is no standard way of doing it, and some of
// the identification is deceptive. This is because the authors of web
// browsers are liars. For example, Microsoft's IE browsers claim to be
// Mozilla 4. Netscape 6 claims to be version 5.

var is = {
ie: navigator.appName == 'Microsoft Internet Explorer',
java: navigator.javaEnabled(),
ns: navigator.appName == 'Netscape',
ua: navigator.userAgent.toLowerCase(),
version: parseFloat(navigator.appVersion.substr(21)) ||
parseFloat(navigator.appVersion),
win: navigator.platform == 'Win32'
}
is.mac = is.ua.indexOf('mac') >= 0;
if (is.ua.indexOf('opera') >= 0) {
is.ie = is.ns = false;
is.opera = true;
}
if (is.ua.indexOf('gecko') >= 0) {
is.ie = is.ns = false;
is.gecko = true;
}

source code ที่ผ่านการบีบอัดแล้ว


var is={ie:navigator.appName=='Microsoft Internet Explorer',java:navigator.javaEnabled(),ns:navigator.appName=='Netscape',ua:navigator.userAgent.toLowerCase(),version:parseFloat(navigator.appVersion.substr(21))||parseFloat(navigator.appVersion),win:navigator.platform=='Win32'}
is.mac=is.ua.indexOf('mac')>=0;if(is.ua.indexOf('opera')>=0){is.ie=is.ns=false;is.opera=true;}
if(is.ua.indexOf('gecko')>=0){is.ie=is.ns=false;is.gecko=true;}

2. พยายามที่จะลด file .js ลง อันไหนรวมกันได้ก็รวมกันไป

การเรียก file .js หนึ่ง file เข้ามาในหน้า web page จะเกิด http request ขึ้นหนึ่งครั้งต่อหนึ่ง file ลองคิดดูว่าถ้าในหน้า web page นั้นมีการอ้างถึง file .js หลายๆ file แสดงว่าต้องเกิด http request ขึ้นอีกหลายอัน ดังนั้น file .js ตัวไหนนั้น สามารถรวมกันเป็น file เดียวได้ก็ให้รวมกัน แต่ไม่ใช่ว่าจะเอาทุก .js ไปรวมกันเป็น file เดียวเพราะว่าอาจจะทำให้ file ตัวนั้นใหญ่เกินไปทำให้การเรียกนั้นก็ช้าลง

3. ลองใช้ tool พวก profiler และ tool ที่ใช้วัดเวลาการทำงานของ java script เรา

tool พวกนี้ที่จะแนะนำคือ Firebug ซึ่งเป็น plugin เสริมของ filefox นั้นเองผมว่า web developer ทุกคนคงมีกันอยู่แล้ว เจ้าตัวนี้สามารถ debug javascript ได้ด้วย ให้ลองตรวจดูว่า script ที่เราเขียนบางที่อาจจะรันได้จริง แต่ว่าทำงานช้าไปหรือเปล่า ลองให้ Firebug ตรวจดูว่ามันเป็นที่ตรงไหน แล้วเราจึงไปปรับปรุงแก้ไข code ตรงนั้น

4. การทำ asynchronize ให้กับ code javascript

ปกติแล้ว browser นั้น run javascript เป็นแบบ synchronously ในที่นี้คือหมายถึงว่า เมื่อ browser เจอ tag <script> การทำงานทุกๆสิ่งใน web page นั้นจะถูกหยุดไป จนกระทั่ง browser นั้นทำงาน tag <script> เสร็จ
แต่ถ้าหากว่าใน tag <script> เกิดมี code javascript ที่มีการทำงานที่นานขึ้นมา แสดงว่าส่วนอื่นนั้นจะไม่มีทางโหลดขึ้นมาได้เลย ดังนั้นเราควรที่จะเขียนให้ javascript เราเป็นแบบ asynchronize เพื่อที่จะไม่จำเป็นต้องรอให้ code javascript นั้นทำงานเสร็จก่อน ก็ให้ไปทำงานส่วนอื่น ๆ พร้อมกันเลย
การเขียนอย่างนี้เราจะใช้ function setTimeout() เข้ามาช่วย คือ setTimeout จะเรียก function ของ javascript ขึ้นมาทำงานในตามเวลาที่กำหนด และถ้ามีส่วนอื่นที่ทำงานอยู่ เมื่อถึงเวลามันก็จะทำงานไปพร้อมกับส่วนนั้นไป ซึ่งจะเห็นได้ว่าถ้าเราเอา setTimeout() เข้ามาช่วย browser ก็จะได้ไม่ต้องรอให้ function ที่ถูกเรียกธรรมดาทำเสร็จ ก็สามารถทำงานในส่วนต่อได้

ตัวอย่างการเรียก function แบบ asynchronize


function testfunc()
{
var x1="test1";
var x2="test2";

alert(x1+x2);
}
testfunc(); //normal way to execute the function
window.setTimeout(testfunc,0); //asynchronous execution of testfunc()

5. ควรระวังในการอ้างถึง DOM variable

เป็นที่รู้กันอยู่แล้วว่าการ binding ใน javascript มันช้า ดังนั้นการเขียน code ที่จะเข้าไป access ถึง IE DOM เมื่อเราเรียกในแต่ละครั้ง มันจะไป search เข้าไปในแต่ละ element ว่าเจอ DOM ที่เราต้องการเรียกหรือเปล่า ซึ่งถ้าใน element นั้นมี sub element ก็จะเข้าไปเรื่อย ๆ จนครบทุกส่วนใน element จึงไปยัง element ต่อไป ถ้า element เยอะก็จะช้าด้วย ดังนั้นการอ้างถึง DOM variable แต่ละครั้งนั้น ควรที่จะเรียกใช้อยากระมัดระวัง จะยกตัวอย่างที่เรียกใช้ DOM variable ที่ไม่ดีและที่ดีให้ดู

การเรียกใช้ DOM variable ที่ไม่ดี


function buildString()
{
var newElement = document.getElementById("myitem");
newElement.innerHTML = ""; // Clear out the previous
newElement.innerHTML += addHeader();
newElement.innerHTML += addBody();
}

การเรียกใช้ DOM variable ที่่ดี


function buildString()
{
var newText = addHeader() + addBody();
document.getElementById(”myitem”).innerHTML = newText;
}
ที่มา : http://www.whenpenguinsattack.com/2007/08/20/5-ways-to-speedup-javascript/

วัดประสิทธิภาพของ Web Application ด้วย JMeter

jmeterเคยสงสัยกันไหมครับว่า web applciation ที่เราพัฒนาขึ้นมานั้นมีประสิทธิภาพมากน้อยแค่ไหน? ผมเองก็คนนึงละครับที่สงสัยว่าเราจะวัดประสิทธิภาพออกมาอย่างไร?

ถ้าถามว่าแล้วมันสำคัญยังไง?
เมื่อเราออกไปพัฒนาระบบ web application ให้กับลูกค้า เราเป็นนักพัฒนา แค่เขียน web application ตามที่ลูกค้าต้องการก็เพียงพอแล้วแล้ว ไม่ต้องสนใจเรื่องประสิทธิภาพอะไรทั้งนั้น ถ้าคิดอย่างนี้กันอยู่ก็ผิดแล้วละครับ

เพราะประสิทธิภาพของ web application อาจจะไปมันกระทบกับระบบงานต่างๆ ซึ่งอาจทำให้ระบบช้าไปทั้งระบบเลยก็ได้ หรือที่แย่ไปกว่านั้น ทำให้ระบบล่มไปเลยครับ และสาเหตุส่วนใหญ่ก็จะมาจาก web application ที่เราเป็นคนพัฒนาเสียด้วย

หลายคนอาจจะละเลยแล้วก็โทษไปที่ server ช้าบ้างละ โทษที่ database tuning ไม่ดีบ้างละ โทษที่ระบบ network ออกแบบมาไม่ดีบ้างละ แล้วในที่สุดแล้วลูกค้าก็จะมาสงสัยที่ web application ที่เราพัฒนาครับ
(โดนจนได้ งานเข้าละครับ -_-'')

แล้วถ้ามันเกิดขึ้นเราจะมีวิธีป้องกันตัวเองยังไง? ถ้าเราจะบอกว่าไม่เกี่ยวกับ web application ของเราลูกค้าจะเชื่อหรอครับ ดังนั้นเราจึงต้องมีการ protect ตัวเองเหมือนกัน

เห็นรึยังครับว่ามันสำคัญครับ ว่าเราพัฒนา web application ออกมาได้ดีแค่ไหน? รองรับปริมาณ request ต่างๆได้มากน้อยแค่ไหน? รวมถึงยังวัดประสิทธิภาพของ server สามารถในการรองรับปริมาณ traffic ที่เข้าออกมาน้อยแค่ไหน? ก่อนที่เราจะนำไปใช้งานจริง

แล้วเราจะวัดประสิทธิภาพของ web application อย่างไร?
ผมเลยหา software ที่จะช่วยเรื่องทดสอบประสิทธิภาพของ application ที่สำคัญต้องฟรีด้วยครับเพื่อให้ผู้ใช้งาน หรือนักพัฒนาทั้งหลายสามารถนำไปใช้ได้อย่างสบายใจ แล้วผมก็เจออยู่ตัวนึง ที่ใช้งานง่าย (มากๆ) เป็น opensource และฟรีด้วย ประสิทธิภาพของตัว software ดีในระดับนึงเลยทีเดียว software ตัวนี้ชื่อว่า JMeter

Software ตัวนี้เป็นหนึ่งในหลาย ๆ project ของ Apache พัฒนาโดยใช้ภาษา java 100% (project ที่น่าสนใจของ Apache มีที่น่าสนใจอยู่หลายตัวครับ ก่อนหน้านี้ก็เพิ่ง review project อีกตัวนึงของ Apache ที่ทำหน้าที่เป็น O/R Mapping ที่ชื่อ iBATIS หรือก่อนหน้านี้ Struts Framework ที่เป็น J2ee Framework)
แต่อย่าเข้าใจผิดนะครับว่า web application จะต้องพัฒนาด้วย JSP servlet เท่านั้น มันใช้งานได้กับทุกภาษาครับที่ทำงานอยู่บน HTTP server

ด้วยเหตุผลต่างๆที่กล่าวมาข้างต้น ผมจึง Review JMeter software load test ตัวนี้ครับ

1. เตรียม web application ที่จะทำการทดสอบให้เรียบร้อย จากนั้น download JMeter เวอร์ชั่นล่าสุดได้ที่ JMeter website และเราต้องมี JDK ในเครื่องด้วยตั้งแต่ JDK 1.4 เป็นต้นไป

2. แตกไฟล์ที่โหลดมาก่อนจากนั้นเข้าไปที่ directory /bin แล้ว run JMeter สำหรับ windows ให้เรียกไฟล์ jmeter.bat แต่ถ้าเป็น linux ให้เรียก jmeter.sh

jmeter main windowsรูปที่ 1 JMeter main window

  • Functional Test Mode ถ้าเรา checkbox ที่นี่ หมายความว่า JMeter จะเก็บ record ข้อมูลต่างๆที่ return จาก server ของแต่ละการทดสอบ

3. ถัดมาให้เรา add Thread Group โดยคลิกขวาที่ Test Plan > Add > Thread Group ซึ่ง Thread Group เปรียบเสมือน users ที่เราจะจำลองพฤติกรรมการทำงานขึ้นมาครับ

jmeter thread groupรูปที่ 2 JMeter Thread Group

  • Name หมายถึงชื่อของ thread group เราสามารถตั้งได้ที่ตรงนี้ครับ ในที่นี้ผมตั้งจำนวน users ไว้ 2
  • Number of Threads (users) หมายถึงจำนวน users ที่เราต้องการจะทำการทดสอบ
  • Ramp-Up Period (inseconds) หมายถึงค่าความเร็ว(วินาที)ที่เราต้องการให้สร้าง Number of Threads (users) ขึ้นมาใหม่ ตัวอย่างเช่นถ้าเราใส่ Number of Thread (users):10 และใส่ Ramp-Up Period:20 ลงไปหมายความว่าอีก 20 วินาที JMeter จะสร้าง users ขึ้นมา 10 threads หรือถ้าตั้งเป็น 0 หมายความว่าจะสร้าง user ทั้งหมดทันทีที่ start หรือจบจาก loop
  • Loop Count หมายถึงจำนวนรอบที่ต้องการทำการทดสอบ ในที่นี้ผมตั้งไว้ 3 หมายความว่าผมมี user 2 คนและต้องการให้วนการทำงานซ้ำกัน 3 ครั้ง รวมเป็น 2x3=6
4. จากนั้นให้ add Http Request Defaults โดยคลิกขวาที่ Thread Group > Add > Config Element > HTTP Request Defaults สร้าง Http Request ซึ่งตรงนี้สร้างเป็นต้นแบบให้ทุก request
ที่เราจะสร้างขึ้นต่อจากนี้ใช้ค่าต้นแบบตามนี้

jmeter http request defaultsรูปที่ 3 JMeter Http Request Defaults

  • Server Name or IP ตรงนี้ให้เราใส่ ip หรือ url ของ server ที่เราจะทำการทดสอบ ในที่นี้ผมจะทดสอบกับ server ของเครื่องตัวเองครับ
  • Port Number ให้ใส่หมายเลข port ของ http server พอดีผมจะทดสอบกับ tomcat เลยใส่ 8080

5. จากนั้น add Http Request โดยคลิกขวาที่ Thread Group > Add > Sampler > HTTP Request ตรงนี้เป็นการเพิ่ม request ที่เราต้องการจะทำการทดสอบ

jmeter http requestรูปที่ 4 JMeter Http Request
  • Path หมายถึง Path ที่เราจะทำการเรียกหรือเข้าถึง page ที่ต้องการทำการทดสอบ
  • Send Parameters With the Request หมายถึง parameter ต่างๆที่เราต้องการส่งไปตอนที่เราเรียกหน้า page ที่จะทดสอบด้วยซึ่งเราสามารถ Add เข้าไปเพิ่มได้เลย
  • Method หมายถึงวิธีการส่งค่า parameter ต่างๆมีทั้งแบบ get และแบบ post
6. จากนั้น add Graph Results โดยคลิกขวาที่ Thread Group > Add > Listener > Graph Results เพื่อใช้แสดงผลลัพธ์ของการทำงาน่ในรูปแบบ graph ซึ่งตรงนี้เราสามารถ add ผลลัพธ์ที่เราต้องการ
ในรูปแบบต่างซึ่งมีทั้งเป็น text, table และ graph

jmeter graph resultsรูปที่ 5 ผลลัพธ์ที่ได้หลังจากทำการวัดประสิทธิภาพ

ซึ่งผลลัพธ์ที่ได้เราจะนำไปวิเคราะห์ตามที่เราต้องการ ซึ่งค่าที่ได้ออกมามีดังนี้
  • Average msค่าเฉลี่ยเวลาโดยรวม ที่ส่ง request ไปหา server
  • Median ms ค่าเวลากึ่งกลาง
  • Deviation ms การกระจายตัวถ้ากระจายตัวไม่มากแสดงว่าดีง่ายต่อการควบคุม
  • Throughput ms ค่าประมวลผล request ต่อนาทีของ Server
เมื่อทดสอบแล้วเราสามารถ save รูปผลลัพธ์ที่ได้ออกมานี้เป็นไฟล์รูปได้โดยการคลิกขวาที่ Graph Results > Save Node As Image ต่อจากนี้คุณอาจจะเพิ่ม View Results Tree เอาไว้เพื่อดูผลลัพธ์หน้า page ที่คุณทำการทดสอบได้ครับว่าเพจนั้นโหลดขึ้นมาแล้วหรือยัง

jmeter result treeรูปที่ 6 JMeter View Results Tree

จริงๆแล้ว JMeter สามารถวัดประสิทธิภาพของ web application เราได้ละเอียดและลึกกว่านี้เช่นสามารถวัดประสิทธิภาพของ web application ขณะเชื่อมต่อกับ database ได้ แต่ผมไม่มีเวลามากพอที่จะอธิบายจนหมดได้ ยังไงถ้าสนใจลองอ่านเพิ่มเติมกันได้นะครับที่ JMeter User Manual

นอกจาก JMeter แล้วยังมี loadtest tools ตัวอื่นๆอีกนะครับ
  • e-TEST suite http://www.empirix.com
  • Autobench http://www.xenoclast.org/autobench
  • Grinder http://grinder.sourceforge.net
  • LoadRunner http://www.mercury.com/us/products/performance-center/loadrunner
  • Micrisoft Stress Test http://support.microsoft.com/kb/231282
  • QEngine http://www.adventnet.com/products/qengine/index.html
  • Badboy http://www.badboy.com.au
  • InFraRED http://infrared.sourceforge.net/versions/latest
  • OpenSTA http://www.opensta.org

Wednesday, 29 August 2007

เรียนรู้ PL/SQL ตอนที่ 1

ปกติ Database ที่เป็น Relational Database ทุกตัวจะมีภาษา SQL (Structured Query Language) ที่ใช้ในการเข้าถึงข้อมูลและจัดการข้อมูลใน Database

SQL เป็นภาษาที่เรียนรู้ได้ง่าย เมื่อเรียนรู้แล้วสามารถนำไปใช้ได้กับทุก ๆ Database
แต่ใช่ว่าทุก ๆ Database จะมี Syntax SQL ที่เหมือนกันซะทีเดียว อาจจะมี Syntax บางอย่างที่แตกต่างกันบ้าง
เช่น Database ของ Microsoft ซึ่งเป็นที่รู้กันอยู่ว่ารายนี้ชอบแต่งเติมมาตรฐานเดิมที่อยู่ให้มี Function ที่มากขึ้น เช่น Constraint ON UPDATE CASCADE ที่จะมีอยู่ใน SQL Server เท่านั้นในขณะที่ Oracle ไม่มี
//แต่โดยร่วมก็เหมือนกันเกือบ 95%

ถามว่านั้นเพียงพอแล้วหรือยังสำหรับในการจัดการข้อมูลใน Database คำตอบคือ “ไม่”

เนื่องจากว่าคำสั่ง SQL หน้าที่หลัก ก็คือใช้ในการ Select, Insert, Update, Delete ธรรมดา อาจจะใส่การคิดคำนวณเล็ก ๆ น้อย ๆ ได้ แต่ก็ไม่เพียงพอกับ Business Logic ที่ซับซ้อน จึงต้องเป็นภาระของงานในฝั่ง Programming

สามารถ manage เกี่ยวกับ Relational Database ที่มี Business logic ไม่ซับซ้อนมากนัก เพราะว่า SQL นั้นไม่มี Control Statement ที่ใช้ในการควบคุม Condition ของ SQL Statement และไม่มี Function และ Procedure เหมือนกับ Language Programming อื่นๆที่รวบรวม SQL Statement และ Control Statement ไว้เป็น Function เดียวกันเพื่อรองรับกับ Business logic ที่มีความซับซ้อนมากๆ

ทำให้ SQL ไม่เพียงพอสำหรับในการแก้ปัญหานี้ การแก้ปัญหามีสองวิธีคือ โยนภาระนี้ไปให้ Model (Model ใน MVC) ของฝั่ง Application นั้นไปทำการแก้ปัญหานี้เอง หรืออีกวิธีหนึ่งคือ ให้ Procedural extensions จัดการกับปัญหานี้ซึ่งในแต่ละค่ายของ Database นั้นก็จะมี Procedural extensions ที่เป็นของตนเอง ซึ่ง Procedural extensions ของ Oracle นั้นก็คือ PL/SQL

What is PL/SQL

PL/SQL นั้นเป็นภาษาที่เป็น Procedure Language ซึ่งก็จะเป็นเหมือนภาษาทั่วไปคือก็จะมี Control Statement สามารถสร้าง Function ได้และสามารถจัดการเกี่ยวกับ Exception ได้ซึ่ง PL/SQL ตัวนี้จะอยู่ฝังอยู่ใน product หลายๆ product ของ Oracle ไม่ว่าจะเป็น Oracle Form, Oracle Report, Oracle Portal และสามารถใช้ร่วมกับ SQL เพื่อที่จะเพิ่มศักยภาพในการจัดการ Database ของเราได้มากขึ้น หากลองสักเกตุดูดี ๆ ใครที่คิดจะจับ product เกี่ยวกับ Oracle จริง ๆ จัง ๆ ก็ควรที่จะมีพื้นฐานด้าน PL/SQL ที่ดี

Why use PL/SQL in Oracle Database

เนื่องจากว่า Oracle Database นั้นเป็น Database ที่เป็นระบบใหญ่มากบางครั้งการโยนภาระไปให้ Model จัดการกับ Business logic ที่มีควารมซับซ้อนนั้นอาจจะไม่เหมาะเพราะบางครั้ง Business logic นั้นอาจจะมีการติดต่อกับ Database บ่อยๆเช่น Business logic นั้นถ้ามีความซับซ้อนมากอาจจะมีคำสั่ง SQL หลาย Statement ซึ่ง SQL นั้นสามารถทำงานได้ทีละ Statement ดังนั้นถ้ามี 20 Statement แสดงว่า Application ต้องส่ง SQL ไปที่ละหนึ่ง Statement เพื่อให้ Database นั้นทำงานแล้วเมื่อเสร็จจึงค่อยส่งผลลัพธ์กลับมา Application ซึ่งต้องทำแบบนี้ส่งไปส่งมา 20 ครั้งซึ่งจะมี overhead อื่นๆตามมาอีก เช่น I/O ที่ใช้ในการถ่ายส่งข้อมูลหรือติดต่อ Database แต่ว่าถ้าเราโยน Business logic นั้นให้ PL/SQL นั้นทำหน้าที่แทนหละก็ต่อให้มีหลาย ๆ SQL statement ก็จะไม่มีปัญหาในด้านนี้คือมันจะทำงานอยู่ใน Database Server ตลอดไม่ต้องคอยเทียวไปเทียวมาในการส่งคำสั่ง SQL ไปกลับระหว่าง Application กับ Database จะทำให้ระยะเวลาที่ใช้ในการทำ Business logic นั้นลดลงไปได้

ก่อนที่จะเข้าถึง PL/SQL นั้นผมอยากจะให้ทำความเข้าใจความสัมพันธ์ของ PL/SQL และ SQL ว่ามีความสัมพันธ์กันอย่างไร

โดย PL/SQL และ SQL มีส่วนที่คาบเกี่ยวกันเพราะ PL/SQL นั้นจะสามารถควบคุม SQL ได้บางส่วนก็คือควบคุมในส่วนของ DML และ DCL ของ SQL ได้เท่านั้นส่วนนั้นคือคำสั่งจำพวก SELECT, INSERT, UPDATE, DELETE, COMMIT หรือ ROLLBACK เป็นต้น แต่ DDL นั้น PL/SQL นั้นไม่สามารถเรียกใช้ได้แต่ว่า Oracle ก็เปิดทางให้เรียกใช้ได้ถ้าจำเป็นต้องใช้จริง ๆ ซึ่งสามารถดูความสัมพันธ์นี้ได้ดังภาพด้านล่าง

Tuesday, 28 August 2007

เป้าหมายถัดไปที่ Oracle สนใจจะควบรวมกิจการ

หนึ่งในกลยุทธ์ที่ Oracle ใช้มาโดยตลอด ก็คือการไล่ซื้อ/ควบกิจการ
เมื่อปลายเดือนมิถุนายนที่ผ่านมา Larry Ellison ก็ได้ประกาศออกมาเองว่า
ยังมีแผนที่จะซื้อ/ควบกิจการ อีกหลายบริษัท
จึงมีข่าววงในออกมาว่า เป้าหมายที่ Oracle กำลังจะซื้้อมีดังนี้

บริษัทใน U.S

บริษัทที่นอก U.S.
ส่วนข่าวที่มีกับ Business Objects และ Cognos
ผู้เชี่ยวชาญวิเคราะห์ว่าน่าจะเป็นเพียงแค่ข่าวลือ
เพราะ Oracle ที่ได้รวมกับ Hyperion และ Siebel
ก็เพียงพอที่เป็นผู้นำตลาดด้าน BI อย่างครบวงจร

สุดท้ายนำการรายการควบรวมกิจการของ Oracle
ตั้งแต่ปี 2005 มาให้ดูครับ
อ้างอิงมาจาก wikipedia

Products Month/Year Industry Valuation
PeopleSoft January 2005 Enterprise Software $10.3 billion
Oblix March 2005 Identity Management Solutions NA
Retek April 2005 Retail Industry Solutions $630 million
TripleHop June 2005 Context-sensitive Enterprise Search .
TimesTen June 2005 Real-time Enterprise Solutions .
ProfitLogic July 2005 Retail Industry Solutions NA
Context Media July 2005 Enterprise Content Integration .
i-flex August 2005 Banking Industry Solutions $900 million
G-Log September 2005 Logistics Hib Solutions .
Innobase October 2005 Discrete Transactional Open Source Database Technology NA
Thor Technologies November 2005 Enterprise-wide User Provisioning Solutions. .
OctetString November 2005 Virtual Directory Solutions .
Temposoft December 2005 Workforce Management Applications .
360Commerce January 2006 Retail Industry Solutions .
Siebel Systems January 2006 Customer Relationship Management Solutions $5.85 billion
Sleepycat February 2006 Open Source Database Software for Embedded Applications NA
HotSip February 2006 Communications Infrastructure Solutions .
Portal Software April 2006 Software Suite for Communications Industry .
Net4Call April 2006 Service Delivery Platform for Communications Industry .
Demantra June 2006 Demand-driven Planning Solutions .
Telephony@Work June 2006 IP-based Contact Center Technology .
Sigma Dynamics August 2006 Real-time Predictive Analytics Software .
Sunopsis October 2006 Enterprise Integration Software .
MetaSolv Software October 2006 Solutions for Communications Service Providers $219 million
Stellent November 2006 Content Management Solutions $440 million
SPL WorldGroup November 2006 Revenue and Operations Management Software .
Hyperion Solutions March 1, 2007 Enterprise Performance Management $3.3 billion
AppForge
April 2007 Cross-platform handheld development
Agile Software Corporation May 2007 Product Life Cycle Management Software 495 million (cash)
Bharosa July 2007 Identify Theft 495 million (cash)
ที่มา

สุดเจ๋ง WebCream เปลี่ยนจาก Java Swing ให้เป็น AJAX RIA (Desktop to Web Application)

WebCream
เวลาเราเขียน Client Application ด้วย Java Swing หรือ AWT เคยอยากที่จะให้มันสามารถรันอยู่บน browser กันบ้างไหมครับ วันนี้มี Software ตัวนึงที่ทำให้สิ่งที่กำลังคิดอยู่นี้เป็นจริงขึ้นมา Software ตัวนั้นมีชื่อว่า WebCream

WebCream คือเป็นตัวแปลง Java Swing หรือ AWT application ของเราให้เป็นภาษา HTML โดยใช้เทคนิคของ Ajax เข้ามาช่วยทำให้ดูแล้วเหมือน Client Application ที่เราเขียนถูกรันอยู่บน browser โดยที่ไม่คิดว่ามันคือ web application เลย ซึ่งเจ้า WebCream จะแปลง gui ทุกตัวที่สร้างโดยใช้ Java Swing หรือ AWT ให้เป็นภาษา HTML ทั้งหมด และ business logic ทั้งหมดที่เราเขียนไว้ก็ จะถูกแปลงให้สามารถทำงานอยู่บนเว็บได้ด้วยเช่นกัน ซึ่งคุณสมบัติเด่นๆของ WebCream มีดังนี้ครับ

  • เราไม่ต้องมีความรู้ HTML/CSS/DHTML/JavaScript ก็สามารถใช้ WebCream ได้
  • สนับสนุน HTML4.0, Cascading Style Sheets 2, DHTML, JavaScript1.2
  • ทำงานร่วมกันได้กับหลาย browsers
  • ไม่ต้อง install Java Plugin หรือ Java WebStart และเครื่อง client ที่จะรันก็ไม่ต้อง support Java ด้วย
  • แสดงผล Java, Swing, Applet ในรูปแบบภาษา HTML
  • ยอมให้มีการปรับปรุงแต่งเติมเมื่อเราแปลงเป็น HTML แล้ว เช่น สี, ตัวอักษร
  • การใช้งานทรัพยากร thread และ memory ถูกปรับปรุงให้ดีขึ้น
  • มีการรองรับ JDK1.2, 1.3 และ 1.4
  • มีการรองรับ dynamic events และ listeners เช่น ActionListener, ItemListener
  • สามารถทำ Dynamic cluster ให้ JVM เพื่อประสิทธิภาพที่ดีขึ้น
ยังไม่หมดนะครับตามไปอ่านกันได้ที่ WebCream Feature อืมอยากที่เห็นว่าความสามารถของ WebCream ไม่ธรรมดาเลยทีเดียวถ้าจะพูดมากไปกว่านี้เดี๋ยวหาว่าโม้แน่ๆ เข้าไปดู demo ได้ที่นี่ครับ WebCream Demo
ถ้าอยากลองเล่นเข้าไป download ได้ที่นี่ WebCream Download เลยครับแต่ต้องทำการลงทะเบียนก่อนนะครับ

WebCream SwingSet 2WebCream Choose ColorWebCream JTable

Monday, 27 August 2007

Scala ภาษาพี่น้องกับ Java?

Scala เป็นภาษาใหม่ที่เพิ่งเกิดมาไม่นานนัก เป็นภาษาที่เป็นทั้ง Object-oriented และ Functional language ในตัวเดียวกัน

ความรู้สึกแรกที่ได้มาจับ Scala จะรู้สึกว่ามันเป็น Object-oriented ทั้งหมด
เพราะว่าไม่ว่าจะทำอะไร ก็จะเก็บเป็น Object ทั้งสิ้น

โดย Type (Attribute ใน Java) และ Behavior (Method ใน Java-โดยจะใช้ keyword ในการสร้าง Method ว่า def) จะถูกรวมกันอยู่ใน Class (Class ใน Scala นั้นจะใช้ keyword ว่า Object)

Scala มีความสามารถของ Inherit และพ่วงด้วยกลไกที่เรียกว่า Clean Replacement เพื่อช่วยในการทำ Multiple Inheritance ตัวอย่าง


object HelloWorld {
def main(args: Array[String]) =
Console.println("Hello, world!")
}

จากองค์ประกอบที่ผ่านมา เราก็ยังมองไม่เห็นว่ามันมีความเป็น Functional Languages ตรงไหน

แต่ถ้าลองเข้าไปใน Function ของ Scala แล้วจะรู้ว่าทุกๆ Function ของ Scala นั้นได้ถอดแบบมาจาก Functional Languages

ใน Function ของแต่ละ Function ของ Scala นั้นสามารถมี Function ที่ซ้อนเข้าไปด้านในได้ ซึ่งเราเรียกว่า Anonymous Functions และมีกลไกที่เรียกว่า Higher-Order Functions เพื่อช่วยจัดการในเรื่อง Nested Function

และอีกอย่างที่น่าสนใจมากของ Scala คือเป็น Platform Independence ซึ่งใช้หลักการ Hybrid แบบ Java คือแปลง Source code เป็น Byte code ก่อน
ซึ่ง Byte code ตัวนี้จะไปรันกับ Interpreter ใด ๆ ก็ได้

Highlight อยู่ตอนนี้ครับ คือ Byte code ของเจ้า Scala ที่ว่านี้สามารถนำไปรันกับ Interpreter ของ Java ได้ด้วย !

Feature ของภาษานี้อีกหลายอย่างนั้นก็ค่อนข้างที่จะคล้ายคลึง Java มาก ซึ่งจะคล้ายคลึงกันยังไงนั้นไว้วันหลังผมค่อยมาเล่าต่อหละครับ

ที่มา : http://www.scala-lang.org/index.html

เกี่ยวข้อง: Scala: The Next Next Java

Blog เข้าไม่ได้ไป 3 ชั่วโมง

ขอโทษผู้อ่านด้วยครับ ที่วันนี้ blog เข้าไม่ได้เป็นเวลา 3 ชั่วโมงเต็มตั้งแต่ 16:50 - 19:50 น.

สาเหตุไม่ได้เป็นที่ Google ล่มเหมือนสัปดาห์ก่อนแต่อย่างใดแต่เป็นที่ความบกพร่องของผมเองครับที่พยายามเปลี่ยน domain name แต่ไม่สำเร็จ

ซึ่งภายในสัปดาห์นี้ ผมมีกำหนดการที่จะต้องเปลี่ยน domain name ให้ได้ครับถ้าภายในวันสองวันนี้ blog เข้าไม่ได้ ต้องขอโทษล่วงหน้าด้วยครับ

Friday, 24 August 2007

Oracle Database 11g Certification Matrix


หลังจากที่ผมได้ติดตั้ง Oracle Database 11g ไปเมื่อหลายวันก่อน
ผมได้รับคำถามมาว่า ในเวอร์ชั่น 11g นี้
สามารถติดตั้งกับ linux อะไร/เวอร์ชั่นใดได้บ้าง

คำตอบดังนี้ครับ

Oracle Database 11g certify กับ

  • SUSE Linux Enterprise Server 10
  • Red Hat Enterprise AS/ES 5
  • Red Hat Enterprise AS/ES 4
  • Oracle Enterprise Linux 5
  • Oracle Enterprise Linux 4
ส่วน Fedora Linux ถึงแม้จะไม่มีการประกาศ certify อย่างเป็นทางการ
แต่ประสบการณ์จากเวอร์ชั่นเก่า ๆ สามารถติดตั้งและใช้งานได้ครับ
เพราะมันก็คือตัว free ของ RHEL

เช่นเดียวกับที่เราสามารถติดตั้ง Oracle บน Windows XP ได้
ทั้ง ๆ ที่ Oracle ก็ไม่ได้ certify แต่อย่างใด

ส่วน product อื่น ๆ สามารถตรวจสอบ certify ได้ที่

Spring Web Services ไม่ใช้ JAX-WS ในการสร้าง WSDL

จากข่าววันก่อนเรื่อง "Interface21 ประกาศออก Spring Web Services 1.0"
มีประเด็นที่น่าสนใจคือ Spring ไม่ใช้ JAX-WS ในการสร้าง WSDL

Spring Web Services ใช้วิธีที่ชื่อ Contract-First ในการสร้าง WSDL ซึ่งพัฒนามาจาก lab ของ Spring เอง

สาเหตุที่ Spring ไม่ใช้ JAX-WS เพราะว่า
JAX-WS ยังมีความผิดพลาดเรื่อง ORM ย่อมาจาก Object/Relational impedance Mismatch (คือการเปลี่ยน Object ของ Java ให้กลายเป็น XML เพื่อส่งออกไปให้กับ client ที่ได้ร้องขอบริการเว็บเซอร์วิส)

ลองดูตัวอย่างดังนี้

การที่ Java มีโครงสร้างข้อมูลที่ซับซ้อน
ทำให้ระบบอื่นๆที่ไม่ใช่ Java เช่น .NET

เมื่อ .NET มาเรียกใช้ services ที่มีการส่งค่ากลับไป
ด้วยโครงสร้างข้อมูล java.util.TreeMap


public Map getFlights() {
// use a tree map, to make sure it's sorted
TreeMap map = new TreeMap();
map.put("KL1117", "Stockholm");
...
return map;
}

เมื่อแปลงเป็น XML แล้วส่งไปให้กับ .NET แล้ว
ปรากฎว่า .NET ไม่มีชนิดข้อมูลที่ตรงกับ Java เลย
.NET จะใช้โครงสร้างข้อมูล System.Collections.Hashtable มารับแทน
จะเห็นว่าโครงสร้างข้อมูลสองอย่างนี้ แทบไม่เหมือนกันเลย

อีกประเด็นคือนี่คือปัญหาหนึ่งปัญหา
บาง service จะส่งข้อมูลด้วยโครงสร้างแบบ Cyclic graphs
XML ที่ได้ออกมาจะซับซ้อนมากดังนี้


<flight number="KL1117">
<passengers>
<passenger>
<name>Arjen Poutsma</name>
<flight number="KL1117">
<passengers>
<passenger>
<name>Arjen Poutsma</name>
<flight number="KL1117">
<passengers>
<passenger>
<name>Arjen Poutsma</name>
...
ดังนั้น Interface21 จึงได้พัฒนากรรมวิธีการสร้าง WSDL ขึ้นมาเอง
โดยใช้แนวคิดที่ชื่อว่า Contract-First Development
หากต้องการทราบในรายละเอียดของแนวคิดนี้ทั้งหมด อ่านต่อได้ที่นี่

บทความที่เกี่ยวข้อง

Thursday, 23 August 2007

แนะนำ iBATIS O/R Mapping อีกตัวที่น่าสนใจ


วันนี้มาแนะนำ OR Mapping Framework ที่น่าสนใจอีกตัวหนึ่งนั่นคือ iBATIS Data Mapper Framework ครับ

iBATIS มันคืออะไร ?
iBATIS framework คือ lightweight data mapping framwork และเป็น persistence API ที่มีความสามารถดึง database schema แล้วนำมาสร้างเป็น database persistence layer สำหรับ java application ของเรา จึงช่วยในเรื่องการติดต่อ หรือทำ transaction กับ database ที่ iBATIS น่าสนใจเพราะว่ามันใช้งานง่ายครับ สำหรับคนที่เคยเขียนเชื่อมต่อกับ database โดยใช้ JDBC เพื่อดึงข้อมูลเอาเองคงรู้ว่าไม่สนุกเลย

หลักการทำงานคือ :
ใน iBATIS layers นั่นจะประกอบด้วย 3 layer ได้แก่

  • SQL Maps Layer นั้นจะเก็บ SQL statement ที่เอาไว้ mapping กับ database โดยจะจัดเก็บ SQL statement ไว้ในไฟล์ XML
  • DAO layer ทำหน้าที่ติดต่อประสานงานระหว่าง SQL Map Layer กับ Domain classes
  • Domain classes มีไว้เพื่อจัดเก็บข้อมูลเราที่ดึงขึ้นมาจาก database ให้อยู่ในรูปของ object เพื่อให้ application ของเรานำไปใช้งานต่อได้ทันที
โดย architectural stack จะเป็นตามนี้
ibatis
เพิ่มเติมครับ :

Oracle Search Plug-in สำหรับ Firefox

Foxkeh banners for Firefox 2
คนที่ทำงานกับ Oracle อยู่ทุกวี่ทุกวัน
หนีไม่พ้นที่จะต้องค้นหาข้อมูลจาก web เหล่านี้
  • OTN ดูบทความเชิงเทคนิคของ Oracle ทั้งหมด
  • Metalink สำหรับลูกค้า Oracle ดู knowledge base ที่เก็บวิธีแก้ปัญหาทั้งหมด รวมถึงการ download patch ต่าง ๆ
  • Oracle Documents ดูเอกสารคู่มือการใช้งานตัวเต็มของ Oracle
  • Oracle Error Messages หนึ่งในคู่มือของ Oracle ที่ รวบรวม error messeage ทั้งหมด
ดังนั้นจึงมีนักพัฒนาที่รู้ใจ
สร้าง firefox search plug-in เพื่ออำนวยความสะดวก ในการค้นหาขึ้นมา
เพื่อการค้นหาข้อมูลต่าง ๆ ของ Oracle ทำได้ง่ายขึ้น


ตอนนี้ที่ oracle-base ได้รวบรวม firefox search plug-in ทั้งหมดรวมถึงเวอร์ชั่นเก่า ๆ ด้วย
ตามไป add ได้เลยครับ
หรือจะตามไป add จากนาย Eddie Awads หนึ่งในกูรู Oracle ก็ได้ครับ

ส่วนตัวผมที่ใช้งานบ่อยที่สุดก็ plug-in ของ metalink น่ะครับ หาอะไรก็เจอ

หมายเหตุไว้นิดนึง search plug-in ของ 11g ยังไม่มานะครับ ต้องอดใจรออีกแป้บนึง

Wednesday, 22 August 2007

Interface21 ประกาศออก Spring Web Services 1.0


Interface21 เจ้าของ Spring Framework ได้ออก Spring Web Services 1.0
ซึ่งตัวนี้จะครอบครอบคลุมในส่วนของการพัฒนา web application ด้วยเว็บเซอร์วิสทั้งหมด
ไม่ว่าจะเป็น เว็บเซอร์วิสที่เป็น SOAP หรือ เว็บเซอร์วิสที่เป็นแบบ POX (Plain Old XML)

Spring Web Services 1.0 จะช่วยในการให้การเขียนเว็บเซอร์วิสใน Spring Framework เป็นไปได้ง่ายขึ้น
โดย Spring Web Services 1.0 นั้นมีสิ่งอำนวยความสะดวก เช่น

  • การสร้าง contract-first
  • document-driven Web services
  • delivering the flexibility
หากต้องการทราบในรายละเอียดตรงนี้ก็เข้าไปอ่านต่อได้ที่นี้ http://www.springframework.org/node/507

ที่มาของข่าว http://www.theserverside.com/news/thread.tss?thread_id=46635

Tuesday, 21 August 2007

แนะนำ "Flog Blog" เพิ่ม blog เราลงไปใน facebook

ผมได้เล่น facebook มาประมาณเดือนกว่า ๆ จากการแนะนำของคุณ mk
จุดเด่นที่สุดก็คือการ add application เข้าไปได้
ผมทดลอง add มาก็หลายตัว ตัวที่ชอบ ๆ ก็มี del.icio.us

วันนี้เจออีกหนึ่งตัวที่ชอบ จึงจะมาแนะนำกัน

ชื่อว่า Flog Blog ครับ
เห็นชื่อก็น่าจะเดาได้ ว่าเป็น Flog = Facebook + Blog
เราสามารถ add blog เรา ผ่าน feed เข้าไปใน Facebook ได้ครับ

ถ้ามี account facebook อยู่แล้วก็ add ได้เลย

http://apps.facebook.com/flogblog/home.php


ใส่ feed URL ลงไป

http://feeds.feedburner.com/OracleJava


ทีนี่ blog ของเราก็จะมาโผล่ใน facebook แล้วครับ

Monday, 20 August 2007

มีวีดีโอสอนการใช้งาน Java ด้วย Eclipse มาฝากครับ

วันนี้มีวีดีโอสอนภาษาจาวา Java ด้วย Eclipse มาฝากครับ
โดย tutorial นี้จะใช้ Eclipse 3.3 เป็นเครื่องมือในการใช้งาน


เนื้อหาที่สอนเป็น Java เบื้องต้น สำหรับมือใหม่จริง ๆ
เริ่มต้นตั้งแต่ class คืออะไร, การใช้งาน package เป็นต้น

เนื้อหามีทั้งหมด 16 บท บรรยายด้วยภาษาอังกฤษ
แต่แสดงการทำงานด้วยวีดีโอทุกขั้นตอน
เรียนตามได้ไม่ยาก ถึงแม้ใครจะฟังภาษาอังกฤษยังไม่คล่องก็ตาม

จัดทำโดยนาย Marx Dexter หนึ่งในทีมงานของ Eclipse
สามารถตามไป download ได้ที่

การติดตั้ง Oracle บน Windows Vista

หลาย ๆ คนที่ได้เปลี่ยนมาใช้งาน Windows Vista
และต้องทำงานกับ software Oracle
จะพบว่า ไม่สามารถติดตั้งได้ โดยจะพบ error ดังนี้ครับ


วันนี้ผมมีวิธีแก้ปัญหาง่าย ๆ มาให้นะครับ

1. ไปที่ file setup.exe
2. click ขวาเลือก properties


3. ไปที่ Compatibility tab


4. เลือกที่ "Run this program in compatibility mode for:" ให้เป็น Windows XP (Service Pack 2)
5. ลอง run setup.exe อีกครั้งครับ


วิธีนี้เท่าที่ใช้มาจากประสบการณ์ จะสัมฤทธิ์ผลประมาณ 90% ครับ
ไม่ว่าจะเป็น

  • Oracle Database
  • Oracle Application Server
  • Oracle Developer Suite
ที่พบว่าใช้ไม่ได้ก็จะมี Oracle Express Server, OSA และ OFA เท่านั้นครับที่ยังหาวิธีลงบน Vista ไม่ได้

หมายเหตุเพิ่มเติม ตอนนี้ Oracle ก็ได้ออก Database ที่สำหรับใช้งานบน Vista ได้โดยเฉพาะ
พร้อม patch ในตัว เป็นเวอร์ชั่น 10.2.0.3


เช่นเดียวกัน ผมก็ได้ทดลองแล้วว่าเวอร์ชั่นสำหรับ Vista นี้
ก็สามารถติดตั้งได้กับ 2000, XP, และ 2003 เช่นกัน
และที่สำคัญ ไม่ต้อง patch ต่อให้เสียเวลาด้วยครับ

Thursday, 16 August 2007

การติดตั้งและใช้งาน Oracle JDeveloper บน Linux

สืบเนื่องจากคุณ ~inSiderboy ถามมาว่า

"Jdeveloper ​มันมี​ให้​ใช้​งาน​กับ​ linux ​หรือ​เปล่าครับ​ ​ผม​เข้า​ไป​โดย​ใช้​ windows ​เปิด​แล้ว​ดันหา​ไม่​เจอ​..- -'' ​อยาก​ได้​ ​ๆ​ ​(​หรือ​ว่า​ต้อง​ download sourcebase ​มาครับ)"

ผมขอตอบในนี้นะครับ

การจะใช้งาน JDeveloper บน Linux มีขั้นตอนดังนี้ครับ

1. Download JDeveloper จาก OTN ครับ
จะมีให้เลือก 3 options นะครับ


จะเลือก Windows Install หรือ Base Install ก็ได้ครับ
สองอย่างนี้ ต่างกันที่ Windows Install จะพ่วง JDK ของ win32 มาให้ด้วยเท่านั้นเอง
แต่สามารถ run ได้บน OS อื่น ๆ เช่นกัน
เพราะ JDeveloper เป็น Pure Java IDE แท้ ๆ ครับ

2. ติดตั้ง JDK ที่ compat กับ JDeveloper ที่จะใช้งาน
วิธีการติดตั้ง JDK บน Linux ผมขอข้ามนะครับ
JDeveloper 11g (11.1.X) ใช้ JDK 5
JDeveloper 10g (10.1.3.X) ใช้ JDK 1.4
JDeveloper 10g (10.1.2.X) ใช้ JDK 1.3

3. Extract zip file ไปไว้ path ที่ต้องการ จะใช้ user root หรือ user อื่น ๆ ก็ได้


4. ไปที่ path /jdev/bin แล้วสั่งใช้งานด้วย ./jdev


5. การใช้งานครั้งแรก JDeveloper จะถามถึง JDK path ครับ
ก็ระบุ path ของ JDK ที่เราได้ติดตั้งในข้อ 2.


ใน screenshot ของผมใช้ JDK ที่มาพร้อมกับการติดตั้ง database 11g เมื่อวันก่อนครับ

6. จะมี pop up ว่าจะ migrate จากเวอร์ชั่นก่อน ๆ หรือไม่
ให้ตอบ 'No' ไปเลยครับ


7. เรียบร้อย JDeveloper บน Linux, ตะลุย coding ได้เลย


วิธีการนี้ใช้ได้กับ UNIX ทุกยี่ห้อครับ
ผมเคยลองใช้กับ Solaris และ AIX แล้วครับ

http://tardate.blogspot.com/2007/08/first-tests-of-11g-native-web-services.html

Tuesday, 14 August 2007

Review Oracle Database 11g Installation

หลังจากที่ Oracle เปิดให้ download Database 11g เมื่อวันศุกร์ที่ผ่านมา
วันนี้ผมมีโอกาสได้ทดลองติดตั้งแล้วครับ
วันนี้จึงมา review ให้ดูว่ามีอะไรเปลี่ยนแปลงไปบ้าง

ก่อนอื่น environment ที่ใช้มีรายละเอียดดังนี้
OS: Oracle Enterprise Linux 4 Updated 4 (oel4u4)
RAM: 3072 MB

ส่วนรายการที่เปลี่ยนแปลงอย่างเห็นได้ชัดคือ
1. ขนาดไฟล์ใหญ่ขึ้นครับ จาก 6XX MB ใน 10.2.0.1 เป็น 1.7 GB ใน 11.1.0.6

2. หน้าตา OUI เปลี่ยนจากสีเทาเป็นสีฟ้าครับ


3. Prerequisite package ของ Linux ที่ไม่เคยต้องใช้มาก่อน แต่ต้องมาใช้ในเวอร์ชั่นนี้

  • elfutils-libelf
  • elfutils-libelf-devel
  • unixODBC
  • unixODBC-devel
4. kernel parameter ที่ตั้งค่ามากขึ้น จากเดิม 262144 เป็น 4194304
  • net.core.rmem_default = 4194304
  • net.core.rmem_max = 4194304
5. Enterprise Manager ที่ใช้ SSL เป็น default


6. Enterprise Manager ที่ใช้ OC4J 10.1.3 เป็น container

7. สุดท้าย Enterprise Manager เปลี่ยนเป็นสีฟ้า เช่นเดียวกับ EBS R12 ครับ


เดี๋ยวขอทดลองใช้งานสักพักนะครับ แล้วจะมา update feature เด็ด ๆ ให้ฟัง

บทความที่เกี่ยวข้อง

Friday, 10 August 2007

ด่วน Oracle Database 11g เปิดให้ download แล้วครับ

มาแล้วครับ หลังจากรอมานาน

ตอนนี้ Oracle เปิดให้ download database 11g แล้วครับ
เป็น platform linux ครับที่ออกมาให้ download ก่อนใคร

ทันทีที่ผม download และติดตั้งเสร็จ จะเอามาโชว์ให้ดูอีกทีครับ

หมายเหตุ: ถ้าใครจะ download ให้สมัคร account OTN ก่อนครับ และอ่าน license information ให้ดีด้วยครับ

บทความที่เกี่ยวข้อง

Thursday, 9 August 2007

ตอนที่​ 2 Struts ​มาลองเล่น​กัน​ดูว่ามันดี​ยัง​ไง


จากตอนที่แล้วบอกคร่าวๆเกี่ยวกับ design patten MVC ว่ามีความหมายอย่างไรในตอนนี้เราจะมาเข้าเรื่องกันครับ เรื่องที่จะอธิบายในตอนนี้คือผมจะเริ่มสร้าง Struts Application อย่างง่ายๆเพื่อให้เข้าใจหลักการทำงานก่อน

ก่อนที่เราจะใช้ Strut Framework นั้นเรามาติดตั้งส่วนต่างๆที่จำเป็นจะต้องใช้ก่อน

1.ติดตั้ง JDK1.4 หรือเวอร์ชั่นสูงกว่า สามารถ download ได้จาก sun

2. ติดตั้ง IDE เพื่อช่วยในการเขียนเช่น Eclipse, Netbeans, JDev หรืออะไรก็แล้วแต่ เพียงแต่ที่ยกตัวอย่างมานั้น Netbean และ JDev นั้น support Struts ด้วยกันทั้งนั้นแต่ Eclipse ไม่ได้ support Struts จึงต้อหา plugin มาช่วยใช้ในการพัฒนา เช่น Exadel หรืออาจจะใช้ Myeclipse ที่รวม plugin สำคัญๆไว้หมดแล้วก็ได้ อันนี้แล้วแต่ครับขึ้นอยุ่กับความถนัดใน IDE ของแต่ละคน ขั้นตอนการใช้งานก้ต่างกันนิดหน่อยครับ แต่ที่ผมใช้คือ Eclipse+Exadel เพราะว่า plugin Exadel ภายในจะประกอบด้วย tomcat, struts framework ซึ่งเราไม่ต้องลง tomcat และ struts เลยมันมีให้เบ็ดเสร็จ เพียงแค่ install plugin Exadel ก็ใช้งานได้เรียบร้อย
ซึ่งถ้าคุณไม่ใช้ plugin Exadel ก็ต้องติดตั้ง Tomcat และ Struts

- ติดตั้ง Tomcat สามารถ download ได้จาก ที่นี่ ซึ่งมีหลาย version ให้ใช้งานและในแต่ละเวอร์ชั่นก็มีหลายแบบให้ download ผมแนะนำให้ download แบบ .zip
เมื่อ download มาแล้วก้ขยาย zip ไว้ก็เรียบร้อย เราใช้ tomcat เพื่อทำหน้าที่เป็น http server และ servlet container
ในส่วนนี้เราสามารถใช้ application server ตัวอื่นๆก็ได้เช่น oc4j, glassfish, jboss, oracle application server ฯลฯ ในตัวอย่างนี้ผมขอใช้ tomcat เพราะไม่กิน resource มากแล้วก็ฟรีครับ ^^

- ติดตั้ง Struts Application download ได้จาก ที่นี่ ในปัจจุบัน Struts ออกเวอร์ชั่น 2 แล้วแต่ที่ผมใช้อยู่เป็น Struts 1.3.8
เมื่อ download มาแล้วให้แตกไฟล์ออกมาจะได้ folder struts-1.3.8 ให้เข้าไป struts-1.3.8\apps จะเห็น war ไฟล์
- struts-black-1.3.8.war เป็น struts application เปล่าๆที่ใช้ในการสร้าง struts application ซึ่งเราจะใช้ไฟล์นี้ในการสร้าง web application ของเรา
- struts-documentation.war จะเป็นที่เก็บ api และ documents สำคัญต่างๆที่เกี่ยวกับการพัฒนา Struts application
- struts-example.war เป็นตัวอย่าง MailReader application เอาไว้ให้เราลองศึกษาดู
จากนั้นให้เรา copy war file พวกนี้ไปที่ \webapps

เมื่อทุกอย่างพร้อมแล้ว มาเริ่มพัฒนา Struts Application กันโดยใน web application ตัวนี้ผมจะสร้าง form ง่ายๆเอาไว้รับข้อมูลที่คุณกรอกแล้วให้แสดงผลในอีก page นึง

1. new project ใหม่ขึ้นมา ถ้าใช้ Eclipse ก็เลือก File > New > Project > Exadel Studio > Struts > Struts Project และทำการตั้งชื่อ Project กับ Struts ที่ใช้ จากนั้น Eclipse จะสร้าง project ที่พร้อมกับการใช้าน Struts ให้เราทันที

2. จากนั้นลองมาดูจุดสำคัญที่สุดของ Struts คือส่วนของ Controller คือไฟล์ web.xml จะเห็นว่า Plugin Exadel Studio ได้เพิ่ม tag ที่จำเป็นต่อการใช้งาน Strtus ไว้แล้วได้แก่
- tag servlet-name action ให้ mapping กับ class ActionServlet
- tag init-param config ให้ mapping กับ struts-config.xml ซึ่งเป็นไฟล์ที่ใช้ในการรับ/ส่ง request/response
- tag servlet-name action ให้ mapping กับ url-pattern ที่มีนามสกุล .do ผลลัพธ์ที่ได้คือเมื่อมี request สำหรับ Struts พวกนามสกุล .do ทั้งหลาย จะถูกส่งมาที่ struts-config.xml ซึ่งตรงนามสกุล .do เราสามารถเปลี่ยนเป็นนามสกุลอื่นก็ได้
- tag taglib เพื่อให้ application เราสามารถอ้างถึง taglib ที่ Struts เตรียมไว้ให้ได้


<web-app>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
....
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

<taglib>
<taglib-uri>/WEB-INF/struts-bean</taglib-uri>
<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-logic</taglib-uri>
<taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-html</taglib-uri>
<taglib-location>/WEB-INF/struts-html.tld</taglib-location>
</taglib>
....
<web-app>


3. จากนั้นคลิกขวาที่ WebContent สร้างไฟล์ welcome.jsp แล้วใส่ code ตามนี้เลยครับ


<html>
<head>
<title>First Struts Application</title>
</head>
<body>
<form name="form1" method="post" action="WebTypeAction.do?" >
Firstname: <input type="text" name="firstName" /> <br/>
Lastname: <input type="text" name="lastName" /> <br/>
<input type="submit" value="submit" />
</form>
</body>
</html>

เป็นแค่ช่องกรอก inputfield 2 ช่องเท่านั้นเอาไว้กรอกชื่อและนามสกุล

4. จากนั้นไปที่ struts-config.xml ใส่ code ตามนี้


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
<form-beans>
<form-bean name="UserForm" type="org.apache.struts.action.DynaActionForm">
<form-property name="firstName" type="java.lang.String"/>
<form-property name="lastName" type="java.lang.String"/>
</form-bean>
</struts-config>
<action-mappings>
<action name="UserForm" path="/UserAction" type="action.UserAction">
<forward name="users" path="users.jsp"/>
</action>
</action-mappings>
</struts-config>

อธิบาย:
<form-bean>
- name ใช้กำหนดชื่อที่เราจะใช้ในการอ้างถึง formbean ตัวนี้โดยที่ตรงชื่อนี้ต้องชื่อเดียวกับ form ที่อยู่ในหน้า welcome
- type ใช้กำหนดที่อยู่ของ class ActionForm ซึ่งถ้าใช้ class DynaActionForm เราไม่ต้องสร้าง class ActionForm ของเราเอง ActionForm ใช้ในเรื่องของการเก็บข้อมูลออกมาจาก Form บนหน้าเว็บ
<form-property>
- name ใช้กำหนดชื่อให้กับ UserForm ของเราเพื่อใช้ในการอ้างถึงภายหลังใน class Action
- type ใช้กำหนด datatype
<action>
- name ใช้กำหนดชื่อของ formbean ที่จะใช้กับ action นี้
- path ใช้กำหนด path ที่เราสามารถอ้างถึง action นี้ได้
- type ใช้กำหนดที่อยู่ของ class Action
<forward>
- name ใช้กำหนดชื่อ forward
- path ใช้กำหนดไฟล์ที่จะ forward ไปหา

5. ต่อไปจะเป็นการเขียน class Action ที่เอาไว้ควบคุมการรับ request จาก welcome.jsp(view) และจะส่ง request ไปที่ไหนต่อคือเราอาจส่งไปให้ model ที่เขียน class ที่ติดต่อกับ database หรือจะ
ส่งไปให้ class Action หรืออาจจะส่งไปให้ view ก็ได้ แต่ในตัวอย่างนี้เมื่อเข้ามาที่ class Action และทำงานจนเสร็จผมจะส่งต่อไปให้ users.jsp(view)
เริ่มโดยการ new class ขึ้นมาชื่อ UserAction โดยให้อยู่ใน package action จากนั้นนำ code นี้ไปวาง


package action;

public class UserAction extends org.apache.struts.action.Action {

public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
String firstName = (String)request.getAttribute("firstName");
String lastName = (Stirng)request.getAttribute("lastName");
request.setAttribute("name", firstName + " " + lastName);
return mapping.findForward(users);
}
}

อธิบาย: class ที่จะเรียกว่าทำหน้าที่ action ได้ต้อง extends มาจาก class org.apache.struts.action.Action และทำการ overrides method execute ซึ่งรับ parameter ที่สำคัญๆของ Struts 2 ตัวคือ
- mapping ใช้ในการเลือก instance
- form นี้จะใส่หรือไม่ใส่ก็ได้แต่ถ้าเราใช้ formbean ก็ต้องใส่ด้วยเพื่อที่จะเอาค่าออกมาจาก formbean
ใน method นี้จะทำการรวมคำระหว่างชื่อกับนามสกุล แล้วส่งออกไปยังอีกหน้านึงผ่านทาง request scope ในตอนสุดท้ายของ method นี้เราสั่ง return ให้ไปหน้า users โดยเดี๋ยว Struts จะไปหาเองว่า object ActionForward มัน mapping กับ forwardname ตัวใดซึ่งตรงนี้ก็ที่เรากำหนดไว้ใน struts-config.xml

6. สร้าง user.jsp ขึ้นมาแล้วใส่ code ตามนี้


<html>
<head>
<title>First Struts Application</title>
</head>
<body>
<% out.println("welcome " + request.getAttribute("name")); %>
</body>
</html>


เมื่อทำงานในส่วน Action เสร็จ มันจะมาที่หน้า users.jsp แล้วแสดง ชื่อและนามสกุลออกมาโดยเอาตัวแปรที่ชื่อ name ออกมาจาก request scope

7. จากนั้นทดสอบ run ดูเลยครับโดยการ start tomcat ขึ้นมาก่อนจากนั้นค่อย run on server ที่หน้า welcome.jsp ทดสอบกรอกชื่อและนามสกุลลงไปกด submit จะเห็นว่าจะไปเปิดอีกหน้า users.jsp แล้วแสดงชื่อนามสกุลออกมา

นี้เป็นการสร้าง web application ง่ายๆโดยใช้ Struts Framework ซึ่งหัวใจของมันจะอยู่ที่ controller สังเกตุดีๆเวลาเขียน class UserAction มันจะคล้ายๆ เวลาเราเขียน Servlet แต่ถ้าใช้ Servlet เราต้องมา getRequest แต่ละตัวเอาเองหรือบางทีเราก้ต้องมา validate เอาเองด้วย ซึ่งตรงนี้ใน Struts มี Struts-Validate เอาไว้ให้เรานำไปใช้ด้วยต้องลองเล่นกันดูครับ ^^

เริ่มเห็นประโยชน์ของการออกแบบตาม MVC รึยังครับ เพราะเราสามารถเขียนขึ้นมาอีก class นึงเพื่อติดต่อกับ database แล้วให้ class Action เป็นตัวจัดการว่า request นี้จะไปติดต่อกับ class ที่ติดต่อกับ database ตัวใด การออกแบบอย่างนี้ทำให้เราสามารถ reuse class ที่เราเขียนไปได้ครับเช่น ถ้าเรามี view 2 ตัวแต่ใช้ database ตัวเดียวกัน เราก็เขียน class ที่ติดต่อกับ database เพียงแค่ class เดียวแล้วให้ class Action เป็นตัวจัดการ ผิดกับแบบที่ถ้าเราเขียน ตัวติดต่อ database ไว้ใน view

ผมหวังว่าบทความนี้คงมีประโยชน์ต่อผู้ที่ต้องการลองเล่น Struts Framework ไม่มากก็น้อย ถ้าผิดพลาดประการใดติชมได้นะครับทุกความคิดเห็นผมจะ นำไปปรับปรุงแก้ไขต่อไปขอบคุณครับที่อ่านจนจบ :>

Wednesday, 8 August 2007

การแก้ปัญหา Oracle Reports ให้ใช้งาน PDF ภาษาไทยได้

ปัญหานึงที่ผมมักจะเจอจากลูกค้าและ partner ออราเคิลบ่อย ๆ
ก็คือเรื่องการแสดงผลภาษาไทยบน Oracle Reports แบบ PDF

วันนี้ผมจะสรุปวิธีการ ขั้นตอน และการแก้ปัญหาให้ครับ

แต่สำหรับตอนนี้ ผมจะให้วิธีการของ Windows Platform ก่อนครับ
ขั้นตอนน้อยกว่าและง่ายกว่าการทำบนตระกูล UNIX
และที่สำคัญ มีเพื่อนร่วมงานผม ที่อยู่ต่างบริษัทกัน กำลังจำเป็นต้องใช้แก้ปัญหานี้บน Windows ครับ

1. ผมจะถือว่าขั้นตอนการติดตั้ง Oracle Application Server เสร็จสมบูรณ์แล้ว และไม่มีปัญหาใด ๆ
2. เพิ่มตัวแปร NLS_LANG เข้าไปในระบบครับ
ผมจะใช้วิธีเพิ่มที่ System Variable ครับ เพราะว่าวิธีนี้จะดีกว่าการเพิ่มใน regedit ครับ เพราะทำที่เดียว ครั้งเดียว
2.1 ไปที่ System Properties ครับ



2.2 ไปที่ Environment Variables



2.3 เพิ่ม System variables เพิ่ม New ครับ
2.4 ใส่ตัวแปร

Variable Name: NLS_LANG
Variable Value: AMERICAN_AMERICA.TH8TISASCII



หมายเหต: ควรตั้งค่า Variable Value ให้ตรงกับ database character set
และค่า NLS_LANG ของเครื่องที่สร้าง file .rdf



3. แก้ไข file uifont.ali
3.1 ไปที่ folder ORACLE_HOME\tools\common จะเจอ file uifont.ali
3.2 เปิด file นี้ หาย่อหน้าที่ว่า

[ PDF:Subset ] #
This example shows how to subset Arial True Type font into the PDF file
# Arial = "Arial.ttf" # The True Type font files must exist in any one of the folders specified in # REPORTS_PATH.


3.3 เพิ่ม fonts ที่ต้องการใช้ลงไป ตัวอย่าง

AngsanaUPC = "ANGSAU.ttf"
CordiaUPC = "CORDIAU.ttf"
"Angsana New" = "ANGSA.ttf"
"Cordia New" = "CORDIA.ttf"



3.4 copy fonts ที่ได้ระบุในข้อ 3.3 ลงไปใน folder ORACLE_HOME\reports\samples\demo

4. Restart Oracle Services ที่เกี่ยวข้อง

5. สำเร็จครับ



ส่วนการแก้ปัญหานี้บน UNIX ไว้จะเอามาลงใน blog อีกทีครับ