Wednesday 31 October 2007

Oracle Database Backup and Recovery Concept

เมื่อต้นเดือนที่ผ่านมาได้รับโจทย์ให้ไปดูแล Oracle Database ที่ไซต์ของลูกค้า และสิ่งที่ขาดไม่ได้ในการดูแล database นั่นคือเรื่องของการ backup database เลยใช้เวลาหาเรื่องเกี่ยวกับการ backup ซักระยะแล้วก็เริ่มหงุดหงิดกับบทความภาษาไทยที่บอกไม่ละเอียดเลย มีบอกนั่นนิดมีบอกนี่หน่อย พอกันทีครับไป otn ดีกว่า มือใหม่อย่างผมก็นั่งงมอยู่ซักพักก็เริ่มจับหลักได้
ผมจึงตั้งใจจะเขียนเรื่องการ backup database โดยแบ่งออกมาได้เป็น 3 ตอน
1. Oracle Database Backup & Recovery Concept
2. Oracle Database Backup (RMAN)
3. Oracle Database Recovery
แล้วจะค่อยๆทยอยเขียนให้อ่านเรื่อยๆถ้ายังไม่เบื่อกันก่อน ok เข้าเรื่องเลย
สำหรับตอนนี้เป็นตอนแรกผมอยากให้เข้าใจ concept ของการทำ backup & recovery database กันก่อนให้เข้าใจก่อนว่า failure สามารถเกิดได้ในเหตุการณ์ไหนบ้าง
Backup และ Recovery จะเกี่ยวข้องกับยุทธวิธีและขั้นตอนการป้องกันข้อมูลไม่ให้สูญหายและคืนสภาพให้กับ database เมื่อข้อมูลเสียหาย
Backup คือการ copy ข้อมูลจาก database เพื่อนำมาใช้สร้าง database เมื่อ database มีข้อมูลเสียหาย แบ่งได้เป็น 2 ประเภท

  • Physical backup คือการ backup ข้อมูลจาก physical file เช่น data file, control file, archive redo log file วิธีการ backup มี 2 วิธี
    • Manual Backup คือการเราเข้าไป copy physical database file แต่ต้องทำขณะที่ shutdown database อยู่
    • Recovery Manager (RMAN) เป็น utility ที่ Oracle ทำขึ้นมาเพื่อทำหน้าที่ backup restore and recovery โดยเฉพาะสามารถทำได้ขณะที่ database กำลัง online อยู่
  • Logical backup คือการ backup พวกข้อมูลที่เป็น Logical เช่น Tables, stored procedures ซึ่งอาจใช้ Oracle export utility
Physical backup เป็นรากฐานของการ backup ส่วน Logical backup ทำเพื่อช่วย support physical backup เพราะมันไม่สามารถกู้ Oracle database ส่วนที่เสียหายกลับคืนมาได้ทั้งหมด เช่นถ้า control file เสียหาย Logical backup ไม่สามารถกู้คืนกลับมาได้เนื่องจาก Logical มันเป็นแค่ข้อมูลที่ backup มาจาก data file

เป้าหมายของการทำ backup
  • Mean Time Between Failure (MTBF) หมายถึงเพิ่มเวลาเมื่อเกิด database failure แต่ User ยังสามารถทำงานต่อไปได้โดยไม่รู้สึกว่า database failure
  • Mean Time To Recover (MTTR) คือการใช้เวลาให้น้อยที่สุดในการ recovery database
  • ป้องกันไม่ให้เกิด Database Failure
  • เมื่อ Recovery กลับมาแล้วข้อมูลควรเสียหายน้อยที่สุด และต้องใช้งานได้เหมือนเดิม

Database Failure ที่อาจเกิดขึ้นได้
  • Statement Failure สาเหตุเกิดจาก
    • syntax ไม่ถูกต้อง
    • application logic failure
    • User ไม่มีสิทธิ์ส่งคำสั่งนั้น
    • User ใช้พื้นที่ tablespace เกิน quota ที่กำหนด ถ้าเกิดปัญหาในข้อนี้สามารถแก้ได้โดยให้ dba เพิ่ม quota ให้ user แต่เราสามารถดักให้ error ที่เกิดขึ้นนี้หน่วงเวลาออกไปได้โดยเข้าไปกำหนดใน parameter RESUMABLE_TIME=xxx (วินาที) ซึ่งในระหว่างนี้ให้ dba เข้าไปเพิ่ม quota ให้กับ user ที่เกิดปัญหาหลังจากนั้น statement ที่ error นั้นสามารถทำงานต่อไปได้
    • failure ประเภทนี้ที่ไม่ต้องมี backup และไม่ต้องทำ recovery เพราะไม่มีผลกระทบอะไรกับ database Oracle สามารถจัดการกับปัญหาที่เกิดขึ้นทั้งหมดได้

  • User Process Failure สาเหตุเกิดจาก
    • User ที่ disconnect database แบบผิดปกติ เช่น user ทำ transaction ต่างๆอยู่แล้วยังไม่ commit เกิดข้อผิดพลาดขึ้นใน application ทำให้ application ต้องหยุดการทำงานไปทำให้ user ออกจาก database แบบผิดปกติ
    • ซึ่งถ้าเกิดความผิดปกติประเภทนี้ เราจะรู้ได้ทันทีจาก background process Process Moniter (PMON) โดยสิ่งที่ Oracle จะแก้ไขปัญหานี้คือ Oracle จะ rollback transaction ที่ทำค้างของ User คนนั้น และปลดล็อคคืนให้กับระบบ failure ประเภทนี้ไม่ต้องมี backup และไม่ต้องทำ recovery

  • Network Failure สาเหตุเกิดจาก
    • Listener Fails เมื่อเกิดเหตุการณ์นี้ client จะไม่สามารถเข้ามาใช้งาน Oracle Database ได้เลย เป็น failure ที่เล็กน้อยแต่เป็นปัญหาใหญ่ การป้องกันไม่ให้เกิด failure ประเภทนี้คือ สร้างเส้นทางสำรองให้กับ listener ทำโดยสร้าง listener process อีก 1 ตัว แล้วเลือก option connection fail over เป็น advance option จากนั้นเราต้องทำให้ client รู้จัก listener รู้จักกับเส้นทางสำรองผ่าน listener โดยการ config tnsname.ora
    • ระบบ network fails
    • ปัญหาอย่างนี้ไม่เกี่ยวข้องกับข้อมูลของ database เลยไม่ต้องมี backup ไว้

  • User Error สาเหตุเกิดจาก
    • ความผิดพลาดจาก user เอง เช่นการลบ table ผิดซึ่งพบได้บ่อยมาก ใน Oracle Database 10g จึงได้เพิ่ม feature ใหม่เข้ามาคือ flashback ซึ่งสามารถเอา table ที่ถูกลบไปแล้วกลับมาได้ด้วย user คนนั้นเอง แต่ก็ต้องดูด้วยว่าข้อมูลที่จะ flashback กลับมานั้นยังอยู่ใน undo table หรือไม่
    • ตัวอย่างการใช้คำสั่ง flashback
      SQL> DROP Table hr.job_history;
      Table dropped.
      SQL> FLASHBACK TABLE hr.job_history TO BEFORE DROP;
      Flashback complete.
      ตารางที่ลบไปแล้วจะถูกเปลี่ยนชื่อโดยขึ้นต้นว่า bin ถ้าเราต้องลบ table ที่อยู่ใน recycle bin คำสั่ง PURGE
      ตัวอย่างการใช้คำสั่ง purge
      SQL> purge recyclebin ; อันนี้ลบทั้งหมด
      SQL> purge table ... ;
      SQL> purge index ... ;
      Failure ประเภทนี้อาจต้องใช้ backup เพื่อทำ recovery เพราะว่าถ้าใช้ คำสั่ง PURGE จะทำให้ table ที่อยู่ใน recycle bin จะถูกลบไปถาวร

  • Media Failure อาจเกิดขึ้นกับ disk ที่ไม่ว่ากรณีใดๆ เมื่อเกิดขึ้นแล้วต้องมี backup และต้องทำ recovery ให้กับ database

  • Instance Failure สาเหตุอาจเกิดจาก
    • ไฟดับ
    • Hardware failure
    • Background processes Failure
    • Emergency shutdown เช่นการส่งคำสั่ง shutdown ABORT และ start FORCE
    • Failure ประเภทนี้ต้องมี backup เพื่อเอาไว้ recovery Failure ประเภทนี้ Oracle สามารถตรวจเจอได้เอง
      การที่ Instance Failure มีโอกาสสูงที่จะทำให้ข้อมูลไม่ synchonize กันเพราะเมื่อมีการส่งคำสั่ง update เข้ามามีผลทำให้ข้อมูลมีการเปลี่ยนแปลง ข้อมูลที่เปลี่ยนแปลงจะถูกเก็บลงใน redo log buffer แล้วเมื่อ user ส่ง commit เข้ามาข้อมูลที่เปลี่ยนแปลงจึงถูกเขียนลงใน redo log file แต่ยังไม่เขียนข้อมูลที่เปลี่ยนแปลงลงใน data file มันจะรอจนถึงกระบรวนการ checkpoint ให้ background process Database Writer (DBWR) เขียนข้อมูลลง data file ให้เป็นข้อมูลเดียวกันระหว่าง redo log file กับ data file ข้อมูลทั้งสอง file จึง synchonize กัน แต่ถ้าระหว่างนี้ เกิดเหตุการณ์ที่ทำให้เกิด Instace Failure ทำให้ข้อมูลที่ถูกเปลี่ยนแปลงล่าสุดจริงๆอยู่ที่ redo log file แต่ Oracle สามารถตรวจจับความผิดปกติตรงนี้ได้และแก้ไขให้เราแต่ต้องอาศัยให้ dba startup database ให้
      ขั้นตอนการทำงานของ Instance Recovery
      ข้อมูลตัวสำคัญที่บอกว่าข้อมูล synchonize กันหรือไม่นั่นค่าของ SCN (System Change Number) ค่า SCN จะบอกว่า ณ ตอนนี้ข้อมูลมีการเปลี่ยนแปลงไปครั้งที่เท่าไหร่แล้ว SCN จะเกิดขึ้นทุกครั้งที่มีการ commit Database จะสร้างเลข SCN ขึ้นมา 1 ตัวและบวกเพิ่มขึ้นไปเรื่อยๆ แล้วเก็บลงใน data file, control file, redo log group
      ตัวอย่าง Instance Failure
      ใน redo log group กับ control file ค่า SCN ล่าสุดคือ 143 แต่ data file ค่า SCN ล่าสุดคือ 140 จะเห็นว่าค่าตอนนี้ไม่ synchonize กัน ซึ่ง background process ที่จะมา stamp ให้ค่า SCN ตรงกันคือ background process Check Point (CKPT) เมื่อมา stamp แล้วเห็นว่าค่า SCN ไม่ตรงกันก็บอกให้รู้แล้วว่า Instance Failure จึงต้องทำ Instance Recovery จากนั้นจะไปเรียกให้ SMON ให้ทำงาน โดย SMON จะทำอยู่ 2 operation นั่นคือ Row forward กับ transaction ที่ commit แล้วคือเอาข้อมูลที่อยู่ใน redo log file ไป update ใน datafile ให้แล้ว, Row backward กับ transaction นั้นถูก rollback หรือถูก force ให้ rollback คือไปเอาข้อมูลใน undo data มาใส่ใน table เหมือนเดิม
      การทำ Instance จะต้องมีจุดเริ่มทำซึ่งจะเกี่ยวข้องกับ checkpoint คือเริ่มทำในตำแหน่งที่ยังไม่ถูกทำ check point เป็นต้นมา จะเห็นว่า checkpoint ถี่ก็มีข้อดีคือ recvoery เร็วขึ้น แต่ก็ทำให้ performance ตกลงเช่นกันเมื่อทำ checkpoint การจะดูว่าควร checkpoint ถี่แค่ไหนให้ดูจาก MTTR

