go to http://oracle.in.th

Wednesday, September 30, 2009

Part2 Motion Detection: Capture Image

ส่วนนี้ผมจะอธิบายคร่าวๆ ถึงการจับภาพที่ได้จากกล้อง โดยมีคลาสสำคัญที่เกี่ยวข้องได้แก่ Camera, Video, BitmapData
ลำดับการทำงาน (วาดภาพน่าจะเข้าใจง่ายขึ้น...             หรอ)

Part2 Motion Detection: Capture Image
อธิบายคร่าวๆ ก่อนเขียน (สงสัยตรงไหนถามเอาละกันครับ)
  • เริ่มแรกกำหนดตัวแปรที่จะใช้ให้เรียบร้อย
  • สร้างปุ่มเมื่อกดกล้องก็เริ่มทำงาน
  • เมื่อโปรแกรมเริ่มทำงานจะทำการเก็บภาพ ทุกๆ 5 นาทีและทุกครั้งที่มีการเคลื่อนไหว
  • เมื่อเก็บภาพได้นำภาพไปแสดงที่หน้าจอจัดระยะห่างกับวางตำแหน่งให้เรียบร้อย
  • ส่งภาพขึ้นเซิร์ฟเวอร์ (sendMsg function)

จากนั้นลงมือเขียนตามแรงศรัทธา

var cam:Camera = Camera.getCamera();
var vid:Video;
var now:BitmapData;
var listCapture:Array = new Array();

var stageWidth = 440;
var stateHeight = 240;
var vidWidth = 160;
var vidHeight = 120;
var fps = 30;

var activeInterval;
var captureInterval;
var camStatusInterval;
var countImage:int = 0;

var txtStatus:TextField = new TextField();
var txtFormat:TextFormat = new TextFormat();
txtFormat.color = 0xC8C8C8;
txtFormat.size = 10;
txtFormat.font = "Arial";
txtStatus.defaultTextFormat = txtFormat;
txtStatus.x = 0;
txtStatus.y = 0;
txtStatus.width = stageWidth;
txtStatus.height = stateHeight;
txtStatus.type = TextFieldType.DYNAMIC;
txtStatus.selectable=false;
txtStatus.text = "status: ";
addChildAt(txtStatus, 0);

var btnStart:Button = new Button();
btnStart.label = "Start Capture";
btnStart.setSize(120, 30);
btnStart.move(250, 40);
btnStart.toggle = true;
btnStart.addEventListener(MouseEvent.CLICK, startCapture);
addChild(btnStart);

if (cam != null) {
setStatus("camera : " + cam.name);
} else {
setStatus("camera not detect");
}

function startCapture(event:MouseEvent):void {
if (btnStart.selected) {
if (cam != null) {
vid = new Video(vidWidth, vidHeight);
cam.setMode(vidWidth, vidHeight, fps, true);
vid.attachCamera(cam);
cam.addEventListener(StatusEvent.STATUS, camStatusHandler);
cam.addEventListener(ActivityEvent.ACTIVITY, camActivityHandler);
} else {
setStatus("camera not detect");
}
btnStart.label = "capture image: ";
btnStart.enabled = false;
}
}

function camStatusHandler(event:StatusEvent):void {
if (!cam.muted) {
addChildAt(vid, 0);
vid.x = 20;
vid.y = 20;
captureInterval = setInterval(capture, 5 * 60 * 1000);
camStatusInterval = setInterval(camStatus, 1000);
} else {
setStatus("camera has't permission");
Security.showSettings(SecurityPanel.CAMERA)
}
}

function camActivityHandler(event:ActivityEvent):void {
if(cam.muted){
setStatus("camera has't permission");
Security.showSettings(SecurityPanel.CAMERA)
}
if (event.activating) {
activeInterval = setInterval(capture, 500);
}
}

function capture():void {
var captureData:BitmapData = new BitmapData(vidWidth, vidHeight);
captureData.draw(vid);
listCapture.push(addChild(new Bitmap(captureData)));
listCapture[listCapture.length-1].x = 20 + (listCapture.length-1)%5 * vidWidth/2;
listCapture[listCapture.length-1].y = vidHeight + 40;
listCapture[listCapture.length-1].width = vidWidth/2;
listCapture[listCapture.length-1].height = vidHeight/2;
++countImage;
sendMsg(captureData);
clearInterval(activeInterval);
}

function camStatus():void {
setStatus("currentFPS: " + (cam.currentFPS) + "\n");
}

