May 20, 2013

Dẫn nhập đầu tiên về Prolog và swi-Prolog.

Các ví dụ và hướng dẫn trong blog này sử dụng swi-prolog. Có thể tải phiên bản mới nhất ở đây. Bài này giới thiệu sơ lược về Prolog và trình thông dịch swi-prolog.

Prolog là một ngôn ngữ lập trình logic, khá với các ngôn ngữ C/C++ là lập trình thủ tục, Haskell lập trình hàm, và Java/C# là lập trình hướng đối tượng. Mô hình của Prolog là lập trình logic. Chính vì vậy, Prolog được giảng dạy và nghiên cứu chủ yếu ở các mảng liên quan đến khoa học máy tính, phục vụ cho trí tuệ nhân tạoxử lý ngôn ngữ tự nhiên.

Về nguồn gốc của Prolog. Cái tên xuất phát từ tên tiếng Pháp: Programmation en logique. Được Alain Colmerauer giới thiệu vào những năm 1970. Đây cũng chính là một trong những ngôn ngũ lập trình logic đầu tiên của thế giới.

Sử dụng SWI-Prolog

Bàn qua một chút về Prolog. Vì là ngôn ngữ lập trình logic, Prolog gồm có 2 phần: 1 phần qui định các mệnh đề và các luật (facts and rules). Và một phần dùng để truy vấn (query ) từ các tập mệnh đề và luật đã được định nghĩa trước đó.
Phần mở rộng của phần swi-prolog là .pl (lưu ý: ngôn ngữ Perl cũng có phần mở rộng tương tự).

Đối với môi trường Windows. Tạm thời tham khảo link sau.
Đối với môi trường Linux. Ta viết các luật ở file xx.pl. Sau đó dùng terminal mở chương trình swipl lên, lưu ý là mở ngay chỗ file xx.pl đã được viết. Sau đó dùng lệnh sau để load các luật.
[tên file không chứa phần mở rộng]
Ví dụ:
[xx]
Sau khi load xong các luật, ta có thể dùng các truy vấn một cách thuận tiện.

Ví dụ

Trong file laptop.pl:
laptop(aa).
laptop(bb).
laptop(cc).

Sau khi lưu xong, ta mở swipl và gõ lệnh:
[laptop].
laptop(aa).
laptop(dd).
Nếu sau lệnh laptop(aa). trả về truelaptop(dd). trả về False thì coi như thành công. Mặc xác ta không hiểu nó là cái chi chi :)).

Tản mạn đêm khuya

Đúng lý ra lúc này mình phải đăng giặt áo quần, làm bài cơ sở dữ liệu và viết lại phần About me phiên bản Tiếng Anh. Nhưng tạm thời xõa hết các công việc đó để dành cho tâm trí vài phút suy tư.

Không, đúng ra là cái đầu đang quay cuồng cuồng bởi những suy nghĩ mông lung vớ vẩn, công việc, deadline, tương lai, sở thích, đam mê, thời gian... Chao ôi, hầm bà lằng các thứ, hầm bà lằng các suy nghĩ. Nhưng có lẽ đêm nay thôi, mình sẽ đem đi mổ xẻ và giải quyết tất tần tật để khỏi phải bận tâm nữa.

Đối với các *deadlines ngắn hạn*. Mình đã mần xong đồ án 2 môn Mạng máy tính (chu choa, vỗ tay). Deadline CSDL coi như xong, mình xõa cái này vậy, để dành sức cho 20% điểm ngày mai. Coi như đã xong, không bận tâm. Đồ án Prolog sẽ được mần vào ngày mai với những dòng Hello world bên em ý. Thứ 3 sẽ bàn về bài toán, code thử chơi, blah blah. Đồ án cuối kì môn NM Công nghệ phần mềm sẽ được mần vào cuối tuần này.

Có nên mua điện thoại mới không nhỉ? Mẹ đã cho mua Lumia 520, mình cũng chỉ cần thế. Nhưng cứ thấy sao sao. Thôi, tạm gác qua. Đúng là mình thích em ý thật, nhưng cảm giác là mình sẽ không dùng hết công suất của em ý. Smartphone với mình là 1 thứ gì đó xa xỉ, tới bây giờ vẫn vậy. Trong thâm tâm muốn mua, nhưng lại thấy tốn kém. Mình có lo lắng quá không?