Mean Time To Recovery (MTTR) ระยะเวลาในการทำ recovery
เราสามารถเข้าไปกำหนดได้ว่าเมื่อมีการ recovery ให้ใช้เวลาเท่าไหร่ ถ้าเข้าไปดูที่ OEM จะมีบอกรายละเอียดด้วยว่าถ้ามีการ recovery ต้องใช้เวลาประมาณเท่าไหร่ หรือเราเข้าไปกำหนดได้ใน Parameter FAST_START_MTTR_TARGET ถ้าเรากำหนดค่าน้อยจะมีผลทำให้ checkpoint บ่อยขึ้น แต่ถ้าใส่ค่ามากจะมีผลทำให้ checkpoint นานขึ้น ซึ่งค่ามากที่สุดคือ 3600 วินาที (1 ชั่วโมง) ค่า default คือ 0 (disable) ซึ่งตรงนี้ถ้าเป็น disable Oracle จะเข้าไปดู paramter ตัวอื่นที่เกี่ยวข้องด้วยคือ LOG_CHECKPOINT_TIMEOUT (วินาที)

การวางแผนเรื่องการ backup
  • ควรมีตารางการ backup เช่น ทุกๆวัน, ทุกๆวันพุธ, ทุกเดือน ซึ่งตรงนี้จะถี่แค่ไหนขึ้นอยู่กับ data ว่ามีการเปลี่ยนแปลงบ่อยแค่ไหน
  • ควรทำ Multiplex Control Files ถ้าไม่มี control files Instance Database จะ statup ไม่ขึ้น
  • ควรทำ Multiplex Redo log groups
  • Production System ควร run อยู่ใน ArchivedLog mode เพื่อป้องกัน loss data
  • สร้าง redundancy ให้กับระบบของเราด้วยการใช้ RAID-based เพื่อให้ระบบสามารถทำงานต่อไปได้เมื่อ disk failure และแถมยังเป็นการการรันตีว่าข้อมูลจะไม่สูญหายไปเมื่อ disk failure
  • ทำการ backup เป็นประจำเพื่อเมื่อถึงเวลาที่ต้องทำการ recovery จะได้กลับไปจุดที่ทำการ backup ครั้งล่าสุดได้ไม่ไกลจากช่วงเวลาปัจจุบันนัก
  • รักษาอุปกรณ์เก็บข้อมูล และมั่นทดสอบว่าข้อมูลที่เก็บอยู่สามารถใช้งานได้จริง
  • run noarchivelog mode เมื่อคุณแน่ใจว่าระบบมีเวลา downtime
  • หลังจากมีการเปลี่ยนแปลงโครงสร้างของ database ควรมีการ backup control file อยู่เสมอ
  • ควรมีการ backup ลงใน tape และ tape ก็ควร backup อีกเช่นกัน
  • ควรมี 2 copies ของ archived redo logs อันนึงเก็บไว้ใน disk และอีกอันเก็บไว้ในอุปกรณ์เก็บข้อมูลอย่างอื่น เพื่อที่ว่าเมื่อมีปัญหาจะได้ดึง archived redo log ที่อยู่ใน disk มาใช้งานได้อย่างรวดเร็วหรือถ้ามีปัญหาอีกก็ดึงจากอุปกรณ์เก็บข้อมูลภายนอก
  • ไฟล์ที่เราควร backup ได้แก่ data files, log files, control files, spfile หรือ init.ora, sqlnet.ora, tnsnames.ora, listener.ora และ password file
  • เก็บมี copy backup อันเก่าไว้ด้วย เผื่อที่ว่า backup ปัจจุบันใช้งานไม่ได้ขึ้นมา(ซึ่งมีโอกาสเป็นไปได้)
  • script backup ควรมีเก็บ log file ได้ด้วยเผื่อมี error เกิดขึ้นระหว่างการ backup จะได้รู้
  • แต่ละ application ควรมีการใช้งานแยก tablespace กันเพื่อที่ว่าถ้า tablespace ใดมีปัญหาเกิดขึ้น application อื่นๆยังคงใช้งานได้ต่อ
  • ใช้ snapshot technology เพื่อเก็บ system backup เพราะว่ามัน backup ได้อย่างรวดเร็วกับ database ขนาดใหญ่
  • ใช้ data pump export utility เพื่อช่วยในการสนับสนุนการ backup

Control Files
เป็น file ควบคุมเก็บสถานะการทำงานของ database โดยสิ่งที่ Control File เก็บเช่น mode การทำงานของ database, เก็บ physical structure เช่นว่า data file กี่ตัวอยู่ path อะไรที่ไหนบ้าง
Control File จะถูกอ่านเมื่อ startup database MOUNT mode แต่ยังไม่ตรวจสอบความถูกต้องของ control file ซึ่งถ้าไม่มี control file จะ startup database ได้แค่ NOMOUNT mode ดังนั้น Oracle จึงแนะนำว่าควรทำ Multiplex Control files ทั้งหมด 3 file และแต่ละตัวควรอยู่คนละ disk กัน ซึ่งตรงนี้ถ้าใช้ DBCA เป็นตัว create database จะสร้าง control file ให้ทั้งหมด 3 file
การทำ Multiplex Control Files ต้องทำ 2 ขั้นตอนคือ
  • ทำในระดับ Database เข้าไปแก้ไข parameter CONTROL_FILE (static parameter) ต้อง shutdown ก่อนจึงจะเห็นผล
    ex. CONTROL_FILES=’’,’’
  • ทำในระดับ OS เริ่มแรกให้ shutdown database ก่อนจากนั้นเข้าไป copy control file ที่ใช้งานอยู่ปัจจุบัน แล้วไปวางใน path ที่ระบุไว้ใน parameter แล้วเปลี่ยนชื่อให้ตรงกับค่าใน paramter ด้วย จากนั้น startup database แล้วเข้าตรวจสอบความถูกต้อง โดยดูได้จาก view V$CONTROLFILE
  • ข้อดีของการทำ Multiplex Control Files คือถ้ามี Control File ตัวใดตัวหนึ่งเสียหายไปอีกตัวสามารถทำงานแทนกันได้โดย Database จะไปอ่าน Control File ที่ยังใช้งานได้อยู่จาก paramter CONTROL_FILES

Redo Log Files
เป็น file ที่เก็บข้อมูลที่เปลี่ยนแปลง โดยจะมี background process log writer (LGWR) ทำหน้าที่เขียน redo log file ให้ก่อนที่จะเขียนลงใน redo log file จะมี memory ตัวนึงที่เก็บข้อมูลที่เปลี่ยนแปลงอยู่เรียกว่า redo log buffer และจะเขียนลงใน redo log เมื่อมีคำสั่ง commit หรือเหตุการณ์อื่นๆ
โครงสร้างของ redo log จะเป็น group ในแต่ละ group จะมี redo log file เป็น member ถ้าใช้ DBCA เป็นตัว create database จะสร้าง redo log group ให้ 3 group และ redo log file ให้ group ละ 1 file ซึ่งเป็นค่า default ของ DBCA แต่อย่างนี้ยังไม่เป็น Multiplex redo log file จะเป็น Multiplex redo log file ก็ต่อเมื่อในแต่ละ redo log group มีมากกว่า 1 redo log file และถ้าให้ดีแต่ละ member ควรจะแยกอยู่กันคนละ disk
ข้อดีของการทำ Multiplex Redo Log File คือ ถ้า member ใดใน group นั้นเสียหายไป Database ก็ยังทำงานได้อยู่เพราะยังมี member อีกตัวทำงานแทนกันได้ และถ้าให้ดี member ที่อยู่ใน group
Note: ถ้าใช้ DBCA สร้าง database จะมี mulitplex control file แต่ไม่มี multiplex redo log file

Archived Log Files
เป็น file ที่เก็บ copy ของ redo log file ก่อนที่ LGWR จะเขียนทับลงใน redo log file path ที่เก็บ archive log file โดย default จะเก็บอยู่ที่ตำแหน่งเดียวกับ flash recovery area ดูได้จาก parameter DB_RECOVERY_FILE_DEST ตำแหน่งที่ 10
เราสามารถกำหนด path ของ archive log file เพิ่มเติมได้ นอกจากจะเก็บลงใน default path ยังสามารถกำหนดได้เองอีก 9 path จาก parameter LOG_ARCHIVE_DEST_<1-10>=""เท่ากับเป็นการ copy archive log file เพิ่มขึ้นเหมือนเป็นการ backup ซึ่งกันและกัน วิธีนี้จะมีประโยชน์ในกรณีที่ archive log file default ใช้งานไม่ได้ database จะย้ายไปใช้อีก path ให้
โดย default archive log file จะมีก็ต่อเมื่อเรา enable archivelog mode แต่ค่า default จะเป็น disable
การตรวจว่า database ขณะนี้ run อยู่ใน mode อะไร
SQL> select archiver from v$instance;
--ถ้าค่าคือ STARTED=archivedlog mode หรือ STOPPED=noarchivedlog mode
หรือ
SQL> select name, log_mode FROM v$database;
หรือ
SQL>ARCHIVE LOG LIST; --ถ้าอยู่ใน archivedlog mode จะแสดงรายละเอียดออกมา
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 18
Next log sequence to archive 20
Current log sequence 20
การเปลี่ยน mode database ให้เป็น archivelog mode หรือ noarchivelog mode
SQL> shutdown
SQL> startup mount
SQL> ALTER DATABASE [ARCHIVELOG | NOARCHIVELOG]
SQL> ALTER DATABASE OPEN;

ถ้าสงสัยตรงไหนหรืออยากให้เพิ่มตรงไหนบอกได้ครับ
สำหรับตอนนี้ขอจบไว้เพียงแค่นี้ครับ ตอนหน้าเทคนิคเน้นๆทำ backup ให้เห็นกันจะๆครับ

Sunday 28 October 2007

ADF BC: Trigger & Entities

เมื่อเราทำการ update, insert, delete ข้อมูล และต้องการ จัดการข้อมูล record ที่เราทำงานอยู่เพิ่มเติมทุกครั้งโดยอัตโนมัติ (คล้ายการทำงานของ trigger)
เช่น ต้องการคำนวนค่าจากข้อมูลที่ใส่เข้ามา ไปใส่ใน filed อื่น ของ record เดียวกันทุกครั้งที่มีการเพิ่มข้อมูล, ต้องการใส่ชื่อผู้ใช้ทีแก้ไขข้อมูล ทุกครั้งที่มีการแก้ไขข้อมูล

ของผมที่ใช้อยู่เป็นประจำ ก็จะเป็นการบันทึกข้อมูลของ user คนล่าสุดที่มา insert, update ข้อมูล record นั้นๆ โดยที่ไม่ต้องไปเขียน code ซ้ำ ในระดับ view object อีก

การจำลองการทำงาน Trigger ใน Entities ทำได้โดยการ owerwrite method doDML (int dml, TransactionEvent evt) เราสามารถเลือกได้ว่าจะให้ มันทำงานทุกครั้งที update , insert หรือ delete โดย check ค่า dml =>DML_INSERT, DML_UPDATE, DML_DELETE

ตัวอย่าง

  • เมื่อ Entity มีการ INSERT ข้อมูล dml = DML_INSERT จะทำการใส่ค่าให้ filed Flex1 มีค่าเท่ากับ ผลรวมของ filed Flex2 และ Flex3 ทุกครั้งที่มีการ insert

  • เมื่อ Entity มีการ UPDATE ข้อมูล dml = DML_UPDATE จะทำการ update filed companyId และ updatedBy ทุกครั้งที่มีการแก้ไขข้อมูล

