Friday, September 30, 2005

Một sai lầm khi thiết kế class String???

Trong cuốn Java Programming Language 4th, method hashCode() của class Object được mô tả như sau:

public int hashCode()

Returns a hash code for this object. Each object has a hash code for use in hashtables. The default implementation returns a value that is usually different for different objects.

Thế nhưng khi thiết kế class String, người thiết kế lại cài đặt mã của method hashCode() như sau:

public int hashCode() {
int h = hash;
if (h == 0) {
int off = offset;
char val[] = value;
int len = count;

for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}

Với mã của method hashCode() của class String được cài đặt như trên thì

String s1 = "OK";



String s2 = new String("OK");

tuy là 2 object khác nhau nhưng lại có hash code như nhau.

Đây có phải là một sai lầm (sai semantic)?

Thursday, September 29, 2005

Ứng dụng thuật toán Bread First Search tìm đường đi ngắn nhất

Đầu bài của bài toán mà tôi cần giải quyết như sau:

Cho một ma trận mxn điểm với các phần tử chỉ nhận các giá trị 0 hoặc 1. Các điểm có giá trị 1 sẽ tạo thành đường đi, các điểm có giá trị 0 tạo thành chướng ngại vật.

Cho một tập các điểm thuộc ma trận trên, tìm đường đi ngắn nhất từ một điểm đến các điểm còn lại trong tập.

Sau khi có các đường đi ngắn nhất, lọc ra một điểm số điểm nằm trên các đường đi đó, những điểm này được gán nhãn. Xuất các nhãn đó ra Excel vào các sheet.

Chương trình về cơ bản đã hoàn thành (chạy đúng) nhưng còn cần refactor và refine lại một số phần.

Source code

Cập nhật 5:44 PM, Sep. 29, 2005:
Thực ra thì chương trình còn có nhiều phần còn ngớ ngẩn. Chẳng hạn, các class Node, FilterNode còn trùng lặp; đoạn mã chương trình chạy (class FilterTest) còn chộp giật thêm linh tinh; một số method trong class BFSAlgorithm đáng ra phải được đẩy ra ngoài... Tôi sẽ cố gắng sửa đổi chương trình trong thời gian ngắn nhất.

Cập nhật 12:32 PM, Sep. 30, 2005:
Chương trình nên được bổ xung class Matrix để thể hiện ma trận các Node thay vì dùng mảng 2 chiều như hiện giờ. Khi đó chuyển 2 method get() từ class BFSAlgorithm sang class Matrix.

Để đơn giản hóa cũng có thể gộp 2 class Node và FilterNode lại làm một.

Tổ chức lại class Utilities.

Tuesday, September 27, 2005

Core Java 7th Vol 1 có đoạn sai

Hôm nay đọc Core Java 7th Vol 1 đến đoạn Default Constructor (chương 4, Objects and Classes) phát hiện ra sách viết bố láo. Nguyên văn nhé:

A default constructor is a constructor with no parameters. For example, here is a default constructor for the Employee class:

public Employee()
{

name = "";
salary = 0;
hireDay = new Date();

}

với class Employee được khai báo như sau

class Employee {

String name;
int salary;
Date hireDay;

.....

}

Cái này mà gọi là default constructor à? Theo cuốn The Java Language Specification 3rd, default constructor là thế này:

If a class contains no constructor declarations, then a default constructor that takes no parameters is automatically provided:

- If the class being declared is the primordial class Object, then the default constructor has an empty body.

- Otherwise, the default constructor takes no parameters and simply invokes the superclass constructor with no arguments

Còn cái đọan khởi tạo ngầm giá trị mà tác giả cuốn Core Java đưa vào cái gọi là default constructor kia thực ra đã được thực hiện trước khi gọi constructor này rồi.

Manning's Ajax in action is delayed

Some days ago I saw that Manning's Ajax in action will be released in Sep. 27, 2005. But today, Manning will delay it to Oct. 3, 2005.


Waiting for this book...

Bug in IDEA IntelliJ 5.0.1 Build #3496???

Maybe it's a bug in IDEA IntelliJ 5.0.1 Build #3496 when I use while and try/catch together.

If I surround while statement in a try/catch statement (see the picture), I've got an warning "while statment cannot complete without throwing an exception".


But if I try to put try/catch statement into while statement's block, I meet the same warning.


Update at 3:16 PM: Reply from JetBrains: "It's not a bug." IDEA IntelliJ inspected that I used a while(true) loop so it can be infinite but it's my intent. So maybe I should change this post's title to "A bug? No, it is an intelligence" ;-)

Monday, September 26, 2005

Update time

'Cause now I live in Seoul while Blogger maybe use US time so I've just updated all posts' time to my current time zone!

Some stupid things

Today, it's first time I try to use Corel's Paint Shop Pro X (PSP) (after uninstall Jasc Software's Paint Shop Pro 9.0.1) and it's first time I know that Jasc Software was acquired by Corel from 10/2004.

I'm not a fan of Adobe's Photoshop and I use PSP instead 'cause it's easier to use and I used it from v4.0.

I don't know why Corel put a digital camera on PSP's splash. It looks stupid. But it has a new showy UI, same as ACDSee 7.0 - 8.0, Photoshop CS - CS2.


And maybe Blogger only accept to upload an image per post to their server. And editor's toolbar hasn't got a properly appearance in Firefox (my version is 1.5 beta 1).

Using POI to create Excel file in Java

I try to use Apache's POI to create an Excel file. It works well and really simple code.

Here is step by step to create an Excel file by POI:

- Create a output stream to generate Excel file: FileOutputStream outStream = new FileOutputStream("test.xls");
- Create a workbook: HSSFWorkbook workbook = new HSSFWorkbook();
- Create a worksheet: HSSFSheet sheet = workbook.createSheet("Result sheet");
- Create a row: HSSFRow row = sheet.createRow(index);
- Create a cell and set its value on a row: row.createCell(index).setCellValue(value);
- Generate Excel file: workbook.write(outStream);
- And clean up: outStream.close();

Note: index of cell must be in short type.

And I also found another API to create Excel file in Java, JExcelApi. It's also free (it is issued on under the GNU Lesser General Public License) as Apache's POI.

Bug in IDEA IntelliJ 5.0.1 Build #3461

This is a bug I've just found in IDEA IntelliJ v5.0.1 Build #3461 and I reported it to JetBrains's IDEA forum today. This is a problem when I try to declare an enum in IDEA IntelliJ.

When I try to declare an enum which have its own constructor or something else I got the problem (see below)


When I remove the semicolon after RFID_C(860), I got an error (see below)


But if I try to declare an enum like this enum Test {A, B, C}, I don't meet this problem.

Update at 12:37 AM: This problem was resolved in #Build 3496.

Waiting for IDEA IntelliJ 5.0.2 ...

Cấp báo, cấp báo...

Sau một thời gian nghỉ ngơi, ngơi nghỉ, quán chó chúng tôi quyết định khai trương chở lại để đáp ứng sự mong đợi ngậm ngùi của quý khách hàng xa gần, gần xa, thân bằng thân hữu! Trong lúc xxx có gì sai sót, mong quý vị bỏ quá cho!