Đại khái, để hạ màn cái trò Lumia này, mình sẽ quyết định như sau: mình *sẽ mua* và lên kế hoạch mua *khi và chỉ khi (iff) có thông báo học bổng kì vừa rồi*. Xem như là 1 phần thưởng, vừa xem như là tự mình mua, không mang cảm giác tội lỗi lắm.

Giờ là lúc quên em Lumia đi.

Đến kì thi cuối kì. Và bắt đầu từ tuần này sẽ là thời kì ôn tập: được chừng nào hay chừng đó. Tuần này chơi theo chiến thuật tùy cơ ứng biến: hôm nào học môn nào thì ôn môn đó, chỉ ôn những phần vừa mới học xong. Hiểu hay không cũng phải ôn. Tuần sau nữa mới ôn từ gốc lên. Không thể để cái tình trạng cái đầu không biết tí gì về kiến thức được. Phải làm, và phải học bài.
Tạm thời là thế. Cứ phải ôn. Deadline thì deadline, nhưng giờ môn nào thì ráng ôn phần môn đó. Được nhiêu phần trăm không quan trọng, quan trọng là có cái đà để tuần tới có thể tiến hành ôn tập thật kỹ.

À, còn về vụ ngôn ngữ lập trình.

Mình khoái cái này: mỗi mô hình lập trình có 1 tư duy khác nhau. Biết nhiều ngôn ngữ khác sẽ giúp khả năng mở rộng tư duy cao. Nhưng không thể tránh 1 điều là hiện nay thời gian của mình *quá ít*. Và ngậm ngùi không thể học ngôn ngữ nào mình thích được.
C/C mãi mãi là 2 ngôn ngữ mình quan tâm bậc nhất, không thể chối cãi được. Có PHP, Perl, Python, Ruby, Java, C# là thứ khiến mình đau đầu.

PHP có lẽ phải biết. Ít ra phải master nó tí. Nền tảng trên PHP còn trụ rất lâu nữa. Và có lẽ mình sẽ kiếm cơm được nhờ bé này. Vậy em này sẽ được tìm hiểu SÂU

Python là 1 ngôn ngữ triển vọng và là của tương lai. Khi hệ thống giáo dục bên Mỹ đã chuyển qua xài Python, cả Google cũng thế. Rồi hiện nay các libs, các framework hỗ trợ rất nhiều. Chính vì thế: mình sẽ học em này

Perl đã già cỗi, thật sự em ý là tư tưởng ảnh hưởng dến nhiều em sau này. Nhưng có lẽ đành kính nhi viễn chi. Khi nào cần dùng đến hệ thống Linux thì mình sẽ xài và sử dụng như 1 cách tham khảo. Không quá chuyên sâu làm gì.

Java và C#. Cá nhân mình thích C# hơn. Nhưng Java có lí do để nó tồn tại. Và nó còn ảnh hưởng đến chuyện nền tảng sau này theo đuổi. .Net thật sự hay ho đấy, nhưng không thể nào ôm và master 2 ngôn ngữ này cùng 1 lúc. Mình chọn C#. Mình cần 1 ngôn ngữ khi cần thiết sẽ là nơi có thể mình phát triển ứng dụng. Đành rằng Android hiện nay khá bá đạo. Nhưng nếu xét ra, thì thị trường PC vẫn còn chỗ đứng, "niche market" trên di động không phải không có. Thành thử ra, ngày xưa mình không có thiện cảm với em Java mấy, nên giờ chắc cũng không có hứng lắm. Nếu bắt buộc dùng Java thì vẫn phải xài thôi, nhưng không thường xuyên và Master.
Cơ mà mình là dân open-source mà ta. Sao lại đi theo C#. Không ở đây là chuyện cơm áo. Cơm áo là C# và sở thích có thể đụng đến Java nếu cần.

Ryby thì dẹp. Bé ý khó chịu, mình sẽ không giành thời gian cho bé. Nếu tương lai có gì sáng sủa. Mà thực tế thì nó đang sáng sủa lắm. Thì mình sẽ nhào vô. Không phải là bây giờ, không phải là 2 năm đại học nữa. Mà là 1 thời điểm khác. Nhiều time hơn.
Ý, còn em JavaScript. Khi nào anh cần thì anh mới gọi em nhé.

