วันอังคารที่ 30 กันยายน พ.ศ. 2551

Software release life cycle

วันศุกร์ที่ 26 กันยายน พ.ศ. 2551

ติดตั้ง RabbitMQ บน windows

หลังจากลองศึกษามาพอสมควรกับ Message Queue Server ตัวนี้ เริ่มจากลองดุที่ภาษา Erlang ซึ่งเป็นภาษาที่เหมาะสมกับระบบที่มี concurrent user จำนวนมาก แตก thread การทำงานได้เยอะๆ [ เขาว่ามาอย่างนั้น ] และมาเจอ MQ ที่ implement ด้วย Erlang คือ RabbitMQ มันยังถูกใช้ใน Twitter ซึ่งปัจจุบันใช้อยู่ประจำ จึงยิ่งทำให้เกิดความสนใจมากขึ้น ไม่พูดมากแล้ว เริ่มเลยดีกว่า ...


RabbitMQ is an implementation of AMQP, the emerging standard for high performance enterprise messaging


ขั้นตอนการติดตั้ง
1. download RabbitMQ Windows Bundle ที่ http://www.rabbitmq.com/download.html โดยใน zip file จะประกอบไปด้วย
- Erlang :: otp_win32_xxxx.exe
- RabbitMq Server :: rabbitmq-server-windows-xxxx.zip
- RabbitMq Client for Java :: rabbitmq-java-client-bin-xxxx.zip

2. ทำการติดตั้ง Erlang
3. extract rabbitmq-server-windows-xxxx.zip จะมี folder -> ebin, sbin, src, include
4. กำหนด env ตาม Link สรุปง่ายๆ เป็นดังนี้
- กำหนด ERLANG_HOME คือ folder ที่ทำการติดตั้ง erlang
- กำหนด RABBITMQ_BASE คือ folder ที่จะใช้เก็บข้อมูลต่างๆ ของ mq เช่น user account, message

5. ทดสอบ run rabbitmq server
- ไปที่ folder sbin ทำการ run
>>rabbitmq-server.bat
จะแสดงผลดังนี้ เป็นอันเสร็จสิ้น

...
starting database ...done
starting core processes ...done
starting recovery ...done
starting persister ...done
starting builtin applications ...done
starting TCP listeners ...done
ิbroke running


มาดูการจัดการหลังการติดตั้ง สามารถเข้าไปดูได้ที่ี่ http://www.rabbitmq.com/admin-guide.html โดยหลักจะทำการ
- Manage Server : stop, start
- Manage User Account
- Manage VirtualHost
- Manage Realm
- Grant permmision to user

ค่า default ของ rabbitmq เป็นดังนี้
username = guest
password = guest
virtualhost = /
realm = /data
host = localhost/ip/127.0.0.1

ผมใช้ client เป็น java ตามสิ่งที่ load มาตั้งแต่แรก ซึ่ง API ที่ให้มาก้ใช้งานไม่ยาก สามารถอ่านจากเอกสารได้ที่ http://www.rabbitmq.com/api-guide.html

ตัวอย่าง code การติดต่อ จะประกอบไปด้วย

1. Create Channel
ConnectionParameters params = new ConnectionParameters();
params.setUsername("guest");
params.setPassword("guest");
params.setVirtualHost("/");
params.setRequestedHeartbeat(0);
ConnectionFactory factory = new ConnectionFactory(params);
Connection conn = factory.newConnection("localhost", 5672);
Channel channel = conn.createChannel();
int ticket = channel.accessRequest("/data");
channel.exchangeDeclare(ticket, "exchangeName", "direct", true);
channel.queueDeclare(ticket, "queueName");
channel.queueBind(ticket, "queueName", "exchangeName","routingKey");

2. Publish Message to broker [ RabbitMQ ]
byte[] messageBodyBytes = "Hello, world!".getBytes();
channel.basicPublish(ticket, "exchangeName", "routingKey", null, messageBodyBytes);

