go to http://oracle.in.th

Wednesday, August 26, 2009

Oracle External Table #1

Oracle External Table เป็นการนำความสามารถของ SQL* Loader มาประยุกต์ใช้ ในส่วนของการโหลดข้อมูลจากไฟล์ข้อความ (Text File) หรือไฟล์อื่นๆที่ไม่ได้อยู่ในฐานข้อมูล แต่อยู่ภายนอกฐานข้อมูล เช่น อยู่ใน File System มาเก็บไว้ในตาราง
แต่ในส่วนของ External Table นั้น ข้อมูลที่ถูกโหลด เข้ามาจะไม่ได้ถูกเก็บลงฐานข้อมูลจริงๆ เปรียบเสมือนเป็นตารางชั่วคราว (Temp Table) ไว้สำหรับพักข้อมูลเพื่อจะนำไปใช้ต่อ เช่น กรณีที่มีไฟล์ข้อความและต้องการจะโหลดเก็บไว้ในฐานข้อมูลจริงๆเราจะไม่สามารถทำการโหลดได้โดยตรง แต่จะใช้ External Table ช่วยโดยทำการโหลดจากไฟล์ข้อความมาเก็บไว้ที่ External Table ก่อน จากนั้นจึงทำการ Query จาก External Table ลงไปยังตารางที่อยู่ในฐานข้อมูลจริงๆได้ สรุปคร่าวๆได้ดังนี้
Text File -> External Table -> Database
ซึ่งจากพฤติกรรมของ External Table ซึ่งเปรียบเสมือนตารางพักข้อมูลเท่านั้น ทำให้ External Table สามารถทำได้แค่เพียง Select เท่านั้น และไม่สามารถสร้าง Index ได้ ซึ่งจะต่างจาก SQL* Loader ที่สามารถสร้าง Index ได้
คำสั่งที่ใช้ในการสร้าง External Table จะอยู่ในรูปแบบของ CREATE TABLE ... ORGANIZATION EXTERNAL และส่วนใหญ่การใช้งานจะนำไปใช้ในการโหลดไฟล์ข้อความที่อยู่ในรูปของไฟล์ CSV และไฟล์ที่มีข้อมูลในแต่ละบรรทัดมีความยาวที่เท่าๆ กัน (Fixed Length)
ตัวอย่างข้อมูลของไฟล์แบบ CSV
1, A, 001M
2, B, 002M
3, C, 003M
ตัวอย่างข้อมูลของไฟล์แบบ Fixed Length
1A001M
2B002M
3C003M
คราวหน้าจะต่อเรื่อง "ขั้นตอนการทำ External Table" ครับ
Created By: Pinant Thammanajit
ข้อเขียนนี้ช่วยฉัน:  

Sunday, August 23, 2009

PowerPoint งาน Oracle Fusion Middleware (OFM) 11g

อ้างอิงจาก Post ก่อนหน้านี้ครับ ภาพวันเปิดตัว Oracle Fusion Middleware 11g
วันนี้เอา PowerPoint ของ speaker ในงานมาให้ดูครับ

PowerPoint ที่ให้ดู จะมี 2 ส่วนครับ
อันแรกจะเป็น Overview of Oracle Fusion Middleware 11g





ถัดมาจะเป็นเรื่อง Application Grid Overview ครับ



















Post หน้าจะมาสรุปให้ฟังครับว่า OFM 11g มีอะไรน่าสนใจบ้างครับ
ข้อเขียนนี้ช่วยฉัน:  

Wednesday, August 19, 2009

Oracle Enterprise Pack for Eclipse (OEPE)




Oracle Enterprise Pack for Eclipse (OEPE)
มันคือ plug-in ของ eclipse ที่ออกมาโดย oracle โดยที่ plug-in ตัวนี้จะรองรับ product ต่างๆที่เกี่ยวข้องกับ SOA และ product ของ oracle ทั้งหมดไม่ว่าจะเป็น Oracle WebLogic Server, Oracle Database และ Kodo JDO นอกจากนั้นยังมี tool ที่ support Spring, JSF Facelets และ Struts อีกด้วย แต่ที่น่าแปลกไม่มี TopLink, ADF หรือ BC4J ของ oracle เลย (หรือว่ามันตายไปแล้วนะ)


SOA
OEPE จะช่วยในการพัฒนา SOA ให้ง่ายขึ้นโดยใช้ feature FastSwap ของ Weblogic เข้ามาช่วยในการ development