function setStatus(status:String):void {
txtStatus.text = status;
}
จากนั้นรันเลย ช่วงนี้ใครเดินผ่านไปผ่านมาแถวโต๊ะผมเก็บภาพไว้หมดหละ ตัดภาพมาบางส่วนเพื่อไม่ให้กระทบต่อความมั่นคงต่อแหล่งที่มาของภาพ!

Capture
ถ้ารู้สึกวิธีนี้ไม่ยืดหยุ่นพอลองใช้แบบของนายคนนี้ แล้ววัดระดับ sensitive เอาก็ได้ครับ ตอนหน้ามาส่งภาพขึ้นเซิร์ฟเวอร์
ข้อเขียนนี้ช่วยฉัน:  

Monday, September 28, 2009

กำหนดการของ Oracle Database 11g Release 2 สำหรับ OS อื่น ๆ

อ้างอิง metalink document #742060.1
Oracle ได้วางกำหนดการของ Oracle Database 11g Release 2 ไว้ดังนี้

ภายในสิ้นปีนี้ 2009
  • HP-UX Itanium
  • Solaris Operating System (SPARC 64-bit)
  • Solaris Operating System (x86-64)
  • AIX 5L Based Systems (64-Bit)
ภายในไตรมาสที่ 2 ปีหน้า 2010
  • Microsoft Windows x86
  • Microsoft Windows x64
  • HP-UX PA-RISC (64-bit)
ภายในไตรมาสที่ 4 ปีหน้า 2010
  • HP OpenVMS Itanium
ภายในไตรมาสที่แรก ปี 2011
  • IBM zSeries Based Linux
กำหนดการยังไม่ออก
  • Linux Itanium
  • Linux on POWER
  • Microsoft Windows Itanium
  • Apple Mac OSX x86-64
ข้อเขียนนี้ช่วยฉัน:  

Enabled/Disabled Password Case Sensitive in Oracle 11g

ใน Oracle 11g นั้น ได้มีการเพิ่ม Feature ที่น่าสนใจเข้ามาอีกอย่างก็คือ การ Enabled/Disabled Password Case Sensitive โดยใช้พารามิเตอร์ที่มีชื่อว่า SEC_CASE_SENSITIVE_LOGON ซึ่งถ้าพารามิเตอร์นี้มีค่าเป็น True จะหมายความว่าตัวอักษรตัวพิมพ์เล็กหรือตัวพิมพ์ใหญ่จะมีผลแตกต่างกันใน Password แต่ถ้าค่าเป็น False จะหมายความว่า ตัวอักษรตัวพิมพ์เล็กหรือตัวพิมพ์ใหญ่จะมีผลเหมือนกันใน Password ซึ่งการตรวจสอบค่าพารามิเตอร์นี้สามารถทำได้โดยใช้คำสั่ง

SQL> show parameter sec_case_sensitive_logon;

โดยค่า Default จะเป็น True อยู่แล้ว แต่สามารถทำการแก้ไขให้เป็น False ได้โดยใช้คำสั่ง

SQL> alter system set sec_case_sensitive_logon=false;

หรือถ้าต้องการแก้ไขกลับให้มีค่าเป็น True ก็สามารถทำได้โดยใช้คำสั่ง

SQL> alter system set sec_case_sensitive_logon=true;

ทดสอบโดยการสร้าง User ชื่อว่า test และมี Password คือ Manager1



ทำการตรวจสอบค่า sec_case_sensitive_logon พบว่ามีค่าเป็น True อยู่ จากนั้นลองทำการ Login เข้า User test โดยใช้ Password Manager1 และ manager1 ผลคือ Manager1 สามารถทำการ Login ได้ตามปกติ แต่ manager1 ไม่สามารทำการ Login ได้



ลองทำการแก้ไขค่า sec_case_sensitive_logon ให้เป็น false และทำการทดสอบแบบเดิมอีกครั้ง คราวนี้จะพบว่าสามารถทำการ Login ด้วย password manager1 ได้แล้วครับ

False value in sec_case_sensitive_logon
ข้อเขียนนี้ช่วยฉัน:  

Saturday, September 26, 2009

Oracle E20 โดย Billy Cripe

Oracle E20 ไม่ใช่น้ำมันแก๊สโซฮอล์ แต่ย่อมาจาก Oracle Enterprise 2.0

Enterprise 2.0 จะเป็นการพยายามนำ Web2.0 เข้ามาใช้ภายในองค์กร
รวมถึงการพยายามจัดหมวดหมู่ข้อมูลที่เป็นแบบ unstructured
(ข้อมูลที่ไม่สามารถจัดเก็บในรูปแบบ relational table ได้)