3. Retrieve Message from broker [ RabbitMQ ]
GetResponse response = channel.basicGet(ticket, "queueName", noAck);
if (response == null) {
// No message retrieved.
} else {
AMQP.BasicProperties props = response.getProps();
byte[] body = response.getBody();
long deliveryTag = response.getEnvelope().getDeliveryTag();
channel.basicAck(deliveryTag, false);
System.out.println(new String(body));
}

4. Close channel
channel.close(AMQP.REPLY_SUCCESS, "Goodbye");
conn.close(AMQP.REPLY_SUCCESS);


เท่านี้ก็สามารถเริ่มใช้งาน RabbitMQ ในเบื้องต้นได้แล้วครับ

วันพฤหัสบดีที่ 25 กันยายน พ.ศ. 2551

Process ที่เป็นอยู่

while (true) {
identify_and_fix_bottlenecks();
drink();
sleep();
notice_new_bottleneck();
}

This loop runs many times a day.

BDD with easyb

หลายสัปดาห์มาแล้วได้เรียนรู้เกี่ยวกับ BDD :: Behavior Driven Development ซึ่งฟังดูไปจะคล้ายๆ กับ TDD :: Test-Driven Developement แต่แตกต่างตรงที่

TDD คือ เขียน test -> coding -> Run Test -> Refactoring

แต่ BDD นั้นจะเป็นการทดสอบระบบงานให้เป็นไปตาม specification/requirement ไม่ได้ทำการทดสอบในระดับ unit test แต่การพัฒนานั้นสามารถใช้คู่กันได้อย่างปกติ [ BDD ไม่ได้มาทดแทน แต่มาช่วยทำให้ทั้งฝ่าย business และ developer เข้าใจกันมากขึ้น ]

TDD -> test
BDD -> spec

ฺBDD framework มีหลายตัวที่น่าสนใจเช่น
RSpec :: http://rspec.info/
JBehave :: http://jbehave.org/
easyb :: http://easyb.org/
JDave :: http://www.jdave.org/

framework ที่ผมสนใจคือ easyb เนื่องจากพัฒนาเพื่อใช้งานบน java platform และที่สำคัญสามารถใช้งานกับ groovy และ grails ได้ครับ

มาดูการใช้งานคร่าวๆ

ก่อนอื่นต้องเข้าใจ story และ specification
โดย story จะประกอบด้วย scenario ซึ่งใน scenario แต่ละตัวจะมี
- Given
- When
- Then

ตัวอย่างของ scenario
scenario "check username/password", {
given "user account already exists", {
}
when "user logins", {
}
then "should return a valid account", {
}
}

ใน { ... } นั้นสามารถแทรก code การทำงานในแต่ละส่วนเข้าไปเพื่อทดสอบได้

มาดูการ run easyb กัน
1. download easyb จาก http://easyb.org/download.html
2. extract และ run ตามนี้
java org.disco.easyb.BehaviorRunner MyStory.groovy

-> MyStory.groovy คือ story ที่เก็บ scenario ด้านบน โดยชื่อ file ต้องมี suffix เป็น Story

3. สามารถ generate report ได้ 2 แบบคือ
3.1 Text file
>>java org.disco.easyb.BehaviorRunner MyStory.groovy -txtstory mystory.txt

3.2 Xml file
>>java org.disco.easyb.BehaviorRunner MyStory.groovy -xmleasyb mystory.xml

ใน easyb version 1.0 จะสามารถ generate เป็น html ได้ครับ ต้องตั้งหน้าตั้งตารอคอยครับ

ถ้าต้องการใช้ใน grails สามารถใช้ plug-in มาช่วยได้ที่นี่ครับ EasyBTest

ใช้งานก็ง่ายดังนี้ครับ
การติดตั้ง
$grails install-plugin grails-easybtest-latest.zip

ทดสอบ run
$grails easyb-test


ส่วน BDD Framework ภาษาไทยก็มีนะครับ คือ TSpec

นี่ก็คือจุดเริ่มต้นในการศึกษาและใช้งาน BDD ครับ

Web Reference
http://www.grails66.com
http://easyb.org/
http://java.dzone.com/articles/is-easyb-easy
http://www.javaworld.com/javaworld/jw-09-2008/jw-09-easyb.html