วันพุธที่ 13 ตุลาคม พ.ศ. 2553

การ Encoding ในภาษา Java

เวลาเขียนเว็บในหน้า page JSP
เรามักจะกำหนด Encoding เพื่อเข้าระหัสให้อ่านภาษาไทยได้ดังนี้
TIS-620 (ALL)
ISO-8859-1 (for IE)
สำหรับ การประกาศเช่น

<%@page language="java" contentType="text/html"%>
<%@page pageEncoding="TIS-620"%>
........
<head>
<title>Test Encode</title>
<meta http-equiv="Content-Type" content="text/html; charset=TIS-620"/>

ซึ่งเป็นการเ้้ข้าระหัส encode/decode ภาษาไทยเท่าไร ภาษาต่างประเทศอื่นจะไม่ support

ดังนั้นเพื่อแก้ปัญหาดังกว่าเราจึงทำการเข้า ระหัสด้วย UTF-8 ซึ่งเป็นการเข้าระหัสทุกภาษาบนโลกใบนี้เค้าว่าอย่างนั้น
ตัวอย่าง

<%@page language="java" contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
........
<head>
<title>Test Encode</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>

สำหรับในหน้า display สามารถแสดงภาษาได้ครับแต่ ถ้าเรากรอกข้อมูลภาษาไทยเช่น ใน text box ข้อมูล นั้นจะเป็น ภาษาต่างดาว
และวิธีที่ผมใช้การแปลงเข้าระหัสใหม่ดังนี้

String var_name = "ภาษาต่างดาว ผกดหำพหกดดพะ";

new String(var_name.getBytes("ISO-8859-1"), "UTF-8");

เพียงเท่านี้ก็สามารถอ่านภาษาไทยและภาษาอื่นได้แล้วครับ

Java Get System Date

public static String getSystemDate(String format) {
try {
return (String) (new SimpleDateFormat(format, Locale.US)).format(new Date());
}
catch (Exception e) {
e.printStackTrace();
return null;
}
}

Object Oriented Programming

Object Oriented Programming เป็นการเขียนโปรแกรมโดยการมองสิ่งต่างๆ เป็นวัตถุ ซึ่งใน Realworld สิ่งต่างๆ รอบๆ ตัวเราก็เป็นวัตถุ โดยมีแนวคิดที่ว่า สิ่งที่ประกอบกันเป็นวัตถุนั้นจะประกอบไปด้วย

* Attribute(ลักษณะที่สามารถอธิบายได้ว่าวัตถุนี้คืออะไร อย่างเช่น คนสิ่งที่อธิบายได้ว่าเป็นคน อาจจะเป็น มีหู ตา จมูก ปาก แขน ขา อะไรพวกนี้)
* Method(พฤติกรรมของวัตถุนั้นว่าสามารถทำอะไรได้ พูดง่ายๆ การกระทำนั่นแหละ)

เราสามารถทำการ Implement ได้โดยการทำให้อยู่ในรูปของ Class ซึ่งเปรียบเหมือนกับต้นแบบที่ไว้ สร้าง Object (Class ไม่ใช่ object นะ) คุณสมบัติที่สำคัญของ OOP ก็คือ

1. Encapsulation
เป็นการห่อหุ้ม Attribute ไว้ด้วย Method หมายความว่าการที่เราต้องการเข้าไป เปลี่ยนแปลงหรือใช้ค่า Attribute นั้นต้องกระทำผ่าน Method ยกตัวอย่างเช่นเด็กหญิงนิดกับเด็กหญิงหน่อยเป็นเพื่อนกัน มีอยู่วันหนึ่งนิดเดินเหยียบเท้าหน่อย หน่อยรู้สึกไม่พอใจ (ตอนนี้ค่า Attribute อารมณ์ของหน่อยเพิ่มขึ้น) แต่นิดยังไม่รู้ เมื่อหน่อยแสดงสีหน้าไม่พอใจ เมื่อนิดเห็นแบบนั้นนิดรู้สึกผิด(หน่อยก็ยังไม่รู้เพราะ นิดคิดอยู่ในใจ) จึงกล่าวขอโทษ หน่อยได้ยินแบบนั้นจึงหายโกรธ

