some characters cannot be mapped using “ISO-8859-1″ character encoding eclipse

Khi làm việc với dự án nào đó với elipse có thể bạn mắc lỗi này:

some characters cannot be mapped using “ISO-8859-1″ character encoding.
Either change the encoding or remove the characters which are not supported
by the “ISO-8859-1″ character encoding

Hãy bình tĩnh làm theo các bước:

1. Trong eclipse: Chọn Help -> Software Updates -> Add Site

2. Nhập địa chỉ site này vào http://propedit.sourceforge.jp/eclipse/updates/

3. Next -> next liên tục -> restart lại eclipse

=> Bạn sẽ không còn bực mình khi đụng tới các file properties có kí tự UTF-8 nữa!

Good luck!

Tham khảo http://propedit.sourceforge.jp/howto_eclipseplugin_install_en.html

Procedure trong Oracle

Mai thi Oracle rồi, Bữa nay tranh thủ ôn lại bài. Đụng đến phần Procedure, tranh thủ viết bài viết lên blog của mình để trình bày lại những j mình hiểu, rèn luyện kỹ năng viết lách.

Procedure bản chất là 1 khối PL/SQL có tên và có đối số nhằm thực hiện một 1 số lệnh nào đó tùy theo mục đích của người viết ra nó.
Cú pháp:

Chạy 1 proc trong sqlplus như sau

Chú ý các thông số khai báo không được ràng buộc điều kiện cho chúng ví dụ : v_a number(3) là sai, mà đúng ra là v_a number — không có giới hạn số chữ số
Đặc biệt trong procedure ta cần chú ý tới phần parameter trong phần khai báo. Có 3 loại parameter trong oracle mà ta cần chú ý. Đó là IN, OUT, IN OUT

Chúng ta làm ví dụ sau để hiểu rõ hơn
Bạn tao 1 proc sau:

Trước khi chạy, ta hay xem ý định của ví dụ này là gì, dze ẹt đó là hoán vị 2 số a,b. Bạn thử đoán xem nó có chạy được không và nếu chạy được thì giá trị của a và b sau bước này có được hoán vị cho nhau không

Câu trả lời là không chạy được proc trên và báo lỗi sau

Lý do là vì là vì tham số a b ta chỉ được đọc giá trị của nó và gán vào biến temp(dòng 6 và 7 ), mặc định sau khi khai báo biến nếu ta không ghi gì hết thì ORACLE sẽ ngầm thêm IN đằng sau biến và khi đó ta chỉ được đọc giá trị của biến này thôi (read value) và gán giá trị này cho biến khác (v_temp:=a) cái này là pass by value(chỉ truyền trị số)
Để khác phục lỗi này ta làm như sau, rất đơn giản chỉ cần thêm IN OUT đằng sau khi khai báo biến, tại sao lại thêm như thế, thật đơn giản khi thêm IN OUT giá trị của biến a sẽ được đọc và gán vô biến v_temp, sau đó giá trị của biến a,b có thể được ghi đè lên. Đó là tại sao oracle lại thêm IN, OUT vào. Tuy rắc rối nhưng rất hữu ích trong 1 số trường hợp sau này khi ta cần sử dụng đến chúng.

Chạy thử OK, Procedure created.
Xong ta thử viết 1 unnamed proc đẻ chạy thủ hàm hoanvi này

Và kết quả trả về là

PL/SQL procedure successfully completed.

Xong, với ví dụ trên thì chắc hẳn các bạn và mình sẽ hiểu rõ hơn về tham số truyền vào Procedure trong Oracle.
Có ý kiến j đóng góp comment cùng trao đổi nha!

Java pass by value hay pass by reference

Chắc hẳn những bạn đã học qua C, C++ sẽ có suy nghĩ như thế khi qua học java. Bên C,C++ thì có cả 2 kiểu trên pass by valuepass by reference, thực chất pass by reference trong C++ là khai báo 1 biến alias khác tên nhưng cùng địa chỉ với biến ban đầu.

Ví dụ:
hoanvi1(int &a,int &b) là pass by refererence còn hoanvi2(int *a,int *b) và hoanvi3(int a,int b) là pass by value.
Khi gọi hàm hoanvi1 thì biến trong hàm hoanvi1 và biến truyền vào là 1(cùng 1 địa chỉ)
Còn khi gọi hàm hoanvi2,hoanvi3 thì giá trị của biến thưc được gán cho biến hình thức, hoặc địa chỉ của con trỏ thực sự được copy và gán cho con trỏ hình thức

Xem thêm:  http://www.codeprovn.com/forums/viewtopic.php?f=17&t=1945

Còn bên JAVA:

Pass by value có thể hiểu là bạn truyền trị số(giá trị của biến) của 1 biến này vào 1 biến khác

Vd: int x=3;

