Menu

Liferay 6.2: Các vấn đề liên quan đến đa ngôn ngữ trong Liferay

Multi-language
English version
Trong một thế giới rộng lớp, nếu muốn giới thiệu tới tất cả mọi người ứng dụng của mình bạn phải thể hiện nó với nhiều ngôn ngữ khác nhau. May mắn thay, Liferay đã hỗ trợ tính năng này và cung cấp những cách dễ dàng nhất để làm điều đó. Mình sẽ giới thiệu làm thế nào để sử dụng đa ngôn ngữ trong một portlet. Hãy bắt đầu nào.

Liferay 6.2: Hook và tự viết taglib


English version
Hôm nay, mình sẽ thảo luận về việc làm thế nào để viết một jsp taglib. Tại sao cần phải tự viết taglib riêng? Vì các tag này được sử dụng lại trong nhiều dự án khác nhau và các taglib trong các thư viện có sẵn không đáp ứng được nhu cầu của bạn. Ví dụ: tạo một taglib để thể hiện thông tin của một sản phẩm trong các dự án thương mại điện tử hoặc thể hiện thông tin của một quyển sách trong cửa hàng sách online,...
Trong bài này, chúng ta sẽ tạo ra một taglib thể hiện thông tin của một cuốn sách, các thông tin gồm: tiêu đề (title), phiên bản (edition version), số ISBN (ISBN), các tác giả (authors), hình bìa (cover image), tổng số trang (number of pages), nhà xuất bản (publisher),...

Liferay 6.2: Hook and Taglib


Vietnam version
Today, I am going to discuss how to create custom JSP tag-libs. Because custom JSP tags are reused in many projects, creating custom JSP tags is always necessary. For examples: creating a tag-lib to show a product information in e-commerce projects, book information in a bookstore.
In this post, we are going to create a tag-lib which shows the information of a book. The book's information includes title, edition version, ISBN, authors, cover image, the number of pages, publisher,...

SQL: Một trường hợp của lệnh UPDATE trong SQL

Lệnh UPDATE là một lệnh rất hay gặp trong việc thao tác với cơ sở dữ liệu. Cú pháp của lệnh như sau:
UPDATE SET Column_1 = Value_1, ..., Column_n = Value_n [WHERE ....];

Postgresql: Execute some simple commands

Postgresql logo
If you working with small scale database, you always using a database management software to done your task. For example, I usually use pgAdmin to integrated with Postgresql database. In some cases, you have to face with a large-scale database, using a database management isn't best choose. At that moments, I often use commands to done my jobs.
In this post, I will show you how to execute a SQL file from the terminal screen.

Liferay 6.2: Multi-language problems

Multi-language
Vietnam version
In the wide world, if you want to introduce your application, your program have to multi-language. Fortunately, Liferay framework supported this feature and provided easiest ways to do. I will introduce how to using multi-language in a portlet. Let's go.

Java: Sử dụng thư viện POI để đọc và ghi dữ liệu với excel


English version
Ngay khi đọc tiêu đề bài viết, bạn cũng dễ dàng đoán được ý đồ của bài này rồi đúng không? Thao tác nhập và xuất dữ liệu từ file excel là một thao tác rất thường xuyên trong công việc của chúng ta. Vậy, làm thế nào chúng ta có thể nhập và xuất những dữ liệu mà ta mong muốn. Bài này sẽ giúp bạn trả lời câu hỏi trên.

Liferay 6.2: How to use liferay-ui:form-navigator tag

liferay-ui:form-navigator tag is a great graphics component. If your entity has much relative information, liferay-ui:form-navigator tag will be the best choose to show them in a browser. In this post, I will show you how to use liferay-ui:form-navigator tag.

Java: Singleton Pattern và kết nối với cơ sở dữ liệu trong các ứng dụng Java

Singleton pattern
Bài viết này mình sẽ nói đến hai phần i)thứ nhất là Singleton Pattern và ii) thứ hai là kết nối với cơ sở dữ liệu trong các ứng dụng Java đơn giản. Cuối cùng, mình trình bày lý do tại sao mình lại áp dụng Singleton Pattern vào việc kết nối với cơ sở dữ liệu trong các ứng dụng Java.

Liferay: So sánh giữa Liferay MVC va Spring MVC

Liferay MVC vs Spring MVC
So sánh giữa Liferay MVC và Spring MVC là một chủ đề nóng nhất trong cộng động phát triển ứng dụng Liferay. Lập trình viên luôn bối rối khi chọn một trong hai framework này. Trong bài viết này tôi sẽ so sánh giữa hai framework để tạo portlet trong Liferay.
Trước khi thảo luận chi tiết hơn, bạn có thể tham khảo ở các blog sau Liferay MVC PortletSpring MVC Portlet để hiểu các khái niệm cơ bản. Để hiểu được sự giống và khác nhau giữa Liferay MVC và Spring MVC, ta sẽ đi so sánh các đặc trưng giữa hai framework này.

Liferay: Tải tệp tin (upload file) trong portlet

Tải tệp tin lên là một hoạt động thường xuyên. Bạn có thể sử dụng nó để tải các tệp tin tài liệu (ví dụ: doc, docx, pdf, png...) hoặc các tệp tin dữ liệu (ví dụ: csv, xls, xlsx, odt,..). Có rất nhiều cách để tải một file nên. Tôi sẽ chỉ cho bạn một cách trong bài viết này.



Liferay 6.2: Upload file in portlet


Vietnamese version
The uploading file is an activity frequently. You can use this activity to upload document files (for examples: doc, docx, pdf, png...) or data files (for examples: csv, xls, xlsx, odt,..). There are many ways to upload a file, I will show you my way in this post.


Alogrithm: Sắp xếp vun đống (heap sort)

Thực hiện vun đống
Trước hết ta hãy hình dung nếu chúng ta có một danh sách các đồ vật và mỗi đồ vật thì có một giá trị cân nặng cụ thể. Làm thế nào để chúng ta có thể sắp xếp lại chúng theo chiều cân nặng tăng dần chẳng hạn.
Rất may mắn có một người bạn giúp ta làm một việc như sau: người bạn đó sẽ sắp xếp số đồ vật của chúng ta thành một đống mà phần tử ở trên bao giờ cũng nhẹ hơn phần tử ở dưới. Như vậy, ta lấy được đồ vật nhỏ nhất và bỏ ra ngoài. Người bạn lại tiếp tục sắp lại đống đồ vật trên và ta lại chọn phần tử ở trên cao nhất - là phần tử nhẹ nhất trong đống nhưng nhẹ thứ hai trong danh sách các đồ vật. Cứ thế đến cuối cùng thì các phần tử được ta nhặt ra từ đống sẽ được sắp xếp.
Ngay lập tức ta thấy có một câu hỏi đặt ra là việc xếp lại cái đống đồ vật để cho ta chọn đồ vật nhẹ nhất có phức tạp và khó khăn hay không? Rất may nó lại khá đơn giản, post này sẽ giải thích kỹ hơn cho bạn.

Algorithm: Thuật toán sắp xếp nhanh (quick sort)