ตัวหนา คือ Method
ตัวหนาเอียง คือ Attribute

จะเห็นได้ว่าค่า Attribute นั้นก็คือค่าที่อยู่ภายในการที่จะให้ Object อื่นรับรู้ได้ก็จำเป็นที่จะ ต้องแสดงค่านั้นออกมาผ่านทาง Method สิ่งที่ส่งออกมาให้ Object อื่นรับรู้นั้นเราเรียกว่า Message จากตัวอย่างจะเห็นว่ามีการเปลี่ยนแปลงค่า Atrribute ตอนที่นิดเหยียบเท้าหน่อยนั้น การเหยียบเท้าคือ Method ที่แสดงออกมาทำให้อารมณ์ ซึ่งเป็น Attribute อยู่ภายในเปลี่ยนแปลง และ การกล่าวขอโทษก็เป็น Method ที่ทำการเปลี่ยนแปลงค่า Attribute ดังนั้นภาพของ Object ในหัวก็จะเป็นลักษณะที่ Method ห่อหุ้ม Attribute ไว้ วัตถุทุกตัวจะแสดงออกให้รับรู้ถึงสิ่งที่อยู่ภายในหรือสิ่งที่ต้องการผ่าน ทางการกระทำ
2. Inheritance
เป็นการทำให้ Class สามารถสืบทอดต่อกันได้ โดยลักษณะของการสืบทอดนั้นก็เพื่อเพิ่มเติมความสามารถให้สามารถทำงานได้ มากกว่าคลาสแม่ที่สืบทอดมา เช่น คลาสของคนสืบทอดมาจากคลาสของสัตว์เลี้ยงลูกด้วยนม โดยที่ Method พื้นฐานของสัตว์เลี้ยงลูกด้วยนมนั้น สมมุติให้มีเพียง กินอาหาร สืบพันธุ์ ขับถ่าย Class ของคนที่สืบทอดมาจากสัตว์เลี้ยงลูกด้วยนม สิ่งที่คนทำได้แตกต่าง เช่น การพูด ก็จะถูกเพิ่มเข้าไปในคลาสของคน สรุปว่าคนสามารถ กิน,สืบพันธุ์,ขับถ่าย และ พูด ได้
3. Abstraction
เป็นการสร้าง Method แบบลอยๆ ขึ้นมายังไม่ได้ระบุรายละเอียดว่า Method นั้น ทำงานอย่างไรจะมีการระบุการทำงานในส่วนของ Subclass ที่รับสืบทอดมา สาเหตุที่มีการทำแบบนี้ก็เพื่อให้สามารถใช้ Polymorphism ได้นั่นเอง
4. Polymorphism
คือสภาวะที่ Method มีหลายรูปแบบ​ เป็น​วิธีการกำ​หนดรูปแบบการกระทำ​ที่​เหมือน​กัน​แต่​ได้​ผลที่​แตกต่างกัน สมมุติว่ามี คลาสแม่(Superclass) ที่เป็นคลาสของสัตว์เลี้ยงลูกด้วยนม โดยมีคลาสลูก(Subclass) คือ คลาสของคนกับสุนัข ซึ่งทั้งคนกับสุนัขมี Method ที่ใช้ในการเปล่่งเสียงซึ่งการเปล่งเสียงระหว่างคนกับสุนัขนั้นไม่เหมือนกัน แต่มันก็คือการเปล่งเสียง ดังนั้นเมื่อได้รับ Message ที่บอกให้ทำการเปล่งเสียงทั้งคนและสุนัขก็สามารถเปล่งเสียงได้เพียงแต่มี เสียงที่แตกต่างกันเท่านั้นเอง เพื่อให้สามารถเข้าใจได้ง่ายเราก็จะสร้าง Method ที่ชื่อว่า เปล่งเสียง( ) มาเพียงชื่อเดียวแล้วใช้หลักการ polymorphism นี้เพื่อให้สามารถเปล่งเสียงได้หลายๆ รูปแบบ