int y = x; // giá trị của biến x(3) sẽ được copy và gán vào y

Đối với kiểu dữ liệu object thì sao.

Vd:  A obj_a = new A();

A obj_b = obj_a; //obj_a , obj_b sẽ cùng tham chiếu tới 1 đối tượng kiểu A

Khi đó mọi thay đổi tới đối tượng A từ obj_b hoặc obj_a đều gây ảnh hưởng đến đối tượng A là 1 thể hiện của class A.

 

Tại sao lại như thế. Khi bạn gán obj_b=obj_a, địa chỉ đối tượng mà obj_a tham chiếu tới sẽ được copy lại và gán cho obj_b.Sau phép gán này thì obj_b sẽ tham chiếu tới đối tượng A. Chú ý là chỉ copy địa chỉ chớ obj_a và obj_b không cùng 1 địa chỉ, do đó Reference to Object is pass by value

Java is pass-by-value.

For primitives, you pass a copy of the actual value.

For references to objects, you pass a copy of the reference (the remote control).

Tham khảo: http://www.javaranch.com/campfire/StoryPassBy.jsp

So sánh 2 phương thức Post, Get

Notice: Bài viết này được tôi viết từ thời còn sinh viên, lúc còn non trẻ – thời mà restful cũng chưa ra những standard như hiện nay (2015). Các bạn đọc và so sánh với những kiến thức hiện tại nhé. Tôi sẽ cố gắng cập nhật nội dung bài viết này sớm  😀

Trong lập trình web. Để xử lý việc nhận gửi thông tin từ  1 form của người dùng nhập vào là rất thường xuyên. Chúng ta thường sử  dụng 2 phương thức POST và GET (ngoài các phương thức sẽ được sử dụng khi làm việc với RESTFUL webservice như PUT, DELETE sẽ được trình bày ở các bài sau liên quan đến RESTFUL webservice) . Tuy nhiên lúc nào sử  dụng POST, lúc nào sử  dụng GET ? Câu hỏi đó ko dễ trả lời vì có những cái chúng ta thường xuyên dùng 1 cách thói quen, chỉ biết dùng sao cũng chạy cả nên rất ít người hiểu rõ và trả lời được câu hỏi này.
Sau đây là sự  giống nhau và khác biệt giữa chúng.
* Giống nhau:  Đều gửi dữ liệu tới server để xử lý, sau khi người dùng nhập thông tin vào Form
* Khác nhau:
** POST:Bảo mật hơn POST vì dữ liệu được gửi ngầm, không xuất hiện trên URL
** GET:Dữ liệu được gửi tường minh, chúng ta có thể nhìn thấy trên URL, đây là lý do khiến nó không bảo mật so
với POST

**GET thực thi nhanh hơn POST vì nhứng dữ  liệu gủi đi luôn được Webbrowser cached lại

**Khi dùng phương thức POST thì server luôn thực thi và trả về kết quả cho client, còn GET sẽ xem xét ứng với cùng 1 yêu cầu  sẽ xem trong cached có kết quả tương ứng với yêu cầu sẽ trả về ngay không cần phải thực thi các yêu cầu đó ở phía server

** Đối với những dự liệu luôn được thay đổi thì chúng ta nên sử  dụng phương thức POST, còn dữ  liệu ít thay đổi chúng ta dùng phương thức GET để truy xuất và xử lý nhanh hơn

Session và HttpSessionListener

Ten ten ten tèn!
Hi hi hi. Chào mọi người! Rất hân hạnh được gặp các bạn tại blog của mình.
Bài viết này mình sẽ trình bày về HttpSessionListener và ứng dụng của nó vào thực tế.
Đầu tiên mình sẽ nói lại về định nghĩa sesssion.
Session nói chung và trong jsp hay servlet nói riêng là 1 interface được cung cấp để lưu trữ các thông tin trong 1 phiên làm việc của bạn trên trang web.Phiên làm việc ở đây có thể hiểu là một quá trình thao tác của bạn từ lúc truy cập vào 1 trang web để mua hàng đến khi bạn thoát khỏi trang đó.
Trong jsp thì đối tượng session được khai báo 1 cách implicit tức là nó nằm trong nhóm những thành phần có sẵn của 1 trang jsp bạn chỉ việc sử dụng nó bắng chính tên session. Còn trong servlet thì bạn phải get nó từ Request  và cú pháp như sau
HttpSession session = request.getSesssion().
Tiếp theo là 1 số thuộc tính và phương thức quan trọng của session.
Ở đây mình chỉ nói những thuộc tính và phương thức hay dùng tới.

