Sunday, August 23, 2009

Central Authentication Service

Central Authentication Service (CAS) là một protocol phục vụ Single Sign-on trên nền web được phát triển tại đại học Yale. Nó cho phép user truy cập nhiều ứng dụng web khác nhau mà chỉ cần login một lần.

Protocol
Protocol CAS bao gồm ít nhất 3 thành phần: web browser, web application và CAS server.
  • Khi web browser truy cập vào web application, application sẽ redirect user tới trang đăng nhập của CAS server.
  • Nếu đăng nhập thành công, CAS server sẽ redirect trở về lại web application, kèm theo một security ticket. Web application sẽ dùng identifier của chính nó và ticket này để kiểm tra với CAS server xem user đó đã đăng nhập hay chưa.
CAS Server Implementations
Hiện nay có 3 bản implement protocol CAS phần server được sử dụng nhiều:
  • Jasig CAS server: Được phát triển bởi tổ chức Jasig, sử dụng ngôn ngữ Java.
  • ESUP CAS server: Một phần của dự án ESUP Portail, sử dụng ngôn ngữ Java.
  • RubyCAS server: CAS server phát triển bằng ngôn ngữ Ruby.
Do chưa biết nhiều về Ruby nên tôi chỉ mới thử qua được 2 server của Jasig và ESUP.
  • Do tôi quen sử dụng Ant nên cài đặt bản của ESUP nhanh hơn, tuy nhiên cấu hình default của bản này lại có giao diện tiếng Pháp. Và giao diện của bản này khó chỉnh sửa vì nó chỉ cho cấu hình các đoạn text và màu sắc đơn giản, khó chỉnh sửa bố cục trang web.
  • Bản cài đặt của Jasig sử dụng Maven để build, do chưa quen với công cụ này nên tôi chưa thử cấu hình nhiều được. Giao diện của bản cài đặt này nằm trong các file JSP nên có thể chỉnh sửa dễ dàng hơn.
Kết hợp CAS vào các ứng dụng web đã có
Các CAS server chỉ làm nhiệm vụ hỗ trợ authenticate, thông tin về các user cần được quản lí bằng một application khác. Vì vậy đầu tiên ta cần xác định sẽ để cho một web application sẵn có quản lí các user hay tạo application mới chuyên dùng cho việc này.

Sau khi triển khai xong CAS server và application quản lí các user, ta cần triển khai các CAS client cho các ứng dụng còn lại để user có thể đăng nhập bằng tài khoản tại CAS server.
Hiện có rất nhiều CAS client cho các ngôn ngữ khác nhau như Java, PHP, Python, Ruby, .NET, ... và các module hỗ trợ CAS cho các web framework như Drupal, Moodle, Django, ...

Một số khái niệm liên quan
  • OpenID: OpenID cho phép user sử dụng một account đã có ở một web site hỗ trợ như Google, Yahoo!, MySpace, ... để login vào một web site khác. Nó khác với CAS ở chỗ user vẫn phải login vào từng site, còn đối với CAS user chỉ cần login một lần.
  • OAuth: OAuth là một protocol cho phép user cấp phép cho một web application truy cập thông tin của mình trên một site khác mà không cần cung cấp thông tin login cho web application đó.

Saturday, August 8, 2009

Những dự định hiện nay

Bảo vệ luận văn xong rồi, xem như là đã xong đại học, sắp tới làm gì đây nhỉ?

Một số dự định hiện tại:

