Apr 28, 2013

Phụ thuộc vòng

Bài viết đang được hoàn thiện

Phụ thuộc vòng - một cách dịch đầy thô thiển. Tên chính xác của nó "Circular Dependency". Nghe khá rờm rà. Từ giờ trở đi gọi là CDepend cho gọn. Wiki có hẳn 1 bài về nó: link đây. Đại để có thể hiểu theo ngôn ngữ C++ như sau: File header A dùng để khai báo lớp A, file header B dùng để khai báo lớp B. Trong lớp A có 1 attribute (thuộc tính) là thể hiện của B, và trong lớp B có một thuộc tính là thể hiện của A. Và như vậy, theo lẽ thông thường, Trong file header A sẽ có dòng #include"B.h" và trong file header B có dòng #include"A.h". Mọi sự rắc rối rồi.

Hậu quả:

  • Phát sinh những vấn đề không mong muốn trong quá trình thiết kế lớp. Như ví dụ nêu trên chắc chắn là sẽ chẳng thể cài đặt với thiết kế và giải pháp đó
  • Gây rò rỉ vùng nhớ (memory leak). Vì sao ư? Đối với các ngôn ngữ không có hỗ trợ việc tự dọn rác (automatic memory management), việc tự thiết kế các phương thức hủy (destructor) hay giải phóng vùng nhớ đối với các lớp phụ thuộc lẫn nhau như thế này rất khó chịu. Nếu "lỡ tay" giải phóng hết các thuộc tính trong A, tức là giải phóng luôn có bé thể hiện B trong đó. Mà bé ý vẫn còn đang sống nhăn răng, vẫn chưa muốn bị hủy thì coi như tách. Cài đặt fail và số quá nhọ. Dĩ nhiên, điều "may mắn" là compiler không bao giờ coi đó là syntax error để thông báo ngay từ đầu cả.
  • Gây hiệu ứng domino: một tác động nhỏ lên lớp này ảnh hưởng đến toàn bộ các lớp khác. Theo nguyên tắc thiết kế, các lớp phải độc lập khi sửa chữa. Tức thay đổi của lớp này không ảnh hưởng đến lớp kia.

Một số điểm thuận lợi:

Không phải cái gì xấu, hại thì xấu hoàn toàn. Cái gì nó cũng có 2 mặt của 1 vấn đề. CDepend cũng có một số điểm tích cực

  1. Có những thiết kế bắt buộc phải dính tới CDepend. Và như vậy buộc ta phải cài đặt nó. Ví dụ: danh sách liên kết, đồ thị ...

Giải quyết

  • Có những tool chuyên trị cái này: JDepend (cho Java), Code Analysis Plugin (cho Java).
  • Sử dụng mẫu thiết kế Observer, Visitor, Factory... blah blah

Một số vấn đề trong C++

Phần này sẽ nêu 1 số ví dụ thường gặp, thường dính khi lập trình trên C++

Tài liệu tham khảo:

Hầu hết những gì chém gió phía trên đều được trích lược và tran sờ lai (translate) sang Tiếng Việt. Những nguồn này khá bổ ích

  1. Avoiding Circular Dependencies of header files
  2. Wikipedia
  3. Một bài viết hữu ích trên stackoverflow
  4. Một bài tập nho nhỏ
  5. Có hẳn 1 mục trong stackoverflow

Mẹo nhỏ khi biên dịch chương trình Multithread trên Visual Studio

Mẹo cũng không phải là mẹo, đây chỉ là 1 lần tình cờ phải cài đặt multithread trên ứng dụng. Điều trớ trêu là khi chạy trên chế độ Debug thì khá ngon lành, đến khi chạy trên Release thì tính năng multithread bị tịt hoàn toàn

Và đây là cách giải quyết. Vào Project -> Propertíe (hoặc Alt+F7 cho gọn). Chuyển đến Configuration Properties và lần lượt thực hiện các công việc sau


  • C/C++ -> Optimization. Optimization:Disable. Phần Enable Intrinsic Functions:No


  • C/C++ -> Code Generation. Enable Minimal Rebuild :Yes. Basic Runtime Checks:Both. Runtime Library: Multi-Thread Dll

  • . Enable Function-Level Linking:Yes

Apr 26, 2013

Cấu hình VIM dành cho lập trình viên.


VIM và Emacs trước đây chính là cuộc chiến "editor war" đình đám của giới lập trình. Dĩ nhiên, chuyện gì cũng có nguyên nhân của nó. Với VIM, người dùng sẽ chẳng bao giờ cân đến chuột, những phím chức năng ngoài, tất cả được nằm gọn trong lòng bàn tay, và nhớ đó, số các động tác tay được giảm tối thiểu, thời gian di chuyển giữa các phím của giảm đi. Nhờ đó mà tốc độ code trở nên 1 phần "bá đạo"

Bài viết dưới đây hướng dẫn cách cấu hình VIM trở nên đa dụng, thông minh hơn

Bước 1: Chép dòng code sau vào terminal

curl http://j.mp/spf13-vim3 -L > spf13-vim.sh && sh spf13-vim.sh

Bước 2: Ngồi đợi ...

Bước 3: Vào trang của đồng chí đã tạo ra cấu hình này: link đây . Đọc và nhớ các lệnh của plugin và hướng dẫn sử dụng

Bước 4:Vọc thử vài chức năng và tự sướng vì trình độ typing như hacker của mình

Lưu ý:

  • Đối với Arch LinuxCài vim trước, sau đó cài bộ plugin này, rồi mới cài gVim.
  • Để xóa các file liên quan và cài mới dùng lệnh sau:
    
    sudo rm -r .spf13* spf13* .vim*
    
    

Log : 14/05/2013: plugin Powerline bị lỗi. Đễ khắc phục. Vào file .vimrc.bundles vào để comment trước các dòng liên quan đến plugin powerline.

Apr 14, 2013

Macro nho nhỏ hiện các thông báo.


Trong lúc viết đồ án về Chat Reference, mình gặp chút vấn đề về việc xuất các thông báo cho người dùng. Đồ án được thực hiện trên MFC và dùng hàm MessageBox , trong khi đó, lúc lập trình, mình lại thiết kế các module, tức phần bussiness lại thực hiện trên console, dùng hàm printf. Lúc chuyển qua MFC phải chuyển hết các hàm đó ... Vả lại mỗi lần viết hàm lại 1 lần viết chuỗi xuất ra, thành thử nhiều khi không nhất quán.

Macro này giúp giải quyết vấn đề nho nhỏ đó. Đúng ra thì 1 con trỏ hàm, cũng có thể làm được điều này. Nhưng mình lại thích làm trên macro hơn :)) =)). Một vấn đề trong con trỏ hàm là đôi khi các hàm mình cần dùng không cùng chung kiểu khai báo, và như vậy dùng con trỏ hàm sẽ không ổn. Đồng thời việc biến tấu cũng không được gọn.

#define MAX_BUFERROR 255
#define COMMAND_ERROR printf
#define NEWEXCEPTION(mess, code) { \
                        char err[MAX_BUFERROR]; \
                        sprintf(err,mess". CODE: %d.\n", code);\
                        COMMAND_ERROR (err);\
                        fflush(NULL);\
                        }

Chút chú thích cho cái này xíu:

  • MAX_BUFERROR: Độ dài chuỗi tối đã của thông báo
  • COMMAND_ERROR: Tên hàm thực hiện xuất ra chuỗi
  • Yêu cầu phải có thư viện stdio.h cho macro này

Apr 11, 2013

iTools: Phần mềm quản lí iPhone và các thiết bị Apple

Trong một ngày đẹp trời ngồi tìm cách chép nhạc, phim, video và tùy chỉnh các thông tin trên iPhone, mình đã tìm được phần mềm này. Cứu cánh cho các vấn đề nan giải.

Chép nhạc, phim, video sang Iphone

Ưu điểm

  1. Dễ sử dụng, miễn phí và thân thiện với người dùng
  2. Hỗ trợ đầy đủ các tính năng, cập nhật các phiên bản mới của Apple
  3. Quản lí app, file hệ thống, thông tin, các tập tin đa phương tiện dễ dàng và tiện dụng, không cần phải kết nối ITunes
  4. Chép nhạc, phim, video, cũng như xóa các tập tin này trong iPhone một cách dễ dàng và tiện dụng
  5. Tương thích với nhiều phiên bản Windows: Windows 7, Windows 8..

Lưu ý: Phần mềm yêu cầu phải có iTunes cài trong máy. Khi kết nối sẽ tự động sync với thiết bị mà không bị mất dữ liệu.

Download here

Apr 5, 2013

Hàm strtok và những rắc rối xung quanh


Thật bất ngờ và tình cờ vì phải đụng đến em này lúc train thi Thách Thức. Và cũng tò mò là vì sao em này có cách dùng lạ đến vậy. Nhưng trước tiên là một số thông tin hấp dẫn đã.

Cú pháp:


char* strtok ( char *str, const char *delimters); 
 
 

Công dụng: Tách chuỗi str thành các chuỗi con. Các kí tự ngăn cách được định nghĩa trong chuỗi delimters.

Tham số:

  • str: chuỗi cần tách.
  • delimters: chuỗi chứ các kí tự ngăn cách

Các sử dụng: để lấy từ phẩn từ sau khi được cắt bị kí tự phân chia. Ta sử dụng đoạn code sau:

pch = strtok (str," ,.-");
while (pch != NULL)
{
  // Phần tử lấy ra là pch pch
  // Xử lý các thao tác trên pch
 pch = strtok (NULL, " ,.-");
}
return 0;

Nhiều người sẽ thắc mắc: đoạn mã strtok(NULL, " ,.-") nghĩa là gì. Nguyên nhân là trong hàm strtok sẽ tạo 1 biến static là char* - ta tạm gọi là last. Ban đầu nó sẽ được gắn bằng NULL. Sau lần duyệt đầu tiên, last sẽ có giá trị là địa chỉ hiện thời của phần tử đã lấy được. Khi chạy đến hàm strtok thứ 2 nó kiểm tra tham số đầu vào có phải là NULL không. Nếu phải thì nó lấy địa chỉ của chuỗi đem cắt gắn bằng giá trị mà last đang giữ.

Tham khảo:

  1. Source code hàm strtok của Microsoft
  2. Source code hàm strtok của Apple.

Lưu ý: vì hàm này tạo 1 biến static tạm để giữ giá trị vừa cắt nên không dùng được cho xử lý đa nhiệm.