การสร้างโครงสร้างการ Design แบบ OO ที่ดีนั้นควรพยายามสร้างตามหลักข้างบนให้ได้นะครับ จะช่วยได้มากเลยทีเดียว แต่ที่แน่ๆ พยายามทำให้คลาสของเรามีลักษณะที่เป็น Encapsulation ตามข้อแรกให้ได้ครับ

นี่ก็เป็นหลักการในการเขียนโปรแกรมแบบ OO ที่ผมสรุปมาจากความเข้าใจของตัวเองนะครับไม่ได้อ้างอิงมาจากที่ไหน ถ้ามีส่วนใดที่ผิดก็แสดงความคิดเห็นมาได้ครับ คราวต่อไปจะมาเล่าเรื่องปัญหาที่เกิดจากการ Design ให้ฟังครับ


ที่มา:http://thitipat.wordpress.com/2007/02/04/object-oriented-programming-oop/

transaction what is it:?

ntroduction
มารู้จักการทำ Transaction กันก่อนน่ะครับ ว่ามันมีไว้ทำอะไร แล้วมีความจำเป็นมากแค่ไหนที่เราต้องใช้มัน
เริ่ม แรกก็ให้ลองนึกถึงการแข่งรถแรลลี่วิบากก่อนน่ะครับ จะมีการเล่น game ซึ่งจะมี check point เป็นจุด ๆ ไว้ ผู้เข้าแข่งขันจะต้องทำการเก็บ check point ไว้
การทำTransaciton มันก็คล้าย ๆ กันครับ คือจะมีการกำหนดจุด Check point ไว้ก่อน (เหมือนกับเจ้าของ game แรลลี่กำหนด) ถ้าผู้แข่งขัน (user) สามารถไปถึงจุด check point จุดนั้นได้ก็ถือว่า ผ่าน game นั้น ๆ ไปได้ครับ


Why we use this?
เอ๋ !! แล้วเจ้า Transaction เนี่ย เราจะทำไปทำไมกันน่ะ?
ตัวอย่างที่พอจะเห็นภาพชัด ๆ ก็คือ ลองนึกถึงระบบธนาคารดูน่ะครับ สมมติว่าคุณนำเงินไปฝากธนาคารจำนวน 1,000,000 บาท (มันก็มากเอาการอยู่) ในขณะที่พนักงานกำลัง save ข้อมูลจำนวนเงินฝากของเราลงไปใน database ที่ online อยู่ ถ้าเกิดในขณะนั้นมีเหตุการณ์ขัดข้องเกิดขึ้น เช่น ไฟดับ (บางคนอ้างว่า มี UPS ไม่ใช่เหรอ) งั้น ถ้าเกิดมีคนสะดุดสายไฟ UPS (มั่วไปเรื่อยนิ...) หรือถ้า Network down ขึ้นมา เอาเถอะ เอาเป็นว่ามีเหตุขัดข้องแล้วกัน ในขณะนั้น ถ้ามีการ save ข้อมูลของลูกค้าใน ตารางหลายๆ ตาราง ถ้ามีลูกค้าหลาย ๆ คน มันก็คงยากเอาการที่จะตรวจสอบว่า ก่อนที่ไฟจะดับนั้น มันได้ทำการ save ข้อมูลลงไปถึงตารางไหนแล้ว ถ้าเกิดมัน save เงินคุณได้ 500,000 บาท (ติ้งต่าง ว่า ไม่สามารถ save ทีละ 1,000,000 บาทได้) เมื่อคุณไปดูผลการฝากเงินของคุณ คุณก็จะเห็นเงินเพียง 500,000 บาท ทั้ง ๆ ที่คุณเอามา 1,000,000 บาท ซึ่งคุณคงไม่พอใจเป็นแน่
แต่ว่าหากมีการทำ Transaction เพื่อป้องกันในจุดนี้ การประมวลผลการฝากเงินของคุณจะถูกยกเลิกทันที ซึ่งมันก็คงไม่เสียหายอะไร เพราะว่าไม่มีการทำรายการ การฝากเงินของคุณ คุณก็รับเงินคืนแล้วก็ฝากใหม่แค่นั้นเอง