FastSwap ถ้าหากต้องการคำนิยามง่ายๆก็เปรียบได้กับ java rebel ที่ตอนนี้กำลังเป็นที่นิยมกัน โดย FastSwap และ java rebel นั้นจะมีการทำงานที่คล้ายกัน โดยปกตินั้นเวลาที่เราต้องทำงานที่เกี่ยวกับ web หรือ web services สิ่งที่หนีไม่พ้นนั้นก็คือวัฏจักรวงจรเดิมๆในการ develop คือ Edit -> Build -> Deploy -> Test เมื่อ test เสร็จแล้วต้องการจะแก้ต้องกลับไป edit เมื่อ edit เสร็จจะ test ต้องเจอกับ build ก่อน (pack เป็น jar, war, ear) จากนั้นก็นำไป deploy แล้วจึงสามารถ test ได้ ซึ่งการ deploy ใหม่นั้นบางครั้งต้องมี undeploy อีก ซึ่งหากเราไปแก้ไข วัฏจักรวงจรเดิมๆ เหล่านี้โดยตัดบางอย่างออกไปได้ก้จะทำให้พัฒนาได้เร็วขึ้น (เพราะว่าผมก็เคยเจอเหตุการณ์นี้ในตอนทำงานระหว่างรอ EJB 2.0 กว่าจะ build กว่าจะ deploy กว่า restart application server หมดเวลากันไป 10-20 นาที) โดย FastSwap และ java rebel นั้นจะเอาขั้นตอนการ deploy ออกไป ดูให้เห็นภาพไปดู vdo นี้กัน

ข้อเปรียบระหว่าง FastSwap กับ java rebel

FastSwap พื้นฐานของมันมากจาก feature ใหม่ของ Java SE 5’s dynamic class redefinition จะใช้ Instrumentation interface ในการ redifining classes ทำให้ถ้าต้องการใช้ feature นี้ ต้องเป็น project ที่ support JDK 5.0 ขึ้นไป (ref ของเรื่อง dynamic class redefinition หายากมากและเป็น feature ไม่เคยรู้มาก่อนจริง) และมีข้อจำกัดมากมาย Limited reflection support (no new/changed/deleted methods/class annotation/type annotations) -> no framework support (details at the end) และผูกติดกับ Weblogic

java rebel ไม่ได้ใช้ feature ของ Java SE 5’s dynamic class redefinition แต่สร้างขึ้นมาเอง ดังนั้นจึง support JDK ตั้งแต่ version 1.4 ขึ้นไปและมีข้อจำกัดไม่มากเหมือน FastSwap ด้วย และสามารถนำไปใช้ได้เกือบทุก platform ของ java ไม่ได้ผูกติดกับ application server


Oracle Weblogic
OEPE นั้นช่วยให้การใช้งานหรือการ configuration Weblogic ได้ง่ายขึ้น เพราะว่าในตอนนี้ eclipse ยังไม่ support Oracle Weblogic ดังนั้นใครที่ทำงานเกี่ยวกับ Oracle Weblogic โดยใช้ eclipse หละก็ plug-in ตัวนี้ก็เหมาะอย่างมาก


Oracle Database
ต่อกับ oracle database และตัวอื่นๆใน Data source explorer รู้สึกครบเครื่องมาก มีลูกเล่นมากขึ้น มากกว่า Data source explorer ธรรมดา และสามารถ view diagram ของแต่ละ table ได้ด้วย


Kodo JDO
JDO ถ้าจะมองให้ง่ายๆมันก็คือ EJB 3.0 ตัวหนึ่งที่มีบางสิ่งที่ต่อเติมขึ้นมาทำให้ EJB 3.0 มีประสิทธิภาพและใช้งานง่ายขึ้น ซึ่งถ้าใครใช้งาน EJB 3.0 อยู่แล้วจะมาเปลี่ยนเป็นใช้ JDO นั้นแทบไม่ต้องปรับเปลี่ยนอะไรเลยเพียงแต่เรียนเพิ่มเติมในส่วนที่เพิ่มเข้ามาเท่านั้น และเราสามารถใช้ tool นี้ในการ generate EJB 3.0 ได้ง่ายขึ้นด้วย เพราะว่ามันจะช่วยเราในเรื่องการทำ mapping entity ได้ง่ายขึ้นด้วย ลองทำตามดูตาม link เลยครับ


Spring
เป็น plug-in ที่ช่วยสอดประสานระหว่าง JPA และ Spring DAO ได้ดีทีเดียว มี tool ช่วย generate ให้ซึ่งลองทำตามได้ตาม link นี้ครับ


สรุป
ผมให้ความสามารถของ plug-in ตัวนี้ 9/10 ครับ เหมาะมากสำหรับการทำ Java EE Application นอกจากนี้ document สอนการใช้ tool ค่อนข้างละเอียดแถมมี vdo การสอนด้วย เป็น step ดีมาก

Ref :


ข้อเขียนนี้ช่วยฉัน:  

Tuesday, August 18, 2009

[news] Larry Ellison ตกอันดับ CEO ที่ได้ค่าเหนื่อยมากที่สุดในโลก