Oracle ADF Business Component (BC4J) ตอนที่ 4 View Object

คราวก่อนเราได้สร้าง Entity Object ไปแล้ว วันนี้ผมจะสร้าง View Object บ้าง

View Object เป็น Component ทำหน้าที่สร้าง Collection ของกลุ่มข้อมูลที่ดึงจาก DB ซึ่งอาจจะอยู่ในรูปของ SQL หรือไม่ก็ดึงกลุ่มข้อมูลผ่าน Entity Object ในแต่ละ Row ทำให้แบ่งประเภทได้ 2 ประเภทด้วยกัน คือ

1. Updatable View เป็นการดึงกลุ่มข้อมูลผ่าน Entity Object ทำให้เราสามารถที่จะ Insert , Update, Delete ได้

2. Read-only View เป็นการดึงกลุ่มข้อมูลผ่าน SQL ทำให้ไม่สามารถ Insert , Update, Delete ได้ เหมาะสำหรับการแสดงผลข้อมูลเฉยๆ ที่ไม่ต้องการทำ Transaction กับข้อมูล

เรามาลองสร้าง Updatable View กันครับ โดยผมจะใช้ Customers Entity Object จากคราวที่แล้วกัน

1. คลิกขวาที่ Project เลือก New นะครับจะขึ้นมาตามรูป Expand Business Tier จะเห็น ADF Business Component เลือก View Object ครับ


2. ผมตั้งชื่อ View Object ว่า CustomersView และเลือก View แบบ Updatable View

3. เลือก Customers Entity Object มาไว้ข้างขวา


4. เลือก Attibute ที่ต้องการแสดงบน View Object ผมเลือกหมดเลยครับ

5. แสดงรายละเอียดของแต่ละ Attribute

6. แสดง SQL ที่ถูกสร้างขึ้นเพื่อไปดึงข้อมูลมาเก็บใน Entity Object แต่ละตัว เพื่อให้ View Object นำมาแสดงผลครับ ตรงนี้เราสามารถที่จะ เพิ่ม Where Clause หรือคำส่ง Order By ได้

7. หลังจากนั้นกด Finish ก็จะได้ Component CustomersView เกิดขึ้น โดยถ้ามองที่ Structure ก็จะประกอบไปด้วย 2 file คือ

1. CustomersView.xml เป็น configuration file ที่บอกว่า View ตัวนี้เชื่อมต่อกับ Entity Object ตัวไหน ใช้ SQL อะไรในการดึงข้อมูลครับ
2. CustomersViewImpl.java เป็น JAVA Class ที่รวม method เกี่ยวกับการจัดการกับกลุ่มข้อมูล รวมทั้งยังสามารถสร้าง method ที่ทำ Business Logic ได้ด้วย

เท่านี้ก็เป็นอันเรียบร้อย คราวหน้าผมจะมาสร้าง Client ติดต่อกับ View Object กันบ้างครับ ขอตัวไปทำงานก่อน

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

Saturday 27 October 2007

ปัญหาเบื้องต้นเมื่อทดลองใช้งาน Oracle Database 11g บน Windows

หลังจากที่ Oracle เปิดให้ download 11g บน windows แล้ว เมื่อวานได้มีโอกาสติดตั้งและทดลองใช้งานเบื้องต้นครับ
ขั้นตอนการติดตั้งไม่ยากครับ ตามไปดู screenshots ได้ที่นี่ครับ

หลังจากติดตั้งเสร็จ จะพบปัญหาอยู่ 2 เรื่องดังนี้

1. ใช้ Toad และ SQL Navigator ไม่ได้ โดยจะได้รับ error ว่า

OCI version 11.1.0.1.0 is not supported

ดังนั้นต้อง work around โดยการย้ายให Toad และ SQL Navigator ไปอ่าน OCI จาก home 10g เป็นการชั่วคราว

2. หลังจากแก้ปัญหาข้อแรกไปได้ ก็จะเจอปัญหาถัดมาคือ Toad ไม่สามารถ authen เข้าไปใน Database ได้
ถ้าใครยังจำได้ ผมเคยเล่าเรื่อง 11g จะ support password แบบ case sensitive แล้ว
เนื่องจาก Toad มีกลไลจะ UpperCase password ที่เราใส่โดยอัตโนมัติ
ทำให้ password ของเราจะ authen ไม่ได้
work around ก็คือ ต้องเปลี่ยน password ใน Database ให้เป็นตัวใหญ่หมด
เช่นแต่เดิม scott password คือ tiger เราก็ต้องเปลี่ยนเป็น TIGER แทน
เพื่อให้สามารถใช้งาน Toad ได้ครับ

ส่วนปัญหานี้ SQL Navigator ไม่เป็นครับ

Friday 26 October 2007

Tuning Embedded OC4J บน JDeveloper 11g Technical Preview 2

อ้างอิงจากนาย Steve Muench ที่ได้เขียนเรื่องการ tuning Embedded OC4J บน JDeveloper 11g Technical Preview 2

โดยนาย Steve Muench แจกแจงว่าเมื่อ disable java policy ในส่วน BCEL proxy นี้จะทำให้ Embedded OC4J start ได้เร็วขึ้นมากถึง 20 วินาที

ผมจึงทดลองตามขั้นตอนของนาย Steve Muench ดังนี้ครับ

1. คุณต้องเคย start Embedded OC4J ขึ้นมาก่อนนะครับ เพราะว่าถ้ายังไม่ใช้งาน file config ของ Embedded OC4J จะยังไม่ถูกสร้างขึ้นมา

2. ไปที่ JDeveloper profile home path ดังนี้ครับ

xp: C:\Documents and Settings\username

vista: C:\Users\username\AppData\Roaming\JDeveloper

3. ไปต่อที่ path นี้ system11.1.1.0.20.46.84\o.j2ee\embedded-oc4j\config

4. เปิด file java2.policy ขึ้นมา

5. ให้ comment ในส่วนนี้ออกครับ

จาก
grant codeBase "file://generated/by/oracle.j2ee.connector.proxy.BCELProxyClassLoader" { permission java.security.AllPermission; };
เป็น
/*grant codeBase "file://generated/by/oracle.j2ee.connector.proxy.BCELProxyClassLoader" { permission java.security.AllPermission; }; */

ก่อนลงมือทำใช้เวลา start OC4J เพื่อ run EJB Application ใช้เวลา 55 วินาที
หลังลงมือทำใช้เวลา start OC4J เพื่อ run EJB Application ใช้เวลา 42 วินาที

สรุปจาก environment ของผมเมื่อทดลอง tuning Embedded OC4J ทำให้ทำงานได้เร็วขึ้น 13 วินาที
ถึงแม้จะไม่ได้ 20 วินาทีตามที่ นาย Steve Muench อ้างไว้ แต่ได้เท่านี้ผมก็ happy ครับ

Thursday 25 October 2007

ภาษาโปรแกรมคอมพิวเตอร์ตัวไหนที่เหมาะกับคุณ (ขำ ๆ)

คุณเคยเจอปัญหาเช่นนี้เหรอไม่
จะหัดเล่นภาษาไหนดี ?
จะหัดเล่นภาษาที่ตลาดต้องการตอนนี้ ดีป่าว ?
เล่นภาษาที่มีข้อมูลให้ศึกษาเยอะๆ ?
เลือกภาษาที่ได้ค่าตอบแทนเยอะๆ ดีมั๊ย?
เขียน java อยู่ดีๆแล้วรู้สึก ยากฉิบ ทำไมมันเรื่องมากนักวะ ?
เขียน php แล้ว เห มันไม่ใช่อะจิ๊บ...
เขียน asp แล้วรู้สึก เอ microsoft มัน จะผูกขาดไปเหรอเปล่า ?
เขียน perl อยู่ดีๆ เอ......... ทำไมนาตาลีต้องได้กับเจ้าบอล ?

วันนี้เรามีทางออกมาให้คุณ แบบทดสอบเพื่อดูว่าคุณเหมาะกับภาษาโปรแกรมคอมพิวเตอร์ตัวไหน
ลองเล่นดูครับ คุณอาจพบภาษาที่เหมาะกับคุณจริงๆ

คำเตือน ภาษาโปรแกรมคอมพิวเตอร์เป็นเพียงเครื่องมือในการทำงาน โปรดเลือกภาษาให้เหมาะกับงานที่จะทำ





Wednesday 24 October 2007

การ Config Data source ใน JBoss

เมื่อเราต้องการเรียกใช้งาน data source ใน JBoss โดย default data source ของ JBoss 4.0 จะใช้ HypersonicDB ถ้าต้องการใช้ Oracle Database ต้องเข้าไปแก้ไขดังนี้

1. copy Oracle Dirver classes <ORACLE_HOME>/jdbc/lib/classes12.zip to <JBOSS_HOME>/server/default/lib

2. copy Oracle transaction (non-XA) data source <JBOSS_HOME>/docs/examples/jca/oracle-ds.xml to <JBOSS_HOME>/server/default/deploy

3. modify oracle-ds.xml set <connection-url/>, <driver-class/>, <user-name> and <password>

- Oracle OCI Type 2 Driver
Class: oracle.jdbc.driver.OracleDriver
URL: jdbc:oracle:oci8:@<database>
- Oracle OCI Thin Type 4 Driver
Class: oracle.jdbc.driver.OracleDriver
URL: jdbc:oracle:thin:@<host>:<port>:<database>
- Oracle OCI XA Type 2 Driver
Class: oracle.jdbc.xa.client.OracleXADataSource
URL: jdbc:oracle:thin:@<host>:<port>:<database>
- Oracle OCI Type 2 Driver
Class: oracle.jdbc.driver.OracleDriver
URL: jdbc:oracle:oci8:@<database>

<user-name>scott</user-name>
<password>tiger</password>


<host> ชื่อ hostname ที่กำหนดอยู่ใน <ORACLE_HOME>/network/ADMIN/tnsnames.ora ของ instance database นั้นๆ
<port> หมายเลข port ที่กำหนดอยู่ใน <ORACLE_HOME>/network/ADMIN/tnsnames.ora ของ instance database นั้นๆ
<database> ชื่อ database

4. modify <JBOSS_HOME>/server/default/conf/standardjaws.xml or <JBOSS_HOME>/server/default/conf/jaws.xml set <datasource> and <type-mapping>
<jaws>
<datasource>java:/OracleDS</datasource>
<type-mapping>Oracle8</type-mapping>
</jaws>


5. modify <JBOSS_HOME>/server/default/conf/standardjbosscmp-jdbc.xml or META-INF/jbosscmp-jdbc.xml set <datasource> and <datasource-mapping>
<jbosscmp-jdbc>
<defaults>
<datasource>java:/OracleDS</datasource>
<datasource-mapping>Oracle8</datasource-mapping>
</defaults>
</jbosscmp-jdbc>


6. modify <JBOSS_HOME>/server/default/conf/login-config.xml add <application-policy>
<application-policy name = "OracleDbRealm">
<authentication>
<login-module code = "org.jboss.resource.security.ConfiguredIdentityLoginModule" flag = "required">
<module-option name = "principal">sa</module-option>
<module-option name = "userName">sa</module-option>
<module-option name = "password"></module-option>
<module-option name ="managedConnectionFactoryName">
jboss.jca:service=LocalTxCM,name=OracleDS
</module-option>
</login-module>
</authentication>
</application-policy>


แต่ถ้าอยาก config database อื่นเข้าไปดูได้ที่
How to Configuring JBoss 4.0 JDBC Connectivity