Transaction method หลัก ๆ
method ที่ต้องเจอแน่นอนในการทำ Transaction คือ
1. BeginTrans - ใช้เริ่มต้นการกำหนด Transaction ใหม่ เหมือนกับการตั้ง Check point นั้นเอง
2. CommitTrans - ใช้ในการบันทึกการเปลี่ยนแปลงและจบการทำ Transaction เหมือนกับผ่าน check point แล้ว
3. RollbackTrans - ใช้ในการ ยกเลิกการเปลี่ยนแปลงที่เกิดขึ้นในระหว่างการทำ Transaction และจบการทำ Transaction นั้น ๆ ด้วย เมื่อจบแล้ว เราอาจจะเริ่มทำ Transaction ใหม่ได้อีก
ที่มา:http://www.thaiadmin.org/board/index.php?topic=74217.0

Threads แบบงงๆ

threads คือ: เปรียบเหมือนกับ process ของระบบปฏิบัติการ หรือสิ่งที่สามารถทำงานโปรแกรมได้ (ตามความเข้าใจ) ซึ่งในระบบปฏิบัติการในปัจจบันส่วนใหญ่จะรองรับการทำงานเเบบ mutiple-tasking ก็จะประมาณว่าระบบปฏิบัติการจะจัดการหรือให้โปรแกรมทำงานพร้อมๆกันได้โดยการ สลับกันทำงานซึ่งจะดูเหมือนว่าโปรแกรมทำงานพร้อมๆกัน

สถานะของ threads ?วงชีวิตของ threads:
เมื่อ วัตถุของ threads ถูกสร้างขึ้น threads จะยังไม่ทำงานคือจะอยู่ใน status New จนกว่าวัตถุนั้นจะถูกเรียก start() ก็จะทำให้ threads เปลี่ยน status เป็น runnable คือ รอเข้าทำงานในหน่วยประมวลจนถึงเวลาที่ threads เข้าไปทำงานในหน่วยประมวลผลก็จะเปลี่ยนเป็น status running ซึ่งจาก status runnable ไปเป็น status running จะเกิดได้เองและเร็วมากจนกว่า threads ทำงานจนจบก็จะเข้าสู่ status terminated

NEW:เป็นการสร้างวัตถุซึ่งจะยังไม่ทำงานอะไรเลยเหมือนวัตถุทั่วไป
RUNNABLE:คือ status รอคิวเพื่อเข้าไปทำงานในหน่วยประมวล
BLOCKED: status ตอนที่ threads กำลังจะ lock เพื่อ synchronized หรือ กลับสู่ synchronized เมื่อเรียก wait()
WAITING:status กำลังรอเหตุการณ์ที่กำลังจะเกิดขึ้น ประมาณนี้
TIMED_WAITING: status กำลังรอให้ถึงเวลาที่กำหนดจะเกิดขึ้นเพราะมีการใช้ sleep(),wait(),join() แบบกำหนดเวลา
TERMINATE: ดิเอ็น;

============================
start(): เริ่มทำงาน
yield(): ยีลด เรียกเมื่อ threads ที่ำลังทำงานอยู่สามารถหยุดออกมารอที่ status runnableและกลับไปทำงานใหม่ได้อีกเมื่อมีโอกาสเพื่อให้ threads อื่นเข้าไปทำงานบ้าง
sleep():เป็นการหน่วงเวลาให้โปรแกรมทำงานช้าลงหรือให้ thread ออกจาก สถานะ running ไปสู่ timed_waiting แล้วจะกลับมาสู่ runnable อีก
interupt:เรียกเพือขัดจังหวะ thread ที่เป้นเจ้าของ
suspend()/resume(): ก็เป้นการเรียกเพือให้ thread ที่กำลังทำงานอยู่หยุดให้เป้น สถานะ runnable แต่ไม่สามารถกลับเข้ามาทำงานได้อีกจนกว่าจะเรียก resume()
stop():