การจัดอันดับผู้บริหารที่มีรายได้สูงสุด 10 อันดับแรก ในปี 2008 ที่ผ่านมาพบว่า Larry Ellison ผู้บริหารของออราเคิล ซึ่งเคยอยู่อันดับหนึ่งของผู้บริหารที่มีรายได้สูงที่สุดในปี 2007 ตกอันดับลงมาอยู่ที่อันดับที่ 2 รองจาก Stephen Schwarzman ผู้บริหารของกลุ่มบริษัท Blackstone Group โดยมีรายได้มากกว่า 700 ล้านดอลลาร์สหรัฐ ส่วน Larry Ellison มีรายได้รองลงมาคือ 557 ล้านดอลลาร์สหรัฐ
รายได้ของ Larry Ellison มาจากส่วนแบ่งจากการออกหุ้นของออราเคิล และในปี 2008 พบว่า ราคาหุ้นของออราเคิลลดลงถึง 21% แต่อย่างไรก็ตาม Larry Ellison ก็ยังถูกจัดอันดับว่าเป็นผู้บริหารที่มีรายได้สูงสุดอันดับต้นๆใน 10 อันดับแรกและคงจะเป็นแบบนี้ไปอีกหลายๆปี ส่วนอันดับอื่นๆรองลงมานั้น ส่วนใหญ่ก็ยังคงเป็นของผู้บริหารด้านธุรกิจพลังงาน
อ้างอิง
ข้อเขียนนี้ช่วยฉัน:  

JavaScript Server Page

มันเป็นการรวมความสามารถของ JavaScript และ Java เข้าไว้ด้วยกัน พยายามให้เราเขียนโค้ดง่ายๆ ด้วย syntax JavaScript แต่ทำงานได้อย่างมีประสิทธิภาพแบบ Java โดย JSSP มันเป็น runtime lib ที่สร้าง web page ผ่านทางภาษา JavaScript ที่รันอยู่บน servlet container เช่น Tomcat, JBoss เป็นต้น

เราไม่จำเป็นต้องเข้าใจภาษา Java มันเหมือนกับพวกภาษา PHP, ASP และ JSP เป้าหมายของมันคือสร้าง web application ที่ง่ายแต่มีประสิทธิภาพ และปริมาณโค้ดที่น้อยเพื่อลดความซับซ้อนของโด้ดให้น้อยที่สุด เราสามารถเข้าถึงฐานข้อมูล หรือ java class ได้ผ่านทางโดยตัว JSSP เสมือนกับ RMI

JSSP แบ่งออกเป็น 2 component หลักๆ
  • JSSP web component เป็นส่วนที่ใช้รัน JavaScript บนฝั่ง Server
  • JSSQL component สร้างเพื่อให้ JSSP ใช้ sql query ในการเข้าถึงฐานข้อมูลได้ โดยมันปรับปรุงมาจาก Mozilla Rhino
ข้อดีของการใช้ JavaScript
  • Function language
  • Dynamic language
  • Easy เขียนง่าย
  • Interpreted language เป็นภาษาที่ interpret ไม่จำเป็นต้องผ่านการ compile ก่อนถึงใช้งานได้
  • Dynamic properties สามารถเพิ่มลด attribute, function ได้ในขณะรันไทม์
  • Reuseability ง่ายและยืดหยุ่นในการสืบทอดฟังช์ชั่นที่มีอยู่แล้ว
  • XML ง่ายในการเขียนโปรแกรมจัดการกับเอกสาร xml
ข้อดีของ JSSP
  • Embedded SQL เพิ่มความนสามารถในการติดต่อฐานข้อมูล เข้าไปโดยเราสามารถเขียน sql เพื่อ query ข้อมูลมาแสดงผลได้โดยข้างในมันจะติดต่อฐานข้อมูลผ่านทาง JDBC ให้เอง
  • AJAX รองรับการทำงานแบบ ajax
  • I18N รองรับการทำงานที่ใช้หลายภาษาได้
  • Dervish เป็นเทคโนโลยีที่ใช้สื่อสารกับทางฝั่งเซิร์ฟเวอร์โดยซ่อนการทำงานไว้เบื่อหลัง ช่วยให้เราสามารถเรียกใช้ออปเจคต่างๆ ที่ประกาศไว้ฝั่งเซิร์ฟเวอร์ได้
  • Easy deployment ทุกครั้งที่มีการเปลี่ยนแปลงโค้ด เราไม่จำเป็นต้องรีสตาร์ทเซิร์ฟเวอร์ช่วยลดเวลาที่ไม่จำเป็นออกไป
    Library support มี api รองรับที่เพียงพอต่อการใช้งาน