Sự nghiệp học hành
  • Nộp đơn vào cao học ở KHTN, hi vọng là đủ điều kiện tuyển thẳng :P. Hình như nó đòi trình độ TOEFL 400, mà cái bằng của mình hết hạn được 3 năm rồi :(
  • Tiếp tục ôn thi và thi GRE. Hic, mấy tháng rồi học cũng nhiều lắm mà sao nhìn cái list từ chưa học nó vẫn còn dài quá vậy nè :((
  • Tìm vài trường đại học để apply học master hay PhD. ^^
Công việc Công ty
  • Sau khi xem xong cái video ở Google I/O về kiến trúc ứng dụng GWT mới biết bọn Google nó gọi mấy cái ứng dụng như công ty mình đang làm là "spaghetti" (tức là rối như spaghetti ^^). Mới bỏ nó chưa được 1 tháng mà giờ nhìn lại thấy choáng quá. Phải nghĩ cách sửa nó trước.
  • "UiBinder has finally been submitted to GWT's svn/trunk, and will be part of the 2.0 release." Yeaaaah...! Vậy là sắp thoát khỏi cảnh developer giành sửa CSS với designer :)). Nghiên cứu để chuẩn bị thôi.
  • Nghiên cứu kiến trúc hệ thống chuẩn bị cho giai đoạn tiếp theo, trước tiên là phần Centralized Authentication.
  • Tổ chức lại các qui trình: Version Control, Unit Test và Automation (Project's safety net).
Cá nhân
  • Google Waaaaaaaaaaaave!!! Từ hồi làm luận văn đã bị cái này chiếm hết 1/3 đầu óc rồi. Khi vừa bảo vệ luận văn xong thì được cấp account sandbox :)). Đang nghịch ngợm và suy nghĩ làm cái gì đó thật hoành tráng với nó.
  • Dependency Injection: Bắt đầu nhận ra tầm quan trọng của cái này khi làm ứng dụng lớn, nhất là sau khi xem giới thiệu về Google Guice. Quyển sách có vẻ là hay nhất về cái này cuối tháng 8 mới xuất bản, nhưng hiện giờ đã có ebook và mình đang có promotion code giảm giá 37%. Có nên mua không đây?
  • Google App Engine: Ở trong trường đã dùng cái này viết được 3 project: cờ vua cho môn công nghệ web, vdm parser cho môn đặc tả hình thức và gps mobile locator cho nhóm 2 đứa bạn làm luận văn. Sắp tới đang dự định chạy thử Django trên App Engine, nếu được thì sẽ có thể làm được nhiều trang web trong thời gian ngắn (Django giúp develop nhanh còn App Engine giúp deploy nhanh ^^).
  • Nhiều thứ linh tinh khác (bản chất vốn tham lam ^^).

Công việc nhìn thấy nhiều vậy thôi, vẫn đi ăn chơi được với bạn bè (mới về Đồng Nai chơi 2 ngày xong). Dù sao cũng vừa mới bảo vệ luận văn xong mà ^^

Wednesday, August 5, 2009

Luận văn tốt nghiệp - Tìm hiểu UIMA

Tuần vừa rồi tôi đã bảo vệ xong luận văn tốt nghiệp đại học, bài viết này nhằm ghi nhận lại một số điểm chính trong luận văn kẻo sau này quên mất. :)

Nội dung luận văn của tôi là tìm hiểu về kiến trúc UIMA (Unstructured Information Management Architecture). Đây là kiến trúc dùng để xây dựng các chương trình phân tích một lượng lớn dữ liệu phi cấu trúc (văn bản, hình ảnh, âm thanh, ...) để rút trích ra các ngữ nghĩa bên trong chúng. Những chương trình như vậy được tài liệu UIMA gọi là chương trình quản lí dữ liệu phi cấu trúc (Unstructured Information Management Applications).

UIMA
Kiến trúc UIMA ra đời do một yêu cầu thực tế: hiện nay các chương trình quản lí dữ liệu phi cấu trúc phát triển rất nhiều, nhưng mỗi chương trình được xây dựng theo một phương pháp, công nghệ khác nhau, vì vậy cần qui định một kiến trúc chung cho những chương trình này để việc xây dựng các dễ dàng hơn và có thể kết hợp những chương trình này lại. UIMA ban đầu được phát triển bởi IBM, hiện nay đã trở thành một chuẩn được quản lí bởi OASIS và có 2 phiên bản cài đặt bằng Java và C++ mã nguồn mở phát triển bởi Apache.

