Jun 19, 2013

[Tips] Tổ chức mã nguồn và lập trình Windows

Hôm nay lại hì hục với đồ án cuối kì môn Đồ Họa, kinh nghiệm thương đau lại về. Mà đau đớn hơn là do cu Micro$oft làm ra. Có thể kể một số lỗi chết người sau.
Các định danh đã được xài. Tụi MS rất vui tính, trong các thư viện tụi nó đã vứt vào đó rất nhiều biến, hàm, macro toàn cục rất dễ bị nhầm lẫn. Ví dụ từ nearfar. Nếu khai báo rồi mà lại còn xài windows.h thì coi như toi.

Cái thứ 2: Dù lười mấy đó thì lười. Thì việc định nghĩa hàm (hàm function chứ không phải method). Nếu đặt vào file cpp chứ không đặt trên header file. Vì chỉ cần 2 file trong project cùng include file header đó thì hàm đó sẽ được định nghĩa 2 lần. Và lỗi này khó giải quyết. Để cẩn thận, tốt nhất là nên rạch ròi giữa phần khai báo và định nghĩa.

Cái thứ 3: Tổ chức dữ liệu cho rõ ràng và cụ thể. Điều này đặc biệt quan trọng trong lập trình team. Sự nhập nhằng này khiến cho code chung rất khó chịu. Chính điều đó làm mã nguồn rối rắm, thuật toán không cụ thể và đặc biệt là khó giao tiếp với nhau qua code được.

Cái thứ 4: Chuyện đặt trình tự file header khá là hay ho. Nó có thể giúp ta xác định được lỗi nhanh chóng. Dưới đây là 1 số cách thông dụng:
  • Gom tất cả những header file cần thiết vào 1 header file. Ví dụ đây là 1 file tên libs.h
    /* * * * * * * * * * * * * * * * * * * * 
    * System and Standard Library header file
    * Author: DangKhoaSDC.
    * * * * * * * * * * * * * * * * * * * * /
    #ifndef _STANDARDLIBS
    #define _STANDARDLIBS
     
     
    #ifndef __cplusplus
    #error "Must use C++ compiler!!"
    #endif
     
    /* Use pre-defined C/C++ compiler macros to determinate OS,
    * version or architectures
    * More info: http://sourceforge.net/p/predef/wiki/Home/
    */
    #ifdef _WIN32
    /* * * * * * * * * 
    * Place for Windows
    *  * * * * * * * */
    #endif
     
    #ifdef __gnu_linux__
    /* * * * * * * * * 
    * Place for Linux
    *  * * * * * * * */
     
    #endif
     
    #include <iostream>
    #include <string>
    #include <vector>
    #include <algorithm>
     
    #include <cstdlib>
    #include <cstdio>
     
    /*
    * User-defined header file
    */
    #endif 
    
    Sau đó thì có thể thoải mái add file này vào trong các mã khác. File này cần header file đặc biệt thì mới cần thêm vào sau.
  • Tùy cơ ứng biến. File nào cần cái gì thì include cái đó. Một cái lợi lớn là không biên dịch ra những file quá lớn. Nhưng đôi lúc lại không quản lí được vì hơi lộn xộn. Hoặc cần phải tự tạo một phong cách đặt trình tự các header file để tránh gây ra các lỗi đáng tiếc.

Chút về viết tiếp
================

Jun 15, 2013

Review Linux Mint 15 Olivia

Không hổ danh là bản distro cực kì ổn định, Linux Mint 15 đã cho thấy những bước tiến khá tốt và giữ vững phong độ. Tuy không có quá nhiều thay đổi đột phá. Nhưng những cải tiến mới cũng đủ làm người dùng hài lòng.

Giao diện của cu cậu:
Đây là phiên bản dùng giao diện Cinnamon. Rất tinh tế, nhẹ nhàng và hiện đại. Hiện nay thì cu cậu mới hỗ trợ cho giao diện MATE và Cinnamon. Dĩ nhiên có thể dùng các giao diện khác nếu muốn ( Dùng Software Manager để tải).
Một số thay đổi trong phiên bản này:
  • Bản cày đặt "nặng" hơn tầm dăm ba MB. Tuy nhiên Linux Mint không còn cài sẵn ứng dụng Libre Office. Nautilus,cũng bị loại bỏ không thương. Cùng lúc đó, Linux Mint đã cài thêm một số gói: systemd, kmod. Ngoài ra không có quá nhiều thay đổi về hệ thống .
  • Thêm tính năng Desklets bên giao diện Cinnamon. Tượng như các Widget bên Windows. Cá nhân thì mình không thích nó lắm.
  • Login Screen hỗ trợ các giao diện được thiết kế bằng HTML nên rất đẹp và bắt mắt.
  • Software Source bây giờ đã chuyên dụng hơn so với trước, chăm chút và cấu hình dành riêng cho Linux Mint. Trong Software Source hỗ trợ đo tốc độ của các server. Khá hữu ích và tiện dụng:
    Lưu ý: Không thì nên dùng server của VietNam khi update và cài đặt gói. Đã có lỗi xung đột về các gói phần mềm ở server này.
  • File Manager bây giờ đã trở nên lung linh lấp lánh ánh sao mai hơn. Có thể thấy nó na ná với cu Windows Explorer của Windows 7
  • Các theme, extension được vứt hết lên mạng. Giúp giảm tài nguyên sử dụng lưu trữ trên máy, đồng thời giúp người dùng có thể cập nhật các phiên bản mới nhất của giao diện.
Hiệu năng luôn là vấn đề mà mình quan tâm. Và thực sự Linux Mint Olivia đã hoàn thành rất tốt. Máy chạy mượt. Hệ thống chạy nên chiếm chỉ khoảng 350MB RAM đối với phiên bản x64. Ngoài ra, Linux Mint cũng đã cấu hình sao cho máy có thể mượt mà hơn. Chính điều này giúp cho Linux Mint xứng đáng trở thành bản distro đáng giá cho người mới sử dụng Linux cũng như các người dùng tầm trung và muốn out-of-the-box trong quá trình cài đặt, cấu hình.
Những việc cần làm sau khi cài đặt Linux Mint:
  • Thực hiện update hệ thống. Đây là 1 điều cần thiết, có nhiều tính năng của Linux Mint bị "giấu" không có trong bản cài đặt. Nhưng khi update sẽ có.
  • System -> Language. Update hệ thống ngôn ngữ, nếu cần thiết thì có thể cài đặt thêm ngôn ngữ ViejtNam và dùng ibus. Trong Synaptic và cài đặt gói ibus-unikey.
  • Cài LibreOffice, cái này có thể dùng Software Manager để dễ cài đặt.
  • Ubuntu Tweak: giúp tinh chỉnh hệ thống
  • Dành cho laptop: kéo dài thời gian dùng pin, giảm nhiệt máy
  • Chmsee: ứng dụng đọc các file chm

Jun 6, 2013

[Tips] Macro, các vấn đề liên quan đến vùng nhớ và quản lí vùng nhớ.



Đang phải cày bừa với đồ án Đồ họa máy tính, nhiệm vụ của mình là viết 1 module để đọc được file WaveFront Obj. Dĩ nhiên là đã xong được các thành phần cơ bản. Link code ở đây Qua lần code tốc độ này, mình rút ra vài điều.

  • Khi dùng macro có nhiều dòng, tuyệt đối không được có dấu space, tab sau đầu \ khi xuống dòng. Nếu có, đôi khi sẽ dính các lỗi rất khó debug. Vì khi sử dụng macro, ta chấp nhận 1 sự thật cay đắng là không debug trực tiếp lên code macro được.
  • Kỹ thuật macro rất tốt cho việc viết các code tổng quát và tránh bị lặp mã. Nhưng như 1 con dao 2 lưỡi, đã chạm đến macro là chạm đến những rắc rối kỹ thuật linh tinh.
  • Trong C/C++ . Điều đau lòng là ta phải trực tiếp quản lí vùng nhớ. Nên máy tính không giúp ta chuyện vùng nhớ đó được alloc (xin cấp vùng nhớ) chưa, được init (khởi gán) chưa. Nên cần có 1 chiến lược code hợp lí. Vì nếu lỗi liên quan đến vùng nhớ, ta khó khoanh vùng được lỗi. Và thường, lỗi chỉ được báo như là lỗi ở code ta giải phóng vùng nhớ. Còn thực tế thì đâu đó xa vời trong các hàm ta làm
  • Quản lí code tốt sẽ giúp debug tốt hơn. Và điều quan trọng là: điều không thể thì chắc chắn nó không xảy ra rồi. Đừng ngồi đó mà loay hoay tìm hiểu. Nếu có gì đó lỗi ở lệnh int a = 1+1; thì đó không phải là lỗi của người lập trình.
  • Đôi khi, giải pháp nằm ngay trước mắt. Vấn đề là do ta đã không chịu đọc kỹ tài liệu

Jun 2, 2013

Mở chuyên mục mới

Một chuyên mục mới mang tên Tips and Tricks sẽ được mở. Nơi đây sẽ chưa các mẹo vặt và thủ thuật lập trình, sử dụng HĐH Linux, Windows cũng như giải quyết những vấn đề *lặt vặt* khi sử dụng máy tính.