Monday 22 October 2007

การเปลี่ยน port OC4J จาก 8888 เป็นอื่น ๆ

Oracle Application Server จะมี engine หลักคือ OC4J ที่ทำหน้าที่เป็น container ให้ feature อื่น ๆ ทั้งหมด. OC4J ชื่อเต็ม ๆ คือ Oracle Container for J2EE แต่เดิมชื่อ Orion ซึ่งก็ถูก Oracle ซื้อมาเช่นกันเมื่อประมาณ 7 ปีก่อน. ถ้าใครได้ทดลอง config ในรายละเอียดลึก ๆ จะเห็นว่า ยังมี file ชื่อ Orion ค้างอยู่เป็นจำนวนมาก.


เข้าสู่ประเด็นหลักของ post นี้. ก็คือการ config เปลี่ยน port ของ OC4J จาก 8888 เป็น port อื่น ๆ ตามต้องการ. วิธีการมีง่าย ๆ ดังนี้


  1. หลังจากติดตั้งสำเร็จ การติดตั้งให้ย้อนไปดูที่ post นี้

  2. ไปที่ OC4J Home แล้วตามด้วย path ดังนี้ /j2ee/home/config

  3. ไปที่ file ชื่อ default-web-site.xml แล้วเปิดมันขึ้นมา

  4. หา 8888 แล้วแทนค่าด้วย port ที่ต้องการ

  5. เป็นอันสำเร็จ :)

Sunday 21 October 2007

Oracle ADF Business Component (BC4J) ตอนที่ 3 มาต่อกับ Entity Object

เราต่อจากคราวที่แล้วกันนะครับ วันนี้ผมจะสร้าง Main Class ขึ้นมาเพื่อแสดงการเรียกใช้ Entity Object กัน

ก่อนอื่นผมจะต้องสร้าง Application Module ขึ้นมาก่อน เพราะว่า Entity Object ไม่สามารถทำงานนอก Application Module ได้ แต่ผมจะไม่ลงลึกรายละเอียดเกี่ยวกับ Application Module มาก เอาไว้วันหลังผมจะอธิบายให้ฟังเรามาเริ่มกันเลยครับ ขั้นตอนมีดังนี้

1. คลิ๊กขวาที่ Project เลือก New จะขึ้นรูปให้ Expand ตรง Business Component Tier จะเห็น ADF Business Component เลือก Application Module


2. ทำการตั้งชื่อ ผมตั้งชื่อว่า CustomersService จากนั้นกด Next จนสุด แล้วกด Finish


3. เมื่อทำการสร้าง Application Module ชื่อ CustomerService เรียบร้อยแล้ว จะปรากฎเป็นComponent รูปกระเป๋าเพิ่มขึ้นมา
สังเกตที่ Structure จะประกอบไปด้วย 3 file คือ

1. CustomersServices.xml เป็น Configuration file ที่ระบุว่าจะ Map กับ Class JAVA ไหน ครับ ซึ่งในที่นี้คือ CustomersServicesImpl.java นั่นเอง

2. CustomersServicesImpl.java ปกติจะเป็น Class JAVA ที่จะ Map กับ View Object ที่เกี่ยวข้องใน Module แต่เนื่องจากว่าเราไม่ได้ Add View Object เข้ามา มันก็เลยไม่เจอครับแต่ Class นี้เรายังสามารถสร้าง Business Logic เอาไว้เพื่อให้ Tier อื่นๆมาเรียกใช้ได้

3. bc4j.xcfg เป็น Configuration file ที่บอกว่าใน package model มี Application Module อะไรบ้าง

คราวนี้เราจะมาเริ่มเขียนโค้ดกันแล้วครับ หลังจากที่ใช้แต่ Tool ช่วยมานาน

โจทย์ของผมคือ ค้นหาชื่อข้อมูลลูกค้าด้วย Primary Key คือ Customer ID กันครับ ขั้นตอนมีดังนี้

1. คลิ๊กที่ตัว CustomersServicesImpl.java ที่ Structure Tab ครับ จะเป็นดังรูป


2. สร้าง Method ขึ้นมา 1 Method ตามรูปโดยรับ Argument เป็น CustomerID แล้ว Return เป็น ชื่อของลูกค้าคนนั้น

3. ใน CustomersServicesImpl.java จะมี Main Class อยู่แล้ว ผมจะ Comment ตรงส่วน Code ที่ Jdeveloper ให้มา จากนั้นเพิ่มโค้ดตามรูป

โดย Configuration.createRootApplicationModule จะทำหน้าสร้าง Instance ของ Application Module ที่ต้องการใช้ จากนั้นเราทำการ Casting เป็น Application Module ที่เราต้องการ ก็จะสามารถเรียก Method นั้นได้เลย

service.findCustomersByPK(118) ผมได้เรียก method findCustomersByPK โดยส่ง Customer ID = 118 ไป

4. เมื่อทำการรันจะได้ผลตามรูป

Friday 19 October 2007

วิธีแก้ปัญหาการติดตั้ง JBuilder 2007 บนเครื่อง Vista

JBuilder 2007 ยังไม่ได้ support vista อย่างเป็นทางการ วิธีที่ดีที่สุดทาง Borland แนะนำให้รอ update เวอร์ชั่นที่ support Vista

แต่ถ้ามีความจำเป็นต้องใช้ JBuilder 2007 บน Vista จริง ๆ มีวิธีดังนี้

1. ไปที่ path ตัวติดตั้ง JBuilder 2007

2. จะเห็น file "install_windows.exe"

  • ให้ click ขวา เลือก properties
  • เลือก Compatibilities tab
  • check "Run this program in compatibility mode for" แล้วเลือก "Windows XP (Service Pack 2)"
3. ทำขั้นตอนที่ 2 อีกครั้งกับ file "jbinstall.exe" ที่อยู่ที่ path

\Disk1\InstData\VM

4. ไปที่ file "install_windows.exe" แล้ว click ขวา Run as administrator

เป็นอันเรียบร้อยครับ

Thursday 18 October 2007

JavaScript Framework ตัวไหนดี?

ช่วงนี้สนใจอยากเล่น javascript framework ที่มีความสามารถของ AJAX รวมอยู่ด้วย เคยลองเล่นดูนานเนิ่นมาแล้วไม่ได้เป็นชิ้นเป็นอัน
วันนี้ไปเจอ web น่าสนใจที่รวบรวม javascript framework ดังจากค่ายต่าง ๆ เอามาแปะไว้เพื่อใครจะใช้เป็นตัวเลือกในการตัดสินใจเลือกใช้ javascript framework

dojo

prototype


mootools

ext

yahoo user interface library (YUI)
rico

qooxdoo


ถ้าให้เลือกเล่น javascript framework สักตัวตอนนี้ คงเลือกใช้ dojo เพราะมี tutorial เยอะดี และเคยสัมผัสมาแล้วบ้าง (ความคิดเห็นส่วนตัว) จะไปลองเล่นดูได้ผลลัพธ์เป็นอย่างไร จะนำมาเขียนให้ชมกันครับ

ปล. อยากทำเว็บเหมือน flick ตอน upload หลายๆรูปพร้อมกัน แล้วมี progress บอกสถานะ จ๊าบมาก

Ref : hongkiat.com
http://pphetra.blogspot.com/ เว็บ polawat (พี่คนนี้เขาเล่น dojo)

Oracle E-Business Suite 12.0.3 RUP3

เมื่อวันที่ 16 ที่ผ่านมา, Oracle E-Business Suite ได้ออก Update Pack ชุดใหญ่มาครับ

จะเป็นเวอร์ชั่น 12.0.3 Release Update Pack (RUP3) โดยสามารถ Apply patch ตัวนี้ได้จาก 12.0.0, 12.0.1, และ 12.0.2 ครับ Patch ตัวนี้จะเป็นเบอร์ 6141000 ขนาด 1.5 GB
ตามไป download ได้ที่ metalink ส่วนรายละเอียดและคู่มือการดูที่ Doc ID: 445192.1


Wednesday 17 October 2007

ปัญหา configurationException เมื่อใช้งาน EJB

คราวที่แล้วผมได้พูดถึง error ที่เกิดขึ้นบนฝั่งของ JBoss ไปแล้ว คราวนี้เราจะมาดูในฝั่งของ WebSphere 6 กันบ้างนะครับ (ถ้าสังเกตจะพบว่าผมจะทดสอบกับ JBoss และ WebSphere เป็นส่วนใหญ่ เนื่องจากที่เครื่องผมติดตั้ง Application Server ทั้งสองตัวนี้อยู่แล้วพอดี แต่ถ้ามีเพื่อน ๆ สอบถามเข้ามามาก ผมก้อจะไปหาคำตอบมาเพิ่มเติมให้นะครับ อย่าพึ่งคิดว่าผมยึดติดกับสองค่ายนี้)

หลังจากที่เราเขียน Session Bean ที่ทำการติดตั้งไว้บน WebSphere Server 6 เรียบร้อย รวมทั้งเช็ต EJB client library สำหรับเรียก EJB ครบ พอเราเริ่มทดสอบการเรียก bean ขึ้นมาจริง ๆ ด้วย cilent application ที่เราเขียนขึ้น กับเจอ error ดังนี้

14 Oct 2007 14:25:52 com.ibm.ws.naming.util.CommonHelpersWARNING: jndiproviderProperties
14 Oct 2007 14:25:53 com.ibm.ws.naming.util.CommonHelpersWARNING: jndiproviderProperties14 ต.ค. 2550 14:25:53 com.ibm.websphere.naming.WsnInitialContextFactoryWARNING: noInitCtxFactoryImpljavax.naming.ConfigurationException: The property com.ibm.ws.naming.wsn.factory.initial is not set. The most likely cause is that the jar which
contains the file com/ibm/websphere/naming/jndiprovider.properties cannot be found by the class loader. at com.ibm.websphere.naming.WsnInitialContextFactory.init_implClassCtor(WsnInitialContextFactory.java:194) at com.ibm.websphere.naming.WsnInitialContextFactory.getInitialContext(WsnInitialContextFactory.java:112) at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:675) at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:257) at javax.naming.InitialContext.init(InitialContext.java:233) at javax.naming.InitialContext.<init>(InitialContext.java:209) at sample.MyTest1Util.lookupHome(MyTest1Util.java:20) at sample.MyTest1Util.getHome(MyTest1Util.java:54) at Main.main(Main.java:17)


เมื่อพบ error นี้ นั่นหมายความว่าเราไม่ได้ กำหนดค่า library ที่ ว่า nameclient.jar นั่นเอง library ตัวนี้จะอยู่ใน Application Server ดังนี้ <WebSphere Home>/lib/nameclient.jar เมื่อ add library เสร็จ error ตัวนี้ก้อจะหายไป เป็นอันเรียบร้อย

Oracle Database 11g for Linux 64 bit

จาก post เก่าที่ได้แจ้งเรื่อง Oracle Database 11g เปิดให้ download
จะมีแต่บน linux 32 bit เท่านั้น

เท่านั้นเมื่อปลายสัปดาห์ที่ผ่านมา Oracle ได้ออก Database 11g บน linux 64bit
ให้สามารถ download ได้แล้วเช่นกัน

ส่วน platform อื่น ๆ ยังไม่มาครับ

สามารถตามไป download ได้ที่นี่ครับ http://www.oracle.com/technology/software/products/database/oracle11g/111060_linx8664soft.html

Tuesday 16 October 2007

Twitter เราก็เอากับเค้าด้วย