โดยพยายามใช้เทคโนโลยีเรื่อง Semantic
เข้ามาใช้ในการสื่อความหมายของข้อมูลแบบ unstructured
เพื่อให้ตรงใจกับผู้ที่ต้องการข้อมูลนั้น ๆ มากที่สุด
ซึ่งจะเป็นส่วนหนึ่งของนิยาม Web3.0 ที่เริ่มมีการพูดถึงกันมากขึ้นในเร็ววันนี้

ในที่สุด Enterprise 2.0 จะมาแทนที่การทำ Intranet ภายในองค์กรในยุคเก่า ที่เป็นการสื่อสารทางเดียว ให้เป็นแบบมีส่วนร่วมมากขึ้น

Oracle จึงร่วมมือกับ Accenture ทำ website ชื่อ Enterprise 2.0 TV ขึ้นมา
โดยวันที่ 8 ตุลาคมนี้ ก็จะมี Virtual Conference สามารถเข้าไป register ได้
หรือจะดู PowerPoint ของ Billy Cripe ล่วงหน้าก่อนได้ ข้างล่างนี้


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

Friday, September 25, 2009

[news] Oracle Enterprise Linux 5.4 พร้อมให้ download ผ่าน E-Delivery แล้ว

Oracle Enterprise Linux 5.4
Oracle Enterprise Linux 5.4 พร้อมให้ download ผ่าน E-Delivery แล้ว

สำหรับผู้ที่ทำงานกับ Software Oracle, platform ที่หนี่ไม่พ้นต้องเจอคือ Unix โดยเฉพาะ Linux Platform
เมื่อสัปดาห์ที่แล้ว Oracle ได้ปล่อย Oracle Enterprise Linux 5.4 มาให้ download ผ่าน E-Delivery แล้ว

สามารถ download ได้ที่ http://edelivery.oracle.com/linux
ข้อเขียนนี้ช่วยฉัน:  

[news] Oracle SQL Developer 2.1 Early Adopter 1 (2.1.0.62.61) ออกแล้ว

Oracle SQL Developer 2.1 Early Adopter 1 (2.1.0.62.61)
Oracle SQL Developer 2.1 Early Adopter 1 (2.1.0.62.61)
ออกมาให้ download ทดลองใช้งานแล้ว
เว้นช่วง 2 เดือนหลังจากที่ออก Oracle SQL Developer 1.5.5 เมื่อ July 2009 ที่ผ่านมา
ดูรายละเอียดเพิ่มเติม พร้อม download ได้ที่นี่
ข้อเขียนนี้ช่วยฉัน:  

Annotation Part#1

จาก EJB 2.1 ถ้าหากใครลองเขียนหรือใช้งานดูจะพบว่ามันยุ่งยากมาก ขนาดแค่ Bean เดียวกว่าจะ implement ออกมาก็เหนื่อยแล้ว เพราะมีการ config มากทำให้การใช้งาน EJB 2.1 ค่อนข้างจุกจิก วุ่นวายและยุ่งยาก ที่เป็นเช่นนี้เพราะ การออกแบบ ejb2 ของ sun นั้นได้แบ่ง programmer ออกตาม ตามหน้าที่โดยจะแบ่งหน้าที่เป็น 3 ฝ่ายโดยคร่าวๆดังนี้
  • Programmer: programmer เป็นผู้เขียน beans ทั้งหลายโดยที่แต่ละ beans นั้นจะทำหน้าที่เพียงแค่อย่างใดอย่างหนึ่งเท่านั้น
  • Assembler: assembler นั้นจะเป็นผู้ที่รู้เกี่ยวกับ business logic ดีมากๆ เป็นผู้นำ beans ต่างๆเหล่านี้มาร้อยเรียงกันใหม่จนหลายเป็น services
  • Deployer: เป็นผู้ที่นำ beans ต่างๆเอาเข้าระบบ รวมทั้งเป็นผู้ที่คอย config xml ต่างๆทั้งหมด