session.invalidate() — hủy session và hủy các đối tượng liên quan tới session
session.setAttribute(name,value) — hàm này dùng để set 1 biến và giá trị của nó vào session ví dụ:session.getAttribute(“user”,”loga”);
session.getAttribute(name) — hàm lấy về giá trị của 1 biến ví dụn session.getAttribute(“user);
session.setMaxInactiveInterval(khoảng thời gian) — hàm này set 1 khoảng thời gian kể từ request cuối cùng từ client tới server cho đến khi session invalidate, khoảng thời gian ở đây tính bằng giây. Ví dụ bạn setMaxInactiveInterval(10) thì tính từ lần request cuối cùng từ client tới server nếu không có 1 request nào mới trong khoảng thời gian 10s này thì session sẽ invalidate, nhưng nếu trong khoảng thời gian 10 s đó có 1 request từ client tới server thì session sẽ tự động gọi setMaxInactiveInterval(10) ;

Trên đây đó là những gì cơ bản nhất về session.Tiếp theo mình sẽ đi vào HttpSessionListener.
Tại sao tui phải quan tâm tới HttpSessionListener? Câu trả lời là: Khi làm việc với session bạn muốn bắt sự kiện khi session được tạo ra và khi session được kết thúc. Ví dụ bạn muốn đếm số người đang online trên trang web của bạn thì bạn sẽ nghĩ là: ”à, mình phải biết được khi nào session được tao ra thì mình tăng biến đêm lên 1, còn khi session bị hủy(invalidate) thì giảm biến đếm 1, tát nhiên biến đếm này phải là biến static trong 1 class nào đó”. Để làm được như vậy thì mình dùng tới HttpSessionListener (ai có cách khác xin chỉ giáo).
Vậy thì HttpSessionListener có gì mà làm đươc thế?

Thưa, HttpSessionListener là 1 interface có 2 method sau:
1.sessionCreated() — bắt sự kiện khi session được tạo ra
2.sessionDestroyed() — bặt sự kiện khi session kết thúc(invalidate)

Ủa mà cái HttpSessionListener là 1 interface thì làm sau mà gọi đọc 2 cái hàm trên được nhỉ. Rất đơn giản bạn chỉ cần tạo 1 class mới implement HttpSessionListener là bạn có thể kiểm sóat được khi nào thì sessionCreated, khi nào thì sessionDestroyed.

Chú ý: Để sử dụng được HttpSessionListener bạn nhớ thêm
<listener>
    <listener-class>MySessionLister</listener-class>
</listener>

vào trong file web.xml, MySessionListener là 1 class implement interface HttpSessionListener. À, còn 1 điều lưu ý nữa là trong file xml bạn có thể chỉnh thời gian timeout cho 1 session (tương tự setMaxInactiveInterval) như sau:

<session-config>
<session-timeout>
30
</session-timeout>
</session-config>

Vậy thì ứng dụng HttpSession vào thực tế như thế nào, làm cái cho dễ hiểu thử coai? Okay dưới đây mình trình bày ví dụ đếm số người online(thực chất là đếm số session, tuy nhiên sẽ không chính xác lắm nếu bạn test với 1 máy mở nhiều hơn 1 trình duyệt khác nhau) trên 1 trang web cực kỳ đơn giản đẻ các bạn có thể hiểu thêm về session và HttpSessionListener.
Đâu tiên bạn tạo 1 class MySessionListener như sau

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package listener;

import java.util.Date;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
*
* @author loga
*/
public class MySessionListener implements HttpSessionListener{

private static int songuoionline=0;

//ham de lay bien so nguoi online
public static int getSonguoionline() {
return songuoionline;
}

public void sessionCreated(HttpSessionEvent se) {
HttpSession session = se.getSession(); //lay session từ HttpSessionEvent
Date now = new Date();
System.out.println(“Da tao session co ID “+ session.getId()+” vao thoi diem ” + now );
System.out.println(“Dang có ” + songuoionline +” online”);
songuoionline ++;
}

public void sessionDestroyed(HttpSessionEvent se) {
HttpSession session = se.getSession(); //lay session từ HttpSessionEvent
Date now = new Date();
System.out.println(“Da huy session co ID “+ session.getId()+” vao thoi diem ” + now );
songuoionline –;
}

}

Sau đó trong file web.xml add thêm đoạn code này vào:

<listener>
<listener-class>listener.MySessionListener</listener-class>
</listener>

Ta có file web.xml hoàn chình như sau:

<?xml version=”1.0″ encoding=”UTF-8″?>
<web-app version=”2.5″ xmlns=”http://java.sun.com/xml/ns/javaee&#8221; xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance&#8221; xsi:schemaLocation=”http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd”&gt;
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<listener>
<listener-class>listener.MySessionListener</listener-class>
</listener>
</web-app>
Chú ý: listener là 1 tên package chứa class MySessionListener

Tiếp đến tạo trang demsonguoionline.jsp như sau:

<%–
Document   : songuoionline
Created on : Jun 22, 2009, 10:06:32 PM
Author     : loga
–%>

<%@page contentType=”text/html” pageEncoding=”UTF-8″%>
<%@page import=”listener.MySessionListener” %>
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”
http://www.w3.org/TR/html4/loose.dtd”&gt;

<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″>
<title>Demo HttpSessionListener</title>
</head>
<body>
<h2>Hiện có <%=MySessionListener.getSonguoionline()%> online</h2>
</body>
</html>

Thử chạy coi nào, bạn hãy thử 2 đến 3 trình duyệt khác nhau tương ứng 3 user trên máy. Cái này gọi là so nguoi online vẫn chưa đúng lắm. Để đếm số người online đúng hơn thì bạn nên kiểm tra ip để  tránh tình trạng 1 ip có nhiều hơn 1 session khi đó biến đếm của chúng ta sẽ không chính xác. Tuy nhiên đây chỉ là 1 ví dụ minh họa đơn giản để các bạn có thể hiểu rõ hơn về session cũng như HttpSessionListener.

Link demo http://mega.1280.com/file/ASK8MKPS/  [ this link is currently unavailable ]
Tham khảo:
http://java.sun.com/products/servlet/2.2/javadoc/javax/servlet/http/HttpSession.html
http://java.sun.com/products/servlet/2.2/javadoc/javax/servlet/http/HttpSession.html
http://www.roseindia.net/servlets/ListenerSession.shtml

Chúc các bạn thành công!

So sanh aggregation với Composition khi thiet ke class diagram

Khi thiết kế class-diagram bằng UML, chắc hẳn ai cũng gặp khúc mắc về sự khác nhau giữa hai quan hệ aggregation và composition. Thực ra chẳng có gì là khó khăn cả nếu các bạn đọc qua 2 trường hợp ví dụ về 2 quan hệ trên.

* Trước hết là sự  ging nhau: cả hai đều là quan h kết hp ( association).

* Khác nhau:
aggregation ( tụ hp) là quan hệ giữa toàn thể và bộ phận, trong đó một lớp biểu diễn cái lớn hơn(tổng thể) còn lớp kia biểu diễn cái nhỏ hơn(bộ phận). Aggregation biểu diễn quan hệ has-a, có nghĩa rằng một đối tượng của lớp tổng thể có nhiều đối tượng của lớp thành phần. Ví dụ: Một môn học được mở (cái này trong học tín chỉ) có nhiều sinh viên theo học, môn học được mở là class tổng thể, còn sinh viên là class thành phần. Nếu không có môn học được mở thì sinh viên vẫn tồn tại, hoặc khi hủy môn học được mở đi thì sinh viên vẫn không bị hủy.
Trong class-diagram thì quan hệ aggregation được biểu diễn bằng đoạn thẳng kết thúc bởi hạt kim cương trắng gần với lớp toàn thể(aggregate class).
Ngược li,composition(gp) mạnh hơn aggregation về sự phụ thuộc lẫn nhau, ví dụ cho dễ hiểu nhé: Một công ty (Company) có nhiều phòng ban( Department). Như thế khi công ty bị hủy đi thì phòng ban (Department) không còn tồn tại, hoặc Một phòng học( Class-room) có nhiều bàn ghế (table), thực tế là tất cả các phòng học đều có bàn ghế riêng cho từng phòng và bàn của phòng nào đều có mã số phòng đi kèm với mã số bàn, như vậy nếu phòng học bị hủy thì bàn ghể của phòng đó bị hủy theo (composition relationship). Tuy nhiên nếu ta đặt vấn đề khác đi một tí là có một số bàn trong kho, có một lúc nào đó muốn mở một số phòng học tăng cường thì trong trường hợp này số bàn trong kho đó không thuộc về nhất định một phòng nào cả như thế khi phòng học tăng cường bị hủy thì bàn trong kho này không bị hủy.
Trong class-diagram thì quan hệ composition được biểu diễn bằng đoạn thẳng kết thúc bởi hạt kim cương màu đen.

* Vậy thì 2 quan hệ này trong JAVA được thể hiện thế nào nhỉ:

Java is always using references. It it always pass by value, because the thing that’s being passed is not the object itself, which is out on the heap, but a reference to that object.

And that’s not the difference between aggregation and composition. Both describe a parent-child relationship between objects, but in aggregation the children have a life outside the parent. Composition means that when you delete the parent the children are deleted, too.

link ref: http://forums.sun.com/thread.jspa?threadID=696709

Ref:

http://tcle.wordpress.com/2008/05/20/aggregation-vs-composition-a-review-on-uml/

http://design-antony.blogspot.com/2007/07/aggregation-vs-composition.html

http://www.c-sharpcorner.com/uploadfile/pcurnow/compagg07272007062838am/compagg.aspx