Hình động cảu thuật toán sắp xếp nhanh
Các thuật toán như sắp xếp nổi bọt, chènchọn đều có độ phức tạp trung bình về thời gian là O(n2). Với thuật toán sắp xếp nhanh trong trường hợp xuất nhất (khi danh sách đầu vào đã được sắp xếp rồi) thì độ phức tạp về thời gian sẽ là O(n2còn trong trường hợp trung bình thì độ phức tạp về thời gian của nó là O(nlogn). Như vậy, trong các tình huống sắp xếp thông thường ta sẽ chọn thuật toán sắp xếp nhanh để cài đặt cho bài toán sắp xếp của mình. Quick sort cũng là một thuật toán đặc trưng của tư tưởng chia để trị.

Algorithm: Thuật toán sắp xếp chèn (insertion sort)

Sắp xếp chèn (insertion sort)
Khác hoàn toàn với thuật toán sắp xếp chọn (tại một vị trí ta đi chọn phần tử phù hợp), thuật toán chèn làm ngược lại là xét các phần tử với từng phần tử ta sẽ chèn nó vào vị trí đúng thứ tự của sắp xếp.

Liferay 6.2: Kết hợp search container và cơ sở dữ liệu

Trong hai post trước đây (service buildersearch container) cho phép chúng ta tương tác với dữ liệu và tương tác với giao diện. Trong post này mình sẽ kết hợp cả hai công việc riêng rẽ ở hai post trên vào thành một. Có nghĩa là ứng dụng của chúng ta sẽ lấy dữ liệu từ cơ sở dữ liệu hiển thị lên màn hình nhờ search container và chúng ta có thể dùng các tham số của search container để lọc các bản ghi phù hợp. Bây giờ các ứng dụng ta viết ra sát với thực tế rồi đấy.

Algorithm: Thuật toán sắp xếp chọn (selection sort)

Hình động sắp xếp chọn
Từ cái tên của thuật toán ta có thể đoán ngay được ý tưởng của thuật toán. Thật đúng như vậy, giả sử chúng ta muốn sắp xếp một danh sách (mảng) theo chiều tăng dần thì rõ ràng phần tử đầu tiên của danh sách sẽ là phần tử nhỏ nhất, phần tử tiếp theo là phần tử nhỏ thứ 2, tiếp nữa là phần tử nhỏ thứ 3,... đến hết. Như vậy, ta xét từng vị trí và chọn phần tử tương ứng với vị trí đó.

Algorithm: Thuật toán sắp xếp nổi bọt (bubble sort)

Minh họa

Sắp xếp nổi bọt là thuật toán sắp xếp đơn giản nhất và dễ hình dung nhất. Ý tưởng của thuật toán như sau: có một danh sách các phần tử để sắp xếp được danh sách này ta sẽ chuyển dần các phần tử "nhẹ" lên trên và các phần tử nặng "xuống" dưới. Ok, bây giờ chúng ta sẽ xem thuật toán được triển khai như thế nào trong ngôn ngữ lập trình nhé.

Python: Sắp xếp (sorting)

Sắp xếp
Sắp xếp là thao tác thường xuyên khi ta sử dụng phần mềm (ví dụ như trong excel ta sắp xếp các bản ghi theo rất nhiều tiêu chí mà ta mong đợi). Trong bài này, mình sẽ hướng dẫn các hàm sắp xếp được xây dựng sẵn của Python. Các post sau chúng ta sẽ tự xây dựng thuật toán sắp xếp cho riêng mình (các thuật toán sắp xếp gồm có: sắp xếp nổi bọt, chèn, chọn, nhanh,...)

Liferay 6.2: Thao tác với cơ sở dữ liệu

Trong các hướng dẫn trước đây, chúng ta đã làm quen với việc xây dựng các ứng dụng (portlet) đơn giản. Tuy nhiên, chúng chỉ là các ví dụ mà thôi, để cho gần hơn với các ứng dụng trong thực tế, mình viết post này trình bày về các thao tác với cơ sở dữ liệu. Liferay cung cấp một công cụ cực kỳ mạnh mẽ và hiệu quả đó là Servvice Builder. Công cụ này sẽ giúp bản triển khai một ứng dụng cực kỳ nhanh chóng.

Python: Tìm giá trị của biểu thức Taylor.

Định lí Taylor cho ta một đa thức xấp xỉ một hàm khả vi tại một điểm cho trước (gọi là đa thức Taylor của hàm đó) có hệ số chỉ phụ thuộc vào các giá trị của đạo hàm tại điểm đó. Định lí còn cho ta một đánh giá chính xác sai số của xấp x.
Trong bài này, chúng ta sẽ tính giá trị của eex theo khai triển Taylor-Maclaurin. Trước hết, ta xem khai triển của eex:


Liferay 6.2: Tìm kiếm và liệt kê (Search Container)

Trong các ứng dụng thông thường, việc liệt kê tất cả các phần tử (bản ghi) là một việc rất hay gặp. Trong trường hợp, nếu số lượng bản ghi nhiều và tràn hết màn hình thì ta sẽ có nhu cầu phân trang.
Liferay có tiện ích search container rất hữu ích cho chúng ta khi thực hiện công việc như trên. Trong bài này, mình sẽ giới thiệu chi tiết cách sử dụng search container.

Liferay 6.2: Làm việc với nhiều render

Như đã nói ở bài trước, nếu trong một portlet có nhiều thao tác xử lý dữ liệu thì ta sẽ tạo ra các action tương ứng để giải quyết công việc một cách độc lập. Việc này sẽ giúp chúng ta tách biệt các công việc khác nhau đồng thời sẽ dễ hiểu cho người khác đọc code của chúng ta và dễ dàng để bảo trì.
Như đã hứa ở bài trước, bài này chúng ta sẽ bàn đến vấn đề trả lại nhiều view khác nhau. Công việc này chắc chắn là thường xuyên gặp. Chẳng hạn bạn đang ở giao diện view, bạn có thể chuyển sang giao diện edit. Edit xong bạn có thể chuyển sang giao diện xem chi tiết chẳng hạn. Nói tóm lại, bài này sẽ giúp bạn chuyển sang các view đúng với kịch bản của bạn sau khi thực hiện các action.

Liferay 6.2: Xử lý nhiều action

Trong bài trước, chúng ta có hai file view.jspedit.jsp. Mặc định, khi mở portlet ra thì sẽ hiển thị nội dung của file view.jsp. Sau đó, ta nhấn vào liên kết để mở file edit.jsp. Trong file edit.jsp ta sẽ nhập vào tên và truyền xuống controllercontroller xử lý dữ liệu rồi trả lại view.jps.
Ta thấy, ở đây có hai thao tác, i) mở file edit.jsp thao tác này được gọi là render và ii) chuyển dữ liệu từ file edit.jsp xuống controller ta gọi là action. Câu hỏi đặt ra, nếu như chúng ta muốn có nhiều thao tác gửi dữ liệu xuống controller thì phải làm thế nào?Bài này sẽ giải đáp thắc mắc trên.

