Thứ Hai, 24 tháng 9, 2012

Chain of Responsibility Pattern

dạo này thích viết bằng html hơn là dùng RichText nên mọi người thông cảm >:)

Nếu các bạn đã từng nghe qua về 23 mẫu Design Pattern của nhóm GOF thì thật tốt vì hôm nay chúng ta sẽ nói về mẫu lập trình trong 23 mẫu đó trong 1 bộ môn có tên là "Kiến trúc phần mềm" do Tiến Sỹ Trần Minh Triết đang giảng dạy...

23 mẫu Design Pattern thường dùng được chia thành 3 "phân vùng" gồm
  • Creational Patterns: các mẫu thiết kế thiên về tạo lập và quản lý tạo lập đối tượng
  • Behavioral Patterns: các mẫu thiết kế thiên về phương thức xử lý và quan hệ giữa các class
  • Structural Patterns: các mẫu thiết kế liên quan đến kiến trúc của phần mềm

Ngày hôm nay tạm gác qua các mẫu về Creational Patterns (sẽ được trình bày ở dịp khác) chúng ta đi vào phần Behavioral Patterns.

Như đã trình bày ở trên, các mẫu thiết kế liên quan đến behavioral patterns là những bài giải mẫu liên quan đến việc điều khiển các luồng xử lý và mối liên hệ giữa các class ... Bắt đầu luôn chứ không dài dòng nữa.


Mẫu số 1: Chain of Responsibility Pattern

Chain of Responbility để làm gì???
Giống như tên gọi của nó ... Chain of Responsibility là một mẫu thiết kế giải quyết cho việc thực hiện 1 chuỗi các tác vụ có trình tự mà mỗi 1 tác vụ trong chuỗi đó được đảm nhiệm bởi 1 class.

Ví dụ :
Mua bột --> Nhào bột --> Nướng bánh --> Nhậu

Đó là ví dụ đơn giản về 1 chuỗi các công việc. Mỗi công việc ở trên do một người đảm nhiệm:

phụ việc : đi chợ
phụ bếp : nhào bột
Đầu bếp : Nướng bánh
Thực khách : nhậu

Trong đó Phụ việc, phụ bếp, đầu bếp, thực khách là các class và Đi chợ(), nhào bột(), Nướng bánh(), nhậu() là các phương thức (method).

Hãy tưởng tượng đến 1 sợi dây xích có nhiều mắc xích ...

Trong mẫu Chain of Responsibility chúng ta có một thành phần chính là Handler. Handler là đối tượng đóng gói phương thức xử lý của instances này vào 1 instances khác (xem phần sau sẽ rõ)



Tạm quên UML của nó 1 bên vì nó không cung cấp nhiều thông tin lắm về mẫu này ... ta đến với vấn đề mẫu...

Vấn đề: Một nhóm các class xử lý theo lượt nhưng không có cách nào xác định thứ tự cái nào sẽ được gọi trước.

Ví dụ 1 luồng công việc như sau

 Process firstProcess = new FirstProcess();  
 fistProcess.Run();  
 Process secondProcess = new SecondProcess();  
 secondProcess.Run();  
 Process thirdProcess = new ThirdProcess();  
 thirdProcess.Run();  

Trong đó Process là lớp cha ... các lớp FirstProcess, SecondProcess, ThirdProcess() là các lớp kế thừa.

Giải quyết: Sử dụng một chuỗi class liên hợp để xử lý và định nghĩa bước thực hiện tiếp theo trong hàm xử lý của các class này.

Sơ đồ UML


Chúng ta đặt class thực thi tiếp theo vào class hiện tại, cho phép mỗi class chứa thể hiện (instance) của class tiếp theo trong chuỗi mắc xích.

#RunNext() bao gồm Run() và SetNextProcess()... 2 hàm này sẽ đảm bảo tại mỗi một mắc xích nó sẽ làm đúng nhiệm vụ của mình và ủy thác phần còn lại cho "mắc xích" tiếp theo cho đến khi hết.

Code cài đặt :


 abstract class Process  
 {  
   private Process _nextProcess;  
   protected abstract void RunNext();  
   public void Run()  
   {  
      RunNext();  
      if(_nextProcess != null)  
      {  
        _nextProcess.Run();  
      }  
   }  
   public void SetNextProcess(Process process)  
   {  
      _nextProcess = process;  
   }  
 }  


 class FirstProcess : Process  
 {  
   Protect override void RunNext()  
   {  
     System.Threading.Thread.Sleep(1000);  
   }  
 }  
 class SecondProcess: Process  
 {  
   Protect override void RunNext()  
   {  
     System.Threading.Thread.Sleep(2000);  
   }  
 }  
 class ThirdProcess: Process  
 {  
   Protect override void RunNext()  
   {  
     System.Threading.Thread.Sleep(3000);  
   }  
 }  

Thực thi vấn đề

 Process firstProcess = new FirstProcess();  
 Process secondProcess = new SecondProcess();  
 Process thirdProcess = new ThirdProcess();  
 firstProcess.SetNextProcess(secondProcess);  
 secondProcess.SetNextProcess(thirdProcess);  
 thirdProcess.SetNextProcess(null);  
 firstProcess.Run();  

Kết quả:

 Beginning first process ....  
 Ending first process ....  
 Beginning second process ....  
 Ending second process ....  
 Beginning third process ....  
 Ending third process ....  

Vậy ta đã thực thi được 1 chuỗi các hành động theo mắc xích bằng cách "chỉ ra mắc xích" tiếp theo của mắc xích hiện tại... Đó cũng là tinh thần của Chain of Responbility...

Thứ Ba, 7 tháng 8, 2012

Python trong Eclipse

    Eclipse có một editor mạnh có hỗ trợ khá nhiều loại plugin, trong đó có plugin hỗ trợ cho việc lập trình với python, đó chính là pydev.

    Trước khi cài đặt pydev, bạn nên cài đặt python trước đã.
    Bạn muốn cài pydev, bạn có thể vào trang chủ của pydev hoặc lười quá thì xem ở đây cho tiện :p
=================================================

Cài đặt:


Mở eclipse:
     Help >> Install New Softwares... >> Trong khung work with, bạn bấm Add, sẽ hiện ra hộp thoại, trong khung name bạn điền tên bất kì giúp bạn dễ nhớ, vd mình điền vào là PyDev, rồi copy dòng này vô khung location : http://pydev.org/updates (Nếu không được thì copy dòng này vô khung location : http://pydev.org/nightly )

    OK

    Check vào checkbox PyDev rồi next, next, accept gì đó rồi finish


Xong chưa nhỉ ... Còn 1 tí :-p

Trong eclipse:
    Windows >> Preferences >> PyDev >> Interpreter - Python >> Autoconfig (hoặc bạn có thể chọn new rồi chọn tới file python.exe trong windows hoặc /usr/bin/pythonx.x trong linux)

    Apply

    OK

Thế là bạn đã cài đặt xong
===================================================

Còn 1 khâu nữa là sử dụng, how how... ???

Bạn để ý ở góc phải eclipse có cái nút Open Perspective, hoặc bạn có thể vào Windows >> Open Perspective . Sau đó bạn chọn Pydev. Khung nhìn dành cho pydev xuất hiện.

Tạo project: khi tạo project, sẽ có lựa chọn PyDev project, bạn hãy chọn nó ^^
(Alt + Shift + N : phím tắt tạo project)

Tạo module: khi tạo một file mới, sẽ có lựa chọn Module hay package, bạn có thể tùy chọn theo ý ^^  

Trong lúc code, khi 1 hàm hay 1 lớp nào đó chưa có, 1 chỉ cần để con trỏ lên tên của hàm hay lớp đó, bận ctrl + 1 để tạo. Tương tự cho import module.

Nếu muốn thay đổi PYTHONPATH, bạn có thể click phải lên project, chọn mục PYTHONPATH và thêm những thư mục cần thiết.

Thứ Bảy, 4 tháng 8, 2012

1.2 Widget (Part 2)

Untitled Document

Hệ tọa độ

Kivy sử dụng hệ tọa độ 2D giống trong sách giáo khoa mà mọi người đã từng học. Với gốc tọa độ (0,0) nằm ở góc trái, phía dưới của màn hình. Trục x nằm ngang, hướng về bên phải, trục y đứng, hướng lên trên.

Dưới đây sẽ là 1 số loại layout thông dụng

Float Layout

The FloatLayout sử dụng chủ yêu cho 2 thuộc tính: pos_hint và size_hint.
Mỗi widget đều có size_hint = 1. size_hint = 1: nghĩa là kích cỡ của widget đó bằng với kích cỡ của widget cha. pos_hint là thuộc tính kiểu Dictionary, hẳn bạn đã biết kiểu Dictionary của python. vd: pos_hint={'x':.02, 'y':.01}, ngoài 2 key 'x' và 'y' ra, pos_hint còn có 'right', 'top', 'center_x', 'center_y', bạn sẽ sử dụng khi cần thiết.
Vậy, đối với mỗi widget con của Float layout, bạn chỉ cần thiết lập 2 thuộc tính pos_hint và size_hint để xác định vị trí.
Bạn có thể xem thêm trong đây để biết thêm chi tiết: link

Box Layout

Đây là 1 loại layout khá phổ biến đối với các ứng dụng giao diện. Nếu bạn chưa từng biết qua, thì cũng không khó để tiếp cận. Box layout đơn giản chỉ phục vụ cho việc sắp sếp các widget con theo chiều dọc, hoặc theo chiều ngang, có thể kếp hợp nhiều Boxlayout chồng nhau để tạo giao diện phức tạp tùy ý.
Cụ thể, đối với Box layout theo chiều dọc, các widget con sẽ được sắp xếp như sau:

Bạn có thể xem thêm trong đây để biết thêm chi tiết: link

1.2 Widget (Part 1)

Widget

Như đã nói ở bài trước, ở bài này chúng ta sẽ tìm hiểu về widget.

Widget là gì?

Widget đơn giản chỉ là một đối tượng tương tác giao diện, chẳng hạn như button, slider,...
Trong Kivy, các widget này các bạn sẽ tìm thấy trong module : kivy.uix.<tên widget>
Ở bài trước, chúng ta đã sử dụng widget button, các bạn có thể làm tương tự với các widget khác

Vấn đề đặt ra?

Ở ví dụ trước, ta chỉ xài 1 widget, vậy muốn xài nhiều widget cùng lúc ta phải làm sao?
Do đó Kivy hỗ trợ hệ thống cây widget (Widget Tree).
Bạn chỉ cần hiểu cây widget nghĩa là: sẽ có 1 widget gốc, rồi từ widget đó, bạn add thêm widget con. Từ những widget con đó, bạn có thể add thêm nữa tùy thích.

Các hàm cơ bản của hệ thống cây widget

add_widget(): add a widget as a child
remove_widget(): remove a widget from the children list
clear_widgets(): remove all children from a widget

Layout

Trong số các widget, có 1 widget tên là Layout. Đây là đối tượng đặc biệt, được sử dụng trong việc gom nhóm các widget, và phân bổ vị trí của các widget.
Tuy nhiên, nếu bạn sử dụng lớp Layout thì bạn sẽ gặp phải exception thông báo không sử dụng được. Lí do: Layout là lớp trừu tượng, không được sử dụng (trong python không có khái niệm này, chỉ là do người lập trình tạo ra exception để các lập trình viên biết đây là lớp trừu tượng để tránh sử dụng)
Một số layout có thể sử dụng được:
- AnchorLayout
- BoxLayout
- FloatLayout
- GridLayout
- StackLayout
- TabbedPanel

Thứ Sáu, 3 tháng 8, 2012

1.1 Hello Kivy

      Sau khi đã hoàn thành việc cài đặt Kivy. Hãy bắt đầu làm quen với Kivy với chương trình đơn giản nhất, đó là "Hello Kivy".

----------------------------------------------------------------------------
from kivy.app import App
from kivy.uix.button import Button

class TestApp(App):
    def build(self):
        return Button(text='Hello Kivy')

TestApp().run()
---------------------------------------------------

Lớp TestApp của bạn phải kế thừa từ lớp App của kivy. Sau đó bạn phải khởi tạo hàm build để thiết lập giao diện ban đầu, hàm này phải trả về một widget


Widget là gì, qua bài sau sẽ rõ!

Bài tiếp theo: 1.2 Widget (part 1)

1.0 Tổng quan kivy

Kivy là gì ?

- Kivy là bộ thư viện mã nguồn mở đa nền tảng 
- Kivy phục vụ yêu cầu về sản phẩm phần mềm nhanh lẹ
- Kivy sử dụng ngôn ngữ lập trình : Python
- Kivy có thể chạy trên các nền tảng : Linux, Windows, MacOSX, Android và IOS
- Kivy hoàn toàn miễn phí, bạn có thể sử dụng để tạo ra các sản phẩm phục vụ thương mại tùy ý.
- Sử dụng giao diện đồ họa thông qua OpenGLES 2


Kivy cần gì ở người lập trình?

- Phải có kiến thức cơ bản về Python
- Có kiến thức về lập trình giao diện (GUI Programming)
- Có kiến thức về lập trình hướng đối tượng (OOP)

Cài đặt