เรื่องล้ำสมัย ไม่มีใครเด็ดเท่าคุณ mk กับผองเพื่อน นี่, นี่, และนี่
จาก facebook ก็ทีนึงแล้ว
ล่าสุดเอา twitter มาปล่อยที่ blognone
ไม่เป็นอันทำงานหนึ่งวันเต็ม ๆ ครับ
ว่าแล้วก็เอา twitter มาใช้กับ blog เราครับ

@middleware

เนื่องจากผมเป็นแฟน duocore กับ blognone เมื่อได้ทดลองใช้แล้วติดใจ จึงถือวิสาสะสร้าง twitter อีกหนึ่ง account เพื่อใช้ส่ง feed ของ duocore โดยเฉพาะ
ถ้าพร้อมที่จะรับ feed duocore ทางมือถือแล้ว ก็ทำตามขั้นตอนคร่าว ๆ ตามนี้
1. ไป register ก่อนนะครับที่ http://twitter.com/
2. validate มือถือเรา โดยส่ง SMS ตาม code ที่ได้ ไปยังหมายเลยที่ twitter ให้มา
3. ไปที่ @feedduocore URL http://twitter.com/feedduocore นี้ครับ
4. คลิก follow และเลือก notification เป็น on ครับ


เท่านี้เป็นอันเรียบร้อยครับ
แตถ้ากลัวแบตมือถือหมดไว ก็แนะนำให้รับทาง Google Talk ก็ได้ครับ

NoInitialContextException ที่เกิดขณะรัน EJB Client Application

NoInitialContextException ที่เกิดขณะรัน EJB Client Application บน JBoss 4.0+Eclipse 3.2

หลาย ๆ ท่านที่เคยเขียน EJB มา คงจะเคยพบ error ที่ชื่อว่า NoInitialContextException กันมาบ้าง หลังจากที่ผมเขียนเรื่องปัญหาที่เกิดจากการ context lookup ไม่ได้ไปแล้ว คราวนี้เราจะมาคุยกันถึง
ปัญหา คลาสสิคอีกหนึงตัว ที่ผมจั่วหัวไว้ข้างบนนั่นเอง

ทำไมผมถึงเรียกว่าเป็น error ที่ คลาสสิค!?

นั่นก้อเป็นเพราะว่ามันเกี่ยวข้องการกับเซ็ต class path นั่นเอง ถ้าหากเราใช้ IDE ที่เก่ง ๆ เช่น JBuilder , RAD เป็นต้น ก้อจะไม่พบปัญหานี้ เนื่องจาก tool จะ config ค่า enviroment ต่าง ๆ ให้กับเราเอง แต่ถ้าเป็นนักพัฒนาประเภทฟรีนิยม เช่น Ecliepse จะพบได้ error นี้แทบจะทุกครั้งที่เริ่มทำโปรเจ็ค EJB เลย
ก้อว่าได้ จากที่ผมเกริ่นมาทั้งหมด

หลายท่านคงจะเดาถูกแล้วว่า ปัญหาประเภทนี้เกิดจากการ หา libraly ตัวที่ต้องการไม่พบ ซึ่ง libraly ประเภทนี้ก้อขึ้นอยู่กับว่า Application Server ที่ใช้อยู่เป็นของค่ายใดถัาเป็น JBOSS 4.0 จะมีชื่อว่า jbossall-client.jar ซึ่งเราก้อไม่จำเป็นที่จะต้องไป download มาให้วุ่นวาย
เพราะว่ามันก้อบรรจุอยู่ภายใต้ Application Server ที่เรา install อยู่นั้นเอง ภายใต้ path ดังนี้

/<JBoss Home>/client/jbossall-client.jar

แต่ถึงแม้ว่าเราจะเซ็ต class path ไว้ที่ enviroment ของเครื่องแล้วก้อตามที แต่ error ที่กล่าวมาก้อยังไม่หายเสียที ที่เป็นเช่นนั้นก้อเพราะว่า Eclipse ของเราจะไม่มอง class path ที่เซ็ตไว้ที่เครื่อง แต่จะมองจากภายในตัว project เท่านั้นนะครับ นั่นคือเราจะต้องใช้วิธีเพิ่ม
โดยการ add libraly ด้วยเมนู project>properties>java build path เท่านั้นครับ

ลองไปเล่นดูนะครับกับ Eclipse เพราะจากที่ผมเคยใช้ tool ต่าง ซึ่งจะ Genarate Code ให้
เราเกือบทั้งหมด แต่สำหรับ Eclipse จะไม่ทำให้ทั้งหมด ซึ่งเป็นประโยชน์ในการศึกษาด้วยการแก้ปัญหาได้
เป็นอย่างดี ถ้าติดปัญหาอะไรก้อสอบถามกันเข้ามาได้ เพราะช่วงนี้ผมก้อหันกลับมาใช้ Eclipse ด้วยเช่นกัน

แนะนำเว็บ CodeGear ครับ http://dn.codegear.com/tv/java


เนื่องจากว่าผมกำลังหา resource ที่เกี่ยวกับการพัฒนา web services ที่ implement ด้วย IDE JBuilder อยู่บังเอิญไปเจอเว็บที่น่าสนใจเข้าคือเว็บ CodeGear ซึ่งเป็นแหล่งที่รวม resource ทั้งหมดที่เกี่ยวกับการใช้ IDE ของ Borland ทั้งหมดเช่น C#, C++, Delphi, Java, PHP และ Ruby

และนอกจากนี้ยังมีอีกตัวนึงที่น่าสนใจคือ Blackfish SQL ซึ่งเป็น database ที่ถูกออกแบบมาให้สามารถนำไปใช้ได้ทั้งในฝั่งของ .NET และฝั่งของ Java ซึ่งถูกพัฒนาโดย CodeGear ซึ่งตัวนี้เป็น database ตัวเล็ก ๆ ไม่เหมาะกับการไปใช้ในระดับ Enterprise ซึ่งถ้าหากอยากใช้ก็ต้องเป็น InterBase แทนซึ่งพัฒนาด้วย CodeGear เช่นเดิม

เอาหละเรากลับมาเรื่องเว็บ CodeGear ต่อในเว็บนี้นอกจากจะมี resource ให้ download อย่างจุใจแล้วอีกอย่างที่โดนใจผมสุด ๆ นั้นก็คือในเว็บนี้จะมี e-learning ที่สอนการในเรื่องต่าง ๆ เช่น Java ตั้งแต่เรื่องพื้นฐาน หรือเรื่อง advance ขึ้นมาหน่อยก็ EJB หรือ web services เป็นต้นเท่านั้นยังไม่พอ ถ้าหากติดใจหรือว่าชอบอันไหนก็สามารถโหลดเก็บไว้ดูได้

หวังว่าคงจะเป็นประโยชน์กับคนที่ต้องการศึกษา Java บน IDE ของ JBuilder นะครับก่อนลาไปผมแนบตัวอย่าง e-learning ของ EJB ไว้ด้วยครับ


อ้างอิง :
Blackfish SQL : http://www.codegear.com/products/blackfish
InterBase : http://www.codegear.com/products/interbase

Monday 15 October 2007

ปลด beta, แนะนำนักเขียน, ขอบคุณพี่บรรศักดิ์ครับ

ถ้าใครสังเกตดี ๆ นะครับ จะเห็นว่า blog ปลด beta เป็นที่เรียบร้อยแล้ว เมื่อคืนที่ผ่านมา
(ที่คุณแอนเคยแซวเล่นว่า web เดี๋ยวนี้ เอะอะก็ beta)


หลายคนคงแปลกใจที่เห็น blog นี้ ก็มี post ไว้ตั้งแต่ปี 2006

ทำไมยัง beta?

ชี้แจงดังนี้ครับ
ก่อนหน้านี้ post ของปี 2006 เป็น post เก่า ที่เราทำเป็น internal
เรายังไม่พร้อมที่จะเปิด public ด้วยปัจจัยหลาย ๆ อย่าง

ด้วยจังหวะและเวลาที่เหมาะสม เมื่อวันที่ 7 เดือน 7 ปี 07 เวลา 7 นาฬิกา 7 นาที 7 วินาที 7 มิลลิเซกคั่น
เราถือเป็นวันมงคล 777.7777
เอา posts เก่า ๆ มาปัดฝุ่น และเปิด public พร้อมลุยอย่างจริงจังเสียที

ก่อนที่จะปลด beta ออก พวกเราก็ได้ปรับปรุง blog ไปหลายส่วนเช่นกัน ดังรายการต่อไปนี้

1. เราปรับจาก Google AJAX Search เป็น Google Search แบบธรรมดาแทน
เพราะเราพบว่า Google AJAX Search จะค้นหา posts เก่า ๆ ไม่เจอครับ
และยังย้ายตำแหน่ง search มาอยู่ มุมบนขวามือแทน ใช้พิ้นว่างได้มีประโยชน์ยิ่งขึ้น


2. ข้อเสียของ blog ก็คือว่า posts เก่า ๆ ที่ดี ๆ จะตกไปไวมาก ทำให้หายากขึ้น
จึงทำ pages ขึ้นมาครับ จะได้เก็บ posts ที่ดี ๆ ไว้ในหากันง่าย ๆ ขึ้น

  • News
  • Articles
  • Database
  • Middleware
  • JDeveloper
  • Enterprise Applications
  • Java SE
  • Java EE
  • SOA

3. เรา tuning blog ให้เร็วขึ้น ก่อนหน้านี้อืดมาก ๆ เพราะเรารับ feeds rss ไว้ 2 ตัว
เพื่อแสดง Recently Articles และ Comments ครับ
จาก post ของคุณเอก จึงพบว่า สามารถเปลี่ยนจาก full feed เป็น summary feed ได้
ทำให้ดึง data ได้เร็วขึ้น

เราลดจาก 7 posts ต่อหน้า เหลือ 5 posts ต่อหน้าด้วย
ผลลัพธ์ก็เร็วขึ้นนิดหน่อยครับ แต่โดยรวมผมก็ว่ายังช้าอยู่
ยังไงจะพยายาม tuning ให้ได้มากกว่านี้ครับ

4. เราเพิ่มหน้า Links แยกไว้ต่างหากครับ
เพราะใจจริงมี link ที่ชอบ ๆ มากมาย ด้านขวามืออย่างเดียวไม่พอใส่ครับ
แยกหน้ามาต่างหาก คราวนี้อยากจะเพิ่มเพื่อนบ้านกี่คน ก็ทำได้ครับ
ว่าแล้วก็เพิ่ม พี่ไท้ ไอ้แอน duocore โดยพลัน

5. เช่นเดียวกันครับ ช่วงเดือนนี้ที่ผ่านมา เราเริ่มมีนักเขียนเข้ามามากขึ้นครับ
เราจึงแยกหน้า ทำสรุปนักเขียนทั้งหมดครับ จะได้แนะนำ profile ไว้คร่าว ๆ ด้วย
โดยเราจะพยายามยึดหลักการเขียนตามกฏ mk ครับ
เพื่อให้มาตรฐาน blog นี้ สูงเฉกเช่น blognone

และโอกาสนี้ขอแนะนำนักเขียนใหม่ 2 และนักเขียนเก่า 5 ท่านครับ

คุณ​ Sage
guru ​ท่านนี้​เป็น​ผู้​เชี่ยวชาญด้าน​ Oracle Database ​และ​ยัง​เป็น​ instructor ​ที่​ Software Park
ประสบการณ์หนักแน่นครับ​ ​ผ่าน​ project ​มหา​โหดมานักต่อนัก​แล้ว
คุณ​ Sage ​จะ​มา​เสริม​ post ​ใน​เรื่อง​ Database ​ให้​แน่นยิ่งขึ้นครับ