Python: Kiểu dữ liệu chuỗi

Kiểu chuỗi
Chuỗi là kiểu dữ liệu có mặt trong tất cả các ngôn ngữ lập trình và các thao tác trên chuỗi cũng được sử dụng rất thường xuyên. Chính vì vậy, bài này ta sẽ đi tìm hiểu tất cả mọi thứ về chuỗi trong Python.

Python: Một số ví dụ về hàm

Hàm
Bài trước, ta đã viết ba chương trình đơn giản đó là kiểm tra một số xem có phải là số nguyên tố, chính phươnghoàn hảo hay không? Tuy nhiên, đó là các chương trình rất đơn giản. Bài này, chúng ta sẽ sử dụng hàm để thực hiện công việc như bài trước.
Khái niệm hàm trong ngôn ngữ lập trình thì mình không phải giới thiệu lại. Bạn chỉ cần hiểu đơn giản hàm là một hộp đen thực hiện một công việc nào đó. Với đầu vào như thế nào thì sẽ được đầu ra tương ứng. Ví dụ, đầu vào của hộp đen số nguyên tố là 11 sẽ có kết quả là True, còn đầu vào là 12 sẽ có đầu ra là False. Vậy, chúng ta sẽ đi tìm hiểu cách chế tạo hộp đen bằng Python nhé.

Liferay 6.2: Gửi và nhận dữ liệu trong portlet

Trong bài trước, chúng ta đã tạo ra được một portlet có tên là FirstApp, portlet này đã hiển thị một lời chào lên màn hình. Câu chuyện đặt ra, nếu mình muốn cho phép người khác hiển thị dòng chữ chào mừng đấy thì ta phải làm thế nào?
Rất đơn giản thôi, ta cho người dùng nhập vào nội dung (tên người chẳng hạn) và người dụng nhấn vào nút Gửi , lúc này, controller sẽ trả lại dòng chữ chào mừng mà ta mong muốn.

Tự học Python: Một vài chương trình đơn giản.

Ở bài số 1, chúng ta đã cài đặt môi trường Python, môi trường lập trình và chạy chương trình đầu tiên. Bây giờ mình sẽ viết một số chương trình ví dụ. Đơn giản nhất là chương trình kiểm tra một số có phải là số nguyên tố, hoàn hảo và chính phương hay không (đây là các bài toán cơ bản và đơn giản nhất có thể.

Tự học Python: Cài đặt và viết chương trình đầu tiên

Mình không phải quảng bá nhiều về Python, chỉ biết rằng Python hiện đang ở vị trí thứ 5 (tham khảo) trong bảng xếp hạng và có chiều hướng tăng. Đồng thời, cộng đồng Python cũng kêu gào rằng Python code Python rất ngắn gọn và phải gõ phím rất ít khi viết cùng một chương trình ở các ngôn ngữ khác. Chính vì thế, có thể sẽ rất phù hợp với những người lười đấy (theo nghĩa đen luôn). Đề xem có đúng như lời cộng đồng Python nói không, thì chẳng có cách nào khác chúng ta đi tự học và cố gắng học trong 21 ngày nhé (dài quá không?).

Liferay 6.2: Tạo Portlet đầu tiên

Portlet hay ta có thể gọi là các ứng dụng sẽ được cắm vào công thông tin của chúng ta. Đây sẽ là nơi cho các lập trình viên phát triển các ứng dụng của mình. Trong bày này, chúng ta sẽ tìm hiểu các công cụ phát triển portlet trong Liferay và tạo ra một portlet đơn giản, triển khai (deploy) và "gắn" vào trong cổng thông tin của chúng ta.

Liferay 6.2: Các thành phần cơ bản của Liferay (P2)

Ở phần trước, chúng ta đã tìm hiểu các thành phần được sử dụng để dựng trang (company, site, page, portlet, ...). Phần này chúng ta sẽ đi tìm hiểu về phần quản lý người dùng trong Liferay gồm có: người dùng, nhóm người dùng, tổ chức, vai trò và quyền,...

Liferay 6.2: Các thành phần cơ bản của Liferay

Sau khi đã cài đặt và cấu hình thành công Liferay trên máy tính các nhân. Lúc này, chúng ta sẽ đi tìm hiểu các thành phần trong Liferay. Mình sẽ chia thành hai phần và chúng ta sẽ đi tìm hiểu từng phần một: i) các thành phần liên quan đến dựng trang (company, site, page, portlet, ...), ii) thành phần người dùng (user, group user,  organization,...). Nào, cùng bắt đầu nhé:

Liferay 6.2: Cài đặt và cấu hình Liferay

Ở hướng dẫn trước, mình đã nêu ra các phần mềm chính (portal, sdk và ide). Trong phần này, mình sẽ hướng dẫn cụ thể cài đặt môi trường máy chủ và môi trường lập trình (bài sau nữa).

Bắt đầu với Liferay

Liferay là một cổng thông tin mã nguồn mở được sử dụng rộng rãi ở Việt Nam nói riêng và thế giới nói chung. Được tạo ra năm 2000 bởi Brian Chan, Liferay được thiết kế phù hợp với các mô hình ứng dụng trong các cơ quan, tổ
chức và doanh nghiệp có nhu cầu phát triển hệ thống thông tin trên môi trường mạng nhằm thực hiện các giao dịch trực tuyến sử dụng Intranet/Internet như một công cụ thiết yêu trong các hoạt động, cung cấp thông tin, giao tiếp, quản lý, điều hành, trao đổi và cộng tác.