Vậy đúng kết ta có 1 mức độ ưu tiên sau: C/C++ > PHP = Python > C# > Perl > Java > JavaScript. Và trong thời gian hiện tại thì chỉ có C/C++, Python và PHP (cu này để duy trì việc cộng tác viên của Khoa học trẻ). Có vậy thôi.

Có 1 vấn đề nữa. Đó là phong cách làm việc. Dạo này tác phong quá tệ, hiệu suất không hề cao. Việc chia nhỏ các công việc khá hiệu quả ở chỗ trông mình lúc nào cũng rảnh rỗi. Nhưng thiệt hại ở chỗ *không lường trước khả năng mất nhiều time cho task đó*. Đó chính là khả năng phân tích rủi ro quá tệ. Chính vì điều này, cộng thêm sự mất tập trung do quá chia nhỏ các task. Nên giờ đây chiến thuật làm việc sẽ khác đi chút.
  • Chọn những công việc bắt buộc phải làm xong và buộc phải xong trước tiên. Đây là điều cần né. Ví dụ như còn 1 ngày nữa nộp bài, còn 1 ngày nữa đi thi mà chưa nhét vô 1 chữ. Ở đây phải dùng tối đa khả năng để làm việc. Không đáng như vậy
  • Các công việc chắc chắn có thể làm được và chắc chắn hoàn thành trong khả năng đã định
  • Các công việc chưa có hướng giải quyết, hoặc tốn nhiều time sẽ được ưu tiên sau. Và sẽ dành nhiều thời gian cho sự tập trung ở đây
  • Những điều vớ vẩn linh tinh thì dẹp đi. Ví dụ: voz, game, xem phim lung tung. Dành những việc này khi nào thực sự có thời gian để đốt chơi
Có những task bắt buộc phải làm, như 1 cách rèn luyện bản thân:
  • Đọc sách mỗi ngày, sách chuyên ngành, sách ngoại văn.
  • Code mỗi ngày. Tính ra mình code quá ít để có thể trở thành 1 Mark, 1 Bill thứ 2
  • Trao dồi Tiếng Anh, đặc biệt là phần nghe.
  • Uốn lưỡi khi nào, suy nghĩ trước khi làm. Bình tĩnh và không có gì phải xoắn cả
Tôn chỉ bây giờ không còn là làm việc theo đam mê nữa. Mà là: *Làm việc, học hành theo trách nhiệm và đam mê*. Có thể ta mệt mỏi, có thể chán chường, có thể đơn độc. Nhưng không được từ bỏ trách nhiệm. Và sau đó, không được từ bỏ đam mê. Khi mọi rào cản về nhiệm vụ phải làm đã qua đi, thời gian dành cho đam mê sẽ trở nên thực sự chất lượng.

Gõ xong mà vẫn chưa buồn ngủ. Và vẫn chưa tìm được cảm hứng để làm việc tiếp.

May 18, 2013

Tùy chỉnh giao diện Dynamic View của Blogspot

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

Dynamic View được Blogspot hỗ trợ rất là lâu. Tuy nhiên, sau một thời gian dài không đụng đến em ý. Giờ đây, mình lại thấy sự tiện dụng và linh hoạt của giao diện này. Dưới đây là một số tùy chỉnh hay ho mà mình góp nhặt được. Nó có thể giúp blog trở nên lung linh lấp lánh ánh sao mai

