JSR 330: Dependency Injection for Java Example

JSR 330: Dependency Injection for Java เป็นการทำ DI(Dependency Injection) ใน Java สำหรับ JSR 330 ได้ Specification Leads จาก SpringSource คือ Rod Johnson ซึ่งเป็นคนสร้าง Spring Framework และ Co-Founder ของ SpringSource และ Bob Lee ผู้สร้าง Guice framework และได้รับรางวัล Jolt Awards (Java Collections Framework ของ Joshua Bloch ก็ได้รับรางวัลนี้เช่นเดียวกัน ซึ่ง Joshua Bloch ก็เป็นคนเขียนหนังสือยอดนิยมชื่อ Effective Java เมื่อกล่าวแบบนี้แล้วน่าจะพอคุ้นเคยกันบ้างนะครับ แต่เรื่องนี้ไม่ได้เกี่ยวกับ JSR 330 ที่กำลังพูดถึงอยู่ แค่เล่าให้ฟังเฉยๆ) สำหรับ Example นี้ผมจะแยกออกเป็นสามส่วนคือ DAO , Service และส่วนของ Servlet ซึ่งผมได้ทำการเพิ่ม Dependency ในโปรเจคผมตามนี้ครับ(โปรเจคเป็น maven project นะครับ)

Continue reading

Type Parameter Naming Conventions


เคยสังเกตหรือไม่ว่า API ที่มีการใช้งานแบบ Generic Type นั้นมักใช้ตัวแปรพวก K , V , T อย่างเช่น List<E> อะไรแบบนี้ ถึงแม้ที่จริงแล้วมันจะใส่อะไรก็ได้ แต่ถ้าจะให้ดีความใส่ให้มีความหมาย ซึ่งหากดูตาม Conventions แล้วจะมีดังนี้

E – Element (used extensively by the Java Collections Framework)
K – Key
N – Number
T – Type
V – Value
S,U,V etc. – 2nd, 3rd, 4th types

Ref : Oracle Docs



me on google plus+Jirawong Wongdokpuang

JSR 310: Date and Time API Example

JSR 310: Date and Time API เป็น api ที่เกี่ยวกับ วันและเวลา ซึ่งได้ Stephen Colebourne founded และ leads ของ Joda-Time project Michael Nascimento Santos founded และ leads ของ Genesis project และ Roger Riggs ซึ่งเป็นทึมงานของ Oracle มาเป็น Specification Leads โดยในขณะที่ผมเขียนบทความนี้ JSR 310 อยู่ในสถานะ Active ใน JCP ver. 2.9

JSR 310 นั้นเป็น API ที่มีความใกล้เคียงกับ Joda-Time มาก(ก็ได้ project founder มาเป็น spec leads นี่หน่า) โดย package ของ JSR 310 จะอยู่ใน javax.time เสียส่วนมาก สำหรับคนที่ใช้งาน Joda-time อยู่เป็นนิจอยู่แล้วคงไม่ต้องอะไรมากกับ api ตัวนี้ครับ เพราะต่างกันน้อยมาก เท่าที่เห็นก็น่าจะเป็นพวก enum และ builder pattern ที่ถูกใส่เข้ามาให้ใช้งานง่ายขึ้น

Continue reading

ใส่สีให้กับ Terminal ของ Mac OSX


หลังจากประเดิมเจ้าเครื่อง iMac 21.5″ มาได้ซักอาทิตย์แล้วความหงุดหงิดที่ติดตลอดคือ เวลาใช้ Terminal ของ osx นี้มันไม่สวยงามเอาซะเลย ช่างเป็นข้อมูลที่ทื้อๆ เลยหาวิธีที่จะมันมีสีสันขึ้นมาซักหน่อย โดยให้ข้อความเป็นสีเหมือนตอนใช้ bash ใน ubuntu ซึ่งก็มีวิธีการที่สุดแสนจะเรียบง่าย ดังนี้ครับ

      เปิด Terminal
      พิม export CLICOLOR=1 กด Enter
      พิม export LSCOLORS=GxFxCxDxBxegedabagaced กด Enter

เพียงเท่านี้ Terminal ก็จะมีสีแล้ว

Screen Shot 2555-12-11 at 12.44.00 AM

จากภาพด้านบนจะเห็นว่า สีของ Folder กับไฟล์จะแสดงคนละสีกัน

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

$ touch ~/.bash_profile
$ echo "export CLICOLOR=1" >> ~/.bash_profile
$ echo "export LSCOLORS=GxFxCxDxBxegedabagaced" >> ~/.bash_profile

ทีนี้ไม่ว่าเราเปิด Terminal ตอนไหนเราจะเห็นสีของ ข้อความที่แตกต่างกันแล้วครับ



me on google plus+Jirawong Wongdokpuang

Builder Pattern