ข้อจำกัดของ JSSP
JSSP มันไม่ใช่ Framework ดังนั้นคุณจะเห็นโค้ดปนไปด้วยลอจิกทางฝั่งธุรกิจ + โค้ดทางฝั่งแสดงผล มันจึงไม่เหมาะกับแอพพลิเคชันที่มีขนาดใหญ่ๆ แต่มันเหมาะกับแอพพลิเคชันขนาดเล็กถึงขนาดกลางมากกว่า
นอกจากนี้มันยังไม่มีไลบารี่ที่จำเป็นอีกบางอย่าง เช่นการเข้าถึงไฟล์ หรือการเข้าถึง network (คาดว่าน่าจะมาในรุ่นถัดๆ ไป) แต่เราสามารถใช้ Java ไลบารี่ช่วยทำงานในส่วนนี้ไปก่อนได้
และถึงแม้ syntax ของ JSSP จะถูกเขียนด้วยภาษา JavaScript แต่ด้วยความที่มันทำงานบนฝั่งเซิร์ฟเวอร์จึงไม่สามารถใช้งานออปเจคที่ทำงานบนฝั่งไคลแอนด์ได้เช่นออปเจค window หรือ document

ตัวอย่างสวัสดีชาวโลก
<html>
<body>
<% out.print("Hello World!"); %>
</body>
</html>

ตัวอย่างการเข้าถึงฐานข้อมูล
<%
var stmt = connection.SELECT * FROM Employees WHERE Name = ?Name?;
stmt.Name = "Jack";
var rset = stmt.run();
while (rset.next()) {
// do something with the result
}
%>
ด้วยความที่มัน implement ได้ค่อนข้างง่ายจึงมี workflow ของญี่ปุ่นตัวหนึ่งหยิบไปใช้สนใจลองเข้าไปดูได้ intra-mart

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

อ้างอิง:
ข้อเขียนนี้ช่วยฉัน:  

Monday, August 17, 2009

XWT: version ใหม่ของ SWT ที่น่ามอง

XWT นั้นเป็น SWT ธรรมดาตัวหนึ่งเพียงแต่ว่าแยกส่วนของ view ออกมาไว้ใน xml ส่วน model และ controller นั้นยังอยู่ใน code java เหมือนเดิม ซึ่งโดยปกติที่เราเขียน SWT ถึงแม้ว่าเราเขียนใน code java ทั้งหมดแต่เราก็สามารถแยก model, view และ controller ออกได้เองอยู่แล้ว เพียงแต่ XWT นั้นช่วยทำให้มันเห็นเด่นชัดมากขึ้นนั้นเอง

การ design หน้า view ของ XWT

<Shell xmlns="http://www.eclipse.org/xwt/presentation"
  xmlns:x="http://www.eclipse.org/xwt">
  <Shell.layout>
    <FillLayout/>
  </Shell.layout>
  <Button text="Hello, world!">
  </Button>
</Shell>


* This source code was highlighted with Source Code Highlighter.


แทนที่การ design หน้า view ของ SWT

Shell parent = new Shell();
parent.setLayout(new FillLayout());
Button button = new Button(parent, SWT.NONE);
button.setText("Hello, world!");


* This source code was highlighted with Source Code Highlighter.

จะเห็นว่ามันง่ายมากขึ้นและสามารถ maintain ได้ง่ายขึ้น แต่สำหรับคนที่มองว่าการเขียน xml เป็นเรื่องยุ่งยากให้เราลองมองว่า xml นี้มันเหมือนกับ html ธรรมดา

ซึ่งก่อนที่ eclipse จะทำ XWT ออกมาก็มี plug-in ต่างๆมากมายที่รองรับการเขียนในส่วนของ view ของ SWT ต่างๆในรูปของ xml ไม่ว่าจะเป็น swtxml, CookSwt: XML to SWT GUI, และอื่นๆอีกมากมาย และดูเหมือนในตอนนี้ผมรู้สึกว่า plug-in ของเจ้าอื่นๆยังใช้ง่ายกว่าอีก (หรือเพราะว่ามันเป็นแค่ RT อยู่ทำให้มันขัดใจได้ขนาดนี้) แน่นอนว่า eclipse ทำมาทั้งทีจะแค่นี้ได้อย่างไร โดยผู้ออกแบบนั้นต้องการที่จะให้ XWT นั้นเป็นสื่อกลางของ UI ทั้งหมดที่พร้อมจะ port ไปเป็นอะไรก็แล้วแต่โดยที่ในรูปด้านล่างจะยกตัวอย่างของ SWT และ JFace และดูเหมือนว่าในจะรองรับการ port ออกมาเป็น web ด้วยซึ่งถ้าเป็นเช่นนั้นจริงถือว่าเป็นการเปิดตลาดของ RIA ขึ้นเหมือนกับของ sun ที่เปิดตลาด RIA ด้วย Java FX (มันคล้ายกับ Java มี Swing แต่ Eclipse ออก SWT มาใช้แทน)

ภาพ UI จากที่ port จาก XWT เป็น web


ภาพ UI จากที่ port จาก XWT เป็น swt


