Monday, 31 October 2016

Kiểm tra máy ảo, liệt kê danh sách các device

Kiểm tra xem máy có phải máy ảo không:
# dmesg | grep -i virtual
[    0.000000] Booting paravirtualized kernel on KVM
[    0.092149] KVM setup paravirtual spinlock
[    2.065254] input: VirtualPS/2 VMware VMMouse as /devices/platform/i8042/serio1/input/input4
[    2.067808] input: VirtualPS/2 VMware VMMouse as /devices/platform/i8042/serio1/input/input3
Đây là một máy ảo KVM.

Còn đây
là kết quả khi chạy trong một Docker busybox container:
/ # dmesg | grep -i virtual
CPU MTRRs all blank - virtualized system.
Booting paravirtualized kernel on bare hardware
ixgbevf: Intel(R) 10 Gigabit PCI Express Virtual Function Network Driver - version 2.12.1-k
VMware vmxnet3 virtual NIC driver - version 1.4.5.0-k-NAPI
Liệt kê danh sách các block device
# lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda     253:0    0  30G  0 disk
├─vda1  253:1    0  30G  0 part /
└─vda15 253:15   0   1M  0 part

Friday, 21 October 2016

Hello, Rust!

Mình thích thì mình học thôi.

Tài liệu: "The Book”,The Rust Programming Language 
Update: tài liệu dễ đọc hơn: http://rust-lang.github.io/book/

Rust thuộc loại ngôn ngữ nào?


Rust là một sản phẩm xuất phát từ Mozilla - tổ chức đứng sau Firefox thần thánh.
Rust is a systems programming language focused on three goals: safety, speed, and concurrency.

Vậy đừng lôi Rust ra làm web rồi chê này kia. Những lĩnh vực mà Rust quảng cáo là phù hợp:
  • embedding in other languages
  • programs with specific space and time requirements
  • and writing low-level code like device drivers and operating systems.
Vậy Rust có thể mang ra code những thứ người ta code bằng C hay C++.

Cài đăt: https://www.rust-lang.org/en-US/downloads.html
Kiểm tra version:
$ rustc --version
rustc 1.12.1 (d4f39402a 2016-10-19)
Những người code Rust được gọi là : Rustaceans

File code Rust có đuôi ".rs". Tên dùng dấu ``_`` để phân cách giữa các từ, như hello_world.rs 
$ cat main.rs
fn main() {
    println!("Hello, FAMILUG!");
}
$ rustc main.rs
$ ./main
Hello, FAMILUG!
Rust là compiled language, tức phải "build" từ file source ".rs" thành file binary, sau đó chạy file binary.
Everything is a tradeoff in language design.

Cargo

Cargo là một phần quan trọng của Rust, quan trọng đến mức khi học lập trình bao nhiêu ngôn ngữ khác bạn sẽ không thấy người ta giới thiệu package manager ngay ở bài Hello, world. Chả ai nói về ``pip`` khi bắt đầu học Python cả.

Wednesday, 19 October 2016

Truy cập đến key của một dict trong Jinja

Thay vì phải viết
adict['mykey']
ta có thể viết
adict.mykey

Trích tài liệu của Jinja:
You can use a dot (.) to access attributes of a variable in addition to the standard Python __getitem__ “subscript” syntax ([]).
The following lines do the same thing:
{{ foo.bar }}
{{ foo['bar'] }}
Chú ý rằng 2 syntax này sẽ cho kết quả khác nhau nếu object có attribute trùng tên với key trong dict mà nó chứa.
This is important if an object has an item and attribute with the same name. Additionally, the attr() filter only looks up attributes.

Sunday, 16 October 2016

[Backup] Ký tự % trong crontab

Một ngày mưa, viết crontab backup dữ liệu về máy, gặp ngay lỗi
unexpected EOF while looking for matching ``'
Tức tự dưng một ký tự kết thúc file (EOF) xuất hiện trong câu lệnh chứa đoạn
scp SOMEWHERE xxx-`date +%Y%m%d_%H%M%S`.tar.gz
Với Linux based OSes, ký tự % trong file crontab không có giá trị gì đặc biệt.