Builder Pattern เป็น pattern ที่ใช้สำหรับแก้ปัญหาที่เกิดในลักษณะของ Telescoping Constructor Pattern คือ ต้องการสร้าง class ที่มีความหลากหลายของตัวเลือก และ parameter ของ Constructor หรือ Method มีจำนวนมาก ซึ่งจะทำให้ยากต่อการตีความของ parameter แต่ละตัว ผมขอยก Class ที่ใช้อธิบายในบทความ Telescoping Constructor Pattern มาทำเป็น Builder Pattern เพื่อให้ง่ายต่อการเปรียบเทียบลักษณะของปัญหาและรูปแบบการใช้งาน

public class Vegetable {
	// amount of vitamin in vegetable (mg)
	private final int c;
	private final int a;
	private final int b1;
	private final int b6;
	private final int b12;
	private final int d;

	public static class Builder {

		// require
		private final int c;

		// option
		private int a;
		private int b1;
		private int b6;
		private int b12;
		private int d;

		public Builder(int c) {
			this.c = c;
		}

		public Builder a(int a) {
			this.a = a;
			return this;
		}

		public Builder b1(int b1) {
			this.b1 = b1;
			return this;
		}

		public Builder b6(int b6) {
			this.b6 = b6;
			return this;
		}

		public Builder b12(int b12) {
			this.b12 = b12;
			return this;
		}

		public Builder d(int d) {
			this.d = d;
			return this;
		}

		public Vegetable build() {
			return new Vegetable(this);
		}
	}

	private Vegetable(Builder builder) {
		this.c = builder.c;
		this.a = builder.a;
		this.b1 = builder.b1;
		this.b6 = builder.b6;
		this.b12 = builder.b12;
		this.d = builder.d;
	}

	public static void main(String[] args) {
		Vegetable tomato = new Vegetable.Builder(10).build();
		Vegetable kale = new Vegetable.Builder(5).a(8).b1(1).b6(0).b12(6).d(3).build();
	}
}

จากโค๊ดตัวอย่างผมได้ทำการสร้าง static nested class ไว้ใน class Vegetable ชื่อว่า Builder ซึ่ง class นี้จะทำหน้าที่รวบรวม property ที่เราสนใจ นั้นก็คือ vitamin นั้นเอง และ method สุดท้ายของ class Builder จะเป็นการสร้าง class Vegetable โดยส่วนนี้จะทำงานคู่กับ private constructor ของ Class Vegetable

		//method ในคลาส Builder สำหรับสร้าง SuperClass
		public Vegetable build() {
			return new Vegetable(this);
		}
...
...
...
	//private constructor เพื่อให้ inner class เรียกใช้งาน
	private Vegetable(Builder builder) {
		this.c = builder.c;
		this.a = builder.a;
		this.b1 = builder.b1;
		this.b6 = builder.b6;
		this.b12 = builder.b12;
		this.d = builder.d;
	}

เมื่อเราสร้าง Builder class แล้วประเราสามารถเรียกใช้งานโดยการ new ผ่าน superclass

	public static void main(String[] args) {
		Vegetable tomato = new Vegetable.Builder(10).build();
		Vegetable kale = new Vegetable.Builder(5).a(8).b1(1).b6(0).b12(6).d(3).build();
	}

จะเห็นว่าค่าทุกค่าที่เราใส่เข้าไปเราจะใช้ผ่าน method เฉพาะของมันทำให้เราเข้าใจได้ทันทีว่าเรา set ค่าอะไรไปเท่าไหร่และเมือเรา set ค่าเรียบร้อยแล้วเราก็จะจบด้วย method build เพื่อสร้าง class Vegetable ขึ้นมา

การใช้งาน Builder pattern สามารถนำไปใช้กับ abstract factory pattern ได้ เพื่อสร้างความยีดหยุ่นให้กับคลาสโดยผมจะขอยกตัวอย่างการใช้ abstract factory pattern ร่วมกับ builder pattern ในบทความต่อไปครับ

Ref. Prentice Hall – Effective Java (P.13-16)



me on google plus+Jirawong Wongdokpuang

Hot Deploy on Jboss

พอดีได้มีโอกาสลองใช้งาน jboss ในการ run project เล็กๆอันหนึ่งก็พบว่าเวลาแก้ไขไฟล์แล้วมันไม่ update ข้อมูลใหม่ให้ต้อง restart server ทุกครั้งเพื่อดูผลที่เปลี่ยนแปลง ก็เลยเปิด admin console ของ jboss ดูพบว่า jboss สามารถทำ hot deploy ได้โดยการตั้งค่า deployment scanners ซึ่งวิธีการตั้งค่านั้นแสนง่ายเหลือหลาย

โดยเข้าไปหน้า admin console (ex. localhost:9990) ไปที่

Profile -> core -> deployment scanners

จากนั้นคลิก edit ทีหนึ่งเพื่อแก้ไขค่า config

ติ๊กถูกที่ Auto-deploy exploded แล้วกด Save เพียงเท่านี้เวลาเราแก้ไขไฟล์แล้ว refresh หน้าเว็บมันก็จะอับเดทให้ใหม่แล้วครับ

Screen Shot 2555-12-10 at 3.11.03 AM



me on google plus+Jirawong Wongdokpuang