โดย vendor ที่เริ่มต้น project นี้คือ soyatec ซึ่งมีหลาย project ซึ่งที่ผมใช้อยู่นั้นคือ euml2 และยังมีอื่นๆอีกเช่น eFace และ eBPMN



โดยแนวคิดนี้ดูเหมือนจะคล้ายกับ XAML ของ M$ มากโดยถ้าหากมันสวยดังรูปที่ demo มาจริงๆหละก็อาจจะมาแทนที่ Java FX เลยก็ได้และเป็นคู่แข่งกับ Flex และ Silverlight ได้อย่างสูสีแต่ ณ ตอนนี้ที่สามารถลองเขียนและ demo ได้จริงนั้นเป็นเพียงแค่ XWT -> SWT เท่านั้นซึ่งผมลองเล่นดูแล้วมันค่อนข้างที่ไม่เหมือนกับภาพด้านบนที่มัน Demo เลยให้ความรู้สึกเหมือน Swing กับ SWT ปกติ ซึ่งอาจเป็นเพราะว่ายังเป็นแค่ RT เท่านั้น

Update :: XWT ที่สามารถ run ทั้งใน desktop application หรือที่ port ออกมาเป็น web application ได้สวยนั้นเพราะว่าใน desktop application นั้นมันจะแปลง XWT เป็น Flex ส่วน web application นั้น XWT จะแปลงเป็น GWT นั้นเอง
RAP ขอโทษครับผิดผลาดอย่างแรง

Update 2 :: ไปลองเล่น demo จริงๆของ XWT ที่ port เป็น RAP ที่นี่


Ref : http://wiki.eclipse.org/E4/XWT, http://dev.eclipse.org/blogs/yvesyang/2008/11/28/xwt-declarative-ui-designed-for-eclipse/, http://wiki.eclipse.org/E4

ปล. http://sourceforge.net/projects/xwt, http://www.xwt.org/ ดูเหมือนว่าจะเป็นคนละ project และไม่เกี่ยวข้องกับ XWT ของ Eclipse เลย
ข้อเขียนนี้ช่วยฉัน:  

Friday, August 14, 2009

ภาพบรรยากาศในงานเปิดตัว Oracle Fusion Middleware 11g สำหรับ Partners













ภาพบรรยากาศในงานเปิดตัว Oracle Fusion Middleware 11g สำหรับ Partners
เมื่อวันที่ 13 สิงหาคม 2552 ที่โรงแรม Arnoma

เอกสาร ppt ที่ speaker ใช้ในงานจะ upload ให้อีกทีครับ
ข้อเขียนนี้ช่วยฉัน:  

PC connecting Mobile

ขอแวะเอาเรื่อง Java มาตัดความร้อนแรงของ Oracle ในบล็อกหน่อย ในโพสนี้จะพูดถึงการเชื่อมต่อระหว่าง PC กับอุปกรณ์สื่อสาร โดยอุปกรณ์สื่อสารที่พูดถึงนั้นเป็นไปได้ทั้งมือถือ หรือโมเด็มที่เชื่อมต่ออยู่กับ PC โดยทั่วไปเราจะสื่อสารกันได้ 2 วิธีหลักๆ คือ
  • AT Command
  • API ที่ผู้ผลิตอุปกรณ์แต่ละแห่งพัฒนาขึ้นมา
AT Command เป็น protocol ในชุดของ Telephony Application Programming Interface (TAPI) ที่ Microsoft คิดขึ้นมาเพื่อให้ PC ที่รันภายใต้ Microsoft Windows สามารถสื่อสารกับอุปกรณ์สื่อสารได้ โดย TAPI ก็จะแตกต่างกันไปตามแต่ละ version ของ Microsoft Windows ในปัจจุบัน TAPI อยู่ที version 3.1

การ เชื่อมต่อแบบนี้ Windows จะมองอุปกรณ์สื่อสารของเราเสมือนว่าเป็น modem และใช้ชุดคำสั่ง AT Command ในการสื่อสารกัน เริ่มต้นการสื่อสารเราอาจใช้ HyperTerminal ที่มีใน Microsoft Windows การทดสอบก่อน
  • เริ่มจากเชื่อมต่ออุปกรณ์สื่อสารเข้ากับ PC
  • เปิด program HyperTerminal จากนั้นเลือก port ที่เชื่อมต่ออยู่กับอุปกรณ์สื่อสารให้ถูกต้อง
  • ทดลองพิมพ์คำสั่ง AT ถ้าผลลัพธ์ตอบกลับมา OK แสดงว่าเราเชื่อมต่ออุปกรณ์สื่อสารสำเร็จแล้ว
