Wednesday, November 24, 2010

SSL on Tomcat

I have found a very nice Tutorial on making SSL on Tomcat.
http://techtracer.com/2007/09/12/setting-up-ssl-on-tomcat-in-3-easy-steps/

The only thing which needs a notice is that port SSL is now 443 instead of 8080. So, to try if you set up SSL successfully, you must open the url: https://localhost:443

However, this is only the self-sign certificate. You will need OpenSSL to create a true certificate or probably buy a comercial one from VeriSign.

More about this topic:
http://download.oracle.com/javaee/5/tutorial/doc/bnbxw.html
-----------------------
Setting up SSL on Tomcat is easy and you don’t have to do much for converting your web application to work with the Https protocol. But however, the problem you would find to set up SSL is the documentation available over the web. The documentation source is available on the Apache site but it starts off good and ends with a lot of confusion. Especially I was confused on the OpenSSL part where it says to use OpenSSL.
It might be good in a production environment to use OpenSSL but if you just want to test out SSL with Tomcat alone then it is more than enough to just have your JDK and Tomcat setups. So I would make you walk through the same steps which I did while getting SSL up and running and building a secured web app within a matter of minutes.
The things which I have used to setup SSL consists of:
JDK 1.6
Tomcat 6
Even though I have used the latest version I don’t see any problems which you might face in carrying out the same set of steps for JDK 1.5 which I am about to explain. JDK comes shipped with a keytool executable which is required to generate a keystore. The keytool can be found in the earlier version of JDK too. The 3 steps which would make you to get started with setting up SSL are:
Generating the Keystore file
Configuring Tomcat for using the Keystore file
Configuring your web application to work with SSL
Let’s get this party started now.
1. Generating the KeyStore file
The keystore file is the one which would store the details of the certificatesnecessary to make the protocol secured. Certificates contain the information as to who is the source from which you are receiving the application data and to authenticate whether it is the intended party or not. To make this keystore you would have to use the keytool. So open command prompt in Windows or the shell in Linux and type:
cd %JAVA_HOME%/bin on Windows
cd $JAVA_HOME/bin on Linux
You would land up in the Java bin directory. Now time to run the keytool command. You have to provide some parameters to the command as follows :
keytool -genkey -alias techtracer -keypass ttadmin -keystore techtracer.bin -storepass ttadmin
The highlighted words are the ones which you would have to change according to your requirements. But keep one thing in mind that both thekeypass and storepass passwords should be the same. The .bin file is actually your keystore file. It would now start a questionnaire. So fill in therelevant details accordingly. Look below for a reference as to what to answer for the questions.
What is your first and last name?[Unknown]: nitin paiWhat is the name of your organizational unit?[Unknown]: homeWhat is the name of your organization?[Unknown]: techtracerWhat is the name of your City or Locality?[Unknown]: mumbaiWhat is the name of your State or Province?[Unknown]: maharashtraWhat is the two-letter country code for this unit?[Unknown]: INIs CN=nitin pai, OU=home, O=techtracer, L=mumbai, ST=maharashtra, C=IN correct?[no]: yes
The command would then conclude. It would make a .bin file with the name you had provided inside the bin directory itself. In my case it wastechtracer.bin which was located in
C:\Program Files\Java\jdk1.6.0_02\bin\
Put the .bin file in the webapps directory of Tomcat. This is required to avoid the need to give an absolute path of the file in the next step.
2. Configuring Tomcat for using the Keystore file
Here we would be making some changes to the server.xml file inside tomcat to tell it to use the keystore which was created in the earlier step for configuring SSL. Open the file server.xml which can be found as:
/conf/server.xml
Now you have to modify it. Find the Connector element which hasport=”8443″ and uncomment it if already not done. Add two lines. The highlighted lines are the newly added ones.