Theo doc Ubuntu manpage 5 crontab
The ``sixth'' field (the rest of the line) specifies the command to be run. The entire command portion of the line will be executed by /bin/sh or by the shell specified in the SHELL variable of the cronfile.
Khi gõ man 5 crontab trên Ubuntu 16.04, ta có:

The ``sixth'' field (the rest of the line) specifies the command to be run.  The entire command  portion of  the  line,  up to a newline or % character, will be executed by /bin/sh or by the shell specified in the SHELL variable of the crontab file.  Percent-signs (%) in the command, unless escaped with backslash (\), will be changed into newline characters, and all data after the first % will be sent to the command as standard input. There is no way to split a single command line onto multiple lines, like the  shell's trailing "\".
Xem online tại: http://manpages.ubuntu.com/manpages/xenial/en/man1/crontab.1posix.html
Tài liệu online của Ubuntu manpage không giống xem từ lệnh man, nó dùng nội dung của file man cung cấp bởi systemd-cron

Trên OSX, ký tự % cũng được xem như dấu xuống dòng (newline).
Theo man của OpenBSD:

The command field (the rest of the line) is the command to be run. The entire command portion of the line, up to a newline or % character, will be executed by /bin/sh or by the shell specified in the SHELL variable of the crontab. Percent signs (‘%’) in the command, unless escaped with a backslash (‘\’), will be changed into newline characters, and all data after the first ‘%’ will be sent to the command as standard input. If the command field begins with ‘-q’, execution will not be logged. Use whitespace to separate ‘-q’ from the command.

Friday, 14 October 2016

On-prem là gì? GA là gì? Ubuntu 16.10

Đọc báo tây về tech sẽ hay thấy mấy từ này, mình không biết thì mình úp đết thôi 😗

On-prem

Viết tắt của "on premises"
premises /ˈprɛmɪsɪz/  
Eng: A house or building, together with its land and outbuildings, occupied by a business or considered in an official context.
Vie: Nhà cửa
on premises: trong nhà
hệ thống "on-prem" software là phần mềm cài, tự chạy trong công ty, không phải là do bên thứ 3 chạy như một dịch vụ (SaaS, cloud, off-premises).
Xem thêm trên bách khoa toàn thư https://en.wikipedia.org/wiki/On-premises_software

GA: Generally Available


E.g:
- Docker for Mac and Windows is Now Generally Available
- Docker 1.12 Goes GA
GA nghĩa là đã chính thức ra lò/ xuất chuồng.

Ubuntu 16.10 - Yakkety Yak

Thursday, 13 October 2016

Đặt tên trong Python

Nếu cứ thấy số 6 gọi là số 6, thấy số 9 gọi là số 9, thì tổng của hai số hẳn là 9 + 6 và sinh ra kết quả là một số 15. Vạn vật sinh ra đều có cho mình một cái tên, một cái tên dù hay hay dở cũng là một cái tên. Python được đặt tên là Python, và người ta gọi nó bằng Python, chứ không gọi nó là "một bộ cú pháp, quy định lập trình với câu lệnh ..."

Remember the name Python

Vậy hãy đặt cho những con số, giá trị đúng sai những cái tên, để ta được gọi nó, để ta có thể hét tên nó lên hay chửi thầm một cái tên vì nó làm chương trình không chạy.

Cú pháp

name = value
Ví dụ:
>>> my_age = 6
>>> your_age = 9
>>> our_ages = my_age + your_age
>>> print(our_ages)
15
Một khi tên đã được đặt, ta có thể dùng tên thay cho giá trị mà tên đó đã đặt cho. Ở đây, ta có tên, và vật được đặt tên (giá trị).

Tên (name)

Tên không phải đặt thế nào cũng được. Ở Việt Nam không thể đặt tên là anh "Trần Văn @;" mà ra đường không bị tóm.

Thursday, 6 October 2016

Đúng và sai - kiểu Boolean trong Python

Thế giới không chỉ có trắng và đen, thế giới còn có tím mộng mơ, hồng ngây thơ, đỏ mãnh liệtxanh hoà bình nữa. Nhưng sự thật chỉ có đúng hoặc sai, và Python thì có True hoặc False.

Boolean

