Archive for August, 2008

Upgrade whois domain to v3.1

Thursday, August 28th, 2008

Lý do phải nâng cấp:
- Matbao.net đã thay đổi lại cấu trúc site của họ (thay đổi giao diện) nên phần parse data của mình sẽ không chính xác nữa.
- Dùng nsloop-up chỉ có thể check domain đó có hoạt động hay không, chứ không check được đã được mua hay chưa. Có thể chủ sở hữu đã mua nhưng chưa active domain :)

Những thay đổi:
Không có nhiều thay đổi trong phiên bản nâng cấp này ngoài:
- Get xml content thay cho html content.
- Chuẩn hóa các function theo camelCase.
- Bỏ php short tag, chuyển về <?php echo …;?> nếu có.

Todo:
Mặc dù kết quả nhận được từ matbao.net là dạng XML nhưng vẫn gặp khó khăn trong khâu parse XML. Dùng các libs có sẵn trong PHP như simpleXML, XMLparse… đều bị lỗi do syntax của file XML này không chuẩn cho lắm. Tạm thời tôi dùng preg_match để parse XML. Khi nào có điều kiện sẽ nghiên cứu cách parse XML mà không biết trước cấu trúc :D Có bác nào tốt bụng thì phát triển thêm hộ tôi với :p

Hướng dẫn nâng cấp:
- Download bản upgrade tại http://donamkhanh.com/download/whoisv3.1.php.txt http://donamkhanh.com/download/whoisv3.2.php.txt
- Sau khi download, rename file whoisv3.1.php.txt whoisv3.2.php.txt thành index.php, rồi ghi đè file index.php trong thư mục whoisv3 (nếu chưa có phiên bản 3.0 thì có thể download tại http://donamkhanh.com/download/whoisv3.tar.bz2)

Yêu cầu:
- Chmod quyền hợp lý (cho đọc ghi đối với file checked_domain.txt)
- Thông số allow_url_fopen trên host phải thiết lập bằng On.

Discuss about Java

Wednesday, August 27th, 2008

Chẳng mấy khi được nghe 2 cao thủ luận bàn, chẳng biết gì nên cứ copy về đây để bao giờ trình độ lên cao thì “nghiệm” vậy :”>

mega2look:

http://www.javavietnam.org/javavn/mvnforum/viewthread_thread,20372_offset,60#87886

Kính thưa các doanh nghiệp Việt Nam,

Hôm nay tôi xin thay mặt công ty SUN Microsystem gởi tới các đồng chí
lời chào thân ái và quyết thắng.

Chắc các đồng chí đều biết công ty chúng tôi là công ty hàng đầu về
bán server đã tối ưu để chạy công nghệ Java, dĩ nhiên công nghệ này
cũng của chúng tôi. Mặc dù tình hình kinh doanh của chúng tôi trong
những năm gần đây không được sáng sủa gì cho lắm, nhưng tôi đảm bảo
rằng chúng tôi vẫn là một trong những công ty hàng đầu trong vài năm
tới miễn là không thua lỗ nhiều quá, và đặc biệt là với sự ủng hộ vô
điều kiện của cộng đồng các nhà phát triển Java đầy tiềm năng tại Việt
Nam thì tương lai của SUN vô cùng sáng lạn.

Công ty chúng tôi chuyên cung cấp các giải pháp cỡ enterprise ở cả
phần mềm lẫn phần cứng. Trước hết tôi xin nói qua về giải pháp phần
mềm. Đây toàn là những phần mềm to vật vã, chức năng vô cùng khủng bố
hoàn toàn hợp với mác Enterprise mà các quí vị đang quan tâm. Để tạo
ra được phần mềm này các quí vị nên xem qua cái chuẩn J2EE (cũng do
chúng tôi định nghĩa ra nốt), nếu các vị chưa chóng mặt vì tầm mức vĩ
đại, kỳ vĩ của nó thì cũng sẽ phải thán phục trước độ phức tạp mà loài
người chưa từng hình dung ra từ trước tới nay.
(more…)

OpenSolaris 2008.05

Sunday, August 24th, 2008

Hồi trước vào blog của cậu Nguyên Vũ thấy cậu ấy “khoe” mới nhận được bản OpenSolaris từ Sun, cũng là 1 dạng request free CD giống Ubuntu nên quyết định đăng ký thử phát (mặc dù không có dùng Linux, nhưng mà đĩa xịn cơ mà, tội gì ).

Đăng ký xong và…quên béng mất thì tự nhiên hôm qua về nhà thấy lù lù 1 cái phong bì rất đẹp Thích thế

Cứ để dành đấy đã, bao giờ có laptop mình cài Linux vào dùng (hoặc hôm nào rảnh thì cài máy ở cty cũng được).

Vì sao các PHP framework làm cho ứng dụng của bạn nặng nề hơn?

Tuesday, August 19th, 2008

Lang thang được bài viết khá hay của bác Huy :)

Nếu bạn đã từng làm việc với các PHP framework như symfony, Cake, Zend … có thể bạn đã nhận ra những vấn đề này. Tôi xin nêu ra đây cả cách giải quyết của mình.

Việc sử dụng các pattern như Active Record, Data Mapping để làm Model trong các framework là một ác mộng.

Thật vậy, không những làm bạn khó khăn hơn trong việc xoay sở với SQL, nó còn khiến quá trình truy xuất dữ liệu trở nên nặng nề hơn. Các pattern này quy mỗi record trong database thành một object. Việc làm này là cực kỳ không cần thiết. Không phải lúc nào bạn cũng select chúng ra sau đó lại update trở lại database. Những logic nhằm bảo đảm mối quan hệ giữa các object cũng ngốn kha khá tài nguyên. Hơn nữa, các câu SQL được tự động sinh ra sẽ không đạt được mức độ tối ưu như mong muốn. Tối ưu SQL là một công việc quan trọng nhưng các ORM lại cố ngăn bạn khỏi công việc đó.

Giải pháp của tôi

Sử dụng DAO pattern để thay cho Active Record. Hoặc tốt hơn nữa là sử dụng các tính năng được hỗ trợ sẵn trong hệ quản trị cơ sở dữ liệu mà lâu nay lập trình viên PHP/(nhất là MySQL) thường quên đi mất như View, Trigger, Stored Procedured…  Bạn không nên lo ngại việc các lập trình viên của mình phải viết SQL. Suy cho cùng họ là lập trình viên, công việc của họ là viết code.

Lạm dụng sự tự động hoá.

Các framework thường tự động hoá một số giai đoạn trong workflow để trở nên thân thiện hơn đối với developer. Nếu bạn đã dùng qua CakePHP, bạn sẽ hiểu. Cake cho phép bạn khai báo các model và component bạn cần trong controller và tự động load toàn bộ chúng trong quá trình start-up. Điều này làm cho ứng dụng phải mất rất lâu để start-up. Hơn nữa, với cách phân chia ứng dung thành controller/action, bạn gặp phải một vấn đề là không phải lúc nào bạn cũng cần những model/component giống nhau ở tất cả các action trong cùng một controller. Với cách làm của CakePHP, bạn phải load những thứ mình không cần một cách bất đắc dĩ.

Giải pháp của tôi

Dẹp sự tự động hoá sang một bên đi! Hiện đại là hại điện. Tôi nhắc lại một lần nữa, bạn tuyển những lập trình viên và trả lương cho họ để họ viết code. Đừng ngại khi bắt họ làm chuyện đó.

Chính mô hình MVC làm tăng thêm các giai đoạn trong workflow của bạn

Ok, MVC là một mô hình tốt, chẳng ai phủ nhận cả. Nhưng việc phân chia rạch ròi giữa business logic (M) và presentation logic (V) cũng làm cho mọi thứ trở nên rắc rối hơn. Một ví dụ: trong mô hình MVC mà bạn gặp ở các framework mà tôi kể ở trên, Model thường xử lý dữ liệu xong rồi truyền cho View. Giả sử ở đây bạn có một list các bài hát cần in ra. Cách thông thường nhất và gần như duy nhất mà ta thường làm là Model nhận việc select từ database, duyệt qua tập kết quả lần để để tổng hợp nó thành một danh sách (ở PHP thì rất có thể là mảng) rồi sau đó mới truyền cho View. View lại phải duyệt qua mảng đó thêm một lần nữa để in ra.

Giải pháp của tôi

Tôi không có cách giải quyết nào và chấp nhận vấn đề này ở hiện tại. Thật ra nó cũng không ảnh hưởng quá nhiều đến performance, bù lại ta có được sự tách biệt rạch ròi về kiến trúc.

OOP

Lập trình OOP luôn luôn ngốn nhiều tài nguyên hơn so với function-based. Thêm vào đó, với đặc điểm của PHP, việc viết mỗi lớp thành một file riêng sẽ làm phân mảnh code và buộc PHP engine phải làm việc nặng nề hơn (nhất là đối với các framework như Zend).

Giải pháp của tôi

Sử dụng các opcode caching egine như APC, XCache.

Nguồn: byhuy.com

Active Record Pattern

Monday, August 18th, 2008

From Wikipedia, the free encyclopedia

In computer science, the active record pattern is a design pattern frequently found in software that stores its data in relational databases. It was named by Martin Fowler in his book Patterns of Enterprise Application Architecture.

Active record is an approach to accessing data in a database. A database table or view is wrapped into a class, thus an object instance is tied to a single row in the table. After creation of an object, a new row is added to the table upon save. Any object loaded gets its information from the database; when an object is updated, the corresponding row in the table is also updated. The wrapper class implements accessor methods or properties for each column in the table or view.

This pattern is commonly used by object persistence tools, and in object-relational mapping. Typically foreign key relationships will be exposed as an object instance of the appropriate type via a property.

Implementations of Active Record can be found in various frameworks for many programming environments. For example, if in a database there is a table parts with columns name (string type) and price (number type), and the Active Record pattern is implemented in the class Part, the following pseudo-code:

part = new Part()
part.name = "Sample part"
part.price = 123.45
part.save()

will create a new row in the parts table with the given values, and is roughly equivalent to the SQL command

1
INSERT INTO parts (name, price) VALUES('Sample part', 123.45);

Conversely, the class can be used to query the database:

b = Part.find_first_part("name", "gearbox")

This will create a new Part object based on the first matching row from the parts table whose name column has the value “gearbox”. The SQL command used would be

1
SELECT * FROM parts WHERE name = 'gearbox' LIMIT 1;

Để đó, chưa dịch :(