Tất cả các thao tác trên được thực hiện ở phần Mẫu - Tùy Chỉnh - Nâng cao - Thêm CSS

  1. Tùy biến thanh tìm kiếm: Danh sách các kết quả sự hiện trước tiếp, như một combobox ở khung tìm kiếm

    #header input#search {
      -moz-transition: all 0.3s ease-in-out;
      -ms-transition: all 0.3s ease-in-out;
      -o-transition: all 0.3s ease-in-out;
      -webkit-transition: all 0.3s ease-in-out;
      transition: all 0.3s ease-in-out;
    }
    
    #header input#search:focus {
      width: 450px;
    }
    
  2. Xóa hiệu ứng viền, đổ bóng của các ảnh được chèn trên phần nội dung bài blog
    .entry-content img{
    box-shadow: none !important;
    padding: 0px !important;
    border: 0px !important;
    }
    
  3. Tuy biến thanh sidebar bên trái

    #sidebar:hover 
    { 
       width: 350px; 
    } 
    #sidebar 
    { 
      -webkit-transition: width 500ms ease-in; 
      z-index: 99; 
    }
    
  4. Hiện thông tin ngày giờ đăng bài trong phần nội dung

    .sidebar .article .article-header .date, .ss 
    {
      display: block !important;
    }
    
  5. Thêm phần "Read more" vào chế độ hiển thị magazine.
    .magazine .summary:after, .ss{
    content: "Đọc thêm ..." !important;
    color: red !important;
    }
    

May 14, 2013

Hướng dẫn cài đặt Ecipse và Android SDK


Hướng dẫn cài đặt Ecipse và Android SDK

Bài viết đang được hoàn thiện về mặt nội dung.

Cài đặt các công cụ sau:

Bước 1. Lần lượt cài đặt các phần mềm trên trên máy tính. Eclipse chỉ cần giải nén rồi tạo shortcut trên Desktop là xong.Lưu ý: Khởi động lại máy sau khi cài JDK xong.

Bước 2. Cài ADT: Android Development Tools. Bước này làm như sau:

  1. Mở Eclipse, chọn mục Help -> Install New Software.
  2. Trong mục Work with. Dán link sau vào và nhấn Enter:
       https://dl-ssl.google.com/android/eclipse/
      
  3. Click vào mục Developer tools được liệt kê bên dưới. Nhấn Next. Ngồi chờ vì load kha khá lâu. Sau đó Next tiếp và OK cho 1 thông báo warning.
  4. Sau khi cài xong và khởi động lại Eclipse. Nó sẽ yêu cầu reference đến thư mục SDK. Ta sẽ trỏ tới thư mục sdk con khi giải nén Android SDK (Nó có 2 thư mục:eclipse và sdk). Việc cấu hình đường dẫn làm ở Preference -%gt Android. Trong mục Use existing SDKs trong hộp thoại lúc khởi động lại cũng làm tương tự
  5. Next, sau đó tick Yes/No tùy ý. Sau đó nhấn Finish

Bước 3.Cài đặt nền tảng và các gói lập trình. Trong thư mục đã giải nén của Android SDK. Chạy chương trình SDK manager.exe. Ta chọn version mới nhất: 4.12 và cài các components tùy yêu cầu sử dụng. Tuy nhiên phải có SDK platforms, ARM .... Phần Extra có thể cài thêm Web driver và USB driver. Xong nhấn Install, rồi tick Acpert rồi chờ.

Vậy là xong phần cài đặt, bây giờ ta sẽ tạo thử 1 project Android.

Bước 1. File -> New -> Project -> Android. Chọn Android Application Project .

Bước 2. Cấu hình: thiết lập tên project, các phiên bản Android yêu cầu từ thiết bị. Next, sau đó chọn icon, giao diện, font chữ cho ứng dụng. Sau khi cấu hình xong nhấn Finsh.

Để build thử ứng dụng. Trong Window - > Android Virtual Divices Manager. New để tạo 1 thiết bị giả lập mới. Các thông số như màn hình, RAM, thiết bị blah blah. Xong rồi nhấn OK. Cuối cùng nhấn Start, rồi Launch để chạy chương trình giả lập

Sau khi chạy chương trình xong, ta tạm thời khóa màn hình của thiết bị. Chuyển sang bên Eclipse và click vào biểu tượng Run. Chọn Android Application. Sau đó app của ta sự tự động load lên trên thiết bị giả lập

May 7, 2013

Kiểm tra 1 điểm có nằm trong đa giác lồi không


Đoạn code này khá hữu ích trong đồ họa máy tính, với chức năng kiểm tra xem 1 điểm có nằm trong 1 đa giác lồi hay không. Khá là ngắn và có thể áp dụng rộng rãi. Điển hình như dùng trong kĩ thuật tô màu, chọn 1 đối tượng hình ảnh ...