Boolean đọc là /ˈbuːlɪən/ - không phải là "bu lin" mà là "bu-li-ờn". Kiểu boolean chỉ có 2 giá trị; True (đúng) hoặc False (sai), chú ý chữ T và chữ F viết hoa.
True đọc là /truː/
False đọc là /fɔːls/
Đúng tức là không sai, và sai nghĩa là không đúng:
>>> not True
False
>>> not False
True
Dùng toán tử not để đảo ngược giá trị của biểu thức. Dùng is để kiểm tra xem CÁI NÀY có CÁI KIA không
>>> True is not False # tương đương với True is True
True
>>> False is not True # tương đương với False is False
True
Và tất nhiên, một là một, còn hai là hai:
>>> 1 is 1 and 2 is 2 True

Tuesday, 4 October 2016

Tính toán bằng Python - phần 2

Bài trước đã giới thiệu về các phép tính tiểu học (cộng trừ nhân chia), bài này sẽ giới thiệu các phép tính phổ thông có vẻ cao cấp hơn như phép luỹ thừa, chia lấy dư, tính toán số phức.

Phép luỹ thừa

Phép toán luỹ thừa, hay mũ, tiếng Anh gọi là "power". 2 mũ 3 trong tiếng Anh là "2 to the power of 3". Phép mũ trong Python sử dụng ký hiệu **, KHÔNG PHẢI ký hiệu ^.
>>> 2 ** 7
128
>>> 2 ** 8
256
>>> 10 ** 7
10000000
>>> 2 ** 1000
10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376
Với Python, độ lớn của số là tuỳ ý, không có giới hạn. Nếu bạn còn chưa quên toán, thì sẽ biết rằng phép căn bậc 2 (square root) thực chất là mũ 1/2, căn bậc 3 (cube root) là mũ 1/3,...
>>> 4 ** (1/2)
2.0
>>> 27 ** (1/3)
3.0
>>> 2 ** (1/2)
1.4142135623730951
>>> 4 ** 2.0
16.0
Chú ý, giống các phép toán khác, phép mũ khi thực hiện với float ở phần số hay phần mũ đều trả về kết quả kiểu float.

Phép chia lấy dư

Phép chia lấy dư (modulo hay viết tắt là mod) trong Python được biểu diễn bằng dấu %.

Saturday, 1 October 2016

Tính toán bằng Python - phần 1

Dễ nhất là toán lớp 1, toán lớp 1 học 1 + 1 = 2.
Con đường học Python cũng nên bắt đầu từ ấy.
Bài này sẽ thực hiện các phép toán cơ bản ở phổ thông sử dụng Python.

Các kiểu dữ liệu số trong Python

Integer

Đọc là /ˈɪntɪdʒə/ (vietsub: in-ti-zơ) kiểu số nguyên,

Float

Đọc là /fləʊt/ (vietsub: phờ-lơu-t) kiểu số thực.
Nghe đọc phát âm tại từ điển Cambridge

Các phép toán trong Python

Mở python lên - chú ý loạt bài viết này dùng Python3 nên nếu bạn sử dụng Python2, kết quả có thể khác.
$ python3
Python 3.5.1 (default, Apr 21 2016, 17:24:52)
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>

Phép cộng

Dùng dấu +, trong tiếng Anh là "plus":
>>> 1 + 1 # đây là dòng mình gõ vào
2  # đây là dòng kết quả sẽ thấy sau khi gõ enter
>>> 2 + 3 + 100
105
>>> 2 + -1 + -2 + 1
0
Không có gì lạ ở các kết quả trên, giống hệt học lớp 1. Không có bài toán nào khó nếu chỉ làm những việc đơn giản như vậy, hãy mở rộng bài toán và thử với các số to hơn:
>>> 12312421312321 + 658347654397897897073214123412
658347654397897909385635435733
Có thể thấy to cỡ nào thì Python cũng xử lý được cả.
Số thực được biểu diễn với phần nguyên và phần thập phân được phân cách bởi dấu chấm (.). Làm phép toán giữa một số thực với một số nguyên sẽ trả về 1 số thực. (Vì tập số thực bao hàm cả tập số nguyên - theo toán học).
>>> 1.5 + 2 3.5