คุณ​ kimgumshek
เป็น​อีกหนึ่งผู้เชี่ยวชาญที่​ต้อง​ทำ​งาน​กับ​ Software Oracle ​และ​ Java ​อยู่​ทุกวี่ทุกวัน​ ​เช่นเดียว​กัน​กับ​พวกเรา
ได้​มี​โอกาสเหมาะ​เจาะ​ ​จึง​ได้​มา​ jam ​ช่วย​กัน​ post
โดย​เนี้อหาที่​ ​คุณ​ kimgumshek ​ถนัด​ ​ก็​จะ​เป็น​ด้าน​ Portal ​และ​การทำ​ CMS ​ด้วย​ Java ​ครับ

คุณ​ Tangy
เป็น​ Java Expert ​ครับ
สมัยเรียนก็​ได้​ 1st Class Honor ​ทำ​งานก็​ยัง​สอบ​ Cert Java ​ได้​เต็ม​ 100%
คอยติดตาม​ post ​ด้าน​ Java
โดย​เฉพาะ​ JDeveloper ​ที่​เขียนมา​จาก​ประสบการณ์​ implement ​ให้​ลูกค้าจริง
เร็ว​ ​ๆ​ ​นี้ก็กำ​ลัง​จะ​ออกหนังสือ​ Struts ​มาวางขาย​ ​ให้​พิจารณา​ด้วย​ครับ

คุณ​ Ji
เป็น​ผู้​เชี่ยวชาญด้าน​ JDeveloper ​และ​ ADF
เค้า​จะ​มา​ post ​ให้​ดูว่า​ ADF implement ​งาน​ได้​เร็ว​อย่างไร
แถมมี​ใจรักด้าน​ Graphic ​และ​ Design ​ครับ​ ​จะ​แซม​ Web UI ​อีก​ด้วย

นายทอง
เป็น​ Java Developer ​ที่​จะ​มา​เสริมมุมมองด้านการ​ Analysis, Design, SDLC+Methodology
เช่น​ Pair Programming ตามนิยามของคุณ​ dean4j ​รวม​ถึง​ทักษะการบริหารโครงการ​ (Project Management) ​ด้วย​ครับ

tofu ​และ​ Mr. Invert prahs
เป็น​เด็กหนุ่ม​ IT ​อนาคต​ไกล​ ​กำ​ลังขมักเข้น​ ​ขับเคี่ยวฝึกฝนตัวเอง
เพื่อ​เป็น​ expert ​อย่างพี่​ ​ๆ​ ​ข้างบนครับ
ถึง commentators ที่เข้ม ๆ ให้โอกาสน้อง เค้าฝึกฝนนะครับ

สุดท้ายนี้ ขอคุยถึงหนังสือของคุณบรรศักดิ์ อีกทีครับ
เพราะพี่เค้าอนุญาติให้เรานำเนื้อหาใน Sample Chapter มา post ลง blog ได้ด้วยครับ
ถ้าได้ลอง download และลองอ่าน ถ้าเห็นว่าดี ก็อย่าลังเล คว้ามาสักเล่มนะครับ

บายครับ
เฮ้อ! ยาวจริง ๆ

Sunday 14 October 2007

Oracle XML Publisher 5.6.2 [1]

หากว่าใครได้เคยมีโอกาศได้ใช้ Oracle XML Publisher คงจะรู้ว่ามันคือ Report Tool ที่ Oracle ได้เอาไว้ใช้ในการจัดกับ Layout ของ Report โดยในการใช้งานนั้น Oracle ได้นำมาใช้ครั้งแรกใน Oracle E-Business Suite 11.5.10 โดยหน้าที่ของ XML Publisher ก็คือการจัดรูปแบบของเอกสารที่เป็น XML ซึ่งหากว่าในระบบมีการใช้งาน XML ก็จะนำ XML Publisher นี้ไปใช้ได้ ซึ่งนั่นหมายถึง Web Service ด้วยครับ

ใน Oracle XML Publisher 5.6.2 นี้ ได้มี API ที่ไว้สร้าง XML เพื่อเป็น Datasource ให้กับ Report ขึ้นมา ซึ่งเราจะมาดูกันว่าหากเราจะสร้าง Datasource นั้นเราจะต้องทำอย่างไร

  1. เริ่มแรกให้เราไป Download Oracle XML Publisher 5.6.2 นี้มาก่อนครับ

  2. ขั้นตอนถัดมาให้เรานำ Library มาใช้ โดย Library จะอยู่ใน <zip_dir>/manual/lib

  3. จากนั้นให้เราสร้าง xml ขึ้นมาเพื่อไว้ใช้เป็น template ของ Datasource โดยในตัวอย่างนี้จะทำการดึงข้อมูลจาก Table Employee ใน HR Schema ซึ่งเป็น Sample Schema ใน Oracle Database มาแสดงโดยที่มี JOB_ID เป็น Parameter นะครับ


  4. <?xml version="1.0" encoding="WINDOWS-1252" ?>

    <dataTemplate name="employeeData" description="Employees Data"

    defaultPackage="" Version="1.0">

    <parameters>

    <parameter name="job" dataType="character"/>

    </parameters>

    <dataQuery>

    <sqlStatement name="Q1">

    <![CDATA[

    SELECT em.employee_id,

    em.first_name||' '||em.last_name ename,

    em.email,

    em.phone_number,

    em.salary,

    em.commission_pct

    FROM employees em

    WHERE em.Job_Id = :job

    ]]>

    </sqlStatement>

    </dataQuery>

    <dataSructure>

    <group name="G_EMP" source="Q1">

    <element name="ID" value="employee_id"/>

    <element name="NAME" value="ename"/>

    <element name="EMAIL" value="email"/>

    <element name="PHONE_NUMBER" value="phone_number"/>

    <element name="SALARY" value="salary"/>

    <element name="COMMISSTION" value="commission_pct"/>

    </group>

    </dataSructure>

    </dataTemplate>



  5. หลังจากที่เรามี Template สำหรับ Datasource แล้วก็มา นำมาใช้ใน Code Java ตามตัวอย่างได้เลยครับ


  6. package my.xml;

    import com.sun.java.util.collections.Hashtable;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import oracle.apps.xdo.XDOException;
    import oracle.apps.xdo.dataengine.DataProcessor;

    public class XMLSource {
    public static void main(String[] args) {
    try {
    // Create Connection And Connect To Database
    Class.forName("oracle.jdbc.OracleDriver");
    String url = "jdbc:oracle:thin:@192.168.2.19:1521:ORCL";
    java.sql.Connection jdbcConnection = DriverManager.getConnection(url,
    "HR", "HR");

    // New DataProcess and Set Template
    DataProcessor dataProcessor = new DataProcessor();
    dataProcessor.setDataTemplate("employeeDS.xml");

    // Create Parameter Hashtable and set to DataProcess
    Hashtable parameters = new Hashtable();
    parameters.put("job", "IT_PROG");
    dataProcessor.setParameters(parameters);

    // Set Connection to DataProcess
    dataProcessor.setConnection(jdbcConnection);

    // Generate Datasource to XML File
    dataProcessor.setOutput("employeeData.xml");
    // Process
    dataProcessor.processData();
    } catch (SQLException e) {
    System.out.println("SQLException " + e.getMessage());
    } catch (ClassNotFoundException e) {
    System.out.println("ClassNotFoundException " + e.getMessage());
    } catch (XDOException e) {
    System.out.println("XDOException" + e.getMessage());
    }
    }
    }

เมื่อ Code เสร็จแล้วให้เราลอง Run Code Java ดูเราจะได้ ไฟล์ XML ชื่อ employeeData.xml มาครับ

BEA ปฏิเสธ Oracle ว่า 17 เหรียญต่อหุ้นน้อยไป

เป็นข่าวช็อกวงการ IT ตั้งแต่ตอนที่ Oracle ยื่นข้อเสนอซื้อ BEA ด้วยราคา 17 เหรียญต่อหุ้น
เบ็ดเสร็จเป็นเงิน 6.6 พันล้านดอลล์​ ราคาพอ ๆ กับ SAP ซื้อ BO สำเร็จเมื่อวันที่ 8 ที่ผ่านมา
ทั้งที่ราคานี้ มากกว่าราคาหุ้นของ BEA ใน NASDAQ ถึง 25%

ก่อนหน้านี้เองก็มีข่าวลือว่า Oracle มีความประสงค์จะซื้อทั้ง BEA และ BO อยู่เนือง ๆ
ในที่สุด BO โดน SAP ชิงตัดหน้าสำเร็จก่อน

แต่กลับช็อกวงการกว่าเมื่อ BEA ปฏิเสธ Oracle ว่า 17 เหรียญต่อหุ้นน้อยไป
โดย BEA อ้างว่าบริษัทมีมูลค่ามากกว่านั้นมาก โดยตอบเป็นจดหมายเปิดผนึกไปยัง Oracle
สามารถตามไปอ่านได้ที่นี่

นักวิเคราะห์ต่างก็ชี้ว่า Oracle ตั้งใจจะปิดดีลนี้ให้สำเร็จ และได้คาดการว่าอาจจะจบลงที่ราคา 18-20 เหรียญต่อหุ้น
แต่กว่าดีลนี้จะจบ คงต้องติดตามกันไปอีกยาว ดังเช่นครั้งที่ Oracle กว่าจะซื้อ PeopleSoft สำเร็จก็ร่วมแรมปี

สามารถดูรายชื่อ 32 บริษัทที่ถูก Oracle ซื้อไปนับตั้งแต่ปี 2005 ได้ที่นี่

ที่มา - AOL money & finance

Friday 12 October 2007

ช่วงนี้ผมกำลังจัดกลุ่ม tags, ทำให้ posts วิ่งเข้าไปใน feed อีกรอบครับ

ช่วงนี้ผมกำลังจะจัดกลุ่ม tags (labels) ใน blog ใหม่นะครับ
จะมีผลก็คือว่า posts เก่า ๆ ที่ผมไป update tags (labels)
มันจะวิ่งเข้าไปใน feed RSS อีกรอบน่ะ
พยายามหาวิธีปิดอยู่ครับ แต่หายังไงก็ไม่เจอ
ยังไงก็ทนรำคาญสักสัปดาห์ละกัน นะครับ
ถัดจากนี้ไป posts ใน blog จะได้มี tag ที่ตรงและค้นหาได้ง่ายครับ

การจัดการ Error ที่เกิดขึ้นจากการเรียก EJB Client Application บน WS6

การจัดการ Error ที่เกิดขึ้นจากการเรียก EJB Client Application บน WebSphere 6

สำหรับนักพัฒนาที่เริ่มศึกษา EJB ทุกท่าน มักจะพบปัญญาเดียวกันคือ เรียกใช้ EJB instance ไม่ไดั ทั้งที่พิมพ์ตามหนังสือ, เอกสาร, หรือ tutorial ใด ๆ ทุกอย่างแล้ว ก้อยังฟ้อง Error ออกมาให้ปวดอยู่เสมอ

วันนี้ผมจะนำเสนอเกร็ดเล็กเกร็ดน้อย ที่จะช่วยให้ปัญหากวนใจเหล่านี้ หมดไปเสียที

สมมุติว่าเรามี EJB project ที่ ทำการ deploy ขึ้นไปบน Server เรียบร้อยแล้ว จากนั้นเราก้อจะมาทำ ตัว client ที่จะไปเรียก EJB เหล่านั้น กัน

ผมจะจำแนก ตัว client ออกเป็นสองประเภทครับ คือพวกที่รันอยู่บน JVM เดียวกันกับ EJB และ พวกที่รันบน JVM คนละตัวกับ EJB ตรงนี้ถ้าเราทำตามตัวอย่างในหนังสือ, เอกสาร, หรือ tutorial ใด ๆ จะพบว่า จะมีการเรียก InitialContext Class ดังนี้