จะเห็นว่าถ้าหากในองค์กรเรามี role ต่างๆเหล่านี้ ภาระการ config จะตกอยู่กับ deployer ส่วน programmer นั้นไม่จำเป็นต้อง config เองและไม่ต้องรู้ business เพราะ assembler จะเป็นผู้นำไปร้อยเรียงเอง ซึ่งถ้าถามว่าในองค์กรขนาดเล็กจะมีคนที่ทำหน้าที่อย่างที่ sun กำหนดไหม คำตอบคือไม่ ยกตัวอย่างเช่น software house ในไทย programmer คนเดียวทำงานตั้งแต่ programmer ยัน SA หรือจนไปถึง PM, Consultant ออกไปหาลูกค้าด้วยยังมีเลย ดังนั้นการที่เราจะใช้ ejb2.1 นั้นต้องยุ่งยากมาก ทำให้การแบ่งหน้าที่ตามที่ sun เป็นผู้ออกแบบไว้เป็นไปไม่ได้

และเนื่องจากว่า beans ที่ programmer เขียนขึ้นมานั้นจะไม่สามารถนำมาทดสอบได้เพราะว่ายังไม่มีการ config ไม่มีการนำไป deploy ดังนั้นถ้าหาก deployer ไม่ deploy ให้ก็จะไม่มีทาง check ได้ว่า beans ที่ programmer เขียนนั้นถูกไหมดังนั้นมันเป็นเรื่องที่ยุ่งยากมากเพราะต้องคอยประสานกับอีกฝ่ายทำให้ระยะเวลาการทำงานมากขึ้น แต่การที่ programmer จะมา config เองนั้น เป็นเรื่องที่ปวดตับ (เน้นว่าปวดตับไม่ใช่ปวดหัว) มากกับ programmer ดังนั้นจึงมีคนเสนอมาว่าการ config ต่างๆนั้น แทบจะไม่ได้มีการเปลี่ยนแปลงอะไรเลย

ทำไมเราต้องมาแยกกันด้วยทำไมเราไม่เอา config เหล่านั้นลงใน code เลย ซึ่งแนวคิดนี้ได้ถูกนำไปพัฒนาจนกลายเป็น meta data ที่ใส่ลงไปใน program แต่จะไม่ถูกทำงานตอนเวลา compile time แต่จะถูกอ่านค่าต่างๆเหล่านี้เวลา runtime เพื่ออ่านค่า config เหล่านี้ออกมา ซึ่ง metadata ตัวนี้เราเรียกว่า XDocLet โดยเราเขียนค่า config เหล่านี้ลงใน code จากนั้น XDoclet จะสร้าง (generate) xml config ต่างๆให้หรือว่าแม้กระทั้ง java source code โดยพื้นฐานนี้มาจาก JavaDoc ซึ่งเราสั่งเกตไหมว่าเราสามารถ generate JavaDoc มาจาก source code ได้เลย เพียงแต่เราต้องใส่ comment เข้าไปเพื่อไว้เป็นรายละเอียดของ JavaDoc เท่านั้น เช่น

/**
* Returns an Image object that can then be painted on the screen.
* The url argument must specify an absolute {@link URL}. The name
* argument is a specifier that is relative to the url argument.
* <>
* This method always returns immediately, whether or not the
* image exists. When this applet attempts to draw the image on
* the screen, the data will be loaded. The graphics primitives
* that draw the image will incrementally paint on the screen.
*
* @param url an absolute URL giving the base location of the image
* @param name the location of the image, relative to the url argument
* @return the image at the specified URL
* @see Image
*/
public Image getImage(URL url, String name) {
try {
return getImage(new URL(url, name));
} catch (MalformedURLException e) {
return null;
}
}

ใช้ @ ไปเพื่อให้ JavaDoc Tool อ่านไปเพื่อนำเอาไปใช้ทำ API Doc แต่สังเกตว่าต้องมีการใส่ comment ด้วยเพราะว่าเครื่องหมาย @ นั้นยังไม่รองรับใน J2SE 1.4 ซึ่งอาจจะยังงงๆอยู่ลองดูดังรูปด้านล่าง
 

Annotation - JavaDoc to API Doc
ต่อมา sun ได้นำแนวคิดนี้ไปผนวกกับ java ใน version 5.0 ซึ่งทำให้ EJB 3.0 พลอยได้รับอานิสงส์นี้ไปด้วย จากที่ต้อง config xml ที่แสนปวดตับกลายมาเป็นประกาศการ config เหล่านั้นลงใน java code แทน ซึ่ง java จะเรียก meta data นี้ว่า annotation
Annotation นั้นคือ meta data ที่แทรกลงไปใน code แต่จะไม่ถูก compile เหมือนปกติแต่จะเป็นตัวบ่งบอก ตัว java runtime (JRE) ว่า ขณะ ณ ตอนนั้นให้ทำอะไรซึ่งจะแบ่ง annotation เป็น 3 ประเภทคือ

  • Information for the compiler : เป็น annotation ที่บอก compile เพื่อไว้ใช้สำหรับ detect error หรือ suppress warnings ยกตัวอย่างเช่น


    • @Override เพื่อบ่งบอกว่า method นี้ถูก override มาจาก class แม่
    • @Deprecated เพื่อบ่งบอกว่า method หรือ class
    นี้นั้นควรที่จะหลีกเลี่ยงหรือว่าไม่ควรจะใช้เพราะว่าเป็นอันตรายหรือว่ามี method ที่ดีกว่านี้ให้เลือกใช้

  • Compiler-time and deployment-time processing : เป็น annotation ที่ให้ Software tools อ่าน annotation เหล่านั้นเพื่อนำไปสร้าง file ต่างๆ เช่น xml, javadoc และอื่นๆ
  • Runtime processing : เป็น annotation ที่บ่งบอกให้ JRE นั้นทำงานตอน runtime
ซึ่งเราก็จะมาดูวิธีการสร้างและวิธีการเรียกใช้กันโดยที่เราจะเน้นที่ annotation แบบ Runtime processing เพียงเท่านั้นเพราะว่าใน EJB3.0 นั้นไม่มีการ config xml และ annotation ใน EJB3.0 จะทำงานต่างกันกับ XDoclet เพราะว่าไม่ใช่ annotation แบบ Compiler-time and deployment-time processing แต่เป็นแบบ Runtime processing เรามาลองดูกันเลยดีกว่า แต่ไม่ได้หมายความว่าเราจะไม่สามารถสร้าง annotation แบบ Information for the compiler ได้ เราทำได้โดยไปกำหนด policy ตอนที่เราสร้าง annotation ซึ่งลองไปดู code กันเลยดีกว่า ซึ่งเราจะสร้าง annotation ไว้ทดลองสองตัวคือ

// mytag.Author.java
package mytag;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface Author {
String name();
}

การสร้าง annotation ใช้ @interface ในการประกาศซึ่งในที่นี้เราตั้งชื่อว่า Author จากนั้นเรากำหนด annotation ของเราให้เป็นแบบ Runtime processing โดยกำหนด policy ดังนี้

@Retention(RetentionPolicy.RUNTIME)

ซึ่งการกำหนด policy นั้นมีด้วยกัน 3 อย่างคือ
  • RetentionPolicy.CLASS: Information for the compiler
  • RetentionPolicy.RUNTIME: Runtime processing
  • RetentionPolicy.SOURCE: Compiler-time and deployment-time processing
จากนั้นก็จะมีการ set element ที่ชื่อว่า name ด้วยซึ่งตรงนี้จะมีกี่อันก็ได้และต้องตั้งตาม syntax นี้

<type> <nameofelement>( );

สังเกตุว่าเหมือนการประกาศ abstract method ธรรมดาเพียงแต่ไม่มีการรับ parameter ใดๆทั้งสิ้นใน method นั้น ใน annotation จะมีแต่การประกาศ element เท่านั้นไม่มีการประกาศ attribute หรือ method ใดๆทั้งสิ้น จากนั้นเราก็มาดู annotation อีกตัวคือ

// mytag.Version.java
package mytag;  
import java.lang.annotation.Retention;  
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface Version {
  int major();
  int minor();
}

annotation Version จะมี element ด้วยกันสองตัว annotation Author เราเอามาใช้ในการเก็บชื่อว่าใครเป็นคนเขียน class, method หรือ attribute นี้ขึ้นมา ส่วน annotation Version จะบ่งบอกว่า class, method หรือ attribute นั้นผ่านการปรับปรุงมาถึง version ไหนแล้ว การใช้ annotation มีลักษณะเป็นแบบ location sensitive คือ เมื่อเราเอา annotation ไปแปะไว้ตรงหน้าอะไร ก็จะเป็นการประกาศ annotation ของ สิ่ง นั้น เช่น เอาไว้หน้า class มันก็จะเป็น annotation ของ class นั้นๆ เป็นต้น ซึ่งการประกาศ annotation นั้นสามารถประกาศได้ 2 ชนิดคือ
  • Class Annotation
  • Class Member Annotation
ตอนหน้าเราจะมาดูกันว่า Class Annotation  และ Class Member Annotation เป็นอย่างไร

Reference from : dr. Werasak Suengtaworn

Compose by : @plaumkamon
ข้อเขียนนี้ช่วยฉัน: