May 16, 2014

Hình vuông kế thừa hình chữ nhật hay ngược lại ?

Đang lúc tìm câu trả lời cho một số câu hỏi đã vương vấn từ lâu, tình cờ đọc được một ví dụ rất lạ trên codeproject. Ví dụ này làm mình phải suy nghĩ lại về kế thừa, tưởng như đã quá hiển nhiên.
Con chó, con mèo, động vật, gần như quyển nào cũng có cái ví dụ này, sách nào cũng bảo con chó, con mèo kế thừa động vật.

Có hai lớp hình vuông và hình chữ nhật. Theo quy tắc hình học: "mọi hình vuông đều là hình chữ nhật, tuy nhiên không phải hình chữ nhật nào cũng là hình vuông". Kế thừa là mối quan hệ "is-a". Theo một lẽ rất tự nhiên, lớp hình vuông sẽ kế thừa lớp hình chữ nhật.

class Rectange
{
   width: number
   height: number
}

class Square : Rectange
{
}

Mình sử dụng 2 lớp như dưới đây

var a = new Rectange()
a.width = 10
a.height = 4

Square b = a;

Nhìn qua thì không có vấn đề gì cả, tuy nhiên nhìn kỹ vào logic thì thấy biến b có kiểu là hình vuông và tham chiếu đến hình có một cạnh là 10, một cạnh là 4 !

(sang trang)

May 12, 2014

Kết nối csdl mysql bằng python

Kết nối tới CSDL



from abc import ABCMeta, abstractmethod

connection = MySQLdb.connect(host="127.0.0.1", user="root", passwd="1234", db="books")

Kiểm tra trạng thái kết nối

Sử thuộc tính open để kiểm tra xem kết nối đã bị đóng hay chưa, 1 : vẫn mở, 0 : kết nối đã đóng.
Hàm keepalive dưới đây sẽ khởi tạo lại kết nối khi nó đã bị đóng
def keepalive( ntry=0):
	if ntry > 3:
		raise Exception('cannot connect to the dabase')

	if self.db.open == 0:
		#try 3 time
		connection = MySQLdb.connect(host="localhost", user="r", passwd="1", db="b")
		keepalive(ntry+1)

Sep 29, 2012

Cập nhật phiên bản xfce 4.10

Tính năng của phiên bản mới

Trên windows 7, khi kéo một cửa sổ vào gần cạnh của màn hình, cửa sổ này sẽ tự động được mở rộng ra một nửa màn hình (tính năng này được gọi là tilling)

image

Để có tính năng này trên Linux, phải cập nhật xfce lên phiên bản 4.10

Nâng cấp

Để năng cấp lên phiên bản mới, dùng lệnh:

sudo add-apt-repository ppa:xubuntu-dev/xfce-4.10

sudo apt-get update

sudo apt-get dist-upgrade

Cách share dữ liệu từ máy chủ (host) Windows đến máy khách (guest) Linux bằng Virtual Box

Các bước thực hiện

  1. Cài đặt Guest Additions cho máy guest
  2. Đăng ký thư mục cần chia sẻ trên máy host (trong ví dụ này là ổ E)
  3. Kết nối ổ E đến thư mục Share trong máy client.

Cài đặt Guest Additions

Ở cửa sổ linux. Chọn menu Devices > Install Guest Additions…, hoặc dùng phím tắt Host+D, theo mặc định, phím host ở đây là nút Ctrl phải (không phải trái).

image

Một thư mục mới được thêm vào cây thư mục.

image

Mặc định tên thư mục này là VMBOXADDITIONS_4.xxx. Vào thư mục này và chạy autorun.sh, nhập password của người quản trị hệ thống rồi nhấn Enter

image

Đợi chương trình chạy xong. Khi quá trình cài đặt hoàn tất, nhấn phím Enter

image

Đăng ký thư mục chia sẽ trên máy host

Trong của sổ VM VirtualBox, chọn Devices, Shared Folders…

image