Chỉ có 7 dòng nhưng chứa đựng tinh túy của thuật toán và kỹ thuật sử dụng ngôn ngữ lập trình

Code nó đây

int pnpoly(int nvert, float *vertx, float *verty, float testx, float testy)
{
  int i, j, c = 0;
  for (i = 0, j = nvert-1; i < nvert; j = i++) {
    if ( ((verty[i]>testy) != (verty[j]>testy)) &&
     (testx < (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]) )
       c = !c;
  }
  return c;
}

Giải thích

  • Danh sách tham số: nvert số đỉnh của đa giác. vertx - mảng chứa tọa độ x của các đỉnh trong đa giác. verty tương tự như vertx nhưng là tọa độ y. testx tọa độ x điểm cần kiểm tra. testy tọa độ y điểm cần kiểm tra
  • Giá trị trả về là kiểu int. 0 là điểm đó nằm ở ngoài, 1 là điểm đó ở trong đa giác

Nguồn: Link đây

May 4, 2013

Lập trình quản lý file trong nachos

Hướng dẫn quản lí tập tin trong nachos

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


Đề bài cho đồ án này: Link đây

Các bước để tạo system call đã được đề cập tại : đây . Các bạn có thể tham khảo để nhớ lại

Bước 1. Cấu hình cho bài tập

Đầu tiên ta tìm hiểu sơ về các lớp trong nachos liên quan đến quản lý file.

  • FileSystem. Địa chỉ: filesys/filesys.h. Lớp này để quản lý các hệ thống file. Trong lớp này có các phương thức hỗ trợ việc quản lý bao gồm: tạo, xóa, mở 1 file dựa vào tên file đó
  • OpenFile. Địa chỉ:filesys/openfile.h. Lớp này dùng để thực thi các phép toán (operator) trên 1 file, bao gồm đọc, ghi, lấy độ dài Phương thức Close 1 file chính là destructor của nó luôn.

Hiểu được cái đề.

  • Đề yêu cầu cùng 1 lúc quản lý được 10 file. Tức là đâu đó trong hệ thống phải có 1 cái mảng kiểu OpenFile chứa 10 phần tử. Dĩ nhiên nó không nằm trong exception method, vì nằm ở đó mảng này sẽ bị xóa và khởi tạo lại mỗi lần gọi. Chính xác hơn, ta sẽ đặt nó ở lớp FileSystem ở dạng public (cho dễ cài đặt, để private phải cài thêm cái getter/setter khá khó chịu). Mỗi giá trị của OpenFileID chính là chỉ mục (index) của biến đó trong mảng ta tạo ở trên. Ví dụ mảng đó là openf thì khi mở file openf[3] giá trị trả về của hàm OpenFile sẽ là 3. Và dĩ nhiên, stdinstdoout chính là openf[0]openf[1]
  • 2 bé stdinstdoout được tạo và mở ngay trong constructor của FileSystem, nhờ đó nó luôn luôn tồn tại và không mất đi. Và khi viết systemcall ta chỉ cần kiểm tra index == 0 || index == 1 (chính là cái OpenFileID) là xong
  • Các thao tác đọc, viết, đóng đã có sẵn rồi, ta chỉ cần thêm phương thức Seek vào OpenFile class. Phương thức này được cài đặt bằng lệnh LSeek. Nếu chú ý các phương thức đọc và viết đã được cài sẵn thì có thể dễ dàng cài đặt phương thức này.
  • Về vấn đề console, khi người dùng yêu cầu các file stdinstdout thì ta xử lý riêng rẽ ( 1 lệnh if thôi). Để kiểm tra xem user có gọi 2 file đó không thì chỉ cần check OpenFileID

Cài đặt

  • Lưu ý: trong FileSystem và OpenFile có 2 version riêng cho mỗi lớp, để đảm bảo an toàn, ta cũng cài đặt cả 2 version đó những thay đổi khi làm
  • Project đã chạy được: Link đây

May 3, 2013

Sublime Text 2

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

Thực tế khi viết blog này, mình vẫn chưa biết nên chọn ẻm nào. Giống như cuộc chiến text editor war, Notepad++ và Sublime Text 2 là 2 đối thủ cực kì nặng ký