Kiến trúc UIMA chia chương trình quản lí dữ liệu phi cấu trúc thành nhiều component, mỗi component này thực hiện một công đoạn nào đó trong quá trình phân tích dữ liệu. UIMA qui định chuẩn cho các component, chuẩn cho dữ liệu trao đổi giữa các component và chuẩn lắp ráp các component thành qui trình phân tích dữ liệu. Điều này giúp cho những component trong các chương trình UIMA có tính tái sử dụng cao; và các component UIMA mã nguồn mở xuất hiện rất nhiều trên mạng (ví dụ: các component có sẵn trong project Apache UIMA), thực hiện nhiều công việc khác nhau như tách từ, gán nhãn từ loại, phát hiện entities dựa vào regular expression, ...

Việc chia chương trình thành nhiều component như trên còn giúp cho việc triển khai chương trình dễ dàng hơn. Toàn bộ chương trình gồm nhiều component có thể chạy trên cùng một máy hoặc chia ra cho nhiều máy (mỗi máy chạy một hay nhiều component) và ta có thể cấu hình load balance, replicate, ... để việc chạy chương trình trên nhiều máy hiệu quả hơn (UIMA hiện thực việc triển khai chương trình trên nhiều máy bằng ActiveMQ).

Quá trình làm luận văn với UIMA
Cảm giác ban đầu khi bắt đầu làm luận văn về UIMA là "ngợp" trong một đống tài liệu :P. Tài liệu quá nhiều và nói về nhiều vấn đề khác nhau. Sau vài ngày, tôi nghĩ ra một cách tiếp cận hiệu quả hơn là đọc các paper có sử dụng UIMA để xây dựng chương trình. Các paper này đều dành một đoạn ngắn khoảng 1/2 trang nói về UIMA và hầu hết đều nhấn mạnh việc chia chương trình thành nhiều component. Nhờ đó, bọn tôi nắm được ý tưởng chính trong kiến trúc UIMA và sau đó xem các example có sẵn dễ dàng hơn rất nhiều.

Luận văn của chúng tôi làm về một chương trình phân tích các bệnh án điện tử. Trong quá trình làm, bọn tôi đã thử nhiều cách phân tích và sử dụng nhiều component phân tích khác nhau. Kiến trúc UIMA giúp cho việc thay đổi qui trình phân tích rất dễ dàng và nhanh chóng. Ví dụ: để thêm khả năng nhận diện tên bệnh trong bệnh án, bọn tôi chỉ cần download component Dictionary Annotator có sẵn, sau đó chuyển từ điển các tên bệnh (nhóm tôi dùng SNOMED CT) thành dạng input mà component yêu cầu rồi đưa component vào qui trình hiện có. Việc thêm một component chỉ đơn giản là sửa đổi một số file XML cấu hình, không hề ảnh hưởng gì đến các component đã có trong qui trình.

Nhóm bọn tôi chưa thử nghiệm nhiều với các khả năng triển khai chương trình của UIMA. Tuy nhiên trong quá trình làm luận văn, có một giai đoạn tôi vừa phải lập trình GUI cho chương trình, vừa phải chạy một số ứng dụng khá nặng khác nên máy chạy rất chậm. Lúc đó bọn tôi đã nghĩ ra cách dùng khả năng triển khai chương trình rất flexible của UIMA để chuyển toàn bộ qui trình phân tích thành một service trên máy của bạn tôi. Sau đó phần GUI của tôi chỉ việc gửi dữ liệu qua cho service này thực hiện phân tích rồi nhận kết quả nên máy chạy nhẹ hơn nhiều. Toàn bộ việc chuyển đổi này được bọn tôi làm chỉ mất khoảng 30 phút!

Kết
Tôi thấy UIMA là một kiến trúc khá mạnh và thú vị, và một số project sau này của tôi có thể sẽ sử dụng nó để việc phát triển thuận tiện hơn. Tuy nhiên UIMA yêu cầu khả năng developer của người sử dụng ở mức trên trung bình (đôi lúc phải track những lỗi phát sinh từ trong framework khá rắc rối) nên đối với người dùng bình thường hoặc người làm nghiên cứu có lẽ GATE là một lựa chọn thích hợp hơn. Còn đối với những chương trình lớn chạy trong thực tế, khả năng triển khai linh hoạt sẽ làm cho UIMA trở thành candidate sáng giá.