Đăng ký một thư mục mới để chia sẻ

image

Ở hình trên, thư mục được đăng ký là ổ đĩa E với tên là E_DRIVE

Kết nối với thư mục chia sẻ đến guest

Trong linux, gõ lệnh

$ cd /home/thanh

$ mkdir Share

$ sudo mount –t vboxsf E_DRIVE Share

trong đó E_DRIVE là thư mục trên máy host, Share là thư mục trên may guest

Kiểm tra kết quả

Trong máy Guest, vào Terminal, gõ lệnh

$ cd /home/thanh/Share

Nếu thấy nội dung thư mục này đúng như ổ E thì thành công

Nếu không thì làm lại từ đầu.

Aug 17, 2012

Cách gọi thủ tục lưu trữ trong Java

Store procedure là một phần không thể thiếu của bất kỳ cơ sở dữ liệu nào, sử dụng store procudure có rất nhiều lợi ích, (có thể tham khảo trên google, khi nào rảnh thì bổ sung)

Có thể phân ra làm 2 nhóm người: nhóm người sử dụng cơ sở dữ liệu, nhóm người thiết kế, triển khai cơ sở dữ liệu, nhóm người thứ nhất không có kiến thức về cách tổ chức cơ sở dữ liệu, họ đặt ra các yêu cầu với nhóm người thứ hai, và nhận lại được một tập các đặc tả về store procedure, cơ sở dữ liệu với họ hoàn toàn là một cái hộp đen, mang đúng nghĩa là một abstract data type, với giao diện là các store procedure. Nhóm người thứ hai thì hiểu rất rõ cơ sở dữ liệu như thế nào, nếu cơ sở dữ liệu quá phức tạp, trưởng nhóm có thể phân chia các quyền và công việc nhỏ hơn với sự giúp đỡ của view.

Bài viết này hướng dẫn nhóm người thứ nhất về cách sử dụng thủ tục lưu trữ trong java.

Giả sử đã có một đối tượng connection, kết nôi thành công đến cơ sở dữ liệu, cơ sở dữ liệu cung cấp đặc tả về một store procedure như sau:

Tên: gfmi
Tác dụng: lấy id của thành viên đầu tiên lưu trữ trong cơ sở dữ liệu.
Tham số:
1. 
tên: id
loại: tham số ra
kiểu: int
tác dụng: chứa kết quả trả về là id của thành viên đầu tiên
Giá trị trả về: không xác định

Tạo đối tượng hỗ trợ giao diện CallableStatement

Việc đầu tiên là phải tạo một đối tượng hỗ trợ giao diện callableStatement từ đối tượng connection

CallableStatement statementmanager = connection.prepareCall( "call gfmi(?)");

tham số của hàm prepareCall có dạng "call xxx(?,?,?,..)"
với xxx là tên hàm cần gọi, theo như đặc tả store procedure ở trên thì là gfmi
liền ngay sau tên là danh sách các tham số, mỗi tham số không cần ghi tên mà chỉ ghi dấu hỏi (?), phân cách nhau bởi dấu phảy (,).

Đăng ký các tham số

Tiếp theo là phải đăng ký tham số:

statementmanager.registerOutParameter( "id", Types.INTEGER );

từ đặc tả có thể dễ dàng suy ra các tham số tương ứng

Gọi hàm

statementmanager.executeQuery();

Lấy kết quả

statementmanager.getInt( "id")

Dưới đây là code tham khảo

try
{
Class.forName("com.mysql.jdbc.Driver").newInstance(); 
Connection connection = DriverManager.getConnection( "jdbc:mysql://localhost:3306","aaaa","aaaa" );
connection.setCatalog( "class");
CallableStatement statementmanager = connection.prepareCall( "call gfmi(?)");
statementmanager.registerOutParameter( "id", Types.INTEGER );
statementmanager.executeQuery();
System.out.println(statementmanager.getInt( "id") );
}
catch ( Exception ex )
{
System.out.printf( "%s", ex.toString() );
}