รายละเอียดของคำสั่ง AT Command ทั้งหมดสามารถหาดูได้จาก website ของผู้ผลิตแต่ละแห่ง เช่นอุปกรณ์สื่อสารที่ผมทำการทดสอบเป็น Nokia Wiki ATCommands
ผู้ผลิตอุปกรณ์แต่ละแห่งก็ implement ชุดคำสั่งไม่เท่ากัน หรือแม้แต่ผู้ผลิตอุปกรณ์แห่งเดียวกันแต่ละรุ่นก็มีชุดคำสั่งไม่เท่ากัน ดังนั้นก่อนที่เราจะใช้งานควรทดสอบก่อนว่าอุปกรณ์นั้นรองรับชุดคำสั่งที่เรา ต้องการหรือไม่ โดยการพิมพ์คำสั่ง AT ตามด้วย +<คำสั่งที่เราจะทดสอบ>=? เช่นถ้าต้องการทดสอบการรับ SMS AT+CMGR=? ถ้าค่าออกมาเป็น OK แสดงว่าอุปกรณ์รองรับคำสั่งนี้ แต่ถ้าออกมาเป็น ERROR แสดงว่าไม่รองรับคำสั่งดังกล่าว

การ สั่งงานควบคุมโดยการใช้ HyperTerminal เป็นวิธีที่ตรงไปตรงมาแต่การใช้งานจริงเราอาจต้องเขียนโปรแกรมเพื่อควบคุม อุปกรณ์สื่อสารอีกที วิธีที่เราจะเขียนโปรแกรมควบคุมอุปกรณ์สื่อสารโดยใช้ AT Command ทำได้หลายวิธีขึ้นอยู่กับ API ของแต่ละภาษา แต่ในตัวอย่างนี้เป็นโปรแกรมที่ใช้ส่ง SMS โดยใช้ภาษา Java เชื่อมต่อกับอุปกรณ์สื่อสารผ่าน Java Communication API

การทำงานของโปรแกรมตัวอย่างนี้เขียนเป็นขั้นตอนได้ดังนี้
  • เชื่อมต่อกับอุปกรณ์สื่อสารโดยเราต้องระบุ port ที่ทำการเชื่อต่อ
  • เมื่อเชื่อมต่อได้สำเร็จจะคุยกันผ่าน Java I/O Stream โดยการส่งคำสั่ง AT Command
class Mobile ที่เป็นถูกออกแบบไว้เป็น utility class เพื่อให้เรียกใช้งานง่ายขึ้น
import java.io.*;
import java.util.*;
import javax.comm.*;
import com.sun.comm.*;

class Mobile {

private static final int RESPONSE_TIMEOUT = 50;
private static final int DEVICE_TIMEOUT = 1000;
private static final String NEWLINE = "\n";
private static final String ENTER = "\r";
private static final String CTRL_Z = "\u001A";
private static final String CONNECTION = "connect";
private InputStream in;
private OutputStream out;

private SerialPort port;
private CommPortIdentifier portID;
public Mobile(String appName, CommPortIdentifier portID) throws IOException, PortInUseException, UnsupportedCommOperationException {
this.portID = portID;
port = (SerialPort) portID.open(appName, DEVICE_TIMEOUT);
port.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
port.setFlowControlMode(port.FLOWCONTROL_NONE);
in = port.getInputStream();
out = port.getOutputStream();
}

public void close() throws IOException {
in.close();
out.close();
port.close();
}


public static Map listPort() throws IOException {
Map listPort = new Hashtable();
Enumeration portList = CommPortIdentifier.getPortIdentifiers();
while (portList.hasMoreElements()) {
CommPortIdentifier portID = (CommPortIdentifier) portList.nextElement();
listPort.put(portID.getName(), portID);
}
return listPort;
}


public String sendSMS(String tel, String msg) throws IOException, InterruptedException {
String result = null;
sendCommand("AT+CMGF=1");
writeRequest("AT+CMGS=\"" + tel + "\"");
result = sendCommand(msg + CTRL_Z);
return result;
}

public String sendCommand(String cmd) throws IOException, InterruptedException {writeRequest(cmd);
return readResponse();
}

private void writeRequest(String req) throws IOException {
out.write(new String(req + ENTER).getBytes());
out.flush();
}

private String readResponse() throws IOException, InterruptedException {
String strIn = "";
for (int i=0; i 0){
byte[] bb = new byte[numChars];
in.read(bb, 0, numChars);
strIn += new String(bb);
}
if (strIn.indexOf(">" + ENTER + NEWLINE) != -1) {
break;
}
if (strIn.indexOf("OK" + ENTER + NEWLINE) != -1) {
break;
}
if (strIn.indexOf("ERROR") != -1 &&
strIn.indexOf(ENTER + NEWLINE, strIn.indexOf("ERROR") + 1) != -1) {
break;
}
Thread.sleep(100);
}
return strIn;
}
}
class client ที่เป็นตัวเรียกใช้งาน utility class การใช้งานเรียบง่ายแค่ระบุ port ที่จะติดต่อและเรียกคำสั่งส่ง SMS โดยใส่เลขหมายปลายทางและข้อความที่ต้องการส่ง
import java.util.*;
import javax.comm.*;
public class Client {
public static void main(String[] args) throws Exception {
//choose port
Map listPort = Mobile.listPort();
System.out.println(listPort);
Mobile mobile = new Mobile("SMS/GSM Nokia N73", listPort.get("COM12"));
System.out.println(mobile.sendSMS("+66123456789", "Hello World"));
System.out.println("---");
}
}