String vs StringBuffer&StringBuilder in Java แบบงงๆ

#String ต่างจาก StringBuffer ตรงที่ String มีลักษณะเป็น immutable(read only) คือไม่สามารถเปลี่ยนแปลงค่าที่อยู่ภายในได้หลังจากที่ถูกสร้างขึ้นมาแล้ว
#ส่วน StringBuffer ออกแบบมาเพื่อให้แก้ไขค่าภายในตัวได้หลังจากที่สร้างขึ้นมาแล้วก็เป็นลักษณะ mutable
ถึง แม้ว่า String จะมี method บางอย่างให้เราใช้เหมือนกับว่าจะเปลี่ยนแปลงค่าของ String นั้นได้ อย่างเช่น concat(), replace(), replaceAll(), toUpperCase(), toLowerCase(), trim() แต่ผลที่ได้จากการเรียกใช้ method เหล่านี้จะเป็น String object ตัวใหม่ ถ้าเราเรียกใช้ method เหล่านี้บ่อยครั้ง จะทำให้มี String object เกิดขึ้นมาใหม่เกินความจำเป็น ซึ่งจะทำให้ประสิทธิภาพการทำงานของโปรแกรมลดลงได้
ใน ทางกลับกัน StringBuffer จะมี method สำหรับเปลี่ยนแปลงค่าในภาย StringBuffer โดยที่จะไม่มีการสร้าง object ใหม่ขึ้นมา ทำให้การทำงานมีประสิทธิภาพมากกว่า อย่างเช่น append(), insert(), replace() และ reverse()
ดังนั้น ในกรณีที่เรามี String ที่เราต้องการแก้ไขค่าในภายหลัง เราควรใช้ StringBuffer แทน String

ใน Java 1.5 ได้มีการเพิ่ม class ใหม่ที่ชื่อว่า StringBuilder ขึ้นมา เพื่อทำหน้าที่เหมือนกับ StringBuffer แต่ StringBuilder จะต่างจาก StringBuffer ตรงที่ StringBuilder นั้นจะไม่เป็น thread-safe1 จุดประสงค์ที่ได้มีการเพิ่ม class นี้เข้ามาก็เพื่อให้ใช้แทน StringBuffer ในกรณีที่มีเพียง thread เดียวเท่านั้นใช้งาน StringBuffer object นั้น เนื่องจาก StringBuilder ไม่ต้องทำ thread synchronization จึงทำงานเร็วกว่า StringBuffer นี่หมายความว่าถ้าเรามีเพียง thread เดียวที่ใช้งาน object ที่เก็บค่า String เราก็ใช้ StringBuilder แต่ถ้ามีมากกว่า 1 thread มาใช้งาน object นี้ เราก็ใช้ StringBuffer แทน

#thread-safe1 หมายความว่า ส่วนของ code, method, หรือ class นั้นถูกออกแบบมาให้ thread มากกว่า 1 thread เข้ามาทำงานในส่วน code นั้น, ใน method นั้น หรือ class นั้น โดยสามารถทำงานได้ถูกต้อง ไม่มีปัญหาจากการทำงานแบบ parallel กันของ thread เหล่านั้น ปัญหาที่เกิดจากการทำงานของ thread มากกว่า 1 thread เราจะเรียกว่า race condition ในการที่จะทำให้ code, method หรือ class มีคุณสมบัติที่เป็น thread safe นั้น จะต้องมีการทำให้ thread หลาย ๆ thread นั้นทำงานประสานกันหรือที่เรียกว่า thread synchronization โดยการใช้ keyword synchronized

อ้างอิง :ref: จำได้มาจากเว็บไหน