InitialContext ic = new InitialContex();

นั่นหมายความว่า การทำงานของ client ตัวนี้ รันอยู่บน JVM ตัวเดียวกัน กับ EJB

แต่สำหรับนักพัฒนาสมัครเล่นอย่างผม ซึ่งมักจะลง JDK ไว้หลาย version เหลือเกิน ไม่รู้ตัวไหนบ้างมั่วไปหมด ดังนั้นแล้วจึงมั่นใจได้ว่า JVM ที่ใช้รัน Client เป็นคนละ
ตัวกับที่รัน EJB ผมจึงหันมาใช้ constructor ที่มีการกำหนดค่า ให้ตรงกับ System Enviroment แทน ดังนี้นะครับ

Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, <factory_Class>); props.put(Context.PROVIDER_URL, <host_name:port>);
InitialContext ic = new InitialContext(props) ;


มาถึงตรงนี้หลายท่านคงสงสัยขึ้นมาบ้าง ว่า <factory_class> ,<hostname:port> เราจะกับหนดค่าอย่างไร อันนี้มันก้อขึ้นอยู่กับว่า เราให้ Application Server อันไหน
เช่น WebSphere, Oracle AS , JBoss, WebLogic เป็นต้น ผมขอยกตัวอย่างที่ผมใช้งานคือ JBoss 4 กับ Websphere 6.0 ดังนี้ครับถ้าเป็น JBoss 4 เราจะเรียกดังนี้ครับ

environment.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");

environment.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");

environment.put(Context.PROVIDER_URL, "jnp://localhost:1098");

// ตรง localhost นี่เปลี่ยนเป็น host ที่ EJB อยู่ในกรณีต่างเครื่อง

// ส่วน port 1098 เป็น default port ของ jboss นะครับ
// ลองเช็คดูได้คับว่าเครื่องเราใช้ port อันไหน เพราะว่าบ่อยครั้งที่ port default ถูกใช้งานไปแล้ว ให้เราลอง
// ตรวจสอบ ใน file jboss-service.xml ตรง tag ที่มีคำว่า name="jboss:service=Naming"
// ก้อให้นำค่าของ port ใน attribute นั้นมาใช้งานครับ

// ส่วนของ Websphere 6 นั้น ดังนี้ครับ


Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory");