You can notice that I have given the path to the keystoreFile property asrelative to tomcat bin directory because the startup command will look for the .bin file. Now all you have to do is start your server and check the working of SSL by pointing your browser to the URL to:
https://localhost:8443/
Now that you have your tomcat running in the SSL mode you are ready to deploy an application to test its working. You must note that still your tomcat can run in normal mode too at the same time i.e on port 8080 with http. So it is but obvious that any application deployed to the server will be running on http and https at the same time. This is something that we don’t want. We want our application to run only in the secured mode.
3. Configuring your web application to work with SSL
In order to do this for our test, take any application which has already been deployed successfully in Tomcat and first access it through http and https to see if it works fine. If yes, then open the web.xml of that application and just add this XML fragment before web-app ends i.e
securedapp/*CONFIDENTIAL
Explanation of the fragment is beyond the scope of this tutorial but all you should notice is that the /* indicates that now, any resource in your application can be accessed only with https be it Servlets or JSP’s. The termCONFIDENTIAL is the term which tells the server to make the application work on SSL. If you want to turn the SSL mode for this application off then just turn don’t delete the fragment. Just put the value as NONE instead ofCONFIDENTIAL. That’s it!
Conclusion
These were the 3 easy steps in which you can make Tomcat to work in the SSL mode and also it tells you how easily you can turn the SSL mode on and off. If you find any difficulty or are not clear on any of the above steps feel free to drop in your queries. If you like this tutorial it would be nice of you to drop in a comment of appreciation or feedback as to how this tutorial can be improved.

Sunday, November 21, 2010

Cài đặt 1 Single sign on server + Ldap

Single sign on (SSO) và Ldap là 1 chủ đề được thảo luận rất nhiều trong những năm qua. Nhiều người có suy nghĩ rằng việc thiết lập các hệ thống sử dụng single sign on và Ldap là công việc phức tạp , đòi hỏi chuyên môn cao. Tuy nhiên, với sự phát triển của các công nghệ mã nguồn mở, việc sở hữu SSO và Ldap đã trở nên rất dễ dàng. Cái khó nhất lại nằm ở chỗ: thiếu các tài liệu cập nhật về các công nghệ này. Bài viết này sẽ giới thiệu từng bước thực hiện các công việc trên.

1. Cài đặt Single sign on server:
Hiện tại, CAS (Central Authentication System - http://www.jasig.org/cas) là 1 phần mềm mã nguồn mở xuất sắc được dùng để thiết lập các Single sign on server. Phát triển trước tiên bởi ĐH Yale, từ năm 2008, được quản lý bởi nhóm yêu thích kiến trúc Java - JASIG.
Trên webpage của Jasig có 1 tutorial hòan chỉnh hướng dẫn các cài đặt CAS

Tuy nhiên, ở bước 10, thay vì property userName phải được đổi thành --> userDn
độc giả không chỉ nên tham khảo cho biết

2. Cài đặt Ldap server
Apache đã phát triển 1 phần mềm gọi là Directory Apache http://directory.apache.org/
Download và cài đặt phần mềm này
Chú ý: sau khi cài vào Control panel/administarive/service và start dịch vụ này lên
3. Now try the CAS by opening browser and type: http://localhost:8080/, it will redirect to a CAS login page. After login, all resources in http://localhost:8080 can be accessed.
-------------------------------
Prerequisites
Apache tomcat is installed and running
Java(JDK) is installed.
Instructions
Download Apache directory server from http://directory.apache.org/
Run the setup with all the defaults and test that the server is working on localhost using telnet:
Start->Run->telnet
In the telnet console, type the following: open localhost 10389
If you get a screen that lets you type, Apache Directory Server is configured properly
Download the CAS installation and find the war file e.g. \cas-server-$VERSION\modules\cas-server-webapp-$VERSION.war
Start the Tomcat server, e.g. $TOMCAT_HOME/bin/startup.bat.
Add the CAS war file, cas-server-webapp-3.2.1.war, to the webapps folder, $TOMCAT_HOME\webapps.
Confirm the following directory exists, which indicates a successful deploy, {{$TOMCAT_HOME\webapps\cas-server-webapp-$VERSION},
You may also examine the Tomcat stardard output log file for errors, $TOMCAT_HOME/logs/catalina.out.
Stop the tomcat server, e.g. $TOMCAT_HOME/bin/shutdown.bat.
Add the following to the pom.xml file in the META-INF folder, $TOMCAT_HOME\webapps\cas-server-webapp-$VERSION\META-INF\maven\org.jasig.cas\cas-server-webapp:

${project.groupId}
cas-server-support-ldap
${project.version}

Edit $TOMCAT_HOME\webapps\cas-server-webapp-$VERSION\WEB-INF\deployerConfigContext.xml as follows:
Add the following bean LDAP authentication:
class="org.jasig.cas.adaptors.ldap.util.AuthenticatedLdapContextSource">



ldap://localhost:10389










Remove the demo authentication handler, org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler, from the authenticationHandlers property of the org.jasig.cas.authentication.AuthenticationManagerImpl bean.
Add the LDAP fast bind authentication handler:




Add the cas-server-support-ldap-$VERSION.jar from the CAS installation to $TOMCAT_HOME\webapps\cas-server-webapp-$VERSION\WEB-INF\lib.
Start tomcat and confirm there are no errors in the $TOMCAT_HOME\logs\catalina.out log.
Open a browser to the URL http://localhost:8080/cas-server-webapp-$VERSION/ and authenticate with the following credentials, admin/secret.










Tuesday, October 26, 2010

Proxy. Loại: Structure. Độ khó: Cao

Proxy tiếng Anh có nghĩa là người được ủy nhiệm. Khi việc khởi tạo 1 đối tượng mất nhiều thời gian ví dụ như đọc file từ ổ đĩa hoặc load file từ Internet, chương trình sẽ tạo 1 file giả. Đến khi cần sử dụng thực sự file này thì lúc đó file có thể đã được load xong. Ví dụ như ở trình duyệt, khi load 1 trang web trình duyệt sẽ hiện các image holder trước sau đó mới lấp nội dung ảnh vào.
Xem xét ví dụ sau đây:
Ta có lớp trừu tượng Graphic với 2 phương thức load và draw. Lớp Image hiện thực lớp Graphic. Lớp ProxyImage cũng hiện thực lớp Graphic. Do load Image có thể mất nhiều thời gian nên ta tạo lớp ImageProxy để có sẵn đối tượng một cách nhanh chóng:

abstract class Graphic {
public abstract void load();
public abstract void draw();
}

public class Image extends Graphic {

private String filename;

public Image(String filename) {
this.filename = filename;
load();
}

public void draw() {
System.out.println("Drawing...");
}

public void load() {
System.out.println("Loading...");
}

}

public class ProxyImage extends Graphic {

private String filename;
private Graphic image;

public ProxyImage(String filename) {
this.filename = filename;
}

public void draw() {
if (image==null) image = new Image(filename);
image.draw();
}

public void load() {

}
}

public static void main(String[] args) {
Graphic image1 = new ProxyImage("file1.jpg");
Graphic image2 = new ProxyImage("file2.jpg");

image1.draw();
image2.draw();
}




Facade. Loại: Structure. Độ khó: Trung bình

Facade, đọc là fei sơ, có ý nghĩa như 1 bộ khung. Ví dụ như trong 1 máy tính sẽ có các bộ phận khác nhau như CPU, RAM, Harddrive. Khi bật nút power, các đối tượng như CPU, RAM, và Hard drive sẽ tự động thực hiện các công việc của mình.

public class Computer {

private CPU cpu;

private RAM ram;

private HardDrive hardDrive;

public Computer() {
cpu = new CPU();
ram = new RAM();
hardDrive = new HardDrive();
}
public void start()
{
cpu.boot();
ram.load();
hardDrive.read();
}
}

public class CPU {

void boot()
{
System.out.println("Booting CPU");
}
}

public class RAM {

void load()
{
System.out.println("Load memory from RAM");
}
}

Test:
public static void main(String[] args)
{
Computer facade = new Computer();
facade.start();
}



Composite. Loại Structure. Độ khó: Trung bình

Composite ám chỉ 1 lớp tổng hợp. Ví dụ 1 thư mục sẽ có 1 thư mục cha và nhiều file. Hay 1 nhân viên sẽ có 1 người quản lý và nhiều người dưới quyền. Ví dụ sau đây hiện thực cấu trúc đó:

public class Directory {

private Directory directory;
private File[] files;

public Directory(File[] files) {
super();
this.files = files;
}
public Directory(Directory directory, File[] files) {
super();
this.directory = directory;
this.files = files;
}
boolean isDirectory()
{
return files != null;
}
boolean isFile()
{
return files ==null;
}

public Directory getDirectory() {
return directory;
}

public void setDirectory(Directory directory) {
this.directory = directory;
}

public File[] getFiles() {
return files;
}

public void setFiles(File[] files) {
this.files = files;
}

}

Decorator. Loại: Structure. Độ khó: Thấp

Decorator là trang trí. Decorator cho 1 class nghĩa là thêm thuộc tính hoặc hành vi, hoặc mở rộng hành vi cho lớp đó mà không dùng subclass.

Ví dụ có lớp Number với phương thức in ra số ngẫu nhiên
public class Number {

public void print()
{
System.out.println(new Random().nextInt());
}
}

public class Decorator
{
public Decorator() {
System.out.println("This is random number: ");
new Number().print();
}
}
public static void main(String[] args)
{
Decorator decorator = new Decorator();
}




Prototype. Loại: Creation. Độ khó: Thấp

Prototype theo tiếng Anh là mẫu vật. Dựa trên mẫu vật mà người ta copy ra nhiều đối tượng khác có cùng tính chất và hành vi. Java hỗ trợ 1 interface Cloneable với phương thức clone.
public class Complex implements Cloneable {

int[] nums = {1,2,3,4,5};
public Object clone() {
try {
return super.clone();
}catch(CloneNotSupportedException cnse) {
System.out.println(cnse.getMessage());
return null;
}
}

int[] getNums() {
return nums;
}

}

public static void main(String[] args)
{
Complex complex1 = new Complex();
Complex copy = (Complex)complex1.clone();

complex1.getNums()[3] = 10000;

for(int i = 0; i < copy.getNums().length; i++)
System.out.println(copy.getNums()[i]);
}

Singleton. Loại: Creation. Độ khó: Dễ

Lúc mới học lập trình Java, tôi rất lười sử dụng từ khóa new để tạo mới class, có lẽ do ảnh hưởng của phương pháp lập trình thủ tục. Không ngờ sau khi làm quen với Java, tôi phát hiện ra rằng việc dùng static và final đôi khi có lợi: đó là lớp static chỉ có 1 và chỉ 1 instance mà thôi.

public class Singleton {

private static final Singleton INSTANCE = new Singleton();

public Singleton() {
}

public static Singleton getInstance()
{
return INSTANCE;
}

public String sayHello()
{
return "This method is called by only 1 instance";
}

public static void main(String[] args)
{
System.out.println(Singleton.getInstance().sayHello());
}
}

Monday, October 25, 2010

Abstract Factory. Loại: Creation. Độ khó: Trung bình

Abstract Factory trừu tượng hơn Factory 1 mức. Thay vì chỉ cần 1 interface Factory, pattern này đòi hỏi thêm 2 lớp Factory hiện thực interface này. Ví dụ interface Factory có 1 phương thức là createButton(), 2 lớp hiện thực là WindowFactory và MacFactory. Hai lớp này sẽ trả về lần lượt 2 đối tượng là WindowButton và MacButton tương ứng. Trong đó WindowButton và MacButton lần lượt là 2 lớp hiện thực của interfact Button.

Code mẫu:
public interface Button {
void paint();
}

public class OSXButton implements Button{
public void paint() {
System.out.println("Draw OSX button");
}
}

public class WindowButton implements Button {
public void paint() {
System.out.println("Drawing Window button");
}
}

public interface Factory {
Button createButton();
}

public class WindowFactory implements Factory {

public Button createButton() {
return new WindowButton();
}
}

public class OSXFactory implements Factory {
public Button createButton() {
return new OSXButton();
}
}

Chạy test:
public static void main(String[] args) {
Factory factory = new WindowFactory();
Button button = factory.createButton();
button.paint();
}

Factory. Loại: Creation. Độ khó: Trung bình

Factory là 1 nhà máy sản xuất. Ý tưởng đưa ra là 1 nhà máy có thể sản xuất ra nhiều loại đối tượng khác nhau tùy theo yêu cầu đầu vào.
Ví dụ, ta có lớp Namer có 2 thuộc tính: First Name và Last Name. Tùy theo văn hóa từng nước mà thứ tự của First Name và Last Name sẽ xuất hiện khác nhau. Giả sử ta có 2 lớp con của Namer là FirstNameFirst và LastNameFirst. Hai lớp này sẽ căn cứ vào chuỗi tên truyền vào, bóc tách ra họ, tên, sau đó gán vào 2 thuộc tính firstName và lastName.

public class Namer {
protected String firstName;
protected String lastName;
}

public class LastFirst extends Namer {

public LastFirst(String fullName) {
int i = fullName.indexOf(",");
if(i>0)
{
lastName = fullName.substring(0,i);
firstName = fullName.substring(i+1, fullName.length());
}
else
{
lastName = fullName;
firstName = "";
}
}
}


public class FirstFirst extends Namer {

public FirstFirst(String fullName) {

int i = fullName.indexOf(" ");
if (i > 0) {
firstName = fullName.substring(0, i + 1);
lastName = fullName.substring(i, fullName.length());
} else {
lastName = fullName;
firstName = "";
}
}

}

Ta dùng 1 factory ở đây để trả về đối tượng phù hợp căn cứ vào dữ liệu đầu vào:
public class FactoryNamer {

public Namer getNamer(String enterText)
{
if(enterText.indexOf(",")>0)
return new LastFirst(enterText);
else
return new FirstFirst(enterText);
}
}


Lập trình phần mềm điều khiển bằng VB6

VB6 đã outdated từ lâu và thay bằng .NET. Tuy nhiên, với các ứng dụng điều khiển, VB6 vẫn còn đất sống bởi vì nó không đòi hỏi cấu hình máy tính cao, dễ lập trình, và bảo trì.
RS232 hay còn gọi là cổng COM hay cổng tuần tự là loại cổng thường được dùng trong các thiết bị cần giao tiếp với máy tính. Ưu điểm của nó là đơn giản, rẻ tiền. Nhược điểm của nó là tốc độ truyền và khoảng cách.

Sau đây là đoạn code mẫu lấy dữ liệu từ 1 máy đo và lưu trữ dữ liệu thu được vào máy tính.

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)


Private Sub Command4_Click()
Dim downloadedData, data As String
If MSComm1.PortOpen = False Then MSComm1.PortOpen = True

Dim i As Integer
i = 5
Do While data <> "" Or i > 1
MSComm1.Output = "D"

Sleep 3000

data = MSComm1.Input

downloadedData = downloadedData & data
i = i - 1

Loop

Open "C:\data_from_awa.txt" For Output As #1

Write #1, downloadedData

Close #1

End

End Sub

Wednesday, October 20, 2010

Iterator. Loại: Behavioral. Độ khó: Thấp

Iterator là một dạng vòng lặp. Đối với 1 danh sách các đối tượng không đồng nhất nhau thì việc đưa vào các danh sách như List, Sort, Map sẽ giúp cho việc duyệt qua danh sách dễ dàng mà không cần quan tâm đến sự hiện diện bên trong của danh sách.

Ví dụ có interface Employee và 2 class hiện thực là HourlyEmployee - nhân viên làm theo giờ và RegularEmployee - nhân viên lãnh lương tháng.

interface Employee {

double earnings();

}

public class HourlyEmployee implements Employee {

private double salaryPerHour;

private String name;

public HourlyEmployee(double salaryPerHour, String name) {
super();
this.salaryPerHour = salaryPerHour;
this.name = name;
}

public double earnings() {
// TODO Auto-generated method stub
return 40*salaryPerHour;
}

public String toString() {
return name;
}
}

public class HourlyEmployee implements Employee {

private double salaryPerHour;

private String name;

public HourlyEmployee(double salaryPerHour, String name) {
super();
this.salaryPerHour = salaryPerHour;
this.name = name;
}


public double earnings() {
return 40*salaryPerHour;
}


public String toString() {
return name;
}

}

Sử dụng pattern này:

public static void main(String[] args)
{
List list = new ArrayList();

list.add(new HourlyEmployee(30, "Petter"));

list.add(new RegularEmployee(20000000, "Mary"));

Iterator itr = list.iterator();

while(itr.hasNext())
{
Employee em = (Employee)itr.next();
System.out.println(em + " earns "+em.earnings());
}

}


Command. Loại: Behavioral. Độ khó: Trung bình

Command nghĩa là ra lệnh. Sĩ quan chỉ huy gọi là commander, người này không làm mà chỉ ra lệnh cho người khác làm. Như vậy, phải có người nhận lệnh và thi hành lệnh (receiver).

Bây giờ ta lấy ví dụ sau. Bóng đèn Light có 2 phương thức switchOn và switchOff.

class Light()
{
void switchOn(){
System.out.println("Switch light on");
}

void switchOff(){
System.out.println("Switch light off");
}
}

Tuy vậy, để giống trong quân đội, ta làm 1 interface tên là Command không trực tiếp tắt bật đèn mà chỉ ra lệnh cho bóng đèn bật tắt.

interface Command(){
void execute();
}

Ta hiện thực interface này bằng 2 class: CommandOff và CommandOn

class CommandOff(){
Light light;
public CommandOff(Light light){
this.light = light;
}

public void execute(){
light.switchOff();
}
}


class CommandOn(){
Light light;
public CommandOn(Light light){
this.light = light;
}

public void execute(){
light.switchOn();
}
}

Bây giờ đã đóng gói các command này vào trong 1 bộ điều khiển gọi là Remote Control

class RemoteControl(){

private Command command;

public setCommand(Command command){
this.command = command;
}

public void pressButton(){
command.execute();
}

Sử dụng remote control này như sau:
public static void main(String[] args){

RemoteControl rc = new RemoteControl();

Light light = new Light();
Command c1 = new CommandOff(light);
Command c2 = new CommandOn(light);

rc.setCommand(c1);
rc.pressButton();

rc.setCommand(c2);
rc.pressButton();

}

Như vậy, ta có thể truyền bất cứ command nào vào Remote control để yêu cầu thực hiện. Khi đó, yêu cầu thực hiện đã được đóng gói vào trong 1 object như mô tả trong GoF book:

Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and support undoable operations


Adapter - Loại: Creation - Độ khó: trung bình

Adapter nôm na là một bộ chuyển đối. Laptop cũng cần adapter để chuyển từ điện AC sang DC. Đi nước ngoài thì phải xem họ xài ổ cắm tròn hay dẹt, 3 chấu hay 2 chấu. Nếu không phải mua adapter.
Vậy adapter là 1 bộ chuyển đổi dùng để kết nối 2 hay nhiều thiết bị khác nhau lại.

Bây giờ xét ví dụ sau đây: mỗi loài động vật có tiếng kêu khác nhau, chó sủa, bò rống, vượn hót, chim kêu.

public class Cow {

public void roar()
{
System.out.println("o o o o o");
}

}

public class Dog {

public void bark()
{
System.out.println("gau gau gau gau");
}
}

Ta cần 1 interface AnimalAdapter để có thể phiên dịch tiếng nói tất cả động vật

public interface AdapterAnimal {

public void say();

}

Để hiện thực interface này ta cần có AdapterCow và AdapterCat.

public class AdapterCow implements AdapterAnimal {

Cow cow = new Cow();
public void say(){
cow.roar();
}
}

public class AdapterCat implements AdapterAnimal {

Dog dog= new Dog();
public void say(){
dog.bark();
}
}

Bây giờ, ta sử dụng Adapter này:

public static void main(String[] args)
{
AdapterAnimal[] aas = {new AdapterCow(), new AdapterDog()};

for(AdapterAnimal aa: aas)
{
aa.say();
}

}

Ta thấy: nhờ có AdapterAnimal mà việc cho các loài động vật khác nhau cùng lúc lên tiếng trở nên dễ dàng.


Design pattern trong Java

Design pattern là một thuật ngữ nổi tiếng trong hướng đối tượng. Tuy nhiên, design pattern cũng khá khó hiểu. Có hơn 200 pattern trong đó khoảng 24 pattern là phổ biến nhất. Để lấy chứng chỉ SCJD chỉ cần biết khoảng 3,4 mẫu gì đó. Còn để lấy được SCEA thì cần biết hết 24 mẫu. Design pattern cũng được ứng dụng trong .NET, Ruby....

Các framework mã nguồn mở sử dụng design patterns rất nhiều. Chúng ta có thể nhận dạng chúng thông qua cách đặt tên ví dụ: Proxy, Adapter, Singleton, Prototype....

Trong quá trình nghiên cứu design pattern tôi nảy sinh ý định viết 1 loại bài tóm tắt lại những cái đã học được. Tài liệu trên Internet về design pattern thì rất nhiều nhưng để hiểu design pattern cần có các ví dụ tốt. Tôi sẽ trình bày các ví dụ này kèm theo mỗi pattern. Ví dụ được tổng hợp từ nhiều nguồn khác nhau


Wednesday, September 1, 2010

Crazy hibernate again

Hibernate có quá nhiều phương thức và cách hành xử khác nhau, rất khó đoán trước

Ví dụ:
Thao tác bằng session
Session session = getSession();
try{
session.saveOrUpdate(serviceParamValue);
session.close();
}
catch(Exception e)
{
e.printStackTrace();
}

Thao tác bằng Hibernate
getHibernateTemplate().saveOrUpdate(serviceParam);

Khi dùng session đối tượng sẽ lập tức được cập nhật vào db. Trong khi nếu dùng hibernateTemplate thì phải đợi hết session dữ liệu mới được commit

Tuy nhiên, khi update 1 đối tượng nếu dùng session dữ liệu sẽ không được cập nhật

Chưa tìm được lý do

Thursday, August 12, 2010

Bộ nhớ heap của Java

Làm quen với Java lâu nhưng ít người để ý bộ nhớ heap của Java trong khi nó đóng vai trò rất quan trọng trong việc bảo đảm hiệu suất làm việc của Java.
Bộ nhớ heap là gì?
Bộ nhớ heap chính là bộ nhớ dùng để lưu trữ các đối tượng được tạo ra trong 1 chương trình Java. Như vậy nếu kích thước bộ nhớ quá nhỏ trong khi số lượng đối tượng được tạo ra lớn hơn dẫn đến tràn bộ nhớ.
Ví dụ cụ thể, bộ nhớ heap mặc định của Java là 64MB. 1 chương trình Java có 1 đối tượng với khoảng 10 thuộc tính kiểu String với độ dài trung bình là 50 ký tự, 1 ký tự 2 bytes như vậy khoảng 100 bytes. Nhân với 10 thuộc tính là 1MB. Nếu chương trình khởi tạo 1 danh sách khoảng 100 đối tượng như vậy lượng bộ nhớ cần dùng là 100MB, chương trình sẽ lập tức bị tràn bộ nhớ.
Có thể thấy khả năng dẫn đến tràn bộ nhớ là rất cao, đặc biệt đối với các chương trình Java lớn.

Cách khắc phục
Giải pháp là tăng bộ nhớ heap. Nói tuy đơn giản nhưng để thực hiện khá phức tạp vì mỗi 1 chương trình Java có cách thiết lập kích thước bộ nhớ heap khác nhau. Có ít nhất 3 cách chỉnh kích thước heap:
- Trong biến môi trường, tạo mới hoặc hiệu chỉnh giá trị của biến có tên JAVA_OPTS. Ví dụ, JAVA_OPTS = -Xms256m -Xmx256m
Xms256m: kích thước khởi tạo của heap là 256 Mb
Xmx256m: kích thước cực đại của heap là 256Mb
- Trong control panel, mở Java Control panel và hiệu chỉnh Runtime Java Environment theo thông số -Xmx256m
- Đối với file jar: java -Xms256m -Xmx256m your_program.jar
- Đối với jetty: vào bin mở file jetty-service.conf và chỉnh như sau:
wrapper.java.initmemory=1024m
wrapper.java.maxmemory= 1024m

Với các ứng dụng khác như Tomcat, Eclipse, Jboss có thể tham khảo cách thiết lập heap size tạo đây















Thursday, July 15, 2010

Học gì ở J2EE nâng cao?

Để có thể xây dựng những ứng dụng có qui mô lớn trong Java, những kiến thức trong phần J2EE nền tảng là chưa đủ. Một trong những khía cạnh quan trọng của các ứng dụng này là cho phép chia nhỏ ứng dụng thành các module nhỏ hơn. Theo lý thuyết, modular design sẽ giúp làm giảm bớt độ phức tạp của ứng dụng. Việc giảm độ phức tạp của hệ thống sẽ làm cho việc phát triển cũng như bảo trì hệ thống trở nên dễ dành hơn nhiều. Có nhiều cách tiếp cập modular design trong Java như: portal, OSGI, và home-made modular design.

1. OSGI có thể coi là một cách tiếp cận chính thống trong modular design. Được đề xuất bởi Sáng kiến giao tiếp mã nguồn mở, OSGI đã có sự phát triển đáng kể từ lúc xuất hiện. Spring cũng đã hỗ trợ OSGI. Tuy nhiên nhược điểm của OSGI là sự phức tạp của nó. Việc thiếu vắng các tài liệu sử dụng cũng là lý do khiến OSGI không phổ biến.

2. Portal cũng là 1 cách tiếp cận modular. Tuy nhiên, portal thích hợp với các trang web dạng như Joomla hơn là phát triển 1 ứng dụng quản lý.

3. Home-made modular design: so với 2 cách tiếp cận trên đây có vẻ là cách phù hợp nhất. Sở hữu một kiến trúc modular đáp ứng chính xác các yêu cầu quản lý đồng thời duy trì sự đơn giản ở mức độ nhất định đó là các lợi thế của các tiếp cận này.

Hai vấn đề cần giải quyết:
Home-made modular design cần phải giải quyết được 2 vấn đề sau:
- Thứ nhất, đó là khả năng chia sẻ kết nối dữ liệu giữa các module, đồng thời cho phép sự phụ thuộc lẫn nhau giữa các file hibernate mapping
- Thứ hai, khả năng đóng gói nhiều module thành 1 file war lớn. File war chung này sẽ giúp chia sẻ session giữa các module.

Các vấn đề này đều đã được nghiên cứu và thử nghiệm tại JDTC. Tham gia khóa học J2EE nâng cao bạn hoàn toàn có khả năng làm chủ các kiến thức này.


Monday, June 14, 2010

MVC với Struts2

Lời nói đầu: bài viết này nằm trong loạt 5 bài viết hướng dẫn các kỹ thuật nền tảng để xây dựng 1 ứng dụng J2EE hoàn chỉnh. Các bài viết này dành riêng cho khóa "J2EE nền tảng" củaJava Developer Training Center (JDTC). Sau đây là danh sách toàn bộ bài viết:
- Cốt lõi Java trong phần mềm quản lý J2EE
- Kết nối thế giới hướng đối tượng và quan hệ
- Giao diện người - máy thế hệ mới
- Máy ảo javascript với jquery
- MVC framework nào, đó là câu hỏi cần trả lời

Từ Struts 1 sang Struts2 là một quá trình. Quá trình này diễn ra với một khoảng thời gian im lặng đáng sợ của Struts 1. Nhiều người cho rằng Strust 1 đã chín muồi nên không cần phải phát triển thêm. Nhiều người tin rằng Struts 1 đã chết. Thế nhưng Struts đã hồi sinh kỳ diệu bằng việc nhập chung vào 1 hảo framework MVC mới nổi webwork, một framework đàn em nhưng thực sự là "anh hùng xuất thiếu niên" với hàng loạt các tính năng mới mẻ và mạnh mẽ. Trên thực tế Struts 2 là tên gọi mới của webwork - bình mới rượu mới hoàn toàn. Struts2 cho phép hàng loạt các tính năng mạnh mẽ như:
- Tích hợp đảo ngược điều khiển của Spring
- Lập trình theo khía cạnh (aspect programming) thể hiện bằng việc hiện thực các Đánh chặn (interceptor)
- Cho phép lập trình viên lựa chọn các view khác nhau như: JSP, FreeMaker, Velocity.
- Cho phép tích hợp: form validation, error handling, internationalization (i18n)

Cấu trúc của Struts2:
Một project trên Struts2 sẽ bao gồm các thành phần sau:

- Action class: đây là file Java đóng vai trò Controller trong MVC pattern. File Java này hiện thực lớp Action của Struts2 trong đó chủ yếu là hiện thực method execute. Phương thức này nói nôm na là nhận kết quả từ người dùng sau đó xử lý và trả kết quả về.

- View layer: tùy theo hiện thực cụ thể có thể là các file jsp hoặc vm dùng để hiển thị giao diện người dùng

- Data model/service layers: tương ứng với phần Model trong MVC pattern. Các file trong phần này sẽ hỗ trợ xử lý kết quả cho action class.

- beans.xml: tương tự như trong Spring, file beans.xml này khai báo các bean sẽ được dùng trong project.

- struts.xml: file này thay thế cho xwork.xml trong webwork dùng để map giữa URL và action class đồng thời map giữa result code và file view.

-web.xml: được đặt ở webapp/WEB-INF/, web.xml cho phép map giữa URL pattern (trong trường hợp này là *.action) với ServletDispatcher của Struts.

Bài tập:
1. Viết 1 ứng dụng Struts cho phép xuất ra dòng chữ "Hello Struts - I love JDTC" khi người dùng nhấn nút Say Hello

2. Viết 1 ứng dụng cho phép người dùng chọn ngôn ngữ tiếng Nauy và tiếng Anh sau đó nhấn nút Say Hello để xuất ra dòng chữ tùy theo ngôn ngữ được chọn:
- Hei Struts - Jeg elsker JDTC
- Hello Struts - I love JDTC

3. Tính hợp với ví dụ Hibernate quản lý user ở phần trước, viết các chức năng Tạo, Đọc, Cập nhật, Xoá (CRUD) cho user.

4. Thử dùng tính năng Form Validation của Struts2 để validate form nhập user

5. Xây dựng ứng dụng đa ngôn ngữ bằng i18n cung cấp bởi Struts2 cho phép 2 ngôn ngữ Nauy và Anh.

Download ví dụ mẫu
http://www.mediafire.com/file/rnonmzjnwyj/struts-example.rar

Friday, June 11, 2010

Máy ảo javascript với jquery

Lời nói đầu: bài viết này nằm trong loạt 5 bài viết hướng dẫn các kỹ thuật nền tảng để xây dựng 1 ứng dụng J2EE hoàn chỉnh. Các bài viết này dành riêng cho khóa "J2EE nền tảng" củaJava Developer Training Center (JDTC). Sau đây là danh sách toàn bộ bài viết:
- Cốt lõi Java trong phần mềm quản lý J2EE
- Kết nối thế giới hướng đối tượng và quan hệ
- Giao diện người - máy thế hệ mới
- Máy ảo javascript với jquery
- MVC framework nào, đó là câu hỏi cần trả lời

Giới thiệu
Như đã trình bày ở bài trước, sự kết hợp của javascript với các trang web đã tạo nên một thế hệ ứng dụng chạy trên web mới: tiện dụng, đáp ứng nhanh, đẹp mắt. Các ứng dụng chủ yếu nhất của javascript có thể chỉ ra là: kiểm tra dữ liệu nhập bởi người dùng (validation), xử lý dhtml, và quan trọng nhất là Ajax.

javascript cung cấp các hàm cho phép lập trình viên thực hiện một các tất cả những tác vụ mong muốn. Tuy nhiên, hiện nay có một xu hướng sử dụng lại các thư viện javascript viết sẵn bởi vì nó giúp lập trình viên tiết kiệm rất nhiều công sức nếu phải xây dựng từ đầu (from scatch). Hợn thế nữa, nếu dùng js nguyên thủy lập trình viên phải viết rất nhiều dòng lệnh trong khi nếu dùng thư viện có sẵn lập trình viên chỉ cần viết vài dòng lệnh mà vẫn có hiệu quả tương đương.

Có rất nhiều bộ thư viện như vậy ví dụ: Yahoo GUI, Prototypes, Ext JS, và đặc biệt là jquery. Trong số này, jquery là bộ thư viện được ưu chuộng nhất và mạnh mẽ nhất với những đặc điểm sau:
- Đơn giản hóa cú pháp js
- Đảo ngược điều khiển
- Có một cộng đồng đông đảo ngày đêm viết thêm các bộ thư viện tiện ích cho jquery từ điều khiển giao diện, các hiệu ứng chuyển động.

1. Cú pháp của jquery:
Để tiết kiệm code, jquery sử dụng 1 bộ cú pháp rất khác thường. Điều này có thể gây khó khăn cho những người mới bắt đầu. Tuy nhiên "khẩu quyết" để viết jquery có thể tóm tắt như sau:
- Chọn 1 hoặc nhiều thành phần trên trang web
- Chọn biến cố (event) sẽ xảy ra trên thành phần được chọn
- Xử lý biến cố này

Xem ví dụ đơn giản sau. Trang web có 1 nút nhấn và 1 thẻ div. Khi nhấn vào nút nhấn này, thẻ div sẽ hiện ra dòng thông báo: "JDTC - My desire"


- Ta có thể thêm chút hiệu ứng để trang web sống động hơn:
$("#divMsg").html("JDTC is my desire").show("slow");

Nhận xét:
- Toán tử dấu dollar $ cho phép chọn đối tượng bằng cách truyền vào "#id_của_đối_tượng".
- Tiếp sau đó là biến cố có thể xảy ra trên đối tượng đó. Các biến cố này cũng tương tự như trong javascript tuy nhiên không có tiền tố "on" phía trước. Ví dụ: click, dblclick, hover, mouseover, keyup, keypress....
- Biến cố sẽ bọc bởi từ khóa function cho phép định nghĩa 1 hàm xử lý biến cố này. Function chỉ có từ khóa, không có tên để giúp lập trình viên tiết kiệm công sức đặt tên hàm.
- Cascading: chắc có lẽ dịch là "dính chùm". jquery tiết kiệm code bằng cách cho phép gán toán tử dính chùm nhau. Điều này giúp tiết kiệm thời gian khi lập trình viên phải viết các biến trung gian để lưu kết quả tạm.

2. Đảo ngược điều khiển
Tương tự như Spring, jquery cũng cho phép đảo ngược điều khiển. Theo ví dụ ở trên nếu không có jquery ta phải khai báo hàm bên trong đối tượng:

input type="button" value="Say hello" onclick="sayHello();">

jquery cho phép tách rời phần trình bày và phần điều khiển khiến cho việc debug và bảo trì trở nên dễ dàng.

3. Cộng đồng jquery:
Ví dụ bộ thư viện jquery UI cung cấp tất cả các control đẹp rực rỡ góp phần làm website trở nên hấp dẫn và quyến rũ hơn bao giờ hết.

jquery UI hỗ trợ các điền khiển nâng cao như kéo thả, slider, accordance... Tận dụng sức mạnh của các thư viện này, trang web của bạn sẽ trở nên "pro" hơn bao giờ hết.

4. Cross browser:
Vấn đề đau đầu của lập trình viên đã được giải quyết triệt để trong jquery. Viết 1 lần chạy mọi nơi đã đúng cho Java giờ lại đúng cho jquery.

5. Hỗ trợ Ajax mượt mà
Ajax đòi hỏi sự kết nối với máy chủ để lấy dữ liệu về và thay đổi một phần nội dung của trang web. Quá trình này diễn ra nhanh hay chậm tùy thuộc vào đường truyền và khả năng xử lý của máy chủ. Để cho giao diện người dùng trở nên thân thiện hơn, ta cần phải có thanh trạng thái báo Ajax đang hoạt động. jquery hỗ trợ làm điều này bằng cách cung cấp 2 hàm ajaxStart và ajaxComplete.

Ví dụ sau cho phép hiển thị thanh "Loading...." khi Ajax đang hoạt động. Thanh trạng thái này thực chất là 1 hình ảnh gif động

$("#imgLoading").ajaxStart(function(){
$(this).show();
});

$("#imgLoading").ajaxComplete(function(){
$(this).hide();
});

Nhờ có cặp hàm này, tất cả các thao tác Ajax trên cùng trang web đều có cùng một "look and feel", mang lại cảm giác thống nhất, dễ dùng cho người dùng.

6. jquery - Máy ảo javascript:
Thực chất jquery có thể được coi như 1 trình biên dịch mini giúp biên dịch các mã lệnh viết bằng ngôn ngữ jquery thành javascript và thực thi được trên trình duyệt.

Xem bảng sau đây để thấy các đại gia như Google, Microsoft, Yahoo đều đã và đang sử dụng jquery cho các ứng dụng của họ.

Bài tập
1. Hiện thực bộ menu của ứng dụng jHMS dùng jquery theo kiểu drop-down menu có sử dụng các hiệu ứng fadeIn, fadeOut. Menu hiện ra dùng hiệu ứng slow.
2. Hiện thực chức năng tìm kiếm bệnh nhân dùng Ajax và jquery. Có thanh trạng thái Loading....
3. Hiện thực chức năng thêm mới 1 bệnh nhân xử dụng Ajax để load form nhập. Sau đó dùng Ajax để post dữ liệu và lưu. Nếu lưu thành công thì trả về thông báo lưu thành công và clear form để chuẩn bị nhập tiếp.
Chú ý trong quá trình chờ dùng thanh Loading..... Kết hợp các hiệu ứng fast, slow, fadeIn, fadeOut để làm trang web trở nên sống động.


Tuesday, June 8, 2010

Giao diện người dùng (GUI) hiện đại

Lời nói đầu: bài viết này nằm trong loạt 5 bài viết hướng dẫn các kỹ thuật nền tảng để xây dựng 1 ứng dụng J2EE hoàn chỉnh. Các bài viết này dành riêng cho khóa "J2EE nền tảng" củaJava Developer Training Center (JDTC). Sau đây là danh sách toàn bộ bài viết:
- Cốt lõi Java trong phần mềm quản lý J2EE
- Kết nối thế giới hướng đối tượng và quan hệ
- Giao diện người - máy thế hệ mới
- Máy ảo javascript với jquery
- MVC framework nào, đó là câu hỏi cần trả lời

Từ desktop application đến web application là cả 1 cuộc cách mạng. Web 2.0 là mỹ từ được dùng để diễn tả cuộc cách mạng này. Sự kết hợp giữa dhtml, css, và ajax đã làm bùng nổ sức mạnh của các ứng dụng web. Thậm chí đã có những thư viện javascript tuyên bố họ có thể xây dựng được cả 1 hệ điều hành trên web 2.0 (Ext JS).

1. Div của dhtml đã thay đổi thế giới:
là viết tắt của Dynamic HTML. Như tên gọi dhtml là một mở rộng của html cung cấp các tiện ích cho phép lập trình viên tương tác với tất cả các thành phần của trang web thông qua javascript.
html tĩnh truyền thống thường rất tẻ nhạt với các thẻ định dạng header (từ h1 đến h5), in nghiêng, đậm, các thẻ liên quan đến table, td, tr. Khi thao tác với form, html tĩnh cung cấp text field, select box, radio button, button, text area.

Điểm ấn tượng nhất của dhtml là nó cung cấp thẻ div và hàm javascript getElementById. Với sự bổ sung của 2 thành phần này trang web trở nên sống động hơn trước rất nhiều.

Ví dụ: trang web có 1 button và dùng 1 thẻ div để hiện thông báo. Khi người dùng nhấn vào nút này, thẻ div sẽ thông báo "Hello world".



2. CSS, trang điểm cho trang web đầy sắc màu:
CSS là một ngôn ngữ giúp đặc tả màu sắc, font chữ, vị trí, đường viền của các đối tượng trên 1 trang web. CSS có khả năng tác động đến tất cả các thành phần của trang web.
Các điểm ấn tượng nhất của CSS bao gồm:
- Tạo border 1 cách đẹp mắt: CSS cho phép tạo border cho bất cứ đối tượng nào: text, paragraph, hoặc nội dung trong thẻ div (được dùng phổ biến nhất). Format border bao gồm: màu, style (đường liền hoặc đứt né), và độ dày (thick, thin, medium).
http://www.html.net/tutorials/css/lesson11_ex1.asp

- Format chữ với các hiệu ứng khác nhau: CSS cho phép chuyển đổi (text-transform) kiểu chữ thành viết chữ in hay kiểu viết hoa, cho phép trang trí (decorate) chữ bằng gạch dưới hoặc gạch ngang, kéo giãn chữ.
http://www.html.net/tutorials/css/lesson5_ex3.asp

- Tạo layer trên trang web: ngoài chiều ngang và chiều dọc, với layer trang web sẽ có thêm chiều sâu. Việc chồng lớp được sử dụng nhiều nhất để tạo message box bằng div cho hiệu quả tự nhiên hơn thay vì dùng popup hoặc javascript confirm box.
Ví dụ sau cho thấy 5 quân bài được xếp chồng lên nhau (thực chất là 5 tấm hình và dùng z-index và position để xếp lớp):
http://www.html.net/tutorials/css/lesson15_ex1.asp

3. Ajax (đọc là "ei jax"): là 1 công nghệ đình đám hiện nay đóng vai trò cột trụ cho web 2.0. Ajax cho phép load lại từng phần của trang web (chủ yếu là thay đổi nội dung của 1 thẻ div nào đó). Như vậy, ajax chỉ phát huy hiệu quả khi kết hợp với lấy việc lấy dữ liệu từ server. Nguyên tắc hoạt động của ajax có thể được tóm tắt như sau: từ trang web hiện hành thông qua javascript gọi 1 url với một hoặc nhiều thông số, url này có thể là 1 action (Struts2) hoặc là trang .php. Trang này có nhiệm vụ xử lý yêu cầu bằng cách tiến hành query vào cơ sở dữ liệu dựa trên các tham số nhận được, và trả kết quả trả lại dưới 2 dạng: html hoặc xml.
Với định dạng html, trang hiện hành chỉ việc dùng javascript lấy id của div và điền vào nội dung bằng cách dùng innerHTML. Đối với dạng xml, trang hiện hành cần phải duyệt (traverse) các node của cây xml sau đó điền kết quả vào trang web.

Như vậy, trong trang hiện hành phải có 2 hàm js: hàm thứ 1 phát động gọi xử lý trên server, hàm thứ 2 xử lý kết quả nhận được.

Với sự hỗ trợ của jquery, ajax trở nên "nhuyễn và kỳ ảo hơn bao giờ hết".

Bài tập:
1. Thiết kế trang đăng nhập của facebook (https://login.facebook.com/login.php) sử dụng CSS, javascript

2. Xây dựng lại top menu của trang (http://tuoitre.vn/)

3. Hiện thực chức năng "Write a comment" trong facebook. Ban đầu hiện text field có dòng chữ Write a comment bên trong. Khi người dùng click vào, sẽ mất dòng chữ Write a comment và hiện ra 1 button Save. Khi người dùng thoát focus ra khỏi text field, nếu chưa nhập nội dung gì thì trả về trạng thái cũ, nếu không sẽ giữ nguyên.

4. Tạo 1 form giống như trang sau http://slave.vatgia.com/home/register.php. Lưu ý các validate dùng javascript và hiển thị nội dung ngay tại control cần validate.


Monday, June 7, 2010

Kết nối thế giới hướng đối tượng và quan hệ

Từ lâu ước mơ của lập trình viên là làm sao kết hợp được sức mạnh mô phỏng thế giới của hướng đối tượng và logic lưu trữ của hệ cơ sở dữ liệu quan hệ. Hibernate đã ra đời để thỏa mãn giấc mơ đó. Tuy Hibernate không phải là framework duy nhất có thể làm được công việc này nhưng Hibernate là framework phổ biến nhất và được dùng nhiều nhất. Rod Johnson khi viết Spring đã chừa không viết luôn framework mới cho ORM (Object Relational Mapping) vì ông cho rằng Hibernate đã quá đủ.

Hibernate là một framework rất đầy đủ tuy nhiên khá phức tạp để sử dụng nhất là đối với người mới bắt đầu. Thiết kế cơ sở dữ liệu là công việc khó. Thiết kế class cũng không dễ dàng. Thiết kế mapping giữa 2 thế giới này lại càng phức tạp hơn. Như vậy, làm thế nào để giải được bài toán có 3 biến số như trong trường hợp này?

Kinh nghiệm cho thấy đối với 1 yêu cầu đầu vào R, hầu như chỉ có 1 đáp án thiết kế cơ sở dữ liệu mang tính tối ưu. Nhưng sẽ có nhiều hơn 1 thiết kế class: đơn hướng và đa hướng. Và do đó, sẽ có nhiều hơn 1 cách mapping. Bài toán này giải được dễ dàng nếu ta nhìn nhận 1 thực tế là: về mặt bản chất, chỉ tồn tại 3 kiểu quan hệ: quan hệ 1-1, 1-n, và n-n. Và trong thiết kế hướng đối tượng, ta cố gắng đưa về 3 kiểu quan hệ trên.

1. Quan hệ 1-1 và 1-n:
Thực chất quan hệ 1-1 và 1-n có cách xử lý gần như tương đương nhau đó là dùng khóa ngoại để tham khảo tới khóa chính của bảng quan hệ.
Ví dụ, quan hệ giữa bệnh nhân và dân tộc sẽ là quan hệ n-1: một bệnh nhân sẽ thuộc về 1 dân tộc và 1 dân tộc sẽ có nhiều bệnh nhân. Cách xử lý: trong bảng bệnh nhân sẽ có 1 cột mã_dân_tộc và liên kết với khóa chính trong bảng dân_tộc.

Trong thế giới hướng đối tượng ta phải thiết kế class như sau:
public class Patient
{
private int id;
private String lastName;
private String firstName;
private Ethnic ethnic;
}

với Ethnic được thiết kế như sau: (a)
public class Ethnic
{
private int id;
private String name;
}

Như đã nói ở trên, thế giới hướng đối tượng cho phép nhiều hơn 1 đáp án cho thiết kế, ví dụ ta có thể thiết kế class Ethnic như sau: (b)

public class Ethnic
{
private int id;
private String name;
private Set patients;
}

Trên thực tế, cách thiết kế này không phổ biến vì nhu cầu truy xuất danh sách các bệnh nhân từ 1 dân tộc không cao và hoàn toàn có thể thực hiện được thông qua 1 query. Do đó, việc thiết kế phụ thuộc rất nhiều vào bản mô tả yêu cầu.

Xây dựng mapping cho thiết kế trên:
- Trong file Patient.hbm.xml ta thực hiện như sau:

- Trong file Ethnic.hbm.xml ta thực hiện như sau: đối với thiết kế (a) và Đối với thiết kế (b)



2. Quan hệ n-n:
Kiểu quan hệ này nghe có vẻ lãng mạn nhưng ít tồn tại trên thực tế. Một số ví dụ liên quan đến quan hệ này. Trong một dự án sẽ có nhiều nhân viên tham gia làm, một nhân viên sẽ tham gia cùng lúc nhiều dự án. Để có thể lưu trữ được yêu cầu này, ta cần thêm 1 bảng trung gian tạm gọi là duan_nhanvien và lấy 2 khóa chính từ 2 bảng nhanvien và duan lam khóa ngoại.
Theo yêu cầu này ta có thiết kế class và hibernate mapping như sau:
- Thiết kế class:
public class Staff
{
private int id;
private String name;
private Date birthDate;
private Set projects;
}

public class Project
{
private int id;
private String name;
private Date startDate;
private Set staffs;
}

- Mapping:


Khi thực hiện thao tác trên project hoặc staff, Hibernate sẽ tự động tạo bảng trung gian staff_project và cập nhật dữ liệu trên bảng này. NHƯ VẬY, ta không cần phải tạo lớp trung gian để quản lý staff_project.
Ví dụ để thêm mới 1 project với 2 nhân viên ta viết như sau:

Staff staffA = new Staff("David Beckham");
staffManager.save(staffA);

Staff staffB = new Staff("C Ronaldo");
staffManager.save(staffB);

Project project1 = new Project("World cup 2010");
project1.getStaffs().add(staffA);
project1.getStaffs().add(staffB);

projectManager.save(project1);
//////thao tác này sẽ vừa insert 1 dòng vô bảng project, đồng thời 2 dòng vào bảng trung gian staff_project./////

3. Thế giới nhị nguyên: lưỡng nghi sinh tứ tượng
Con số 2 phát sinh ra thế giới, sự kết hợp giữa âm và dương làm cuộc sống sinh sôi. Sự kết hợp của 2 trạng thái 0 và 1 phát sinh ra kỉ nguyên thông tin.
Trong hibernate mapping cũng vậy, điều gì xảy ra nếu trong ví dụ trên ta thêm vào yêu cầu: mỗi nhân viên làm việc cho 1 dự án sẽ có chức vụ khác nhau và số giờ làm việc hằng tuần khác nhau. Như vậy trong bảng trung gian staff_project ta cần phải thêm vào 2 thuộc tính: position và hours. Do đó, mapping n-n trong trường hợp trên sẽ phải được chuyển thành 2 liên kết n-1:

public class Staff
{
....
private Set staff_projects;
}

public class Project
{
....
private Set staff_project;
}

và 1 class trung gian:

public class Staff_Project
{
private Project project;
private Staff staff;
private int hours;
private String position;
}

Hibernate mapping cho trường hợp này sẽ trở lại thành trường hợp n-1 như đã nói ở trên.


4. Thao tác với hibernate:
Hibernate cung cấp đầy đủ các API giúp cho lập trình viên thực hiện các thao tác tương tự như với jdbc. Lập trình viên chỉ cần gọi hàm save hoặc update, Hibernate sẽ "take care" việc lưu trữ xuống database. API của Hibernate cũng cực kỳ phức tạp nhưng có thể tóm tắt lại như sau:
- Configuration: là lớp dùng để khai báo thông tin về database, các file mapping
- SessionFactory: hibernate có 1 nhà máy sản xuất các session
- Session: đây chính là lớp cung cấp các thao tác thêm, xóa, sửa, và truy vấn đối tượng.

Qui trình để thao tác với hibernate: (mã giả)
Configuration conf = new Configuration();
SessionFactory sf = conf.createSessionFactory();
Session session = sf.openSession();
session.save(new Project("World cup"));

5. Spring và Hibernate:
Rod Johnson khi viết Spring đã ưu ái hỗ trợ Hibernate rất đầy đủ mặc dù các phiên bản Hibernate có cách hiện thực khác nhau.
Spring giúp tích hợp với Hibernate thông qua 2 lớp: org.springframework.jdbc.datasource.DriverManagerDataSource và org.springframework.orm.hibernate.LocalSessionFactoryBean.

6. Hibernate Query Language (HQL):
Là một ngôn ngữ tương tự như SQL nhưng dùng riêng cho hướng đối tượng. Đặc điểm:
- Góp phần tăng sức mạnh của Hibernate
- Lưu ý đặc biệt: trả về đối tượng chứ không trả về record set.
- Điều kiện của truy vấn: nối chuỗi bằng String chứ không nối với đối tượng do đó điều kiện truy vấn phải lấy thuộc tính của đối tượng để so sánh.

Ví dụ:
Cho mô hình lớp như sau:
public class Ethnic
{
private int id;
private String name;
private Set patients;
}

public class Patient
{
private int id;
private String lastName;
private String firstName;
private Ethnic ethnic;
}

a. Lấy danh sách các bệnh nhân
query = "from Patient"

b. Lấy danh mục các dân tộc
query = "from Ethnic"

c. Lấy danh sách bệnh nhân người Hoa (phải thực hiện join trên đối tượng)
query = "from Patient as patient inner join patient.Ethnic as ethnic where ethnic.name='Hoa' "

d. Lấy danh sách bệnh nhân có năm sinh là 1985
query = "from Patient as patient where year(patient.birthdate)=1985


Bài tập:
1. Hiện thực mô hình class cho bệnh nhân và dân tộc ở ví dụ 1 như trên.
- Viết hibernate mapping file
- Viết interface PatientManager và hiện thực bằng Hibernate dưới sự hỗ trợ của Spring

2. Hiện thực mô hình class cho ví dụ nhân viên và dự án ở trên (cho cả 2 trường hợp a và b)
- Viết hibernate mapping file
- Viết interface StaffManager và ProjectManager và hiện thực bằng Hibernate dưới sự hỗ trợ của Spring

Saturday, June 5, 2010

Thiết yếu lập trình java cho J2EE

Lời nói đầu: bài viết này nằm trong loạt 5 bài viết hướng dẫn các kỹ thuật nền tảng để xây dựng 1 ứng dụng J2EE hoàn chỉnh. Các bài viết này dành riêng cho khóa "J2EE nền tảng" của Java Developer Training Center (JDTC). Sau đây là danh sách toàn bộ bài viết:
- Cốt lõi Java trong phần mềm quản lý J2EE
- Kết nối thế giới hướng đối tượng và quan hệ
- Giao diện người - máy thế hệ mới
- Máy ảo javascript với jquery
- MVC framework nào, đó là câu hỏi cần trả lời


Java là một ngôn ngữ lớn, đầy thách thức nhưng cũng đầy khả năng. Một trong những điểm mạnh của Java chính là cộng đồng rộng lớn với hàng chục ngàn framework khác nhau được xây dựng để hỗ trợ thực hiện các chức năng khác nhau. Có nhiều người dự đoán Java sẽ chết và Ruby sẽ thay thế. Thực sự, Java chỉ có thể chết khi cả cộng đồng to lớn đó chết. Điều này hoàn toàn không dễ xảy ra ít nhất trong thời gian 10 năm tới. Bởi vì, Java luôn thay đổi, luôn thích ứng. EJB cồng kềnh đã được thay thế bằng EJB 3.0. Đặc biệt với Spring, thế giới J2EE đã trở nên hợp nhất và mạnh mẽ hơn bao giờ hết. Nếu thế gian mất 16 năm để Java có thể tiến hóa như hiện tại thì sẽ phải mất từng đó năm để có thể một cái gì đó khác thay thế cho Java.

Java được sử dụng nhiều nhất trong các ứng quản lý trên nền web. Đó là sân chơi mà Java chiếm ưu thế. Và đó cũng là chủ đề của bài viết này.

1. Hướng đối tượng trong Java
- Java gắn liền với hướng đối tượng. Có nhiều đánh giá cho rằng Java là ngôn ngữ hướng đối tượng trong sáng nhất. Nhưng hướng đối tượng của Java trong các ứng dụng quản lý khác nhiều so với quan niệm phổ biến là "đối tượng bao gồm các thuộc tính và hành vi". Trong các ứng dụng quản lý, các lớp đối tượng được tách riêng hoàn toàn thuộc tính và hành vi.

Ví dụ 1:
- Mô tả yêu cầu:
Xây dựng mô hình class để quản lý sinh viên. Mỗi sinh viên có các thuộc tính cơ bản: mã số, họ tên, ngày sinh, địa chỉ, giới tính. Mỗi khoa có thuộc tính: mã khoa, tên khoa. Mỗi sinh viên sẽ thuộc về một khoa, mỗi khoa sẽ có nhiều sinh viên. Ứng dụng cho phép CRUD (Create Read Update Delete) các sinh viên và khoa.

- Phân tích và thiết kế:
Theo quan niệm truyền thống lớp (class) bao gồm thuộc tính và hành vi vậy lớp Sinh viên có thể được thiết kế như sau:

public class Student
{
private String id;
private String name;
private Date birthDate;
private String address;
private boolean gender;

//hàm get set cho các thuộc tính của sinh viên

//các method CRUD

public void addStudent(Student student);
public void updateStudent(Student student);
public void deleteStudent(Student student);

}

Tuy nhiên trên thực tế không ai làm như vậy mà phải tách ra thành 2 lớp riêng biệt:
public class Student
{
private String id;
private String name;
private Date birthDate;
private String address;
private boolean gender;

//hàm get set cho các thuộc tính của sinh viên
}

public class StudentManager
{
//các method CRUD

public void addStudent(Student student);
public void updateStudent(Student student);
public void deleteStudent(Student student);

}

2. Trừu tượng hóa bằng interface:
Java có vô số thứ nổi tiếng, design pattern là một trong số đó. Design pattern nghe có vẻ "cao siêu" thực ra cũng rất đơn giản. Làm riết thành quen, design pattern không phải là lý thuyết mà thực chất là kinh nghiệm. Design pattern có hơn 250 mẫu, không ai nhớ được hết 250 mẫu, khoảng mười mấy cái được dùng chủ yếu nhất. Trong J2EE, ít nhất trong Spring, có 2 cái dùng thường xuyên đó là Factory Method và MVC. MVC ai cũng hiểu. Factory method thực chất cũng dễ hiểu.

Áp dụng Factory method cho ví dụ ở trên, ta được:

interface StudentManager
{
public void addStudent(Student student);
public void updateStudent(Student student);
public void deleteStudent(Student student);
}

Có nhiều cách để hiện thực các methods ở trên. Nếu ta dùng Hibernate, ta sẽ được:
public class HibernateStudentManager implements StudentManager
{
public void addStudent(Student student)
{
session.save(student);
}
}

còn nếu hiện thực bằng jdbc:

public class JDBCStudentManager implements StudentManager
{
public void addStudent(Student student)
{
con.execute("insert into student(id, name) values(student.getId, student.getName) ");
}
}

Như vậy, đối tượng trong J2EE tách rời hoàn toàn thuộc tính và phương thức.

3. Đảo ngược điều khiển (Inversion of Control):
Đảo ngược điều khiển là 1 khái niệm rất nổi tiếng trong Spring. Nói nghe có vẻ phức tạp nhưng trên thực tế rất đơn giản. Đảo ngược điều khiển trao quyền tạo đối tượng cho bean factory và được cấu hình trên file beans.xml thay vì lập trình viên phải viết code.

Trong ví dụ ở trên, khi muốn tạo 1 đối tượng studentManager, người dùng chỉ việc khai báo:

private StudentManager studentManager:

Sau đó get hoặc set cho property này. Việc quyết định StudentManager là HibernateStudentManager hoặc là JDBCStudentManager hoàn toàn được khai báo trong file beans.xml.

4. Sức mạnh của hướng đối tượng
Những điểm mạnh của hướng đối tượng thường được nhắc tới bao gồm: trừu tượng hóa, tính đa hình. Tuy vậy, có một điểm mạnh của hướng đối tượng thường được bỏ quên đó là: hướng đối tượng cho phép mô hình thế giới thực một cách đầy đủ nhất. Thật vậy, trong ví dụ ở trên, nếu sinh viên có thêm thuộc tính Khoa, lớp sinh viên sẽ được mô hình chính xác như sau:

public class Student
{
....
private Department department:
}
với Department là một lớp khai báo như sau:

public class Department
{
private String code;
private String name:
}

Khi trình bày 1 danh sách sinh viên, nếu muốn lấy tên khoa ta chỉ cần thao tác như sau: student.getDepartment().getName()


Bài tập
1. Phân tích và thiết kế class cho hệ thống có yêu cầu như sau:
Hệ thống quản lý 1 danh sách nhân viên. Thông tin của nhân viên gồm có: mã số, họ tên, ngày sinh, giới tính, địa chỉ. Mỗi nhân viên thuộc về 1 phòng ban. Thông tin của phòng ban gồm có: mã phòng, tên phòng. Một phòng ban có nhiều nhân viên.
- Viết 1 interface gồm các phương thức để quản lý danh sách nhân viên với các thao tác CRUD (Tạo mới, Đọc, Cập nhật, và Xóa)
- Hiện thực interface trên bằng 2 cách: 1) dùng kiểu array chứa danh sách nhân viên 2) dùng jdbc để thao tác với cơ sở dữ liệu;

2. Phân tích và thiết kế class cho hệ thống như sau:
Hệ thống quản lý kho dược quản lý danh mục các loại thuốc. Thông tin thuốc gồm có: tên thương mại (brand name), tên thuốc gốc (generic name), qui cách đóng gói, đơn vị tính nhỏ nhất (viên, gói, hộp, chai, lọ).
- Viết 1 interface gồm các phương thức để quản lý danh mục thuốc với các thao tác CRUD (Tạo mới, Đọc, Cập nhật, và Xóa)
- Hiện thực interface trên bằng 2 cách: 1) dùng kiểu array chứa danh sách nhân viên 2) dùng jdbc để thao tác với cơ sở dữ liệu;

3. Phân tích và thiết kế class cho hệ thống như sau:
Hệ thống quản lý xuất nhập tồn kho dược. Hệ thống quản lý danh sách các loại thuốc: tên thuốc, đơn giá. Hằng ngày, nhân viên sẽ lập các phiếu nhập để nhập thuốc vào kho. Thông tin phiếu nhập gồm: số phiếu, ngày nhập, tên nhân viên nhập, tổng tiền trước thuế, % thuế, tiền thuế, và tổng cộng. Mỗi phiếu nhập sẽ bao gồm nhiều chi tiết. Mỗi chi tiết là 1 loại thuốc, số lượng nhập, và đơn giá.
- Viết 1 interface gồm các phương thức để quản lý danh mục phiếu nhập với các thao tác CRUD (Tạo mới, Đọc, Cập nhật, và Xóa)
- Hiện thực interface trên bằng 2 cách: 1) dùng kiểu array chứa danh sách nhân viên 2) dùng jdbc để thao tác với cơ sở dữ liệu;

Download ví dụ mẫu:
http://www.mediafire.com/file/rnonmzjnwyj/struts-example.rar


Giáo trình J2EE cho các lớp lập trình viên

Lời nói đầu: bài này nằm trong loạt bài gồm 5 bài, thảo luận các vấn đề khác nhau trong việc xây dựng ứng dụng quản lý trong Java.
- Cốt lõi Java trong phần mềm quản lý J2EE
- Kết nối thế giới hướng đối tượng và quan hệ
- Giao diện người - máy thế hệ mới
- Máy ảo javascript với jquery
- MVC framework nào, đó là câu hỏi cần trả lời

Các bài viết này nhằm mục đích hệ thống hóa lại những nhận xét cũng như kinh nghiệm thực tế của tác giả sau một thời gian làm việc với J2EE với mong muốn góp chút sức mọn đào tạo nên những lập trình viên Java có trình độ làm chủ được công nghệ và giải quyết được những bài toán mà thực tiễn phát triển của đất nước đang đặt ra như: chính phủ địên tử, y tế điện tử, giáo dục... Các bài viết này được viết với phương châm ngắn gọn, thực tế, và thực hành. Một số lượng các đồ án được đặt ra sau mỗi bài viết sẽ giúp học viên thực sự hiểu được "what is going on here?".

Là người theo chủ nghĩa thực dụng, tôi có một nhận xét rất tiêu cực rằng, những bài giảngvề lập trình dù được dạy trực tiếp bởi Bill Gates hay Rod Johnson cũng vô nghĩa nếu học viên không trực tiếp "trải nghiệm" bằng những ví dụ và bài toán cụ thể. Cách đây khoảng 5 năm, tôi có viết vài bài trên Javavietnam.org trong đó có một câu đại ý "tất cả những lý thuyết đại ngôn sẽ trở nên vô nghĩa nếu bạn không tự mình làm thử qua một ví dụ". Áp dụng tinh thần đó, loạt bài này sẽ theo công thức 4+1 nghĩa là 4h làm thực tế và 1h thảo luận. Như vậy có thể thấy, loạt bài này không dành cho những người tự học. "Sorry for that", người Anh thường dùng câu này khi phải nói ra sự thật mà không đúng với mong đợi của người được nghe. Chúng ta ai cũng có khuynh hướng tự học nhưng "it doesn't work", ít nhất là trong khuân khổ giáo trình này.

What is beyond the scene? Ý nghĩa của những việc này là gì?

Tôi tin tưởng vào triết lý "empowering people" - con người đều có những khả năng tiềm ẩn để làm những việc lớn hơn những cái họ đang làm. Để làm được vậy, họ cần phải được đào tạo để khai phá những tiềm năng đó. Những người bán vé số, những người nhặt rác, họ không hề vô dụng, họ có tiềm năng lớn. Họ có thể được đào tạo để làm những công việc có giá trị gia tăng cao hơn, và mưu cầu một cuộc sống tốt hơn. Nếu tất cả những người có hoàn cảnh khó khăn đều được "powered", chắc chắn lúc đó đất nước sẽ giàu mạnh lên và người Việt Nam khi cầm hộ chiếu ra nước ngoài sẽ không còn mặc cảm.

Giáo trình này làm một phần trong kế họach lớn hơn: viết lại sách giáo khoa và thông qua đó cải tổ giáo dục sâu rộng. Chưa ai làm được việc này, và sẽ không ai làm được việc này bởi lẽ đơn giản: nó đòi nỗ lực của một đội ngũ, của một mạng lưới. Bản thân từ đội ngũ đã mang ý nghĩa trừu tượng, đội ngũ là 2 người hay 2000 người. Như vậy, đội ngũ phải được bắt đầu từ người thứ 1và thứ 2, người thứ 10, người thứ 100.... Như vậy bạn có muốn là người thứ 100?

Sunday, February 28, 2010

Tài liệu học Java?


Tài liệu học Java rất quan trọng đối với lập trình viên Java. Tuy nhiên với sự bùng nổ của nhu cầu học ngôn ngữ này, từ hơn mười năm qua, hàng chục ngàn đầu sách về Java đã được xuất bản, chưa kể kèm theo đó là hàng ngàn các website, diễn đàn về Java. Điều này gây lúng túng cho những người mới làm quen với Java khi không biết chọn sách nào để đọc. JDTC bằng kinh nghiệm thực tiễn đã chọn lựa sẵn những đầu sách Java có giá trị và hữu ích cho học viên của mình.

Học ở JDTC bạn được tặng 1 bộ sách Java tham khảo từ căn bản đến nâng cao. Sách được in rõ ràng, đóng bìa chắc chắn, chắc chắn sẽ là người bạn hữu ích và gối đầu giường cho các bạn chọn sự nghiệp của mình với Java.



Anh hùng võ lâm ngày xưa thành tài cũng nhờ "bí kíp võ công". Lập trình viên Java ngày nay có lẽ cũng vậy

Các tiêu chí chọn sách của JDTC:
- Sách viết rõ ràng, dễ hiểu, đi sâu vào trọng tâm
- Được recommend nhiều bởi những học viên Java khác
- Chọn một cuốn trong số các sách tiêu biểu nhất cho mỗi thể loại
- Độ dài không quá mức i.e phải trong vòng vài trăm trang trở lại
- Bộ sách này sẽ trải rộng các chủ đề mà học viên sẽ được học trong 3 courses: Java foundation, J2EE - foundation, J2EE - advance như: ngôn ngữ Java, Spring, Hibernate, Webwork, Struts 2, CSS, Javascript

Sau đây là link download một số sách tiêu biểu dưới dạng ebook:
- Java Complete Reference
- Spring in Action
- Hibernate in Action
- Webwork in Action

Đến đăng ký học ngay để ẵm trọn bộ sách:

Time and place of study?
Flexible time: 9AM-8PM.
Place of study:
Java Developer Training Center

29 D14B street, Tay Thanh ward, Tan Phu dist. HCMC
Tel:08-3 815 62 68 (MS Khanh Huong)
Email: javadevelopervietnam@gmail.com
Website: http://javadevelopervietnam.org (underconstruction)
blog: http://javadevelopervietnam.blogspot.com

Wednesday, February 24, 2010

Sự khác biệt trong cách dạy của JDTC? Một số câu hỏi thường gặp

Tại sao học lập trình khó?
Học và sử dụng một ngôn ngữ không dễ. Điều này cũng đúng với ngôn ngữ lập trình. Đó là điều ai cũng phải công nhận. Ngôn ngữ lập trình là ngôn ngữ dùng để giao tiếp giữa người và máy tính, chỉ thị cho máy tính thực hiện các yêu cầu của lập trình trình viên.

Sử dụng được một ngôn ngữ có khó không? Chắc chắn là rất khó khăn. Bạn đã từng trải qua bao nhiêu lớp học ngoại ngữ nhưng thử hỏi bạn đã đủ tự tin khi giao tiếp bằng tiếp Anh? Hằng ngày, hằng đêm hàng núi tiền được đổ ra cho các trung tâm ngoại ngữ với mác giảng viên nước ngoài, với mong muốn hết sức chính đáng là để sử dụng thành thạo tiếng Anh. Ngôn ngữ lập trình cũng vậy.

Là 1 loại ngôn ngữ giao tiếp, ngôn ngữ lập trình cũng cần được học theo đúng qui luật tự nhiên, một môi trường để kỹ năng ngôn ngữ có thể sống và phát triển.

Bởi vì không tạo lập được một môi trường sống cho ngôn ngữ nên ở Việt Nam nhiều trường đã thất bại trong việc đào tạo nguồn nhân lực CNTT đáp ứng được yêu cầu thực tế.

Vậy phương pháp của JDTC là gì?
JDTC đã trải nghiệm và phát hiện ra một phương pháp dạy và học lập trình mới mô phỏng quá trình học tự nhiên của ngôn ngữ. Phương pháp này đã được thử nghiệm trên một tập đủ lớn các học viên của JDTC và kết quả thu được hết sức khả quan. Phương pháp học này thực ra không hề xa lạ hoặc huyền bí mà trong thực tế đã được sử dụng khá nhiều, tiếng Anh gọi là "on-job training" hoặc "learning by doing", tiếng Việt gọi là "cầm tay chỉ việc". Tuy nhiên, trên thực tế phương pháp này mới chỉ được sử dụng trong các trường hợp đặc biệt như đào tạo nhân viên mới, triển khai một qui trình làm việc mới....

image

"On-job training"

Learning by Doing by BrianCSmith.

"Learning by experiment"

learning by doing cartoons, learning by doing cartoon, learning by doing picture, learning by doing pictures, learning by doing image, learning by doing images, learning by doing illustration, learning by doing illustrations

Lợi điểm của phương pháp đào tạo này:
- Cực kỳ hiệu quả trong việc nhanh chóng trang bị kỹ năng về một lĩnh vực nào đó cho học viên, đặc biệt là lĩnh vực lập trình
- Tiết kiệm thời gian cực lớn, còn khoảng 20% so với các phương pháp khác đồng thời tạo hứng thú sáng tạo cho học viên, điều này cực kỳ quan trọng vì nó giúp học viên duy trì được niềm đam mê lập trình

Bất lợi của phương pháp này:
- Sự đầu tư cực lớn từ phía giảng viên và trung tâm đào tạo, mỗi lớp học phải cắt giảm xuống còn dưới 5 người

Bởi vì JDTC chấp nhận dấn thân để xây dựng một "talent pool", một trung tâm sản sinh ra các lập trình viên chất lượng, phục vụ mạnh mẽ cho nhu cầu của ngành CNTT trong nước và quốc tế. Như những hạt giống, sức sống từ những học viên này sẽ lan tỏa rộng ra, góp phần đổi mới tư duy đào tạo nhân lực CNTT ở Việt Nam.

Dự án thực tế?
JDTC tin rằng chỉ với dự án thực tế, học viên mới có thể trưởng thành. Ở JDTC, chúng tôi có một số lượng đáng kể các dự án đang triển khai giúp học viên làm quen với thực tế. Và một số lượng lớn các dự án mã nguồn mở mà chúng tôi đang cộng tác phát triển sẽ giúp học viên tiếp cận nhanh nhất với nền CNTT thế giới.

Việc làm sau tốt nghiệp?
JDTC đã thiết lập mối quan hệ với một số lượng các công ty có nhu cầu về lập trình viên Java. Chúng tôi sẽ hỗ trợ bạn tìm kiếm công việc với mức lương hợp lý và thăng tiến.

Ai có thể học?
- Sinh viên các trường ĐH chuyên ngành về CNTT, hoặc các ngành khác
- Sinh viên đã tốt nghiệp
- Các lập trình viên trong các doanh nghiệp, muốn trang bị hướng kiến thức mới
- Học sinh phổ thông yêu thích lập trình

Time and place of study
?
Flexible time: 9AM-8PM.
Place of study:
Java Developer Training Center

29 D14B street, Tay Thanh ward, Tan Phu dist. HCMC
Tel:08-3 815 62 68 (MS Khanh Huong)
Email: javadevelopervietnam@gmail.com
Website: http://javadevelopervietnam.org (underconstruction)
blog: http://javadevelopervietnam.blogspot.com

Tuesday, February 23, 2010

Blackbox testing và Whitebox testing

Có 2 trường phái test hoạt động khác nhau về nguyên lý nhưng thực chất bổ sung cho nhau. Có thể bạn đã nghe nói nhiều về Black and White rồi nhưng trên thực tế thì nó hoạt động động như thế nào chắc có thể nhiều nhiều chưa nắm rõ lắm. Xin mạo muội viết vài dòng:
- White box tesing: là cách thức test dựa trên code của chương trình, sau đó viết các test case nhằm phủ kín (coverage) các trường hợp cần test. Có WBT có 2 loại: Control flow và Data flow

+ Control flow: nghe khá rối rắm nhưng thực ra rất đơn giản.
Các bạn biết trong các ngôn ngữ lập trình các lệnh sẽ được thực hiện theo các cách sau:
1. Tuần tự:
2. Rẽ nhánh: như if... else...
3. Vòng lặp: for, while, loop
Như vậy nếu mình lập ra các trường hợp test cho phủ kín các cấu trúc nào thì coi như đạt yêu cầu
Ví dụ.
if (x>0)
{

}
else
{

}
Cần phải có 2 test case: 1. x>0 2. x<=0 + Data flow: Tập trung vào kiểm tra giá trị của các biến trong chương trình Biến sẽ xuất hiện theo 2 dạng: khai báo và gán giá trị Biến sẽ được sử dụng theo 2 cách: predicate (kiểm tra điều kiện) và computational (tính toán) Trên thực tế, để hiện thực cách test này phải xây dựng sơ đồ Control Flow Diagram hoặc Data Flow Diagram. Việc này có thể thực hiện tự động bằng cách phần mềm hỗ trợ. Sau khi viết các test case, có thể chạy các Coverage Tool để xem độ phủ code bao nhiêu, chỗ nào cần phải viết thêm test case. Black box testing: là phương pháp test dựa trên đầu vào và đầu ra của chương trình để test mà không quan tâm tới code bên trong được viết ra sao. Phương pháp này thường dùng để test chức năng của chương trình. Có nhiều phương pháp dành cho BBT nhưng tựu trung trải qua 3 bước sau:
1. Phân chia giá trị đầu vào thành các miền giá trị khác nhau
2. Tổ hợp các miền giá trị của các đầu vào, mỗi tổ hợp là 1 test case
3. Dựa trên ràng buộc giữa các đầu vào để giảm bớt số lượng test case.

Các phương pháp phổ biến
- Equivalence Class Partition
- Boundary Value Analysis
- Category Partition
- Cause Effect Graph

Ví dụ. Kiểm tra chức năng đăng nhập
Đặc tả: nhập user name và password, nếu đúng thì báo đăng nhập thành công, nếu sai thì báo sai mật khẩu.

Input:
- username
- password
Output:
- sai username và password
- đúng username và password

Như vậy ở đặc tả này không nói rõ yêu cầu về độ dài, kiểu ký tự của 2 thông số username và password nên ta có thể chọn bất kỳ. Ở output có 2 trường hợp đầu ra nên ta cần có 2 test case
1. Sai username và password
2. Đúng username và password

Đặc tả khác: nhập user name và password, nếu đúng thì báo đăng nhập thành công, nếu sai thì báo sai mật khẩu. Username phải có độ dài từ 4-25 ký tự, nếu không sẽ hiện thông báo yêu cầu nhập lại.

Trong trường hợp này, thì giá trị đầu vào của username có được phân thành 3 miền giá trị như sau:
- (1) độ dài của chuỗi username từ 0-3
- (2) độ dài của chuỗi username từ 4-25
- (3) độ dài của chuỗi username từ >25

Như vậy ta phải có 3 test cases cho 3 trường hợp này, đồng thời trong trường hợp 3, ta cần 2 test case nhỏ nữa cho 1. đúng username 2. sai username
Số test case tổng cộng: 4
Kết luận: số lượng test case phụ thuộc rất lớn vào đặc tả (specification) phần mềm

Áp dụng phương pháp Category Partition cho ví dụ trên
-username (u), độ dài:
1 0-3: Error
2 4-25: [property hople]
3 >25: Error
-password (p):
bất kỳ
-output (o):
1 đăng nhập thành công: [if hople]
2 đăng nhập không thành công: [if hople]
Ta có tổng cộng 4 test case như sau:
u1: username = "ab"
u2po1: username = "javadevelopervietnam.org", password="Great_Course", và tồn tại user này trong hệ thống
u2po2: username = "javadevelopervietnam.org", password="Great_Course", và không tồn tại user này trong hệ thống
u3: username = "abc23593945734973454386054654"