แน่นอนครับว่านอกจากส่ง sms แล้วยังสามารถทำอย่างอื่นได้อีกถ้าสนใจลองดูได้จากชุดคำสั่ง Nokia Wiki ATCommands

โดยสรุปแล้วการสื่อสารผ่าน AT Command มีข้อดีและข้อเสียดังนี้
  • ข้อ ดีของการสื่อสารกันผ่าน AT Command คือเป็นชุดคำสั่งมาตรฐานที่ให้ผู้ผลิตอุปกรณ์นำไป implement ลงในอุปกรณ์สื่อสารของตัวเอง ดังนั้นเราโปรแกรมที่เขียนจึงไม่ต้องกังวลว่าจะใช้สื่อสารกับอุปกรณ์อื่นไม่ได้
  • ข้อเสียคือเนื่องจาก AT Command เป็นชุดคำสั่งที่ Microsoft เป้นผู้คิดขึ้นมาจึงไม่อาจนำไปใช้ต่างระบบปฏิบัติการได้
ข้อเขียนนี้ช่วยฉัน:  

Thursday, August 13, 2009

"EXTRACT" SQL Function ดี ๆ ที่ไม่ควรมองข้าม

วันนี้มี Function ดีๆ มาแนะนำให้รู้จักกัน

จากประสบการณ์ที่ผ่านมา คาดว่าหลายๆ คน อาจจะเคยต้องเขียน Function เพื่อคำนวณหาอายุ ต่าง ๆ
ไม่ว่าจะเป็น อายุของลูกค้า, อายุงาน, อายุสัญญา ต่างๆ เป็นต้น และวิธีที่หลายๆ คนเคยใช้ ก็คงไม่ต่างกันนัก
กล่าวคือ หาผลต่างระหว่างวันที่เริ่มต้น กับวันที่สิ้นสุด เพื่อให้ได้จำนวนวันที่อยู่ในช่วงอายุนั้นๆ จากนั้นก็นำไปคำนวณ
หาจำนวนปี และเดือน โดยการ mod และ div ด้วยจำนวนวันในหนึ่งปี และจำนวนวันในหนึ่งเดือน ได้ในที่สุด


Oracle ได้นำเสนอ Function EXTRACT ให้เป็นทางเลือกแก่ผู้ใช้ ซึ่งสามารถใช้งานได้ตั้งแต่เวอร์ชั่น 9i ขึ้นไป
โดย Function ที่ว่านี้ สามารถที่จะดึงเอา วันที่ เดือน หรือ ปี จากข้อมูลประเภท Date โดยให้ผลลัพธ์เป็นข้อมูล
ประเภทตัวเลข ซึ่งต่างจากการแปลงรูปแบบโดยใช้ Function TO_CHAR ตามปรกติ ที่จะให้ผลลัพธ์เป็นตัวอักษร

SQL> select sysdate as current_date,
2 extract (month from sysdate) as mm_e,
3 to_char (sysdate, 'MM') as mm
4 from dual;


CURRENT_DMM_EMM
---------------------
22-JAN-08101

เพื่อให้ง่ายต่อการทำความเข้าใจ เราจะลองเอา Function EXTRACT มาใช้ในการหาอายุของลูกค้าให้ดู

SQL> select cust_last_name,
2 extract (year from (sysdate - date_of_birth) year to month)
3 ' years '
4 extract (month from (sysdate - date_of_birth) year to month)
5 ' months' as age
6 from customers;


CUST_LAST_NAMEAGE
----------------------------------------
Kinski52 years 9 months
Garcia36 years 8 months
Olin21 years 7 months
Dench54 years 7 months
Altman23 years 6 months
...

วิธีการก็ไม่มีอะไรมาก เพียงแค่ใช้ Function EXTRACT ในการ Extract ค่า YEAR และค่า MONTH จากผลต่างของวันปัจจุบันกับวันเกิด
ที่อยู่ในรูปของ Interval Year To Month ก็จะได้ผลลัพธ์ออกมาอย่างง่ายดาย
ข้อเขียนนี้ช่วยฉัน:  

Tuesday, August 11, 2009

[news] VMWare ซื้อ SpringSource แล้ว

VMWare ซื้อ SpringSource ด้วยราคา 362 ล้านเหรียญสหรัฐบวกด้วยหุ้นอีกจำนวน 58 ล้านเหรียญสหรัฐ การซื้อครั้งนี้ยืนยันได้จากผู้ถือหุ้นของ SpringSource และคาดว่าจะปิดที่ไตรมาสที่สามของปีนี้

SpringSource มี product อยู่ในมือตั้งแต่ application framework ไปจนถึง server ของตัวเอง อีกทั้งยังเป็นผู้ขับเคลื่อนชุมชน Java open source ให้เติบโตขึ้นอย่างทุกวันนี้
ก่อนหน้านั้น SpringSource ได้เข้าซื้อ Hyperic ซึ่งเป็นตัว monitoring และบริหารจัดการตัว application การซื้อในครั้งนั้นเป็นการเพิ่มมูลค่าให้ SpringSource และทำให้ VMware รู้สึกสนใจ SpringSource มากขึ้นเนื่องจาก VMware ไม่มีเครื่องมือบริหารจัดการที่มีประสิทธิภาพ

การรวมกันครั้งนี้ VMware ยังคงสนับสนุน SpringSource ต่อไป และวางอนาคตถึงการเปลี่ยนแปลงใหม่ๆ การพัฒนาการรวม platform เข้าด้วยกัน Platform as a Service (PaaS) เพื่อให้บริการ Datacenter หรือบริการอย่าง cloud computing เป็นต้น
บริการต่างๆ เหล่านี้จะช่วยให้นักพัฒนาสร้าง enterprise และ web application และ run และ จัดการ application เหล่านั้นได้ดียิ่งขึ้น

อ้างอิง:
ข้อเขียนนี้ช่วยฉัน:  

Monday, August 3, 2009

แล้ว Oracle Database 11g Release 2 ล่ะ, จะออกเมื่อไหร่?

จาก post ที่แล้ว ที่ผมประมาณการ ไว้ดังนี้

"ดังนั้นผมจึงขออนุมานว่า Oracle Database 11g Release 2 น่าจะออก ประมาณกลางปีหน้า (2010)
ส่วน Oracle Database XE 11g ก็คงเป็นปลายปี 2010"

คุณ Surachart จึงได้แย้งผมมาทันที่ว่า 11gR2 ไม่น่าจะรอนานแบบนั้น โดยได้นำข้อมูลจากแหล่งข่าวที่เชื่อถือได้มาให้ผมทราบดังนี้
  1. @alexgorbachev Mr. Alex จาก Oracle Consult จาก The Pythian Group ได้ประมาณการว่า 11gR2 จะออกภายในเดือนสิงหาปีนี้
  2. Oracle Developer ที่พัฒนา Oracle APEX สำหรับ 11gR2 ก็ได้ปิด project เรียบร้อยแล้ว
  3. ที่ web Oracle FAQ ก็ได้ให้ข้อมูลว่า 11gR2 จะออกภายในไตรมาสที่ 4 ปีนี้เป็นอย่างช้า
  4. ระหว่างนี้ได้มี Oracle Partners และ Oracle Customers หลายรายกำลังเข้าทดสอบ 11gR2 beta กันอยู่
ดังนั้นจากหลายแหล่งข้อมูลที่น่าเชื่อถือได้ เป็นในทางทิศทางเดียวกันคือ 11gR2 น่าจะออกภายในปีนี้แน่นอนครับ
ข้อเขียนนี้ช่วยฉัน:  

Saturday, August 1, 2009

Oracle Database XE 11g จะออกเมื่อไหร่?

เห็นหลายคนถามถึง Oracle Database XE 11g ว่าเมื่อไหร่จะออกมาให้ได้ใช้งาน
ผมเองก็เป็นอีกหนึ่งคนที่รอใช้งาน Oracle Database XE 11g ด้วยเช่นกัน จึงลองค้นหาดูว่าทาง Oracle เองมีกำหนดการอย่างไร
ในที่สุดก็ได้เจอ ข่าวนี้ที่ The New York Times

อ่านแล้วได้ข้อสรุปว่า Oracle Database XE 11g มีแผนที่จะออกหลังจากที่ได้ปล่อย Oracle Database 11g Release 2 ออกมาสักพัก
แต่ในข่าว ก็ยังไม่ได้ระบุอีกว่า Oracle Database 11g Release 2 จะออกมาเมื่อไหร่
ดังนั้นผมจึงใช้วิธีเทียบจาก version เก่า ๆ ดังนี้
  • Oracle Database 10g Release 1 ออกเมื่อ June 2004
  • Oracle Database 10g Release 2 ออกเมื่อ December 2005
  • Oracle Database 11g Release 1 ออกเมื่อ November 2007
ดังนั้นผมจึงขออนุมานว่า Oracle Database 11g Release 2 น่าจะออก ประมาณกลางปีหน้า (2010)
ส่วน Oracle Database XE 11g ก็คงเป็นปลายปี 2010

แล้วเรามาดูกันว่า ผมประมาณการได้แม่นขนาดไหน
ข้อเขียนนี้ช่วยฉัน: