Tuesday, December 16, 2008

Bóc tách nội dung từ trang Web

Việc bóc tách nội dung trên web thường được thực hiện bằng cách sử dụng các crawler hay wrapper. Một wrapper được xem như là một thủ tục được thiết kế để có thể rút trích được những nội dung cần quan tâm của một nguồn thông tin nào đó. Đã có nhiều công trình nghiên cứu khác nhau trên thế giới sử dụng nhiều phương pháp tạo wrapper khác nhau để thực hiện rút trích thông tin trên web. Các phương pháp này bao gồm:

+ Phân tích mã HTML

+ So sánh khung mẫu

+ Xử lí ngôn ngữ tự nhiên

Cũng giống như Google News, hệ thống khai thác và tổng hợp nội dung có nhiệm vụ khai thác, tổng hợp, lưu trữ rồi phát hành lại tới người dùng. Wrapper nhận cấu hình đầu vào của một website (tin tức, nhật ký trực tuyến, ...) tiến hành bóc tách, tổng hợp chủ đề liên quan, lưu trữ trong database và phát hành lại tới người đầu cuối. Nội dung được bóc tách toàn vẹn, sạch sẽ và được tổng hợp từ nhiều nguồn khác nhau giúp người đọc có thể theo dõi, kiểm soát, tìm kiếm, biên soạn, lưu trữ, xuất bản,...

Khó khăn của bài toán là không phải toàn bộ nội dung của trang web đều cần thiết. Nếu chỉ đơn thuần loại các chuỗi script HTML thì nội dung lọc được sẽ rất nhiều lỗi rác không cần thiết. Ví dụ: phần thông tin quảng cáo, tin mới cập nhật, nội dung tin ngắn, menu... những nội dung như thế này thường cần phải bỏ qua trong quá trình bóc tách nội dung chính của trang web

1. Phân tích mã HTML

Hiện nay, VietSpider[1] của tác giả Nhữ Đình Thuần là một phần mềm bóc tách đúng nghĩa, chúng truy xuất trực tiếp vào nội dung toàn diện rồi tiến hành bóc tách. Sau đó những đặc tả dữ liệu (meta data) được xây dựng tự động trên nền nội dung đã bóc tách. Sau quy trình khai thác, nội dung sẽ trở thành độc lập với website nguồn, được lưu trữ và tái sử dụng cho những mục đích khác nhau.

Hình 1: Hệ thống bóc tách nội dung của VietSpider

Hệ thống của tác giả Nhữ Đình Thuần cũng đã cài đặt mô hình khai phá dữ liệu cho phép tổng hợp những nội dung liên quan. Xây dựng mô hình topic tracking cho phép theo dõi các sự kiện đang diễn ra theo tuần tự thời gian. Mô hình thuật toán được cài đặt là LOR (Linked Object Representation) với sự hỗ trợ của kỹ thuật Stopping trong phân tách nội dung. Giải pháp đánh chỉ mục (indexing) và tìm kiếm (searching) được sửa đổi và cải tiến từ một giải pháp nguồn mở nổi tiếng của Apache là Lucene Search.

Tuy nhiên, hạn chế của chương trình là cần phải xác định đường dẫn đến vùng nội dung chính trước khi bóc tách đối với mỗi domain. Như thế sẽ khó khăn nếu hệ thống khi gặp phải một trang web mới hoàn toàn.

2. So sánh khung mẫu

Phương pháp rút trích thông tin bằng cách so trùng hai trang web được xây dựng trên nền tảng nhận dạng mẫu được tác giả Trang Nhật Quang thực hiện trong việc rút trích nội dung nhằm cung cấp tin tức trên trang web hành chính [5]. Phương pháp này cho phép so khớp trang web cần rút trích với một trang web mẫu để xác định khung trình bày chung cho cả hai trang web cần rút trích, từ đó đi đến rút trích ra nội dung nằm trong phần được xác định chứa nội dung chính trên trang mẫu.

(a) (b) (c)

Hình 2: Mô hình bóc tách nội dung chính bằng so sánh khung mẫu

(a) Trang web cần rút nội dung chính

(b) Trang web khung mẫu (được xác định trước)

(c) Nội dung chính sau khi so khớp và rút được

Phương pháp này không đòi hỏi người sử dụng phải biết về ngôn ngữ xây dựng wrapper hay phải thay đổi wrapper khi cách trình bày thay đổi do trang web mẫu có thể lấy trực tiếp từ trang chủ và có cùng cách trình bày với trang cần rút trích. Tuy nhiên, đối với mỗi domain, cần phải xác định được một trang web làm mẫu cho những trang khác. Đây cũng là một hạn chế trong quá trình tự động hóa xác định nội dung chính của web.

3. Xử lý ngôn ngữ tự nhiên

Đây là phương pháp sử dụng các kỹ thuật xử lý ngôn ngữ tự nhiên được áp dụng cho những tài liệu mà thông tin trên đó thường không có một cấu trúc nhất định (như truyện). Các kỹ thuật này xem xét sự ràng buộc về mặt cú pháp và ngữ nghĩa để nhận dạng ra các thông tin liên quan và rút trích ra thông tin cần thiết cho các bước xử lý nào đó. Các công cụ sử dụng phương pháp này thích hợp cho việc rút trích thông tin trên những trang web có chứa những đoạn văn tuân theo quy luật văn phạm. Một số công cụ sử dụng phương pháp xử lý ngôn ngữ tự nhiên trong việc bóc tách nội dung như: WHISK hay RAPIER

Đặc trưng của phương pháp này còn phụ thuộc vào ngôn ngữ trên trang web cần được bóc tách nội dung. Đối với tiếng Việt có đề tài “Rút trích nội dung chính trang web dựa vào ngữ cảnh của trang web” của tác giả Hồ Anh Thư [3]. Đề tài tiến hành xác định nội dung chính của trang web dựa vào ngữ cảnh của nội dung, sau đó tiến hành rút trích bản tóm tắt của nội dung dựa trên phương pháp chọn câu trội. Việc xác định nội dung chính được thực hiện qua các bước:

- Loại bỏ thông tin định dạng

- Tách vùng nội dung dựa vào cấu trúc, mà cụ thể là sử dụng tag TABLE để tách vùng văn bản.

- Xác định mức độ liên quan về mặt nội dung để ghép nối các vùng kế cận với nhau.

- Chọn vùng văn bản có kích thước lớn nhất để xử lý tiếp

Tuy nhiên phương pháp này có một số nhược điểm sau:

- Tùy theo mức độ xử lý mà quá trình bóc tách phụ thuộc nhiều hoặc ít vào ngôn ngữ xử lý

- Phương pháp dựa vào độ đo tương tự giữa các vùng để ghép nối từ đó xác định nội dung chính. Những nếu các nội dung chính được chia trên nhiều table với các thông tin ít liên quan đến nhau thì sẽ khó khăn trong việc mở rộng và xác định vùng nội dung chính chứa tất cả chúng.

- Trường hợp thông tin trong một vùng (table) quá ít, sẽ ảnh hưởng đến quá trình tính tương đồng và mở rộng vùng nội dung chính.

4. Kết hợp phân tích mã và xử lý ngôn ngữ tự nhiên

Giải pháp thực hiện của tôi cũng dựa trên phương pháp bóc tách nội dung nhờ vào phân tích mã HTML theo các bộ mã nguồn HTMLParser của dự án Majestic-12[2] để tạo thành cây Document Tree. Từ đó áp dụng các công cụ và kỹ thuật ngôn ngữ để quyết định phần nội dung chính.

Phương pháp này dựa trên tiền đề là trang web đã được phân tích các tag HTML để xây dựng nên cây Document Tree. Từ cây này chúng ta đi xác định node nào ở trên cây chứa nội dung chính của trang WEB. Phương pháp cho điểm các node dựa vào kết quả xử lý ngôn ngữ tự nhiên trên nội dung mà nó chứa bên trong đó.

Một số quy tắc cho điểm được áp dụng:

+ Chỉ cho điểm cho những NODE có tag là TEXT. Vì chỉ có những node này mới là node chứa nội dung thực sự. Các node khác tổng hợp từ node này.

+ Cho điểm NODE TEXT dựa vào số câu của nội dung chứa bên trong node đó. Càng nhiều câu thì node có điểm càng cao.

+ Node được cho điểm phải chứa tối thiểu một đoạn văn. (Tuy nhiên việc xác định như thế nào là một đoạn vẫn chỉ là một heuristic)

+ Điểm của các node cha sẽ bằng điểm của các node con cộng lại.

Hình 3: Node chứa nội dung chính trên cây văn bản [3]

Xác định node nội dung: Để xác định node nội dung chính mà không chứa các nội dung không cần thiết chính là đi xác định node sâu nhất trên cây có điểm cao nhất. Bằng việc xác định node nội dung như vậy, hệ thống có thể tự động xác định nội dung trang web mà không cần biết trước khung mẫu cũng như nguồn gốc của trang web đó.


Mọi tham khảo vui lòng ghi rõ nguồn gốc:
Ngô Quốc Hưng, 2008, "Tìm kiếm tự động văn bản song ngữ Anh-Việt từ Internet", Luận văn Thạc sỹ, tr.5-10, ĐH KHTN TP.HCM

Monday, September 22, 2008

Standard Template Library

STL là một thư viện template cho C++ được phát triển vào năm 1992 với mong muốn có được những cấu trúc dữ liệu cũng như giải thuật tổng quát nhất nhưng không làm mất đi tính hiệu quả. Thư viện này được đưa vào danh sách các thư viện chuẩn của C++ theo tiêu chuẩn ANSI/ISO với tên gọi Standard Template Library (STL).

STL đã được nhiều tổ chức, hãng phần mềm mở rộng và phát triển; trong đó đáng kể nhất phải kể đến phiên bản SGI-STL của Silicon Graphics và STL Port (hiện đã được tích hợp trong Borland C++ Builder 6). Cũng xuất phát từ ý tưởng của STL (đồng thời cũng sử dụng chính thư viện này làm nền tảng), một số thư viện standard template khác ra đời phục vụ các lớp ứng dụng đặc thù hơn, như thư viện cho ma trận - MTL (trường đại học Notre Dame - Pháp) hay thư viện cho đồ thị - GTL (trường đại học Passau - Đức).

Đặc điểm thư viện STL này là được hỗ trợ trên các trình biên dịch ở cả hai môi trường WINDOWS lẫn UNIX. Vì vậy nên khi sử dụng thư viện này trong xử lý thuận tiện cho việc chia sẽ mã nguồn với cộng đồng phát triển.

STL có một số thành phần cơ bản sau: containers, iterators, algorithms, và các functors. Trong đó, containers đóng vai trò như là các kiểu dữ liệu, bao gồm: vector, list, deque ; set, multiset, map, multimap, hash_set, hash_multiset, hash_map, hash_multimap, bitset và valarray.

Sau đây là một số địa chỉ tham khảo về STL:

- SGI STL: http://www.sgi.com/tech/stl/
- STL Port: http://www.stlport.org/
- STL introduction: http://en.wikipedia.org/wiki/Standard_Template_Library
- Matrix Template Library: http://osl.iu.edu/research/mtl/
- Graph Template Library: http://www.infosun.fmi.uni-passau.de/GTL/index.html
- Alexander Stepanov Inteview:
http://www.stlport.org/resources/StepanovUSA.html
http://www.sgi.com/tech/stl/drdobbs-interview.html

- Tutorial:
http://www.infosys.tuwien.ac.at/Research/Component/tutorial/prwmain.htm
http://www.cs.rpi.edu/~musser/stl-book/

Thursday, September 4, 2008

Phần mềm chuyển PDF sang Word

Đối với người làm văn phòng, sử dụng máy tính làm công văn, báo cáo thì không ít lần có nhu cầu chuyển một file PDF sang file WORd nhằm mục đích lấy một phần hoặc toàn bộ nội dung của file PDF hiện có. Chương trình mạnh nhất cho công việc này là SolidDocumentPDF, tuy nhiên đây là một chương trình có bản quyền và các chương trình crack tỏ ra không hiệu quả. Sử dụng KEY có sẵn cũng không thành công. Trong quá trình chông gai tìm kiếm phần mềm thay thế, tôi thấy sản phẩm PDF2Word v3.0 có thể thực hiện công việc này với chất lượng gần tương đương. Hơn nữa key của phần mềm vẫn có tác dụng.

Một vài thông tin về sản phẩm:

VeryPDF PDF2Word v3.0

PDF2Word (PDF to Word) xuất mọi chữ, hình ảnh và các nội dung khác từ bất kỳ file PDF nào sang định dạng MS Word(RTF or Word), từ đó bạn có thể chỉnh sửa và sử dụng lại nội dung file PDF. PDF2Word (PDF to Word) giữ gìn nguyên bản các chữ, layout, ảnh khi chuyển đổi.

PDF2Word (PDF to Word) là phần mềm ứng đụng độc lập và không cần Microsoft Word, Adobe Acrobat, hay thậm chí cả Acrobat Reader.

Serial :

Code:
1. 7441-62252-5V331-449
2. 5667-39244-6V631-485
3. 3886-89993-9V131-676
4. 9243-86464-8V131-249
5. 7478-71447-6V231-658


Rất tiếc khi một tín đồ CNTT đang làm phần mềm nhưng lại góp phần cung cấp key cho mọi người. Tuy nhiên vì tính ứng dụng của công việc hỗ trợ cho các bạn "tay ngang" sử dụng máy tính , CNTT để hỗ trợ tốt hơn cho công việc của mình.

Tuesday, August 26, 2008

ThreadPool

Tôi đang quan tâm đến vấn đề download dữ liệu từ NET, tuy nhiên làm tiểu trình như hiện tại download lần lượt bị cho là như thế không tốt vì sẽ rất lâu, hơn nữa không tận dụng được năng lực của NET cũng như xử lý của CPU. Giải pháp thay thế là sử dụng nhiều tiến trình download cùng một lúc. Keyword cho vấn đề này là THREADPOOL. Rất hấp dẫn đấy thế là lại có cái chuyên về công nghệ để vọc nữa rồi.

Lân la trên mạng thì được bác Google mách nhỏ là dùng ThreadPool thì có thể theo một số ví dụ đơn giản có sẵn từ đây. Thế là lại lần mò làm theo thôi. Cũng nhanh và ok lắm. Nhìn chuyên nghiệp và nhanh hơn hẳn phương pháp tuần tự trước.

Khai báo một phương thức chứa mã lệnh cần thực thi; phương thức này phải trả về void và chỉ nhận một đối số. Sau đó, tạo một thể hiện của ủy nhiệm System.Threading.WaitCallback tham chiếu đến phương thức này. Tiếp tục, gọi phương thức tĩnh QueueUserWorkItem của lớp System.Threading.ThreadPool, và truyền thể hiện ủy nhiệm đã tạo làm đối số. Bộ thực thi sẽ xếp thể hiện ủy nhiệm này vào hàng đợi và thực thi nó khi một tiểu trình trong thread-pool sẵn sàng.

Nếu ứng dụng sử dụng nhiều tiểu trình có thời gian sống ngắn hay duy trì một số lượng lớn các tiểu trình đồng thời thì hiệu năng có thể giảm sút bởi các chi phí cho việc tạo, vận hành và hủy các tiểu trình. Ngoài ra, trong một hệ thống hỗ-trợ-đa-tiểu-trình, các tiểu trình thường ở trạng thái rỗi suốt một khoảng thời gian dài để chờ điều kiện thực thi phù hợp. Việc sử dụng thread-pool sẽ cung cấp một giải pháp chung nhằm cải thiện tính quy mô và hiệu năng của các hệ thống hỗ-trợ-đa-tiểu-trình.

Có từng làm mới thấy rằng: ThreadPool đảm bảo được yêu cầu: chỉ cần cung cấp hàm thực hiện, hệ thống sẽ tự động gọi chạy. Chúng ta có thể cung cấp tham số quy định số tiểu trình chạy tối đa tại một thời điểm. Tuy nhiên, hạn chế của ThreadPool lại là các tiến trình khi đã cung cấp cho ThreadPool tức là đã ngoài tầm kiểm soát, không thể Abort / Pause hay Resume gì nữa, mà nó sẽ tự động Start theo tình trạng của hệ thống. Điểm này chính là hạn chế của ThreadPool, nên nếu muốn nó chạy hiệu quả thì chúng ta cần bổ sung một Thread thường trực, cung cấp thread cho ThreadPool, và trong các hàm xử lý, cần thêm một số điều kiện thoát khi mà môi trường thay đổi.

Mốt số đặc điểm của ThreadPool:
+ Tất cả các phương thức của ThreadPool đều là hàm tĩnh, truy cập thông qua lớp.
+ Các Thread đưa vào ThreadPool không bị giới hạn trong một lớp / đối tượng.
+ ThreadPool tự thân không có hàm Stop / Abort dành cho các Thread nó chứa.
+ Có thể quy định số tiểu trình chạy đồng thời thông qua hàm ThreadPool.SetMaxThreads.

Tham khảo:
[C#] Thực thi phương thức với thread-pool
C# Tutorial - Using The ThreadPool
ThreadPool Class

Monday, August 25, 2008

ExecuteExternalFile

[VC++ / MFC]

void ExecuteExternalFile(const char* csExecuteCommand)
{

STARTUPINFO sInfo;
ZeroMemory(&sInfo,sizeof(sInfo));
sInfo.cb = sizeof(sInfo);

PROCESS_INFORMATION pInfo;
ZeroMemory(&pInfo,sizeof(pInfo));
sInfo.cb = sizeof(sInfo);

//Create the process here.

CreateProcess(0, //LPCWSTR lpszImageName,
(char*)csExecuteCommand, //LPCWSTR lpszCmdLine,
0, //LPSECURITY_ATTRIBUTES lpsaProcess,
0, //LPSECURITY_ATTRIBUTES lpsaThread,
TRUE, //BOOL fInheritHandles,
NORMAL_PRIORITY_CLASS|CREATE_NO_WINDOW, //DWORD fdwCreate,
0, //LPVOID lpvEnvironment,
0, //LPWSTR lpszCurDir,
&sInfo,//LPSTARTUPINFOW lpsiStartInfo,
&pInfo//LPPROCESS_INFORMATION lppiProcInfo
);

// Wait until child processes exit.
WaitForSingleObject( pInfo.hProcess, INFINITE );

// Close process and thread handles.
CloseHandle( pInfo.hProcess );
CloseHandle( pInfo.hThread );
}

[C#.NET]

private static bool GetVieKeywords(string csExecuteFile, string csExecuteParam)
{

try
{

Process proc = new Process();

proc.StartInfo.UseShellExecute = false;
proc.StartInfo.CreateNoWindow = true;

proc.StartInfo.FileName = csExecuteFile;
proc.StartInfo.Arguments = csExecuteParam;
proc.Start();
proc.WaitForExit();
proc = null;

}
catch (Exception)
{

//Extract fail.
return false;

}

return true;

}


Thủy cung thần tiên 08/2008


Sau 4 tuần setup hồ thủy sinh mới với cỏ Trân Châu, cỏ Nhật, Tiêu Thảo... thì bây giờ cũng đã có thành quả rồi. Rảnh rỗi viết về những gì nếm trải thú vui này cũng thú vị lắm.

Thursday, August 21, 2008

Những trang web song ngữ

Những trang web song ngữ Anh-Việt mà tôi thấy có thể chia sẽ để phục vụ cho các nghiên cứu xử lý ngôn ngữ tự nhiên:

1. Website Đại sứ quán Mỹ tại Việt Nam:
EN: http://vietnam.usembassy.gov/
VN: http://vietnamese.vietnam.usembassy.gov/

2. Thời báo kinh tế Việt nam
EN: http://www.vneconomy.com.vn/eng/
VN: http://vneconomy.vn/

3. VOANews
EN: http://www.voanews.com/english/portal.cfm
VN: http://www.voanews.com/vietnamese/
FR: http://www.voanews.com/french/
CH: http://www.voanews.com/chinese/

4. British Embassy
EN: http://www.britishembassy.gov.uk/servlet/Front?pagename=OpenMarket/Xcelerate/...
VN: http://www.britishembassy.gov.uk/servlet/Front?pagename=OpenMarket/Xcelerate/...

5. BBC
EN: http://www.bbc.co.uk/
VN: http://www.bbc.co.uk/vietnamese/

6. Viet magazine
EN: http://www.vps.org/sommaire_en.php3
VN: http://www.saigon.com/vietmag/

7. Du lịch VN
EN: http://www.vietnamtourism.com/e_pages/news/index.asp
VN: http://www.vietnamtourism.com/v_pages/news/index.asp
FR: http://www.vietnamtourism.com/f_pages/news/index.asp
JP: http://www.vietnamtourism.com/j_pages/news/index.asp
CH: http://www.vietnamtourism.com/c_pages/tourist/travel.asp

8. PhapLuat
EN: http://vbqppl3.moj.gov.vn/law/en/main_page
VN: http://vbqppl.moj.gov.vn

9. CDC
EN: http://www.bt.cdc.gov/
VN: http://www.bt.cdc.gov/vi/
FR: http://www.bt.cdc.gov/fr/

10. Influenza
EN: http://www.cdc.gov/flu/avian/
VN: http://www.cdc.gov/flu/vie/

11. Flu

EN: http://www.pandemicflu.gov/index.html
VN: http://vietnamese.pandemicflu.gov/pandemicflu/envi/24/_www_pandemicflu_gov/in...

12. HIV
EN: http://www.acas.org/treatment/engmap.html
VN: http://www.acas.org/treatment/vietmap.html

*** Others ***

Vietnamese Health http://nutrition.berkeley.edu/extension/vietnamese.health/

WHO
FR: http://www.who.int/csr/don/fr/index.html
EN: http://www.who.int/csr/don/en/index.html



13. Website chính phủ ViệtNam
EN: http://www.chinhphu.vn/pls/portal/url/page/vgp_en
VN: http://www.chinhphu.vn/vi

14. Trang tin ToQuoc của Bộ văn hóa, Thể thao và Du lịch
EN: http://www.toquoc.gov.vn/english/home.asp
VN: http://www.toquoc.gov.vn/vietnam/home.asp

15. Trang tin VietNamNet
EN: http://english.vietnamnet.vn/news/
VN: http://vietnamnet.vn/

16. Báo Kinh Tế Việt Nam
EN: http://www.ven.org.vn/home/switchLanguage?set_language=en&cur_lang=en
VN: http://www.ven.org.vn/home

17. Trang tin e-TinTuc
EN: http://e-tintuc.com/public.php?lang=english
VN: http://e-tintuc.com/public.php?lang=vietnamese

18. Trang tin tuc VNDaily.Net
EN: http://www.vndaily.net/english
VN: http://www.vndaily.net/
FR: http://www.vndaily.net/francais
JP: http://www.vndaily.net/japanese
CH: http://www.vndaily.net/chinese

19. Trang tin BOM
EN: http://www.bvom.com/news/english/home
VN: http://www.bvom.com/news/vietnam/home

Khai thác THNNews và THNOnline

Hôm nay tôi bắt đầu tiến trình khai thác trang web báo chí song ngữ Anh-Việt của báo ThannNien. Hệ thông báo của THN gồm nhiều trang khác nhau phục vụ nhiều mục đích khác nhau, nhưng giá trị nhất và đáp ứng nhu cầu mà hiện tại tôi đang quan tâm là trang tin tức tiếng Anh, tiếng Việt:

[EN] http://www.thanhniennews.com
[VN] http://www.thanhnien.com.vn

Đây là hai trang tin tức với hai ngôn ngữ song song có khối lượng bài viết rất lớn từ năm 2002 (VN), 2004 (EN), tuy nhiên bài viết hai bên có thể là bản dịch của nhau, có thể chỉ là bản dịch của một tin từ báo khac. Vấn đề chúng ta khai thác dữ liệu này như thế nào.

Với tôi, tôi quan tâm đến những trang tiếng Anh và trang tiếng Việt tương ứng là trang nào, có thể nằm trong tên miền tiếng Việt [VN], cũng có thể là không (mà nó nằm ở một báo khác).

Các bước khai thác như:
- Collect dữ liệu bằng công cụ Crawler
- Sử dụng các cơ chế tìm kiếm, lọc và so sánh để tìm ra những cặp song song tưng ứng từ nguồn dữ liệu trên.

Saturday, August 16, 2008

Ngô Hưng

Hôm nay ngồi lang thang trên mạng, vào Google search từ khóa "NgôHưng" tôi nhận được kết quả thú vị này:

Ngô Hưng (chữ Hán phồn thể: 吳興區, chữ Hán giản thể: 吴兴区, âm Hán Việt: Ngô Hưng) là một quận thuộc địa cấp thị Hồ Châu, tỉnh Chiết Giang, Cộng hòa Nhân dân Trung Hoa. Quận này có diện tích 872 kilômét vuông, dân số 560.000 người. Mã số bưu chính của Ngô Hưng là 313000. Chính quyền nhân dân quận Ngô Hưng đóng ở số 493, đường Hồ Đông. Về mặt hành chính, quận Ngô Hưng được chia thành 6 nhai đạo, 6 trấn, 3 hương.



Về thơ văn, tôi lại thấy bài thơ dịch:

Ngô Hưng thu tứ nhị thủ

Bất thị Điều Khê yếm khan nguyệt ,
Thiên nhai hữu trình vân thụ lương .
Hà ý đinh châu thặng phong vũ ,
Bạch tần kim nhật tự Tiêu Tương .

Nhật tịch côn ngư mộng nam quốc ,
Điều Dương thủy cao mê độ đầu .
Cố sơn thu phong ức quy khứ ,
Bạch vân hựu bị Vương Tôn lưu .


Trần Đào

Nghĩ về thu tại Ngô Hưng

Đâu phải vì trăng tại suối Điều
Vì rừng mây phủ bước cô liêu
Bãi sông mưa gió xa xôi quá
Thấy bạch tần mà nhớ Tương Tiêu

Chiều xuống cá côn mơ miền nam
Bến nước Điều Dương đã ngập tràn
Gió thu núi cũ bao là nhớ
Vương Tôn , mây lấp bước chân hoang

Phan Lang dịch

Saturday, August 9, 2008

Remote connect to SQL Server 2005 Express

SQL Server 2005 không cho phép remote connection cho nên chúng ta cần phải active service này lên một cách thủ công. Message sau sẽ xuất hiện trong trường hợp service này chưa được start.

An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connection. ….?"

SQL Server does not allow remote connection

Login failed for user ‘sa’. The user is not associated with a trusted SQL Server connection.�?

Login failed for 'sa'

Kiểm tra quyền truy cập vào hệ thống SQL Server với account trong hệ thống của SQL Server hoặc quyền của Windows Authentication.
Ví dụ: tài khoản ‘sa’.

    1. Login vào SQL Server sử dụng công cụ SQL Server Management Studio Express trên hệ thống SQL Server với tài khoản của Windows Authentication.
      Login using Windows authentication mode on local
    2. Trong phần cửa sổ Object Explorer, click chuột phải trên tên server đã connect và chọn Properties.
      Open SQL Server Properties
    3. Trên phần của sổ trái của cửa sổ Server Properties, chọn Security và thay đổi dạng truy cập Server authentication trở thành SQL Server and Windows Authentication mode.
      Change SQL Server authentication mode
    4. Của sổ thông báo kết quả thay đổi đã thành công và yêu cầu restart lại SQL Server để làm cho những thay đổi trên có hiệu lực.
      SQL Server need restart
    5. Click chuột phải trên tên server, chọn Restart để restart lại dịch vụ SQL Server.
      Restart SQL Server Service
    6. Chọn Yes.
      Confirmation
    7. Của sổ restart dịch vụ SQL Server.
      Restarting SQL Server Service
    8. Tất cả đã hoàn tất, dịch vụ SQL Server với quyền truy cập là tài khoản của SQL Server và Windows authentication đều đã được kích hoạt.
  • Kiểm tra dịch vụ remote connection vào server SQL trên công cụ SQL Server Surface Area Configuration
    1. Mở chương trình SQL Server Surface Area Configuration.
      Open SQL Server Surface Area Configuration
    2. Click vào chức năng Surface Area Configuration for Services and Connections (chọn lựa đầu tiên trong 2 chức năng).
      Open Surface Area Configuration for Services and ConnectionsTrên phần cửa sổ bên trái của cửa sổ vừa mở ra, chọn SQL Server instance -> Database Engine -> Remote Connections. Trên phần bên phải, chọn Local and remote connections -> using both TCP/IP and named pipes.
      Allow remote connections
    3. Tiếp theo trên phần trái của cửa sổ, chọn SQL Server Browser -> Service.
      Trên phần phải của cửa sổ, Hãy start dịch vụ và để nó ở chế độ Automatic. Sau đó nhấn OK.
      Start SQL Server Browser
    4. Sau khi tiến hành các bước cấu hình trên, hệ thống đã có thể tiến hành remote connect từ một máy khác trong hệ thống mạng.
      Login to remote SQL Server
    5. Trang login.
      Login succeeded

Monday, August 4, 2008

SQL Server 2005 Express Edition

Keywords: SQL Server 2005 Express, SQLExpress, SQLServer2005, SQL2005,

1. Cài đặt .NET Framework 2.0
2. Cài đặt Microsoft SQL Server 2005 Express Edition
3. Cài đặt SQL Server Management Studio Express

SQL Server 2005 Express Edition (SSE) là phiên bản desktop của sản phẩm cơ sở dữ liệu SQL Server 2005 rất phổ biến của Microsoft. Phiên bản SQL Server 2005 Express Edition được cung cấp miễn phí cho người sử dụng.

1. Cài đặt .NET Framework 2.0

SSE đi với bộ công cụ phát triển phần mềm Visual Studio.NET 2005 nên yêu cầu cần phải có .NET Framework 2.0. Link download .NET Framework 2.0: http://msdn2.microsoft.com/netframework/

2. Cài đặt Microsoft SQL Server 2005 Express Edition

SQL Server 2005 Express Edition là phiên bản desktop làm server dữ liệu SQL trên máy PC x86. SSE có đặc điểm là miễn phí, dễ sử dụng, kích thước file cài đặt nhỏ gọi chỉ với 36.5MB.

Link download : http://go.microsoft.com/fwlink/?LinkId=65212

3. Cài đặt SQL Server Management Studio Express

SQL Server Management Studio Express để dễ quản lý database, nó giúp bạn tạo database dễ dàng hơn. Trường hợp không cần công cụ quản lý dữ liệu thì không cần cài đặt phần này.

Link download: http://go.microsoft.com/fwlink/?LinkId=65110

Trước khi cài cần phải có MSXML 6.0.

(Link download : http://www.microsoft.com/downloads/details.aspx?familyid=993c0bcf-3bcf-4009-b...)



4. Câu lệnh kết nối đến SQL Express

SQLServer2000:

m_szConnectString.Format("Provider=SQLOLEDB;Data Source=%s; Trusted_Connection= yes; User Id = %s; Password=%s; Initial Catalog=%s", m_szServer, m_szUsername, m_szPassword, m_szDatabase);

SQLExpress2005:

m_szConnectString.Format("Provider=SQLNCLI; Server=HUNGNQ\\SQLEXPRESS; Trusted_Connection=yes; Database=%s; User Id=%s; Password=%s; Initial Catalog=%s", m_szUsername, m_szPassword, m_szDatabase);

m_szConnectString.Format("Provider=SQLNCLI; Server=HUNGNQ\\SQLEXPRESS; Persist Security Info=True; User Id=%s; Password=%s; Initial Catalog=%s;", m_szServer, m_szUsername, m_szPassword, m_szDatabase);

Tuesday, July 1, 2008

Rút trích từ khóa tự động trên tài liệu tiếng Việt

URL: http://ngo.2uoc.hung.googlepages.com/RuttrichTukhoa.htm

Từ khóa là một từ hoặc một cụm từ mô tả nội dung chính của một tài liệu. Rút trích từ khóa tự động trên tài liệu tiếng Việt là một bài toán thường bắt gặp trong nghiên cứu xử lý ngôn ngữ tự nhiên cũng như trong cuộc sống hàng ngày.


Những trang báo điện tử hiện nay đang hướng đến việc sử dụng những từ khóa nhằm đại diện cho một văn bản, hỗ trợ người đọc nhanh chóng nắm bắt thông tin. Đi đầu trong hướng sử dụng từ khóa như một phần thông tin đăng tải của bản tin là Báo mới (www.baomoi.com, beta.baomoi.com); Vietbao.vn. Báo mới đã thực hiện rất tốt việc rút trích từ khóa từ một văn bản ban đầu. Những từ khóa mà Báo mới rút ra sau khi sử dụng công cụ tìm kiếm Google hoặc Yahoo chúng ta luôn luôn tìm được link đến bài viết gốc.

Vấn đề đặt ra là những từ khóa rút trích được phải được xem là đại diện cho văn bản ban đầu, thông qua các từ khóa, người đọc có thể phần nào biết được nội dung của văn bản và cũng thông qua danh sách các từ khóa đó, các công cụ tìm kiếm có thể tìm được văn bản ban đầu.

Các phương pháp áp dụng có thể sử dụng đến một tập dữ liệu huấn luyện ban đầu hoặc là không. Tuy nhiên, việc tránh tập dữ liệu ban đầu luôn được hướng đến, vì nó sẽ giảm được công việc xây dựng một tập dữ liệu lớn hỗ trợ quá trình huấn luyện đó,

Để đưa ra từ khóa cho một tài liệu, ta dựa vào thông tin thống kê trên các từ có trong văn bản, thống kê đồng hiện của tất cả các từ phổ biến trong tài liệu đó, từ đó dựa vào các thông số thống kê và yêu cầu của bài toán để xét xem đâu là từ khóa đại diện cho văn bản ban đầu.

Một số đặc điểm ảnh hưởng đến quá trình rút trích từ khóa:
- Các từ chức năng (stopword) không nằm trong danh sách các từ khóa rút được. Các từ chức năng là các từ không hàm chứa nghĩa như: là, cũng, sẽ, đến, tới, .....
- Các từ nằm trong danh sách từ khóa thường là các danh từ và động từ
- Một số từ khóa xuất hiện trong tiêu đề của văn bản.
- Các danh từ tên riêng thường có khả năng xuất hiện trong danh sách các từ khóa cao hơn các danh từ phổ biến.

Đối với mỗi bài toán mà yêu cầu có một danh sách từ khóa khác nhau với số lượng khác nhau. Số lượng các từ khóa đại diện có thể chỉ là 5 hoặc 10, hoặc cũng có thể là không xác định trước. Tùy theo yêu cầu đó mà các chi tiết cụ thể của phương pháp áp dụng có thể khác nhau để cho kết quả cuối cùng tốt nhất.

Sunday, June 15, 2008

Tooltip trên trang web

Hôm nay ngồi ngâm cứu mấy trang tin tức để phát triển trang web tin tức thì thấy một số hệ thống có phần tooltip hiện lên khá ấn tượng, mình có thể sử dụng được. Qua bác GOOGLE lần mò đến http://boxover.swazz.org/. Đây là trang chuyên cung cấp chuyện này sẽ rất bổ ích cho ai muốn làm WEB có nhu cầu này.

Cạy cựa với cái code có sẵn thì mới thấy là nó cũng có một module như thế, thế là sử dụng luôn, chỉ có điều cần điều chỉnh lại cho đẹp mặt. Và cuối cùng thì cũng ok cả.

Wednesday, June 4, 2008

Một chút bâng khuâng ngày tôi ở TOKYO

Hôm nay lang thang ở Nguyễn Huệ thấy mấy cái chân máy chụp hình khá đẹp. Những chân máy này mà gắn vào máy chụp hình thì hoành tráng phết, vững chắc chụp đủ các góc độ không phải tìm chổ đặt máy gì cả.

Thấy chân máy chụp hình mới nhớ lại thời gian tôi ở Nhật. Tôi cũng được em Thắng cho một cái chân máy chụp hình như thế nhưng nhỏ hơn. Lúc đó mình khái lắm, vì có nó mình có thể đặt máy lên cân đong đo đếm để có được những khung ảnh đẹp. Lúc đó mọi việc thấy bình thường, giờ về VN rồi mới thấy rằng những lúc như vậy cũng thật thú vị đấy chứ. Một cậu nhóc cũng như mình thôi, đi học xa nha, giúp đỡ mọi người một cách vô tư, nhiệt tình mà mình sẽ khó gặp như ở VN.

Ngày đó, mọi người còn tổ chức đi Cung điện hoàng gia vào dịp ngày sinh của Nhật hoàng, đi xem lá đỏ và đi trượt tuyết nữa. Rất tiếc là chuyến trượt tuyết thì lại không tham gia rồi. Mà cũng vui, ở Tokyo rộng như thế nhưng hễ cứ kéo nhau đi khu vực mua sắm hàng điện tử Akihabara lớn nhất ở Tokyo thì lại gặp thêm một vài nhóm người Việt nữa, lại thăm hỏi nhau cũng vui cung quý lắm.

Có như thế chúng ta mới thấy được rằng: đi một ngày đàng học một tràng khôn. Có đi, có tiếp cận những môi trường mới chúng ta mới thấy quý những cái mà mình đang có hiện tại và tiếp sức cho tương lai ngày mai.

Tuesday, June 3, 2008

[BioCaster Portal] Notify of ontology download page

[BioCaster Portal] Notify of ontology download page. Đây là thông báo source của Onotlogy của chúng tôi nhận được từ BioCaster portal được người dùng download. Cũng vui lắm vì những nghiên cứu của mình được người khác quan tâm và sử dụng trong các nghiên cứu khác.

Bio-Ontology của dự án BioCaster là một ontology về các căn bệnh (dịch tể học), và về địa danh hành chính (Geo-Ontology) trên toàn thế giới. Phần thông tin về y học thì có một nhóm phát triển, phần tôi chỉ phải triển phần nội dung và quan hệ liên quan đến địa danh mà thôi. Dữ liệu địa danh phần lớn mà chúng tôi sử dụng được rút trích từ Wikipedia.org , đây là bộ bách khoa toàn thư được cư dân mạng cập nhật nên thông tin cũng rất có ý nghĩa và tương đối đầy đủ.

Những thông báo dạng như thế này nhằm mục đích để chúng tôi nhận được những phản hồi từ phía người dùng nhằm update cho phiên bản của mình càng tốt hơn.

Hiện nay, Bio-Ontology đã update được phiên bản thứ 2 với 8 ngôn ngữ trong đó. Trong đó các phần thông tin về bệnh tật và địa danh được cập nhật rất nhiều so với phiên bản 1.0 trước đó.

Thông tin xin xem thêm: BioCaster page.

Thursday, March 6, 2008

Flickr

This is a test post from flickr, a fancy photo sharing thing.

Tuesday, January 29, 2008

Các kho lưu dữ liệu miễn phí trên mạng

Những website lưu trữ này cho phép mọi người chia sẻ file có dung lượng lớn hoặc mở ra xem trên bất cứ máy tính kết nối Internet nào. Tất cả đều dễ sử dụng và một số còn tự động cập nhật file mới trong ổ cứng của người sử dụng. Điều này sẽ rất bổ ích nếu chúng ta cần gửi dữ liệu lớn cho nhiều người dùng khác trên mạng hoặc trong trường hợp người nhận offline.

Box.net: 1 GB miễn phí và 5 GB nếu người sử dụng trả thêm 5 USD/tháng.

Streamload MediaMax: Miễn phí 25 GB upload (tải lên) và 1 GB download (tải xuống) mỗi tháng. Nếu trả thêm 4,95 USD/tháng, người sử dụng sẽ có ổ lưu trữ ảo 100 GB và có thể tải về 10 GB/tháng.

MailBigFile: Cho phép gửi file nhanh chóng, dễ dàng với kích thước lên đến 1 GB mà không cần đăng ký tài khoản. Mail Big File hỗ trợ mã hóa 128 bit, tức an toàn hơn cả các dịch vụ e-mail thông thường.

Pando: Một dịch vụ kết hợp của YouSendIt, BitTorrent và AIM.

MooLoad: Kích thước file tối đa là 500 MB và sẽ chỉ tự động xóa nếu sau 30 ngày không có ai tải xuống.

Diino: Ngoài việc cho phép chia sẻ file dung lượng lớn dễ dàng, Diino còn hỗ trợ tổ chức ảnh số, chơi nhạc và truy cập thông tin an toàn.

bbDRIVE: Lưu trữ 10 GB và không giới hạn kích thước file.

Picture9: Nơi lưu trữ ảnh và tạo slideshow cho blog, đấu giá eBay và MySpace.

FileXoom: Kích thước file tối đa 100 MB, khả năng lưu trữ 2 GB và hỗ trợ tất cả các định dạng file.

zSHARE: Kích thước file 100 MB, thời hạn 10 ngày (chỉ bị xóa nếu không có ai tải trong vòng 10 ngày).

BigFileUpload: Kích thước file 100 MB, không giới hạn thời gian lưu trữ.

GimeHost: Tải file với dung lượng 250 MB.

SendOver: Kích thước file lên tới 2 GB nhưng thời gian tồn tại của file chỉ là 7 ngày.

MegaShares: Kích thước file 1,5 GB và sẽ bị xóa sau 25 ngày nếu không có ai tải về.

FileFactory: Kích thước file 1,5 GB, cho phép tải xuống 25 lần trong thời gian 7 ngày.

Spread-It: Kích thước file 500 MB với thời hạn 14 ngày.

XtraFile: Kích thước file 250 MB, thời hạn: 15 ngày

RapidSharing: Kích thước file 50 MB với thời hạn 60 ngày.

YouSendIt: Kích thước file 1 GB, giới hạn 25 lượt tải và thời gian tồn tại 7 ngày.

RapidShare: Kích thước file tối đa 100 MB với thời gian tồn tại 30 ngày.

Inbox.com: Webmail miễn phí với dung lượng 2 GB.

Friday, January 25, 2008

Những vấn đề liên quan đến bài toán Bóc tách nội dung

Những vấn đề phát sinh xung quanh bài toán bóc tách nội dung trang WEB vẫn còn tiếp diễn. Lần này là chế độ BẢNG MÃ của trang WEB. Không phải mọi trang đều có bảng mã giống nhau nên chúng ta cần phải tự nhận ra BẢNG MÃ đó để chuyển về đúng bảng mã mà chúng ta cần để xử lý cho thống nhất.
Những bảng mã thường xuất hiện:
. NCR Decimal
. UTF-8
. ISO-8859-1
. Windows CP1258
Như thế sẽ cần đến bộ chuyển mã cho nội dung nhận được từ những bảng mã này về mã UNICODE.

Một bộ chuyển mã được đóng gói thành thư viện hỗ trợ môi trường .NET là : vnConvert của tác giả Nguyễn Đức Khoan. Hệ thống còn được đóng gói thành phần mềm với các tính năng:
- Chuyển mã tiếng việt cho MS Access, MS SQL Server, Oracle database. (Đã có chức năng chuyển mã tiếng việt cho Oracle).
- Chuyển mã Clipboard: văn bản trong clipboard sau khi chuyển đổi sẽ trả về dạng Text không có định dạng.
- Hỗ trợ chuyển đổi qua lại giữa các bảng mã tiếng việt Unicode dựng sẵn, Unicode tổ hợp, VNI-Windows, TCVN3 (ABC), UTF-8, Windows CP1258 và NCR Decimal.
- Chuyển tất cả các mã tiếng việt có dấu trên thành mã KHÔNG DẤU.
- Có thể tự nhận dạng mã tiếng việt khi chuyển đổi.

Link: http://luudiachiweb.com/convertdb/

Tuesday, January 22, 2008

Ứng dụng C# gọi chương trình console mà không xuất hiện cửa sổ DOS

Trong quá trình lập trình, tôi sử dụng đến một chương trình DOS để thực hiện các tác vụ nền, vì là tác vụ nền nên không muốn nó hiển thị lên cửa sổ đen của DOS khi nó được gọi. Sau đây là cách thực hiện (môi trường C#):
// This code needs the "System.Diagnostics" library
// Application path and command line arguments
string ApplicationPath = "C:\\example.exe";
string ApplicationArguments = "-c -x";
// Create a new process object
Process ProcessObj = new Process();
// StartInfo contains the startup information of the new process
ProcessObj.StartInfo.FileName = ApplicationPath;
ProcessObj.StartInfo.Arguments = ApplicationArguments;
// These two optional flags ensure that no DOS window appears
ProcessObj.StartInfo.UseShellExecute = false;
ProcessObj.StartInfo.CreateNoWindow = true;
// If this option is set the DOS window appears again :-/
// ProcessObj.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
// This ensures that you get the output from the DOS application
ProcessObj.StartInfo.RedirectStandardOutput = true;
// Start the process
ProcessObj.Start();
// Wait that the process exits
ProcessObj.WaitForExit();
// Now read the output of the DOS application
string Result = ProcessObj.StandardOutput.ReadToEnd();

Friday, January 18, 2008

Những vấn đề liên quan đến bài toán Bóc tách nội dung


Phương pháp mà tôi sử dụng cho bài toán bóc tách nội dung chính trang web là phân tích mã HTML để tạo nên cây cấu trúc của trang WEB. Tuy nhiên, để xác định tốt nội dung chính, hệ thống cần giải quyết những vấn đề sau:

1. Lỗi trong TAG của HTML

Trường hợp lỗi của TAG HTML có hai dạng: lỗi có tag mở nhưng không có tag đóng và lỗi sử dụng tag HTML không hợp lệ, sai cú pháp.

Trong trường hợp TAG đóng không được sử dụng, TAG đi sau sẽ có nhiệm vụ tìm kiếm TAG tương ứng để đóng TAG đã mở trước đó.
Còn trường hợp TAG sử dụng bị lỗi, thiếu dấu CloseTag chẳng hạn, thì trình duyệt sẽ không thể hiện đúng nội dung cho nên chương trình cũng sẽ bỏ qua trường hợp này, coi như lỗi dữ liệu.

2. Dữ liệu được tổ chức hỗn loạn


Trường hợp dữ liệu được nhúng nhiều thành phần khác nhau: đoạn văn bản nội dung, bảng số liệu, hình ảnh minh họa, thông tin chú thích. Trong trường hợp này chương trình sẽ dò tìm để loại bỏ những TAG không cần thiết như , tag có nội dung theo dạng bảng số liệu.

Đau đầu nhất vẫn là trường hợp các đoạn dữ liệu được tổ chức xen kẽ với các đoạn thông tin kính kèm theo, thông tin quảng cáo ... Trong trường hợp này cần phải có giải pháp để loại bỏ những đoạn dữ liệu không cần thiết đó như: quảng cáo, liên kết liên quan...

3. Xác định vùng nội dung chính

Trong bài toán Bóc tách nội dung trang Web thì vấn đề lớn nhất là xác định nội dung chính của trang web, loại bỏ đi những nội dung dư thừa không cần thiết. Đây là một vấn đề khó và nó ảnh hưởng đến kết quả bài toán, hơn nữa chất lượng loại vùng nội dung dư thừa bị còn tùy thược vào bài toán cụ thể để quyết định nội dung chính gồm những phần nào. Vấn đề này tôi xin để trong một bài viết riêng để xử lý cho vấn đề này.

Saturday, January 12, 2008

Tìm kiếm tự động văn bản song ngữ Anh-Việt từ Internet

Hôm nay tôi bắt đầu start mạnh mẽ lại vấn đề của riêng mình với một đề tài mới: ParallelDocSearch. Tôi sẽ tóm lược phần nào những thông tin về đề tài và sẽ cập nhật những thông tin đi theo tiến độ thực hiện của đề tài, hy vọng những chia sẽ này có thể để những bạn quan tâm đến vấn đề này cùng trao đổi, cũng có thể để các bạn không trong domain này có thể cùng nhau góp ý cho cách làm việc một project dạng này.


Tìm kiếm tự động văn bản song ngữ Anh-Việt từ Internet

Mục tiêu đề tài: Xây dựng hệ thống tìm kiếm tự động những bản dịch song ngữ Anh Việt từ nguồn Internet thông qua hệ thống tìm kiếm Google và các công cụ xử lý ngôn ngữ tự nhiên.

Nội dung đề tài:
Sử dụng hệ thống dịch tự động Anh-Việt để dịch tự động văn bản tiếng Anh ra văn bản tiếng Việt. Từ văn bản tiếng Việt này, hệ thống tiến hành rút bộ từ khóa và đưa vào bộ máy tìm kiếm Google để rút ra tập liên kết đến các văn bản có chứa bộ từ khóa này. Từ các văn bản tìm kiếm được, chương trình tiến hành đánh giá mức độ tương đồng giữa hai văn bản để xác định văn bản có khả năng cao nhất là văn bản dịch của văn bản tiếng Anh ban đầu.
Mô hình Tìm kiếm tự động văn bản song ngữ Anh-Việt từ Internet

Kết qủa đề tài: Chương trình có khả năng đưa vào một tài liệu tiếng Anh, hệ thống sẽ tự động tìm kiếm bản dịch có khả năng nhất nếu có từ nguồn Internet.

Sunday, January 6, 2008

SOA - Kiến trúc định hướng dịch vụ

Download:

Service Oriented Architecture
Áp dụng kiến trúc hướng dịch vụ cho hành chính công
Service.Oriented.Architecture.in.C.Sharp.2005.2nd.Edition.Aug.2006.pdf

Phần mềm đang ngày càng trở nên phức tạp quá mức và dường như đang vượt khỏi khả năng kiểm soát của các mô hình phát triển hiện có. Có một kiến trúc phần mềm mới được kỳ vọng là chìa khóa giải quyết vấn đề phức tạp này...

Hình ảnh

"Mọi việc nên thực hiện theo cách đơn giản đến mức có thể ..." - Albert Einstein, đây cũng chính là vấn đề đặt ra hiện nay trong lĩnh vực phát triển phần mềm. Một thực trạng đáng buồn là có rất nhiều hệ thống phần mềm được thực hiện quá phức tạp, chi phí phát triển và bảo trì cao chót vót, đặc biệt với các hệ thống phần mềm cao cấp. Hàng chục năm qua, các kiến trúc phần mềm đã cố gắng giải quyết vấn đề này. Thế nhưng độ phức tạp vẫn tiếp tục tăng và dường như vấn đề này đã vượt quá khả năng xử lý của các kiến trúc truyền thống. Điều này một phần do ngày càng xuất hiện nhiều công nghệ mới tạo nên môi trường không đồng nhất, một phần do yêu cầu trao đổi tương tác giữa các hệ thống phần mềm với nhau. Những yêu cầu truyền thống đặt ra đối với tổ chức CNTT vẫn còn đó, cùng lúc phải đáp ứng nhanh chóng các yêu cầu mới, đòi hỏi phải liên tục giảm chi phí, có khả năng sử dụng và tích hợp các thành phần mới... Tất cả đã tạo nên một áp lực nặng nề đối với các nhà phát triển phần mềm.

Chúng ta đã có các kiến trúc như OOP (Object Oriented Programming), COM/DCOM (Distributed Common Object Model), CORBA (Common Object Request Broker Architecture)... và nhiều phương thức tích hợp ứng dụng nhanh và tốt hơn. Thế nhưng vẫn chưa có giải pháp nào hoàn chỉnh. Giờ đây, SOA đang được xem là 'ứng cử viên sáng giá' có thể đảm nhận trọng trách này và được kỳ vọng tạo nên cuộc cách mạng trong kiến trúc phần mềm.

SOA là gì?

SOA - Service Oriented Architecture (Kiến trúc Định hướng Dịch vụ), theo định nghĩa của DotNetGuru, là "Khái niệm về hệ thống trong đó mỗi ứng dụng được xem như một nguồn cung cấp dịch vụ".

Dịch vụ là yếu tố then chốt trong SOA. Có thể hiểu dịch vụ như là hàm chức năng (mô-đun phần mềm) thực hiện qui trình nghiệp vụ nào đó. Một cách cơ bản, SOA là tập hợp các dịch vụ kết nối 'mềm dẻo' với nhau (nghĩa là một ứng dụng có thể 'nói chuyện' với một ứng dụng khác mà không cần biết các chi tiết kỹ thuật bên trong), có giao tiếp (dùng để gọi hàm dịch vụ) được định nghĩa rõ ràng và độc lập với nền tảng hệ thống, và có thể tái sử dụng. SOA là cấp độ cao hơn của phát triển ứng dụng, chú trọng đến qui trình nghiệp vụ và dùng giao tiếp chuẩn để giúp che đi sự phức tạp kỹ thuật bên dưới.

Thiết kế SOA tách riêng phần thực hiện dịch vụ (phần mềm) với giao tiếp gọi dịch vụ. Điều này tạo nên một giao tiếp nhất quán cho ứng dụng khách (client) sử dụng dịch vụ bất chấp công nghệ thực hiện dịch vụ. Thay vì xây dựng các ứng dụng đơn lẻ và đồ sộ, nhà phát triển sẽ xây dựng các dịch vụ tinh gọn có thể triển khai và tái sử dụng trong toàn bộ quy trình nghiệp vụ. Điều này cho phép tái sử dụng phần mềm tốt hơn, cũng như tăng sự linh hoạt vì nhà phát triển có thể cải tiến dịch vụ mà không làm ảnh hưởng đến ứng dụng client sử dụng dịch vụ.

Thật ra triết lý SOA không hoàn toàn mới, DCOMCORBA cũng có kiến trúc tương tự. Tuy nhiên, các kiến trúc cũ ràng buộc các thành phần với nhau quá chặt, ví dụ như các ứng dụng phân tán muốn làm việc với nhau phải đạt được 'thỏa thuận' về chi tiết tập hàm API, một thay đổi mã lệnh trong thành phần COM sẽ yêu cầu những thay đổi tương ứng đối với mã lệnh truy cập thành phần COM này.

Ưu điểm quan trọng nhất của SOA là khả năng kết nối "mềm dẻo" (nhờ sự chuẩn hóa giao tiếp) và tái sử dụng. Các dịch vụ có thể được sử dụng với trình client chạy trên nền tảng bất kỳ và được viết với ngôn ngữ bất kỳ. (Ví dụ, ứng dụng Java có thể liên kết với dịch vụ viết trên nền .NET và ngược lại).

SOA dựa trên 2 nguyên tắc thiết kế quan trọng:
    Mô-đun: Tách vấn đề lớn thành nhiều vấn đề nhỏ.

    Đóng gói: Che đi dữ liệu và lô-gic trong từng mô-dun (hay 'hộp đen') đối với truy cập từ ngoài.

SOA và OOP: Không loại trừ nhau

Có ý kiến cho rằng SOA (Service-Oriented - định hướng dịch vụ) sẽ thay thế phương thức lập trình hướng đối tượng - OOP (Object Oriented Programming). Ít nhất thì đây là thông điệp của Don Box, phụ trách bộ phận thiết kế Indigo - công nghệ tích hợp trong hệ điều hành Windows Longhorn (phiên bản hệ điều hành Windows thế hệ kế tiếp) mà theo Microsoft sẽ hỗ trợ hoàn toàn SOA. Thực sự đây chỉ là tuyên bố mang tính "giật gân", gần giống như tuyên bố AOP thay thế OOP (tham khảo "AOP=Aspect Oriented Programming", TGVT A số 01/2003 - trang 60).

SOA sử dụng cùng một số nguyên lý như OOP, tuy nhiên triết lý SOA có khác biệt đáng kể so với OOP. SOA có thể thực hiện với cả chương trình theo hướng đối tượng (OO) và chương trình không hướng đối tượng.

Hình ảnh
Hình 1: Kiến trúc 3 cấp tiêu biểu của mô hình đối tượng

Hình 1 là kiến trúc 3 cấp (three-ties) tiêu biểu của mô hình đối tượng. Chúng ta có thể thấy sự ràng buộc giữa lớp thể hiện và các đối tượng của lớp nghiệp vụ. Chương trình client phải tương tác với mô hình đối tượng của lớp nghiệp vụ, điều này làm tăng sự ràng buộc và yêu cầu số lượng đáng kể các "gọi hàm" giữa các 2 lớp. Khi các đối tượng nghiệp vụ nằm ở máy tính xa thì đây sẽ là vấn đề. Tương tự, số lượng đối tượng nghiệp vụ mà lớp thể hiện phải thao tác làm giảm sự độc lập giữa các lớp và làm cho khó sử dụng lớp nghiệp vụ.

Ví dụ, xét đoạn mã sau:

Mã:
Customers customers = Customer.List();
Orders orders = customers[0].Orders;
Order order = orders.Add('ORDER001', customerData.Customers[0]);
Order.Lines.Add(new Product('53XYPR0D8', 2);
Orders.Save(); // Nếu việc cập nhật không được thực hiện theo thời gian thực.

Chương trình làm việc với các đối tượng nghiệp vụ Customer, Order Product. Ở đây sử dụng đối tượng Order để thực hiện việc cập nhật. Trong một số mô hình, việc cập nhật được thực hiện trực tiếp ngay trong từng lời gọi đến đối tượng nghiệp vụ. Những lời gọi đến máy chủ được tô đậm.

Hình ảnh
Hình 2: Mô hình SOA phát triển lên từ mô hình đối tượng

Hình 2 là mô hình SOA. Khác biệt giữa SOA và mô hình đối tượng chính là lớp mới 'Services'. Lớp thể hiện giờ đây không còn thao tác trực tiếp lên các đối tượng nghiệp vụ nữa, mà sử dụng dịch vụ để truy cập chúng. Các đối tượng nghiệp vụ được đặt trong thư viện và được dịch vụ nạp vào bộ nhớ - lớp dịch vụ và lớp nghiệp vụ nằm trong cùng tiến trình, nhờ vậy lời gọi hàm đến đối tượng nghiệp vụ sẽ không hề bị quá tải.

Dịch vụ đóng vai trò như 'hộp đen': cung cấp một lớp trung gian cho mô hình đối tượng và đưa ra tập chức năng rút gọn, làm giảm nhu cầu trao đổi giữa các lớp.

Đoạn mã ví dụ trên được thực hiện theo kiến trúc SOA như sau:

Mã:
CustomerData customerData = CustomerService.ListCustomers();
OrderData orderData = new OrderData();
OrderEntity order = orderData.Orderss.Add('ORDER001',customerData.Customers[0].CustomerID);
Order.Lines.Add('53XYPR0D8', 2);
CustomerService.AddOrders(orderData);

CustomerService làm việc với các đối tượng dữ liệu CustomersData và OrderData. Trình client chuẩn bị các đối tượng dữ liệu và gửi chúng đi trong 1 lời gọi. Giờ đây nó tùy thuộc vào dịch vụ thực hiện cập nhật. Phương thức này thực hiện nhóm dữ liệu lại với nhau và làm giảm số lượng lời gọi đến server.

SOA và WebService (dịch vụ Web): Không phải là một

Đặc điểm chính của SOA là tách rời phần giao tiếp/gọi dịch vụ với phần thực hiện dịch vụ. Điều này có thể làm bạn liên tưởng đến một công nghệ được đề cập nhiều gần đây: WebService (dịch vụ web). Dịch vụ web cho phép truy cập thông qua định nghĩa giao thức-và-giao tiếp. SOA và dịch vụ web thoạt trông có vẻ giống nhau nhưng chúng không phải là một.

Về cơ bản, SOA là kiến trúc phần mềm phát xuất từ định nghĩa giao tiếp và xây dựng toàn bộ mô hình ứng dụng như là mô hình các giao tiếp, hiện thực giao tiếp và phương thức gọi giao tiếp. Giao tiếp là trung tâm của toàn bộ triết lý kiến trúc này; thực ra, tên gọi "kiến trúc định hướng giao tiếp" thích hợp hơn cho SOA. Dịch vụ và module phần mềm nghiệp vụ được truy cập thông qua giao tiếp, thường theo cách thức yêu cầu - đáp trả. Ngay cả với yêu cầu dịch vụ 1 chiều thì nó vẫn là yêu cầu trực tiếp có chủ đích từ một phần mềm này đến một phần mềm khác. Một tương tác định hướng dịch vụ luôn bao hàm một cặp đối tác: nguồn cung cấp dịch vụ và khách hàng sử dụng dịch vụ.

Định nghĩa cơ bản của dịch vụ web dựa trên một nền tảng khác: Tập hợp các công nghệ WSDL (Web Services Description Language), SOAP (Simple Object Access Protocol) và UDDI (Universal Description, Discovery ang Integration), cho phép xây dựng các giải pháp lập trình cho vấn đề tích hợp ứng dụng và truyền thông điệp. Theo thời gian, các công nghệ này có thể hoàn thiện hay có thể được thay bằng công nghệ khác tốt hơn, hiệu quả hơn hay ổn định hơn. (Hiện tại thì các công nghệ này làm việc tốt và hiệu quả).

Rõ ràng, theo định nghĩa thì dịch vụ web là đặc tả công nghệ còn SOA là triết lý thiết kế phần mềm. Dịch vụ web đưa ra giải pháp kỹ thuật để thực hiện SOA, nhưng SOA cũng có thể thực hiện với các giải pháp kỹ thuật khác không phải dịch vụ web (và không phải tất cả dịch vụ web đều có kiến trúc SOA). Tuy vậy, SOA và dịch vụ web có mối quan hệ tương hỗ: sự phổ biến của dịch vụ web giúp thúc đẩy sự phát triển của SOA, và kiến trúc tốt của SOA sẽ giúp dịch vụ web thành công.

Tương lai cho SOA

Tháng 5 vừa qua (2006), BEA đưa ra sáng kiến Liquid Computing hỗ trợ dịch vụ web và SOA. Cũng trong tháng 5, IBM đã khai trương 4 trung tâm nghiên cứu và triển khai SOA tại Austin (Mỹ), Beijing (Trung Quốc), Delhi (Ấn độ) và Hursley (Anh). Các trung tâm này sẽ hỗ trợ cho công việc của IBM Global Services SOA Centers of Excellence. Như đã đề cập ở phần trên, phiên bản HĐH Windows thế hệ kế tiếp, tên mã Longhorn, sẽ hỗ trợ đầy đủ SOA với công nghệ tích hợp Indigo. Và SOA còn được sự ủng hộ của nhiều hãng tên tuổi khác như Sun, Oracle ... Theo Gartner, trong khoảng 2 năm nữa, SOA sẽ hiện diện trong hầu hết các dự án phần mềm.

SOA sẽ giúp cho công việc phát triển phần mềm trở nên dễ dàng và nhanh chóng hơn. 'Đừng tốn công chế tạo lại bánh xe', hãy kết hợp những linh kiện (dịch vụ) có sẵn và bổ sung những gì cần thiết để 'lắp ráp' nhanh chóng 'chiếc xe' đưa bạn đến đích. Đó là triết lý của SOA! Ngay từ bây giờ bạn có thể áp dụng triết lý này cho các hệ thống phần mềm của mình để sẵn sàng cho những nhu cầu của ngày mai.

THAM KHẢO:
Realizing a SOA with .NET (15 seconds)
The Case for Developing a SOA (IBM)
Getting a little Closer to SOA (DotNetGuru)
SOA Ushers in the Next Era in Business Software Engineering (Gartner Research)

(Theo PCWorld-VN)

Hiện thực hóa kiến trúc SOA với .NET

(Realizing a Service-Oriented Architecture with .NET)
Web Services have emerged as a key strategic capability for integrating business processes, data, and organizational knowledge.

This article is meant to be a practical discussion guide to building a .NET application in a service-oriented architecture. We will consider real-world goals, real-world obstacles, and experience-based solutions. I quickly concede the approaches discussed here are not exhaustive or infallible. This paper is focused on application development, not application integration. We will specifically consider architectural issues and component design issues.

The Potential of Web Services

So why all the hype? Web Services obviously have great potential. It's a way to integrate at many different levels. Consider this example. A single consumer application (perhaps interacting with your company over the Internet) wants to engage the company in some business process. To facilitate that business process, the company internally invokes processing that spans two discreet systems (A and B). However, through a service-oriented architecture, the entire end-to-end business process is exposed to the consumer application as a single service.

Hình ảnh
Figure 1. Exposing separate LOB applications as a single service.

Architectural Considerations

A good architecture emphasizes a separation of responsibilities. For example, the presentation tier manages presentation components; the business logic tier manages business logic components; and the data access tier manages data access components.

This separation provides for fault tolerance, easier maintenance, and future-proofing. A good service-oriented architecture is nothing new, just a smart way of separating (and exposing) a component's responsibilities. It builds on classic object-oriented (OO) ideas.

In a service-oriented architecture, clients consume services, rather than invoking discreet method calls directly. In a 3-tier model (Figure 2), objects are marshaled across process boundaries through the proxy/stub techniques we know from COM. This provides benefits such as location transparency. The same techniques are used in .NET Remoting via channels and sinks. The basic philosophy is that one tier should only communicate with the tier contiguous to it.

One disadvantage to object-orientation at an architectural level is the number of communication links. Client code is responsible for traversing complex object models and understanding details about domain-specific logic. In a service-oriented model, we introduce a further "layer of indirection". This alleviates some of the pain associated with traversing complex object models. The services layer, denoted below in Figure 3 by the cloud, provides black-box functionality.

Hình ảnh
Figure 2. A typical 3-tier application architecture

Hình ảnh
Figure 3. A service-oriented application architecture

Designing Services and Objects

In a service-oriented design, services should be course-grained. Course-grained services are modeled after and align to business processes.

Objects should be fine-grained and align to real business entities. These discreet objects provide the detailed business logic. Specificity is good when building discreet business objects. This is also a very successful way to codify organizational knowledge. Each business object is responsible for its own behavior and business rule implementation, such as updating a database table, sending an email, or placing a message on a queue.

Services provide the orchestration of the detailed business objects to expose a full service to the consumer. Services are responsible for orchestrating calls to discreet business objects, managing the responses, and acting accordingly. Service methods may invoke and manage several business objects.

Service methods align to business processes by design. Class methods align to detailed object-level operations by design.

Consider the following example in Figure 4. Notice we have a Web service called BookStoreService and a Web method called orderBook(). This single Web method instantiates and manages 3 separate objects, Book, Order, and OrderDetail.

Hình ảnh
Figure 4. Designing services and objects.

Design Considerations

Minimize Roundtrips

A design goal should be to design services to minimize round-trips. This was true with COM and it continues to be true with .NET and Web Services.

Recall in classic n-tiered distributed architectures that conventional wisdom said it was better to move 1000 bytes across process boundaries 1 time, rather than moving 1 byte across 1000 times. We would optimize method signatures and design stateless components, and we would use database helper routines to convert ADO recordsets to XML to provide a lightweight payload for distributed applications.

With SOAP and Web Services, we generally see the same approach. However, we need to take it one step further. We should now consider using the Web Service as a service, not just a data pump, and XML as a self-describing package, not just a payload.

Align Web Methods to Forms

Web methods should be designed to perform an entire service for an entire form. In short, our design goals are:

Provide a course-grained Web method at the form level
Have the Web method invoke whatever business objects it needs
Return to the consumer the whole service result, like a DataSet with numerous tables within it

Consider the following example. We may be designing a search form to search a bookstore for certain titles. To support this search screen in this figure, we would design a Web method called GetSearchScreenInfo which returns a DataSet that has a number of tables within it. This Web Method is designed to provide all the information the form needs to draw itself on the load event.

Hình ảnh
Figure 5. Align service methods to forms

On this particular form, we need two lists just to populate the screen: a list of valid publishers, and a list of valid categories. Rather than making two calls to the Web Service (one for each dropdown), we design our Web method to provide everything we need in a single call. We service the loading of the search form in a single interaction. Later work, such as performing the search or drilling into details, is handled by separate Web methods.

Behind the scenes, our web method is invoking and managing all the business objects it needs to satisfy the request.

Moving Data Between Tiers

Data can be moved between architectural tiers as DataSets, serialized objects, raw XML, etc. -- but design your solution to be consumed. DataSets are .NET specific objects that serialize nicely but are intended for other .NET applications. If your application needs to interoperate with, for example, a J2EE solution, DataSets may be too troublesome to employ because the J2EE side would not readily understand a DataSet.

Serializing business objects is also an option. But remember that the full object is not marshaled. The object's public properties and data members are serialized and shipped, but the calling client cannot re-inflate the object and access its private data members or methods.

XML is, of course, an obvious choice also. XML formatted exchanges are a solid and proven technique for moving data around any distributed architecture.

Distributed Transactions

Web methods can act as the root of a distributed transaction. These transactions are managed by the Distributed Transaction Coordinator (DTC). Our Web Service classes must reference the System.EnterpriseServices namespace, and can then use the ContextUtil class to use the SetAbort() and SetComplete() methods. This provides for declarative transaction control.

Each object enlisted by the Web method is a child object and will participate in the transaction and "vote" on the outcome. This provides the best fit for keeping objects granular enough to manage their own data from a persistent store, while still allowing them to be orchestrated by a transaction-root controller.

Transactional context is managed by the root. Web Methods must be adorned with the TransactionOption attribute, something like this:

Mã:
[WebMethod(TransactionOption=TransactionOption.RequiresNew)]


Child objects need nothing special. They do NOT need to derive from the ServicedComponent base class. The same child object can be enlisted in a transaction for one Web method, but not enlisted in a transaction for another Web method.

Exception Handling

Exceptions should be considered a rarity. They should be thrown only in exceptional situations, not in normal branching. Each caller should catch exceptions and deal with them appropriately. In its simplest form, an exception could be bubbled up the call stack from the backend to the UI and presented to the end-user. However, each step up the stack should have processing done at that layer. All exceptions thrown over SOAP get shipped as SOAP exceptions. For example, we might throw an exception if someone tried to log on inappropriately using this simplified code:

Mã:
Throw New BadPasswordException()

The caller would need to catch that exception, like this:

Mã:
Catch x1 As BadPasswordException // do something

In this example, the caller catches the particular exception and reacts to it. However, if the Web Service threw an application exception to the end-user client, the exception is transformed into a SOAP exception. In fact, the client program must specifically catch that SOAP exception, as in Figure 6.

Mã:
catch e as System.Web.Services.Protocols.SoapException


Hình ảnh
Figure 6. Throwing exceptions over a SOAP connection.

The client program must catch at least 3 different types of exceptions. The first is SoapException.

On the client, SoapExceptions should be caught for any middle-tier exceptions. This is useful for throwing exceptions from the middle tier application logic. However, ANY middle tier exceptions will be thrown as a SoapException.

We can encode the inner exception to be business-problem specific information we need. As an example, we can pass a SoapException with a meaningful message, such as "Database access error", so that the client can deal with it.

Next the client should catch WebExceptions. This is useful when the network goes down in the middle of an end-user's session.

Finally, the client must catch client-side exceptions. These are thrown by client-side processing, and are something local to client, like FileNotFound.

Conculsion

The key messages to take away from this discussion about constructing .NET applications in a service-oriented architecture are as follows:

Service-oriented architecture is rooted in object-orientation but adds a layer of abstraction. I like to think that service-orientation is not a departure from object-orientation, but rather an evolution. Services orchestrate calls to discreet business objects to satisfy requests. Objects are enlisted, behind the scenes, to formulate a response.

The openness of the technologies is exciting and easy to use. The current industry work on standards around UDDI, WSDL, Web Services, etc. promises that more and more applications can be constructed from constituent services rather than re-invented domain-specific code.

The statelessness of the technologies can be a challenge for performance heavy applications. Be aware of the non-functional requirements of the solution you want to build. Sometime line-of-business applications desire long-running transactions that are better suited to other distributed application technologies.

Design your solution for Web Services - you will have different approaches than you would for Remoting or DCOM. Again, remember that service-orientation is appropriate for some business applications, but not all. A service-oriented architecture is one possible architecture pattern to consider when designing solutions.
(Chip Irek)