Category Archives: Lập trình

Nơi chia sẻ các kĩ thuật, hiểu biết về lập trình.

How to …

Get number of lines of a text file and assign this value to a variable

num_lines=($(wc -l <file_name>))

Ex:
Fruits.txt

Annona
Coconut
Papaya
Mango
Nuts

We have 5 lines.

num_lines=($(wc -l Fruits.txt))
echo "The number of lines in Fruits.txt is $num_lines"

It will print “The number of lines in Fruits.txt is 5”

Write log of a command in terminal to file

<command> > <log_file>

Ex:

echo "Have a nice working day!" > happy.txt

Result:
happy.txt

Have a nice working day!

Some problems with array

Initialize an array

arr=(<element1> <element2> ...)
#===================================================
# example
arrNum=(1 2 3 4)

Access elements

${<NameOfArray>[index]}
#===================================================
# example
echo ${arrNum[1]}    # => 2

Print all elements

${<NameOfArray>[*]}    
# or 
${<NameOfArray>[@]}
#===================================================
# example
echo ${arrNum[*]}    # => 1 2 3 4

Get lengh

${#<NameOfArray>[*]} 
# or 
${#<NameOfArray>[@]}
#===================================================
# example
echo ${#arrNum[*]}    # => 4

——— Have fun! 🙂 ———

Vẽ biểu đồ với thư viện Matplotlib

Đây là một thư viện khá là mạnh mẽ trong việc tạo biểu đồ với Python. Để bắt đầu với nó chúng ta cần install nó. Nếu cài Anaconda thì nó đã có sẵn rồi! Ở đây tôi xài Jupyter notebook của Anoconda để code! (Nếu trên máy đã có Anaconda thì ta chỉ việc Run->powershell và cd đến thư mục muốn làm việc rồi gõ jupyter notebook và tạo một file để code!).
Nếu bạn muốn xài IDE khác để code thì có thể tham khảo link sau:
https://heoublog.wordpress.com/2016/09/27/cong-cu-de-lap-trinh-python/

Let’s start!

import matplotlib.pyplot as plt

# Từ điển chứa danh sách các món ăn và số người thích
Food_counts = {'Fish': 10, 'Meat': 20, 'Egg': 50, 'Milk': 30, 'Crab': 40}

# Chuẩn bị dữ liệu:
# Sort Số lượng người thích (giảm dần)
Counts = sorted(Food_counts.values(), reverse=True)
# Sort các món ăn dựa vào số lượng người thích (giảm dần)
Foods = sorted(Food_counts, key=Food_counts.__getitem__, reverse=True)

# Chỉ số các món ăn
ind_Foods= range(len(Food_counts))

# Vẽ biểu đồ cột
plt.bar(ind_Foods, Counts, align='center')
plt.xticks(ind_Foods, Foods)

# Label x, y axit
plt.xlabel('Foods')
plt.ylabel('Count (like)')
# Label title of bar char
plt.title('FOOD WHICH PEOPLE LIKE')

# Thêm các giá trị trên mỗi cột
for x, y in zip(ind_Foods, Counts):
    plt.text(x+0.02, y+0.05, '%d' % y, ha='center', va= 'bottom')

# Tăng trục y thêm 20 đơn vị
plt.ylim(0, Counts[0] + 20)

# Cuối cùng là show kết quả!!!
plt.show()

Kêt quả:

Đây chỉ là một ví dụ nho nhỏ nhưng khá hữu ích nếu bạn muốn thống kê một điều gì đó trong cuộc sống!!! Ngoài biểu đồ cột ra còn có khá là nhiều biểu đồ khác thú vị hơn.

Sau đây là một số link hướng dẫn, tham khảo nếu bạn có ý định tìm hiểu về thư viện này:
Matplotlib gallery:
http://www.labri.fr/perso/nrougier/coding/gallery/
Một thư viện ví dụ đồ sộ về matplotlib:
http://matplotlib.org/gallery.html
https://plot.ly/matplotlib/
——— Have fun! ——–

OpenMP

OpenMP (Open Multi-Processing)

OpenMP là một API hỗ trợ lập trình song song (ngoài ra bạn có thể tìm hiểu về CUDA của NVIDIA). OpenMP bao gồm nhiều chỉ thị chạy khác nhau. API này đã có sẵn trong Visual Studio C/C++. Vì thế khi sử dụng bạn chỉ cần import dòng này vào:

#include <omp.h>

là xong!

Bạn thử chạy dòng code này:

  
#include <stdio.h>
#include <omp.h>
#include <conio.h> # Để có thể sử dụng lệnh _getch() (dừng màn hình)

int main()
{
    #pragma omp parallel
    {
        printf("Hello world!\n");
    }

    _getch();
    return 0;
}

Sau khi chạy xong đoạn chương trình trên bạn có lẽ CHỈ THẤY 1 dòng Hello world! được xuất ra! Có lẽ bạn sẽ nói: “Như vậy mà gọi là SONG SONG ah?!? Có khác gì dòng code bình thường đâu?!?”.
Vấn đề là ở đây! Nếu bạn đã thiết lập chạy song song thì sẽ in ra 4 dòng Hello world! (Còn tùy vào máy của bạn có mấy nhân! Bạn có thể biết được số nhân của máy qua dòng lệnh sau:

printf("Số nhân: %d\n", omp_get_max_threads());

)
Tuy bạn có thể có 4 nhân nhưng lại không in ra được màn hình 4 dòng Hello world! là do bạn chưa enable cho nó!

Để Enable OpenMP bạn làm như sau:
* Phải chuột lên project của bạn, chọn properties.
* C/C++ -> Language, và thay đổi “OpenMP Support” thành ‘Yes’.
* Click OK!

Xong! Bạn có thể Ctrl+F5 lại xem!!! Nếu vẫn chỉ có 1 dòng được in ra thì máy của bạn chỉ hỗ trợ có 1 nhân thôi!

Bạn có thể tham khảo thêm tại đây

Bài phỏng vấn của Guido van Rossum

“Guido van Rossum is a Dutch programmer who is best known as the author of the Python programming language.”
—wikipedia—

Bài phỏng vấn Guido van Rossum (GvR), tác giả của Python, qua đó ta hiểu được công việc của ông tại Google (trước đây) và Dropbox (hiện tại), cũng như quan điểm của ông về lập trình hướng đối tượng, lập trình hàm, multi-line lambda, pypy, và Python 3.

Bạn có thể đọc ở đây: Link

Công cụ để lập trình Python

Hiện nay có rất nhiều Editor để học và làm việc với Python (hay còn gọi là IDE). Có thể kể đến một số IDE tiêu biểu như sau:
Atom (Free – Open Source)
Atom
IDE này được gọi là “A hackable text editor for the 21st Century” – một cái tên khá là kêu! Bạn có thể tải và xem thêm thông tin về IDE này tại trang web này: Atom

Tips

  • Bạn có thể cài thêm các package (các gói tiện ích) cho IDE này bằng cách nhấn tổ hợp phím Ctrl + Shift + P và nhập Install Packages And Themes. Trong đây chứa rất nhiều các package hữu ích giúp bạn code nhanh hơn! Có thể kể đến một số package sau: Autocomplete-python (package này rất tuyệt!), python-tools, Script (Run code in Atom), Activate-power-mode (package này khá là tuyệt khi bạn gõ code – như bắn pháo hoa zậy)… ngoài ra còn có khá nhiều nữa. Bạn chỉ cần nhập từ khóa python chương trình sẽ hiện ra các package có liên quan kèm theo mối package là một vài dòng thông tin liên quan đến package đó!

  • Ngoài ra bạn còn có thể cài thêm các theme khác cho IDE cũng bằng dòng lệnh trên.

  • Nếu bạn không thích package nào bạn có thể vô hiệu hóa (Disable) nó.

  • Ngoài Python, IDE này còn hỗ trợ khá nhiều ngôn ngữ lập trình khác như C/C++, C#, Javascript, TypeScipt,..

Sublime Text (Not Free – Use as free!!!)
sublimetext
IDE này được gọi là: “The text editor you’ll fall in love with” <3.

IDE này có nhiều điểm giống với Atom. Bạn có thể tải và xem thêm thông tin về IDE này tại trang web này: Sublime Text.

Tại sao nói Not FreeUse as free vì bạn có thể xài như bản full nhưng sau khoảng 20 lần save thì chương trình hỏi bạn có muốn mua không nhưng bạn yên tâm bạn chỉ cần Cancel là xong! :).

Lần đầu bạn tải về thì bạn cần cài thêm cái plugin Package Control (Để có thể cài thêm các package hữu ích khác!). Bạn có thể vào trang Package Control để có thể biết thêm chi tiết.

Để cài Package Control, bạn vào View -> Show Console. Lúc này chúng ta sẽ thấy một dòng console nhỏ phía dưới, hãy copy đoạn code dưới đây và paste vào khung nhập lệnh rồi ấn Enter.
Tùy theo phiên bản của sublime text:
Ver2:

"import urllib2,os,hashlib; h = '2915d1851351e5ee549c20394736b442' + '8bc59f460fa1548d1514676163dafc88'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); os.makedirs( ipp ) if not os.path.exists(ipp) else None; urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler()) ); by = urllib2.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); open( os.path.join( ipp, pf), 'wb' ).write(by) if dh == h else None; print('Error validating download (got %s instead of %s), please try manual install' % (dh, h) if dh != h else 'Please restart Sublime Text to finish installation')"

Ver3:

"import urllib.request,os,hashlib; h = '2915d1851351e5ee549c20394736b442' + '8bc59f460fa1548d1514676163dafc88'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)​"

Giờ thì Esc để tắt cái console đi. Cuối cùng là khởi động lại Sublime Text.
Sau khi khởi động Sublime Text nhấn tổ hợp phím Ctrl + Shift + P và nhập Package Control: Install Package. Cũng tương tự như đối với Atom, bạn có thể nhập từ khóa vd Python bạn sẽ nhận được một nùi các package có liên quan muốn cài cái nào chỉ cần click chọn là OK!

Tips

  • Bạn có thể paste 1 đoạn code bất kì (Python chẳng hạn) và nhấn tổ hợp phím Ctrl + Shift + P nhập Set Syntax: Python thì chương trình sẽ format code theo Python cho bạn!

  • Một số phím tắt thông dụng trong Sublime Text (bạn cũng có thể tìm thấy các phím tắt này ở một số IDE khác):

  • Ctrl+Shift+L …..: chọn các dòng sau đó nhấn tổ hợp phím này nó sẽ thêm các con trỏ vào cuối dòng và chúng ta tha hồ gõ trên nhiều dòng
  • Ctrl+Shift+Mũi tên lên xuống : di chuyển dòng code
  • Ctrl+D…………..: chọn các từ giống nhau có thể sửa đồng loạt (thêm con trỏ ở những nơi đã chọn)
  • Alt+F3…………..: giống Ctrl+D nhưng chọn hết
  • Ctrl+L…………..: Chọn các dòng code
  • Ctrl+Shift+K……..: Xóa dòng tại vị trí con trỏ
  • Ctrl+/…………..: bật/tắt chú thích cho dòng được bôi đen hay dòng có con trỏ
  • Ctrl+K+U…………: chuyển chữ thường thành chữ hoa
  • Ctrl+K+L…………: chuyển chữ hoa thành chữ thường
  • F6………………: bật tắt chế độ kiểm tra chính tả tiếng anh
  • Ctrl+H…………..: Search+Replace
  • F11……………..: bật/tắt fullscreen
  • Shift+F11………..: bật/tắt fullscreen ko có sidebar
  • Alt+Shift+1,2,3,4…: chia màn hình soạn thảo thành các cột (1, 2, 3, 4 cột)
  • Alt+Shift+5………: chia đều màn hình soạn thảo thành 4 vùng bằng nhau
  • Alt+Shift+8,9…….: chia màn hình soạn thảo thành 2, 3 dòng đều nhau
  • Bạn cũng có thể code ngôn ngữ khác trên IDE này (giống Atom)

Wing (Not Free)
wing

IDE này tập trung hỗ trợ cho việc code Python nên trông rất chuyên nghiệp! 🙂 Có thể nói là “support đến tận răng”. Đối với IDE này bạn có thể code Python (autocomplete code, hint code), run, debug, xem thông tin các module, tham số các hàm,… Nhưng bạn nếu là sinh viên có email sinh viên thì bạn có thể yêu cầu bản quyền phần mềm này cách miễn phí! (Bản quyền khoảng 6 tháng (12 tháng) / 1 máy. Nếu bạn muốn yêu cầu cho nhiều máy bạn có thể viết thư yêu cầu unclock thêm! Of course by English! 🙂 ).

Python Tools for Visual Studio (Free – Open Source)
ptfv

Đây là một plug-in cho Visual Studio. Nó không hề kém cạnh các IDE trên!!! Let’s try and feel! 🙂
Nếu máy bạn đang sở hữu Visual Studio 2015 thì bạn hoàn toàn có thể xài bản mới nhất (Đối với các bản Visual về trước (Visual Studio 2010 – 2013) bạn có thể xài bản thấp hơn).
Download tại: Download PTVS

JetBrains PyCharm (Not Free – Free)
jetbrain1

Đây cũng là IDE rất mạnh mẽ được rất nhiều các coder Python lựa chọn!

Tùy mục đích sử dụng, bạn có thể lựa chọn bản có phí, hay miễn phí, bản cho giáo dục (Edu). Tuy nhiên nếu bạn là học sinh / sinh viên bạn có thể dùng tải khoản email của mình để có thể đăng kí nhận miễn phí bản quyền các IDE của JetBrains (Giống với Dream pack). Tuy nhiên bạn cần tuân thủ các luật của nhà cung cấp! (Không dùng cho mục đích thương mại). Bạn có thể sở hữu các IDE sau ^^:

jetbrain

Link:
Link đăng kí tài khoản student để get free các IDE
Link download IDE

Notepad++ (Free)
notepad

Nếu bạn là một người thích sự “đơn giản” bạn có thể chọn cho mình IDE này! 🙂
Download tại: Notepad++


Trên đây chỉ là một số IDE mà tôi đã từng sử dụng để làm việc với Python! Hy vọng bài viết này sẽ giúp bạn chọn được IDE để code Python – một ngôn ngữ đáng học nhất mà tôi từng biết! 🙂

Cách để học bất cứ ngôn ngữ lập trình nào !?!

Có rất nhiều cách để học một ngôn ngữ lập trình (hầu như các ngôn ngữ lập trình có sự tương tự nhau – Đó là suy nghĩ của riêng cá nhân thôi!!!). Theo Zed A.Shaw – tác giả của cuốn sách Learn Python the hard way có đề xuất một phương pháp như sau:


1. Get a book or some introductory text about the language.
2. Go through the book and type in all the code, making it run.
3. Read the book as you work on the code , taking notes.
4. Use the language to implement a small set of programs you are familiar with in another language.
5. Read other people's code in the language, and try to copy their patterns.

Có thể tạm dịch như sau:

1. Kiếm một cuốn sách hoặc vài thông tin hướng dẫn về ngôn ngữ mà mình học.
2. Đọc qua cuốn sách và gõ các đoạn code trong sách đó, và quan trọng là những đoạn code đó chạy được.
3. Đọc kĩ cuốn sách để hiểu về các đoạn code đó, ghi chú lại những điểm quan trọng.
4. Sử dụng ngôn ngữ đó để thực hành với những bài tập nhỏ mà bạn đã thực hành với ngôn ngữ bạn đã biết.
5. Đọc code của người khác và thử sao chép phong cách lập trình của họ.

Riêng tôi, tôi cảm thấy việc gõ hết code là không cần thiết bởi vì nếu thực hành với số lượng code ít thì có thể được nhưng đối với một lượng code lớn thì có thể khá mệt (Thiếu động lực!) nên tốt nhất là nếu đoạn code quá dài thì nên copy và paste để xem kết quả! Lúc đó bạn sẽ biết kết quả và tới lúc quan tâm đến nó là đọc hiểu và nếu có thể thì code lại!!!

Đọc code của người khác – Đó là cách để nâng cao kỹ năng của bản thân. Thông qua code của người khác bạn có thể học được nhiều thứ như: phong cách lập trình, cách suy nghĩ,…
Bạn có thể lên Github để tìm một số đoạn code của ngôn ngữ lập trình mà mình học! Chúc bạn thành công!

Toán tử sizeof với struct (C)

Toán tử sizeof hay được dùng để tính kích thức bộ nhớ cần khi cấp phát động. Để diễn tả một cách dễ hiểu thì ví dụ là hay nhất!!!

struct HS {

        char name;

        int id;

};

Bạn đoán thử sizeof(HS) = ???

Có lẽ bạn sẽ đoán nó = 5 (sizeof(char) = 1, sizeof(int) = 4). Nhưng trình biên dịch lại cho kết quả là 8??? Vì sao vậy?

Cơ chế cấp phát là như sau:

  • Đầu tiên nó sẽ lấy kích thước của biến lớn nhất trong struct HS là sizeof(id) = 4 cấp phát 4 byte để chứa biến name (kích thước = 1 byte) còn dư 3 byte.
  • Tiếp theo nó sẽ chứa tiếp biến id (kích thước 4 byte) mà chỉ còn có 3 byte (không đủ) nên bộ nhớ sẽ cấp phát thêm 4 byte để chứa biến id.
  • => Sau khi cấp phát: 8 byte (còn dư 3 byte) !!!

Đến đây chắc bạn có câu trả lời rồi nhỉ? ^^ . Để hiểu thêm ta có 1 ví dụ típ theo như sau:

struct SV {

        int DiemAV;

        double diemToan;

        double diemLT;

        int diemRL;

};

Bạn đoán xem sizeof(SV) = ???

Đáp án là 32 byte!!! (dư 8 byte). Vậy phải làm sao để tiết kiệm được 8 byte này???

Đơn giản nhất là sắp các biến trong struct SV lại thôi!!!

struct SV {

        int DiemAV;

        int diemRL;

        double diemToan;

         double diemLT;

};

Và bây giờ  sizeof(SV) = 24 byte !!! ^^

struct SV { };

Now, sizeof(SV) = ???

=> 1 byte!!!

Mặc định sẽ dành 1 byte để chứa struct!!!

Con trỏ trong C/C++

Con trỏ thực sự là một biến giữ địa chỉ. Tuy nhiên nó ẩn chứa rất nhiều “bí ẩn”!?! Ta cùng xem ví dụ sau:

01. short a = 5;
02. short* pshort;       // Khai báo một con trỏ kiểu short
03. unsigned long* plong; // Khai báo một con trỏ kiểu unsigned long
04. pshort = &a;          // Con trỏ pshort đang giữ địa chỉ của a
05. *pshort = 7;          // Dòng này đã thay đổi giá trị của a (bây giờ a = 7)
06. unsigned short A[5] = {0}; // Khai báo mảng A với năm phần tử
07. plong = (unsigned long*)&A[3];
08. *plong = 0xDEADBEEF;   // A[3] = 0xBEEF ~ 48879; A[4] = 0xDEAD ~ 57005;
/*
Dòng code 7, 8 khá đặc biệt! kiểu long có kích thước 4 byte mà kiểu short có kích thước 2 byte nên *plong tương đương một biến 4 byte bao trùm lên cả A[3] và A[4]
*/

Qua những dòng code trên bạn chắc cũng đã phần nào hiểu sơ về con trỏ!!! ^^

VOID
Bạn để ý thấy hầu như các con trỏ trên đều có kiểu cụ thể (int, short,…) Thế thì liệu có con trỏ nào khác mà không thuộc những kiểu dữ liệu ấy không?!? Xin thưa là có! Đó là con trỏ vô kiểu 🙂 (không thuộc kiểu nào hết ak!)

void*

Bạn nghĩ biến A[3] ngoài kiểu unsigned short còn có kiểu nào nữa không??? 🙂 Đó là kiểu void!!! Có thể bạn sẽ khá bất ngờ về điều này!

Biến con trỏ void có thể nhận địa chỉ của bất kì biến nào, có thể được gán bằng biến con trỏ tùy ý. Dựa vào đặc tính này bạn có thể viết những đoạn mã nguồn tổng quát có thể dùng lại cho nhiều kiểu dữ liệu khác nhau.

Bản thân kiểu void không xác định kích thước!!! Bạn nghĩ sizeof(void) = ??? 🙂 VÔ NGHĨA! Nhưng sizeof(void*) = 4 (Tùy vào công nghệ). Vì sao vậy? Đó là do con trỏ void* giữ địa chỉ bộ nhớ.
Ví dụ:

float a[5];
void *pvoid = a;
...

pvoid + 1, p[1], *p => Error!!!
Mọi thao tác đều phải ép kiểu!
*p => Phải là: *(float*)p

CON TRỎ HẰNG

Con trỏ trỏ đến vùng dữ liệu hằng

Vùng dữ liệu mà con trỏ đang trỏ đến không được phép sửa đổi nhưng bản thân biến con trỏ thì có thể thay đổi (có thể trỏ đến nơi khác, tăng giảm địa chỉ).

const char* pStr = “I love you…<3”;
// <=> char const* pStr = “I love you…<3”;
pStr[0] = ‘i’;             // Error! => Dữ liệu không thể đổi
pStr++;                      // OK
pStr = “I miss you!”;   // OK
//——————————-
const char* pChr;
char cStr[17] = “Have a nice day!”;
cStr[0] = ‘h’;        // OK
pChr = cStr;
pChr[0] = ‘H’;     // Error! => Ko thể thay đổi

Hằng con trỏ

Bản thân con trỏ bị gim vào 1 địa chỉ bộ nhớ và không thể trỏ đến vùng dữ liệu mới hay tăng giảm con trỏ. Điểm đặc biệt là vùng dữ liệu có thể thay đổi thông qua con trỏ.

char* const cp;
char cStr[] = "Have a nice day!";
cp = cStr;
cp[0] = 'h';    // OK
cp = "Have a nice night!";  // Error!
cp++;  // Error!

Hằng con trỏ đến vùng dữ liệu hằng

Đây là một con trỏ hằng. Nó không được phép thay đổi giá trị địa chỉ mà nó đang giữ và cũng không thể thay đổi vùng dữ liệu mà nó đang trỏ đến.

const char* const ccStr = "You are number one!";
// Chú ý có 2 chữ "const" gần nhau
ccStr[0] = 'y'; // => Error!
ccStr = "Good!"; // => Error!

Con trỏ hàm

Chức năng: giữ các hàm. Con trỏ hàm tạo điều kiện cho các Dev viết những đoạn code có khả năng tái sử dụng cao trong nhiều tình huống nhờ việc biến tấu các con trỏ hàm. Khi thay con trỏ hàm bằng những hàm cụ thể thì chương trình sẽ thực thi ứng với từng hàm cụ thể.
VD:

// Các hàm phép tính cơ bản
int Cong(int a, int b){ return a + b; }
int Tru(int a, int b){ return a - b; }
int Nhan(int a, int b){ return a * b; }
// Hàm chia lấy phần nguyên
int ChiaLayNguyen(int a, int b){ return a / b; }
// Hàm chia lấy phần dư
int ChiaLayDu(int a, int b) { return a % b; }
int TinhToan(int a, int b, int (*ConTroHam)(int, int))
{ return ConTroHam(a, b); }
//----------------------------------------------------
// MAIN
int main()
{
    // Sử dụng
    int a = 10, b = 3;
    cout << a << " + " << b << " = "
         << TinhToan(a, b, &Cong) << endl;

    cout << a << " - " << b << " = "
         << TinhToan(a, b, &Tru) << endl;

    cout << a << " * " << b << " = "
         << TinhToan(a, b, &Nhan) << endl;

    cout << a << " / " << b << " = "
         << TinhToan(a, b, &ChiaLayNguyen) << endl;

    cout << a << " % " << b << " = "
         << TinhToan(a, b, &ChiaLayDu) << endl;

    return 0;
}