Bạn có thể xem hướng dẫn cài đặt ở đây: link
Riêng mình thì mình sử dụng Eclipse với plugin PyDev, mình sẽ hướng dẫn các bạn cài đặt trên PyDev:
- Download file nén tại đây : link
- Giải nén file vừa down , ta gọi thư mục này là "Thư mục Kivy"
- Bạn vào Window -> Preferences -> PyDev -> Interpreter Python
- Bạn chọn button New với :
+ Interpreter Name: Kivy
+ Interpreter Executable : chỗ này bạn chọn đường dẫn đến file python.exe trong thư mục Kivy > Python (với Kivy là "Thư mục Kivy")
- OK
- Bạn chọn thẻ Environment
- New các giá trị sau (lưu ý, thư mục kivy của mình là :"E:\kivy-1.3.0-w32". Bạn có thể thay đổi giá trị này tùy vào vị trí của thư mục kivy của bạn.):
+ Name: GST_PLUGIN_PATH, Value: E:\kivy-1.3.0-w32\gstreamer\lib\gstreamer-0.10
+ Name: GST_REGISTRY, Value: E:\kivy-1.3.0-w32\gstreamer\registry.bin
+ Name: PATH, Value: E:\kivy-1.3.0-w32\;E:\kivy-1.3.0-w32\Python;E:\kivy-1.3.0-w32\Python\Scripts;E:\kivy-1.3.0-w32\gstreamer\bin;E:\kivy-1.3.0-w32\MinGW\bin;%PATH%
 

API references (tra cứu các lớp)

http://kivy.org/docs/api-index.html 

  

Thứ Hai, 23 tháng 7, 2012

1.1 Giới thiệu về python

1. Bắt đầu vòng vo
Python và những lợi ích

Dễ sử dụng

Có thể thực thi trên Windows, Mac OS X, và các hệ điều hành Unix (có thể chạy được trên Linux). Các chương trình viết bằng Python hiện diện trong các thiết bị di động (Symbian, Android - hạn chế, ...) trên Linux (khá phổ biến và rất nhiều phần mềm viết bằng Python). Trên Windows (Blender là một ứng dụng sống động cho Python / Windows)...

Viết 1 lần và sài đc nhiều lần (viết trên Windows, chạy trên Linux, MacOS và Unix OS ... mà không cần biên dịch hay sửa chữa).

Là ngôn ngữ tốt để xử lý chuỗi (text data).

Có thể viết được những phần mềm rất lớn. (là 1 ngôn ngữ lập trình thật sự).

Python là một ngôn ngữ thông dịch (khác với biên dịch).
Biên dịch : chương trình được viết sẽ được trình biên dịch chuyển đổi thẳng qua mã máy (chỉ biên dịch  1 lần). Sau này chạy chương trình sẽ chạy trực tiếp bằng các mã máy này (mã máy = mã nhị phân).
 Mã nguồn  ==> Chương trình biên dịch  (chỉ biên dịch 1 lần)  ==> mã máy .
Người dùng chạy chương trình ==> mã máy.
Thông dịch : chương trình được viết sẽ được dịch mỗi lần chạy. Mỗi lần chạy là mỗi lần thông dịch. Thường các ngôn ngữ thông dịch phải thông qua 1 trình thông dịch để dịch sang mã máy.
Người dùng chạy chương trình ==> Mã nguồn hoặc mã trung gian ==> trình thông dịch (thực hiện mỗi lần chạy chương trình) ==> mã máy.
 Ưu điểm của thông dịch: Không cần biên dịch nhiều lần trong quá trình viết.

Python có cú pháp rất gọn và dễ đọc. Một chương trình viết bằng Python sẽ ngắn hơn so với viết bằng C C++ hay Java.
- Những kiểu dữ liệu bậc cao cho phép diễn tả những nhiệm vụ phức tạp chỉ trong 1 câu lệnh
- Những nhóm lệnh sẽ được phân biệt với nhau bằng thụt đầu dòng thay vì {}
- Không cần định nghĩa kiểu dữ liệu (Giống PHP).

Python dễ mở rộng.
-Một khi hook ( xâm nhập ) vào được, ta có thể kết nối trình thông dịch của python với một chương trình được viết bằng C và sử dụng những phần mở rộng hoặc câu lệnh của nó cho chương trình của chúng ta.

LINK GỐC http://docs.python.org/py3k/tutorial/appetite.html


Ngoài lề :
Ưu : Là ngôn ngữ lập trình tốt nhất thế giới trong vài năm liền
Nhược : Python trên các thiết bị di động đời mới như Android, iOS chạy chưa thật sự thuyết phục và chưa được sự support đáng kể nào.