props.put(Context.PROVIDER_URL, "iiop://localhost:2809";

// เช่นเดียวกันกับ JBoss ครับ port 2809
// นี่เป็น port default ซึ่งผมจะพบเป็น ประจำเลย
// ว่าเครื่องที่รันไม่ได้ port default
// เพราะลง program อะไรต่อมิอะไรเต็มไปหมด
// จึงต้องทำการตรวจสอบ port server ที่แน่นอนก่อนเรียกใช้
// โดยเข้าไปที่ Server Websphere console นะครับ
// แล้วไปที่ Application servers > server1 > Ports

// server1 คือ ชื่อ server ที่เรา deploy EJB ขึ้นไปนั่นเอง ครับ
// โดยดูที่ port name ว่า "BOOTSTRAP_ADDRESS " ในตาราง
// เราก้อจะได้ port ที่ใช้ในการ remote เข้าไปใช้ instance EJB
// ในกรณีที่ใช้ Websphere Server 6 โดยจะนำ properties นี้
// ไปเป็น argument ให้กับ InitialContext class ดังที่กล่าวไปข้างต้นแล้ว
// ดังนี้ครับ InitialContext ic = new InitialContext(props) ;

// หลังจากนั้น เราก้อจะมาทำการ lookup JNDI
// ของ bean ที่เราต้องการใช้งานนะครับ
// ถ้าเราอ่านดูในหนังสือทั่วไปจะเป็นดังนี้นะครับ
Object o = ic.lookup("java:comp/env/ejb/MyHelloBean");

// MyHelloBean คือชื่อ ของ JNDI Name ที่ประกาศไว้ใน ejb-jar.xml
// แต่กรณีนี้จะใช้ได้กับ JVM เดียวกันเท่านั้นนะครับ กรณีที่เป็น JVM ต่างกัน
// จะไม่รู้จัก java:comp ดังนั้น เราจะต้องเรียกใช้ JNDI name ตรง ๆ
// ดังที่ประกาศไว้ใน ejb-jar.xml ครับ
// (กรณีที่เป็น Websphere 6 จะเป็นชื่อเฉย ๆ เช่น MyHelloBean )
// ดังนั้นโค๊ดของเราจะกลายเป็นดังนี้ครับ
Object o = ic.lookup("MyHelloBean") ;


ส่วนที่เหลือก้อตามโค๊ดในหนังสือ, เอกสาร, หรือ tutorial ใด ๆ ซึ่งถ้าเราพิมพ์ถูกไม่ตกหล่น ก้อไม่น่าจะมีปัญหาอะไรอีกแล้วล่ะครับ หรือถ้าเพื่อน ๆ ท่านใด ยังเจอปัญหา หรือ สงสัยก้อ comment เพิ่มเติมมาได้นะครับ แล้วพบกันใหม่ในบทความถัดไป

Thursday 11 October 2007

มีหนังสือ Oracle ภาษาไทย มาให้ download กันครับ เนื้อหามีตั้งแต่ติดตั้ง Database รวมถึง PL/SQL

มีหนังสือ Oracle ภาษาไทยทั้ง 16 บท พร้อม sourcecode มาให้ download กันครับ


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

หนังสือฉบับเต็ม มีทั้งสิ้น 33 บท คุณบรรศักดิ์ ตัดมา 16 บท ให้ download กัน มีเนื้อหาดังนี้ครับ

บทที่​ 1 ​ความ​รู้​เบื้องต้นการจัดการข้อมูล​ ​และ​ Web Applications (10 ​หน้า, มี sample)
บทที่​ 2 ​การติดตั้ง​ Database 10g ​และ​ Developer Suite 10g (38 ​หน้า, มี sample)
บทที่​ 3 ​การ​ใช้​งาน​ SQL ​แบบ​ Interactive (36 ​หน้า, มี sample)
บทที่​ 4 ​การ​ใช้​ PL/SQL (56 ​หน้า, มี sample)
บทที่​ 5 ​ความ​ถูก​ต้อง​ของข้อมูล​ (Data Integrity) (16) ​หน้า
บทที่​ 6 ​การ​ใช้​ Built-In Functions (18 ​หน้า)
บทที่​ 7 ​การควบคุมจัดการ​ Errors ​ใน​ PL/SQL (10 ​หน้า)
บทที่​ 8 ​การ​ใช้​ Functions, Procedures ​และ​ Packages (8 ​หน้า)
บทที่​ 9 ​การ​ใช้​ Cursors (14 ​หน้า, มี sample)
บทที่​ 10 ​การ​ใช้​ Stored Procedures (8 ​หน้า)
บทที่​ 11 ​การ​ใช้​ Stored Functions (8 ​หน้า)
บทที่​ 12 ​การ​ใช้​ Database Triggers (12 ​หน้า)
บทที่​ 13 Data Consistency ​และ​ Concurrency (10 ​หน้า, มี sample)
บทที่​ 14 ​การทำ​งาน​กับ​ Forms (34 ​หน้า, มี sample)
บทที่​ 15 ​การสร้าง​ Master Form (18 ​หน้า, มี sample)
บทที่​ 16 ​การสร้าง​ Property Classes ​และ​ Visual Attributes (12 ​หน้า)
บทที่​ 17 ​การทำ​งาน​กับ​ Libraries (6 ​หน้า)
บทที่​ 18 ​การทำ​งาน​กับ​ Alerts, Hint ​และ​ Tooltip (10 ​หน้า)
บทที่​ 19 ​การสร้าง​ Master-Detail Form (24 ​หน้า, มี sample)
บทที่​ 20 List of Values, Radio Button, Item List ​และ​ Popup Menus (35 ​หน้า, มี sample)
บทที่​ 21 ​การส่งผ่าน​ Parameter ​บน​ Forms (10 ​หน้า)
บทที่​ 22 ​การสร้าง​ Multiple Canvases ​บน​ Form (8 ​หน้า)
บทที่​ 23 ​การทำ​งาน​กับ​ Menus (28 ​หน้า, มี sample)
บทที่​ 24 ​การสร้าง​ Form ​แบบ​ Tab Pages (Multiple Pages) (16 ​หน้า, มี sample)
บทที่​ 25 ​การสร้าง​ Toolbars (8 ​หน้า)
บทที่​ 26 ​การทำ​งาน​กับ​ Reports (32 ​หน้า)
บทที่​ 27 ​การสร้าง​ Break Report (8 ​หน้า, มี sample)
บทที่​ 28 ​การสร้าง​ Master-Detail Report (16 ​หน้า, มี sample)
บทที่​ 29 ​การสร้าง​ Report ​แบบ​ Form Letter (4 ​หน้า)
บทที่​ 30 ​การแสดง​ Report ​ใน​ Database Applications (24 ​หน้า, มี sample)
บทที่​ 31 ​การทำ​งาน​กับ​ LOB Object (8 ​หน้า, มี sample)
บทที่​ 32 ​การสำ​รอง​ ​และ​กู้คืนข้อมูล​ (Backup ​และ​ Recovery) (30 ​หน้า)
บทที่​ 33 ​การติดตั้ง​ Application Server 10g ​และ​ ​การ​ใช้​งานผ่าน​ Web (35 ​หน้า)

ถ้า download ไปอ่านแล้วเห็นว่าเนื้อหาดี ซื้อมาเก็บไว้สักเล่มดีกว่าครับ
เห็นใจคุณบรรศักดิ์ เกิดชัยฤทธิ์ ใจดีเอามาแจกให้ตั้งครึ่งเล่ม

ส่วนผมอ่านดูแล้วครับ เขียนดี เนื้อหาครบถ้วนครับ

Wednesday 10 October 2007

Data Warehouse

วันนี้ผมขอเปลี่ยนเรื่องบ้างนะครับ พอดีได้รับมอบหมายงานใหม่ เกี่ยวกับ Data Warehouse ก็เลยเตรียมตัวไว้ก่อน ไหนๆเตรียมตัวแล้ว ก็อยากจะ share ให้เพื่อนๆบ้าง

เพื่อนๆรู้มั้ยว่า Data Warehouse ต่างกับ Database ตรงไหน บางคนก็งง ผมก็งงเหมือนกัน เพิ่งไปอ่านเจอใน wiki http://th.wikipedia.org/wiki/%E0%B8%84%E0%B8%A5%E0%B8%B1%E0%B8%87%E0%B8%82%E0%B9%89%E0%B8%AD%E0%B8%A1%E0%B8%B9%E0%B8%A5 เค้าบอกว่า

Data Warehouse คือ คลังข้อมูล ใช้สำหรับการวิเคราะห์ ซึ่งได้จากการรวบรวมข้อมูลทั้งอดีตและปัจจุบัน ส่วน

Database คือ ฐานข้อมูล ใช้ในการประมวณผลทำ transaction ในปัจจุบัน ดังนั้นข้อมูลที่ใช้ก็เป็นข้อมูลปัจจุบันด้วยครับ


แต่ถ้า Data Warehouse ไหนมีการจัดหมวดหมู่ด้วย เค้าจะเรียกว่า ตลาดข้อมูล หรือ Data Marts


เมื่อได้ Data Warehouse แล้วส่วนต่อมาก็คือ การวิเคราะห์ข้อมูล โดยแบ่งออกเป็น 2 ประเภท คือ


1. Online Analytical Processing (OLAP) เป็นการ Query ดึงข้อมูลขึ้นมา ซึ่งก็จะคล้ายๆกับการ Query บนฐานข้อมูลทั่วไป

2. การทำเหมืองข้อมูล หรือ Data Mining เป็นการค้นหา Pattern หรือความสัมพันธ์อะไรบางอย่างที่เกิดขึ้นกับข้อมูล ตัวอย่างเช่น ห้างสรรพสินค้า ปกติคนมักจะซื้อกระดาษกาว ก็มักจะซื้อกรรไกรไปด้วย เมื่อระบบวิเคราะห็ได้แบบนี้ ก็จะทำให้เกิดการขายแบบเป็นแพ๊คคู่กัน หรือว่าสินค้าไว้ใกล้กัน นี่ก็เป็นหลักการตลาดอย่างหนึ่งครับ

วันนี้เพิ่งตาสว่างมากขึ้นหละครับ

ADF Search Forms ตอนที่ 1 สร้างด้วยวิธี Named Bind Variables

ระหว่างที่รอคุณ Tangy เขียนเรื่อง BC4J ตอนที่ 3
ผมขอคั่นจังหวะ ด้วยการสร้าง ADF Search Forms ด้วย Technology BC4J กับ ADF Faces
บน Oracle JDeveloper 10g ก่อนนะครับ

เพื่อน ๆ จะได้เห็นภาพกว้างมากขึ้น ว่า ADF ทั้งหมด สามารถทำอะไรได้ขนาดไหน
เมื่อย้อนกลับไปอ่านเรื่อง BC4J ตอนที่ 1 และตอนที่ 2 จะยิ่งเข้าใจมากขึ้นครับ

Search form ใน ADF มีวิธีสร้างได้หลายแบบด้วยกัน
แต่ที่ผมใช้อยู่หลักๆ มีอยู่ 2 วิธี คือ

  1. EnterQuery/ExecuteQuery อันนี้ง่ายสุด สร้าง View Object เสร็จปุ๊บ ลากวางปั๊บ เสร็จเลย ( ... ง่ายขนาดนั้นเลยเหรอ ไว้มาเขียนในตอนต่อไป)
  2. Named Bind Variables วิธนี้สร้าง parameter ที่ต้องการใช้ search รอรับใน Querey SQL แล้วเราส่งค่า parameter จากหน้า form search ไปให้ ข้อดีของวิธีนี้ คือมีความยืดหยุ่นในการทำงานสูง ความสา เช่น เราสามารถเขียน query sql ให้ search เอาข้อมูลเฉพาะช่วงเวลาที่เราต้องการ
ในตอนนี้ ผมจะแสดงตัวอย่างการ Search แบบ Named Bind Variables เป็น ตัวอย่าง form search ในการหาข้อมูลพนักงาน

เริ่มกันเลย
มี table ชื่อ EMPLOYEE_TABLE ใน DB มีข้อมูล ดังนี้

ขั้นแรก
ผมทำการสร้าง view object (Read-only View เพราะเราใช้ในการ view ดูข้อมูลอย่างเดียว ไม่ได้ manage ข้อมูลใน DB จริงๆ) ชื่อ EmpolyeeView


View Object มี SQL querey ดังนี้

SELECT FIRST_NAME, LAST_NAME, EMAIL_ADDRESS
FROM
employee_table
WHERE FIRST_NAME LIKE DECODE(
:PfirstName,'',FIRST_NAME, :PfirstName)
AND LAST_NAME LIKE DECODE(
:PlastName,'',LAST_NAME, :PlastName)
AND EMAIL_ADDRESS LIKE DECODE(
:Pemail,'',EMAIL_ADDRESS, :Pemail)

ใน SQL query มี parameter ชื่อ PfirstName, PlastName และ Pemail รอรับค่าจากหน้า form search เพื่อเอาไปใช้ search ใน database
parameter จะมีเครื่องหมาย colon นำหน้า ในที่นี้ให้ถ้าไม่มีค่าอะไรส่งให้ parameter ก็ให้ search ให้เจอให้หมด โดยใช้ความสามารถของ sql querey => decode


นำ View Object ที่ได้มาใส่ใน AppModule เสร็จสิ้นขั้นตอนการสร้างชั้น Business


ขั้นต่อไปก็สร้างส่วนของชั้นหน้าจอ โดยวิธีการลากวาง
  1. ลาก View EmployeeView เลือกเป็น ADF Read-only table เป็นส่วนแสดงผลข้อมูลที่ search เจอ
  2. ลาก action ExecutewithParam ของ view EmployeeView ตัวเดิม เลือกเป็น from search


เสร็จแล้ว ลองเล่นดู

search ไม่ใส่ parameter อะไรจะเป็นการ search ข้อมูลทั้งหมด


search ข้อมููลโดยนามสกุลพนักงาน


Search ข้อมูล โดยเลือกชื่อพนักงานที่ขึ้นต้นด้วยอักษร 'ก'


เป็นอันเรียบร้อยครับ ไวดีมั้ยครับ?
ยังไงรอดูตอนถัดไปของผมนะครับ เด็ดดวง!

Monday 8 October 2007

ทำไมเว็บไซต์ใหญ่ ๆ หลายแห่ง ถึงไม่เขียนด้วยภาษา java

ผมอ่านมาจาก Nati Shalom's Blog จึงเห็นว่าน่าสนใจดีเลยจะนำมาเล่าให้ฟังกัน



นี้เป็นข้อมูลคร่าวๆว่า เว็บไซต์ดังๆหลายแห่งเช่น Firckr, YouTube, MySpace ... เค้าออกแบบระบบกันอย่างไรใช้ Technology อะไรกันบ้าง ซึ่งสรุปได้คร่าวๆดังนี้

OS: Linux 7 - Windows 2
Web server: Apache 7 - IIS 2 - Lighttpd 2
Scripting: PHP 4 - Perl 4 - ASP.NET 2 - Python 1 - Java 1
Database: MySQL 7 - SQL Server 1 (possibly 2)

ตัวเลขข้างหลังหมายถึงจำนวนที่ web ในตารางใช้

แน่นอนว่าเว็บไซต์เหล่านี้ต้องมีระบบขนาดใหญ่ มีความเสถียรภาพสูง เค้าทำกันอย่างไร เพื่อรองรับจำนวน transaction เป็นล้านๆต่อวัน

ส่วนใหญ่ใช้ LAMP (Linux, Apache, Mysql, PHP) กันเยอะ แต่ก็จะมีบ้างที่พัฒนา file system ขึ้นมาเองเช่น GFS ของ Google

บางที่ใช้ cache เพื่อช่วยแก้ปัญหาคอขวดของ database
และบางที่ก็แก้ปัญหาด้วยวิธีที่พัฒนาขึ้นมาเอง แต่ละแห่งก็ใช้วิธีที่ต่างกัน

แต่ที่สงสัยคือทั้งที่ Architecture J2EE ถูกออกแบบมาเพื่อระบบขนาดใหญ่ แต่ทำไมไม่มีใครนำไปใช้

เท่าทีอ่านดู Nati Shalom สรุปใจความได้ว่า ถ้าใช้ LAMP ในการพัฒนาระบบ ไม่ต้องกังวลเรื่องของค่าใช้จ่ายเกี่ยวกับ software และ LAMP เสถียรพอสมควรเลยทีเดียว แต่นี้เป็นเพียงความเห็นส่วนตัวของ Nati Shalom แล้วผู้อ่านคิดว่ายังไงกันบ้างครับ

Reference:
อยากอ่านเต็มๆเข้าไปอ่านได้ที่ http://natishalom.typepad.com/nati_shaloms_blog
มาดูว่าเว็บไซต์ขนาดใหญ่หลายแห่งเค้าออกแบบระบบกันอย่างไร http://www.highscalability.com

Oracle ADF Business Component (BC4J) ตอนที่ 2 เริ่มต้นกับ Entity Object

ต่อจากคราวที่แล้ว วันนี้ผมจะเสนอ Layer แรกของ BC4J ก่อนเลยนะครับ คือ Entity Object
นิยามสั้นๆ ของ Entity Object ก็คือ เป็น Persistence Layer ซึ่งเปรียบได้กับ 1 Row ใน Table นั้นเองครับ แต่มันมีความสามารถมากกว่านั้นคือ มันสามารถที่จะสร้างกฎเกณฑ์เพื่อมา validate ข้อมูลแต่ละ Row นั้นได้ก่อนที่จะมีการลง DB จริง แถมยังสามารถใช้ IDE ช่วย Gen ได้อีกต่างหาก ทำให้การเขียนโค้ดน้อยลงด้วย

เรามาลองสร้าง Entity Object ซัก 1 Table กันนะครับในที่นี้สมมติว่าทุกคนมี JDeveloper กันแล้วนะครับหรือใครยังไม่มีนะครับ Oracle เค้าใจดี download ฟรีได้จาก http://www.oracle.com/technology/software/products/jdev/index.html

ก่อนอื่นสร้าง Application กับ Project ขึ้นมาก่อนนะครับ ต่อไปขั้นตอนการสร้าง Entity Object มีดังนี้

1. คลิกขวาที่ Project เลือก New นะครับจะขึ้นมาตามรูป Expand Business Tier จะเห็น ADF Business Component เลือก Entity Object ครับ


2. จะขึ้นหน้าต่างให้สร้าง Connection DB ก่อน ตรงนี้เราสามารถเลือก Type ของ DB ได้นะครับ ไม่ว่าจะเป็น DB2, MySQL ก็ได้ครับ ในที่นี่ผมใช้ DB Oracle Schema OE ที่เป็น Defualt มาให้นะครับ จากนั้นกด OK


3. ส่วนนี้คือหน้าต่างให้เลือก Table ที่ต้องการสร้าง Entity Object เลือกสร้าง CUSTOMER Table ก็แล้วกันครับ โดยผมวางไว้ที่ package model ครับ จากนั้นกด Next


4. หน้าต่างจะบอกว่าใน Entity Object จะมี Attribute อะไรบ้าง มองง่ายๆก็คือชื่อ Column ใน Table CUSTOMER นั่่นเองครับ จากนั้นกด Next อีกครั้ง


5. คราวนี้ก็จะแสดงรายละเอียดของแต่ละ Attribute เช่น CustomerId ซึ่ง Map กับ Column CUSTOMER_ID ซึ่งเป็น Primary Key ของ Table และต้องมีการเก็บข้อมูลลง DB ดังนั้นจึงเป็น Persistenence เราสามารถที่จะดูรายละเอียดของ Attribute อื่่น ให้เลือกที่่ Select Attribute นะครับ


6. หน้าต่างนี้จะให้เลือกว่าจะสร้าง Java Class เพิ่มอีกหรือป่าว ส่วนนี้ผมก็ไม่ชำนาญเท่าไหร่มักจะ Default เอาไว้อย่างนี้หละครับ กด Next


7. หน้าต่างนี้จะเป็นหน้าสรุปครับ กด Finish โลดเลยครับ


สุดท้ายจะได้ดังรูปนี้ คือได้ Component เป็นรูปเกียร์ชื่อ Customers โดย Structure ของ Customers จะมีด้วยกัน 2 file คือ

1. Customers.xml เป็น configuration file xml ที่ทำการ Map Class JAVA กับ Column ใน Table ในที่นี้ และจะเก็บรายละเอียดของแต่ละ Attribute เอาไว้ด้วย เช่น Column ไหนเป็น Primary Key , Column ไหนห้ามเป็น Null (Mandatory Field)

2. CustomersImpl.java เป็น Class JAVA ที่จะมี Attribute เป็น Column ใน Table และมี method พวก Accessor เอาไว้เรียกใช้ได้ครับ

คราวหน้าผมจะมาสอนวิธีการเรียกใช้ Entity Object โดยตรงให้นะครับ ขอตัวไปทำงานก่อน ^^

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