Friday, 30 December 2016

Vì sao 0.1 + 0.1 + 0.1 không bằng 0.3?

Nếu có thể trả lời chính xác câu hỏi sau và giải thích tại sao, bạn có thể bỏ qua bài này:
0.1 + 0.1 + 0.1 == 0.3
Trong Python, biểu thức này trả về đúng (True) hay sai (False)? hay nói cách khác, khi gõ biểu diễn trên máy tính vế trái có bằng vế phải không?
Có thể sử dụng bất kỳ ngôn ngữ lập trình nào khác: Python, C, Java, Golang, ... kết quả là không đổi.
Câu trả lời ngắn gọn: Kết quả trả về là False, hay vế trái không bằng vế phải.

Float là gì?

Kiểu dữ liệu float là viết tắt của "real floating-point number" - kiểu "số thực dấu chấm động".

float là một cách BIỂU DIỄN XẤP XỈ cho một số thực (real number) bằng cách đánh đổi độ chính xác (precision).

Các quy tắc / chuẩn để biểu diễn float được mô tả trong tiêu chuẩn quốc tế IEEE 754

Số thực

là tập số gồm:
  • các số hữu tỷ (số biểu diễn được ở dạng phân số: VD: 2, 1/3)
  • và các số vô tỷ (số không biểu diễn được ở dạng phân số: VD: căn bậc 2 của 2)

Số vô tỷ

Wednesday, 28 December 2016

[pandas] Truy cập nội dung DataFrame

Bài trước đã hướng dẫn các khái niệm cơ bản và cách tạo một bảng dữ liệu bằng pandas.
Bài này sẽ hướng dẫn cách xem bất cứ phần nào ta muốn trong bảng (DataFrame) đã tạo.

Tạo bảng mới

In [1]: import pandas as pd
In [4]: import numpy as np
In [5]: dates = pd.date_range('20161212', periods=6)
In [6]: df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
In [7]:  df
Out[7]:
                   A         B         C         D
2016-12-12 -0.115304 -0.400382  1.254944  0.702264
2016-12-13  1.436155  0.476939  1.334369  0.223856
2016-12-14 -0.124606 -0.017318  0.824345 -0.432029
2016-12-15 -1.013802  0.266865  1.341752 -0.990876
2016-12-16  0.669347 -1.086764  0.555358 -0.579439
2016-12-17 -0.405407 -0.044016 -0.153047 -0.800809

Truy cập hàng và cột trong bảng

Lấy danh sách tên các cột (column)

In [60]: df.columns
Out[60]: Index(['A', 'B', 'C', 'D'], dtype='object')

Lấy danh sách tên các dòng (index)

[Pymi.vn] Python là gì? Python để làm gì?





Xem bài viết hướng dẫn tại http://pymi.vn/tutorial/python-la-gi/

[Swift] Phân biệt let và var - giữa struct và class - [phần 1]

Để bắt đầu serial Kiến thức phỏng vấn cho lập trình viên iOS, mình xin đề cập đến hai khái niệm let và var trong ngôn ngữ Swift mà các bạn khi phỏng vấn sẽ rất hay hỏi.

Mình sẽ dùng phiên bản mới nhất đó là Swift 3 và mới hơ

I - Khái niệm:

var vs let - sẽ tương ứng với hai khái niệm biến số và hằng số

VD:
let wife = "Joana"
var darling = "Beautiful Girl"
Hai dòng code trên có ý nghĩa như sau:
"Khai báo một hằng số tên là wife, có giá trị là Joana. Tiếp theo, khai báo một biến số tên là darling và cho nó một giá trị khởi tại là  Beautiful Girl."

Tuesday, 27 December 2016

[Python] Tạo bảng dữ liệu với pandas

pandas là gì

pandas là bộ công cụ để phân tích và chỉnh sửa dữ liệu mạnh nhất thế giới, được sử dụng rộng rãi trong phân tích tài chính, phân tích dữ liệu.

Python pandas

pandas là một Python package.

Cài đặt pandas

(trong virtualenv):
$ pip install pandas
...
Installing collected packages: pandas
Successfully installed pandas-0.19.2
NOTE: pandas phụ thuộc vào package numpy,  tức cài xong pandas thì đã có cả pandas lẫn numpy.

Muốn phân tích thì phải có dữ liệu và hiển thị nó lên bảng thành hàng cột đã rồi làm gì thì làm.
Trong bài đầu tiên của series, ta sẽ sử dụng pandas để tạo một bảng dữ liệu có hàng, cột, giống như Excel hay Google spreadsheet.

Kiểu dữ liệu trong pandas

pandas có hai kiểu dữ liệu chủ chốt
- Series: kiểu dữ liệu một chiều (1D) - chuỗi các giá trị
- DataFrame: kiểu dữ liệu hai chiều (2D) - tức sẽ biểu diễn thành bảng , có hàng / cột trên Excel hay Google spreadsheet.

Monday, 26 December 2016

[Debian] Khám phá các tiện ích trong package dpkg

Trong package dpkg có gì? 

Bạn hỏi, dpkg trả lời:
$ dpkg -L dpkg | grep bin/
/sbin/start-stop-daemon
/usr/bin/dpkg-split
/usr/bin/dpkg-statoverride
/usr/bin/dpkg
/usr/bin/dpkg-divert
/usr/bin/dpkg-query
/usr/bin/dpkg-maintscript-helper
/usr/bin/dpkg-deb
/usr/bin/update-alternatives
/usr/bin/dpkg-trigger

Các câu lệnh dpkg này làm gì?

Whatis:
$ for binary in $(dpkg -L dpkg | grep bin/); do whatis $(basename $binary); done
start-stop-daemon (8) - start and stop system daemon programs
dpkg-split (1)       - Debian package archive split/join tool
dpkg-statoverride (8) - override ownership and mode of files
dpkg (1)             - package manager for Debian
dpkg-divert (8)      - override a package's version of a file
dpkg-query (1)       - a tool to query the dpkg database
dpkg-maintscript-helper (1) - works around known dpkg limitations in maintainer scripts
dpkg-deb (1)         - Debian package archive (.deb) manipulation tool
update-alternatives (8) - maintain symbolic links determining default commands
dpkg-trigger (1)     - a package trigger utility

dpkg - chương trình quản lý package cho Debian

dpkg có các câu lệnh để :

[Python] thôi dùng subprocess.check_output

Function tiện tay subprocess.check_output rất hấp dẫn khiến người ta khó có thể từ chối dùng nó. Để kiểm tra output một câu lệnh, chỉ cần:
In [1]: import subprocess as spr

In [2]: output = spr.check_output(['ls', '/etc/hosts'])

In [3]: print(output)
b'/etc/hosts\n'
Chuyện này không có gì sai cho đến khi có gì đó sai sai xảy ra.

Nếu có lỗi xảy ra, ta chỉ nhận được một exception chứ không thu được phần lỗi của câu lệnh (stderr):

Sunday, 18 December 2016

Làm quen với Ansible - viết playbook đơn giản

Sau khi đã cài đặt Ansible và chạy được ad-hoc command, bài viết này sẽ hướng dẫn viết các file playbook để thực hiện hàng loạt task thay vì chỉ chạy từng câu lệnh một. Các file Playbook này thường cho vào một git repo để tiện quản lý.

Ansible playbook

Một Ansible Playbook là môt file ở định dạng YAML (.yml), nó ở dạng list và chứa một hoặc nhiều "play".

Play

Mỗi "play" dùng để kết nối (map) một nhóm các "host" với một vài "role". Roles trong playbook được gọi là "tasks".

Role và task

Một task thực hiện gọi đến một Ansible module nào đó.

Ví dụ một playbook tên là vim.yml, chỉ chứa 1 play map tất cả các hosts với role cài vim:
$ cat vim.yml
---
- hosts: all
  remote_user: root
  tasks:
    - name: Install vim
      apt: name=vim state=present

Saturday, 17 December 2016

Làm quen với Ansible - module, ad-hoc command

Mình dùng SaltStack để quản lý cấu hình và tự động hoá hệ thống.
Mình muốn thử dùng Ansible để xem có gì hay ho, vì nhiều người bị ho và cứ hỏi là SaltStack hơn Ansible cái gì, nên mình đọc doc.


Mình không hiểu nổi tại sao có cái document to đùng và xinh đẹp ở đấy thì mọi người chả đọc, cứ đi tìm cái đâu đâu, kỳ 😶

Cài đặt Ansible

Nếu biết pip là gì thì dùng pip là nhanh gọn nhất,  vì Ansible viết bằng Python, cài bằng pip là điều hiển nhiên không cần bàn cãi. Chạy lệnh sau:
$ pip install ansible
...
Successfully installed ansible-2.1.0.0
Nếu thấy dòng trên sau khi chạy lệnh pip tức là đã thành công.

Nhận xét:
- Ansible khuyến khích người dùng cài từ bản develop checkout từ Ansible repo trên GitHub
- Nếu không được thì cài từ pip
- Nếu vẫn không được thì cài bằng các package manager của hệ thống như apt, yum...
- Phần hướng dẫn thì ít mà chú ý thì nhiều.

Monday, 5 December 2016

[Rust] Học Rust để tính toán

Việc học không có mục đích sẽ khó đi đến đích, dễ lạc lối và hoang mang.

Bài này giới thiệu đủ các khái niệm của Rust để tính toán cơ bản, cụ thể là làm vài bài ProjectEuler.net
Nếu ai hỏi học Rust làm gì, có ai thuê đâu? thì câu trả lời là mình học cho đỡ vui 🤑


Các khái niệm cần thiết gồm có:
- Đặt biến để chứa giá trị
- Thực hiện các phép toán cơ bản: cộng trừ nhân chia, chia lấy dư
- Các câu lệnh điều khiển: if/else if/else
- Các vòng lặp: while, for
- In ra màn hình: println!

Tạo project bằng câu lệnh:
cargo new --bin rustmath
Bấm vào đây để xem thêm về cách tạo Rust project và dùng cargo.

Sửa file rustmath/src/main.rs
Đoạn code sau để kiểm tra số x có phải số chẵn không, in ra màn hình.
fn main() {
    let x = 42;
    if x % 2 == 0 {
        println!("{} is even", x);
    } else {
        println!("{} is odd", x);
    }
}
Giải thích:
- Dùng hai dấu bằng ``==`` để kiểm tra xem giá trị vế trái và vế phải có bằng nhau không. Ở đây kiểm tra x chia cho 2 có dư 0 hay không (có chia hết không).
- Để in ra màn hình, dùng "macro": println!  - có dấu ! chỉ rằng đây là một macro, macro là gì tạm thời để sau, giờ cứ biết làm thế để in ra màn hình.
- Trong khi gọi macro!(), dùng dấu ``{}`` để giữ chỗ cho giá trị sẽ được thay thế sau đó. Nội dung in ra nằm trong dấu nháy kép (double quotes): "{} is odd".

Thử làm bài Project Euler 1:
Tính tổng các số nhỏ hơn 1000 chia hết cho 3 hoặc chia hết cho 5.

Monday, 21 November 2016

[Sec|Django] Social media fingerprinting

Mới đây một website đã được tung ra để tự động hiển thị những trang mạng xã hội mà người dùng đã login vào. Việc này trông có vẻ đầy hư cấu và có cảm giác mình bị "hack", thế nhưng nó không phải là mới, dựa trên một lỗ hổng bảo mật mà nhiều hãng không thèm fix. Nó có tên "Social media fingerprinting".

https://robinlinus.github.io/socialmedia-leak/#updates


Cơ chế để trang này hoạt động rất đơn giản:
  • Nếu website X cho phép redirect tới một địa chỉ (đặc biệt) khác thì tức là user đã đăng nhập.
  • Nếu không redirect được đến địa chỉ đó thì có vẻ như user chưa đăng nhập hoặc site đã fix lỗi.

Lớn rồi

Nontech, stupid rant.

Saturday, 19 November 2016

Học Python - lớp PyFML 11

Thông báo khai giảng lớp học Python

- Khoá 201611 - 29 tháng 11 năm 2016,
  • HN: SGarden coworking space, số 19, ngõ 376, Khương Đình, Hà Nội.
- Khoá 201612 - TP Hồ Chí Minh (dự kiến mở cuối tháng 12 nếu đủ học viên).


Đăng ký học tại đây.

Friday, 18 November 2016

[vim] Dùng Go font với Gvim

vim dùng trên terminal chỉ có thể dụng font mà terminal đang dùng.
Gvim hay macvim thì khác, chúng hỗ trỡ set font tuỳ ý.

Đặt font cho gvim

Câu lệnh set font trong gvim là:
set guifont=FONTNAME:hSIZE
Nếu tên font có dấu space, hãy escape nó bằng dấu backslash  ``\``.
Để xem guifont đang dùng giá trị gì, gõ:
set guifont
Để hiện ra giao diện chọn font (đã test trên macvim), gõ
set guifont=*
Ví dụ, dùng lệnh sau để set Courier font, size 14: 
set guifont=Courier:h14

Wednesday, 2 November 2016

vim-go autocomplete panic

Nếu đã dùng vim-go plugin của vim để code Golang, chỉ cần bấm Ctrl-x Ctrl-o sẽ hiện ra các function của một package, ... để "autocomplete" - tính năng này của vim có tên omnicompletion.



Nếu bạn vừa upgrade Golang lên bản mới hơn, tính năng Ctrl-xCtrl-o có thể không
hoạt động và hiện ra mỗi chữ PANIC. Lúc đó có thể việc cần làm là cài lại bản mới nhất của chương trình chạy khi bấm Ctrl-x Ctrl-o, với vim-go thì chương trình đó là gocode.

upstart script chạy bằng /bin/sh -e

Nếu trong Upstart job file có sử dụng ``script``, script đó được chạy bằng lệnh ``/bin/sh -e``
Tức sẽ dừng lại lập tức khi có một lệnh nào đó fail.

Vì vậy cách check câu lệnh vừa chạy có fail hay không theo kiểu
command
if [ $? -ne 0 ]; then ...
sẽ dừng ngay khi ``command`` fail, phần if không bao giờ được chạy.

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

Thursday, 22 September 2016

Luật bất thành văn của sysadmin

Vì không thành văn nên mỗi ông viết một kiểu 🙄
Kể ra thì nhiều nhưng list ra đây vài cái cơ bản, về cơ bản là cho bớt đau thương, chứ không phải là vì mình thích thì mình làm thôi.

Luật sysadmin
- Không deploy (vietsub: thay đổi hệ thống/ cài đặt phiên bản mới) vào thứ 6. Với các sysadmin thì ngày thứ 6 thường được coi là ngày "reading" hay "research". Lý do rất dễ hiểu, nếu có gì không thuận buồm xuôi gió là mất toi "Friday night", thậm chí mất luôn cả cuối tuần. (Tất nhiên luật này không áp dụng nếu sysadmin ấy định làm việc vào cuối tuần) 


- Luật trên áp dụng tương tự cho 2 tiếng trước khi hết giờ làm việc - cũng trừ luôn trường hợp nếu định làm quá giờ.

Thursday, 15 September 2016

[CLI] tail -F, F hoa F***

Là *NIX user, hẳn phải biết dùng lệnh tail để theo dõi một file (thường là file log). Mỗi khi có dòng mới ghi vào file, ta sẽ thấy được dòng đó:
tail -f /var/log/syslog
(Trên Ubuntu, có thể gõ "logger FAMILUG" để ghi một dòng vào syslog).

Log ghi ra file mãi liệu có chán mà dừng lại?
Chán thì không chán, nhưng các nhà viết phần mềm sẽ không ghi hàng GB log vào 1 file rồi để nó dùng hết ổ cứng trên máy rồi làm chương trình chết vì hết ổ cứng. Từ đó khai niệm "log rotate" ra đời.
Mỗi file log cũ sẽ được đi chuyển, đổi tên mới (thường là thêm đuôi .1 .2 .3 ... vd: /var/log/syslog.1  và sau đó nếu cũ quá thì được nén lại bằng gzip cho tiết kiệm ổ cứng), chuyện này thường được làm hàng ngày hay hàng tuần. File log mới được tạo ra, cùng tên với file log cũ, nhưng giờ trống trơn. Xem thêm chương trình logrotate để biết thêm chi tiết.
Nếu ai đã thử dùng -f để theo dõi file log, rồi may mắn hơn nữa, file log đó được rotate, từ ấy trờ đi, không thấy lệnh tail output gì ra nữa. Lúc đó phải dùng F to.

Có một sự khác biệt tinh vi ở đây, khi dùng tail -F FILENAME thì tail sẽ theo dõi file này kể cả khi nó bị thay thế bởi file khác cùng tên (theo dõi bằng tên). Trong khi đó tail -f FILENAME lại theo dõi file descriptor, tức nếu file này có bị đổi tên thì lệnh tail vẫn tiếp tục theo dõi.

Vậy, nếu đang theo dõi file log, hãy dùng -F.

Trích man tail
       -f, --follow[={name|descriptor}]
              output appended data as the file grows; -f, --follow, and --follow=descriptor are equivalent

       -F     same as --follow=name --retry

       --retry
              keep trying to open a file even when it is or becomes inaccessible; useful when following  by
              name, i.e., with --follow=name

Wednesday, 14 September 2016

[Python] Happy programmer day!

Hôm qua (13/9) là ngày thứ 256 của năm, với các lập trình viên, 256 là một con số rất đặc biệt.
Từ thời xa xưa, khi những chiếc máy tính chỉ lắp RAM 256, USB chỉ có 256 MB...
ngày ấy đã xa, nhưng 256 luôn ở đó vì nó đặt biệt: 256 = 2 ^ 8

Chúc mừng ngày lập trình viên, những người đẻ ra bug 🕷🐞

🍺🍻🍻🍺

In [12]: import datetime

In [13]: (datetime.datetime.now() - datetime.datetime(2016, 1, 1)).days - 1 == 2 ** 8
Out[13]: True

Friday, 2 September 2016

[Golang] fix Go 1.7 panic

Nếu như mới build lại Go bản 1.7 và chạy một lệnh chuẩn nào đó mà bị panic (như go vet chẳng hạn):
 go vet ./...
panic: inconsistent import:
    var os.Stderr *os.File
previously imported as:
    var Stderr *os.File
 [recovered]
    panic: inconsistent import:
    var os.Stderr *os.File
previously imported as:
    var Stderr *os.File


goroutine 1 [running]:
panic(0x2734a0, 0xc42028a540)
    /Users/hvn/FOSS/golang/src/runtime/panic.go:500 +0x1a1
go/types.(*Checker).handleBailout(0xc4200d21c0, 0xc42004d8d8)
    /Users/hvn/FOSS/golang/src/go/types/check.go:213 +0xae
panic(0x2734a0, 0xc42028a540)
    /Users/hvn/FOSS/golang/src/runtime/panic.go:458 +0x243

Đừng khóc, vì lúc khóc trông rất ngu 😭


hãy build lại Go lần nữa để sửa vấn đề này.
Nhưng trước khi build, nhớ rm -r pkg trong go source đi.

Tuesday, 30 August 2016

robots.txt là gì?

Một sai lầm chết người có thể mắc phải và gây ra hậu quả khôn lường là set nhầm file robots.txt khiến cho Google không index site của bạn 😂 (khi mà bạn rất muốn nó index và leo top).

robots.txt là gì?

một file text chứa vài câu lệnh đơn giản để hướng dẫn các search engine (SE) như Google, Bing ...
cách index trang của bạn (tức hướng các SE có nên trả về các kết quả trong đường dẫn /A/B/C hay không).

robots.txt la gi

file robots.txt nằm ở đường dẫn /robots.txt của site.

robots.txt có 3 câu lệnh phổ biến

User-agent: SOMETHING - set đối tượng (SE) áp dụng luật
Allow: PATH - cho phép index một đường dẫn PATH
Disallow: PATH - không cho phép index một đường dẫn PATH

Thử xem vài trang

pyjobs.vn

Tại https://pyjobs.vn/robots.txt
User-agent: *
Disallow: 
Đoạn này cho phép mọi search engine (User-agent: *) được truy cập/index toàn bộ nội dung của trang. (Disallow: để trống).

Friday, 26 August 2016

[Python] Tải nhạc từ youtube bằng dòng lệnh

Lên mạng có bài nhạc hay,
cảm thấy có tội nếu không tải về 😜
download youtube bang python

youtube-dl 

là công cụ tải nhạc bằng dòng lệnh, một trong các top star repo GitHub viết bằng Python

Cài đặt
$ pip install youtube-dl
Collecting youtube-dl
  Downloading youtube_dl-2016.8.24.1-py2.py3-none-any.whl (1.4MB)
    100% |████████████████████████████████| 1.4MB 302kB/s
Installing collected packages: youtube-dl
Successfully installed youtube-dl-2016.8.24.1

Tải nhạc

Thursday, 25 August 2016

Không biết không có tội, nhưng là dốt nát, và lãng phí

Không phải chuyện học lập trình Python

Nhưng các cụ xưa đã dạy:
"không biết không có tội"
để giờ đây con cháu mang ra xuề xoà mỗi khi mắc phải cái tội gì đó mà không muốn chịu trách nhiệm. Nhưng các cụ đã dạy thì cấm có sai! Rõ ràng việc không biết, không phải một cái tội.


minh hoạ về seo

Saturday, 20 August 2016

Python tutorial Tiếng Việt

Tài liệu tiếng Anh để học Python thì nhiều vô kể, nhưng tài liệu Python tiếng Việt chất lượng thì chưa có nhiều.
Dưới đây là danh sách các bài viết tổng hợp các tutorial Python của FAMILUG. Chúng tôi sẽ hoàn thiện dần theo năm tháng.

python logo


Integer (số nguyên)
- Dùng python làm máy tính công trừ nhân  chia
- O(n) 

String (chuỗi)
- strip/replace

List (danh sách)
- Đếm số lần xuất hiện một item trong list/ độ dài của list
- Kiểm tra 2 list giống nhau
- Tìm từ dài nhất/ngắn nhất trong list

Control flow
- Đếm số dòng trong 1 file
- Ternary  

Friday, 19 August 2016

[Windows] PowerShell đã đến thế giới *NIX

PowerShell là gì? 
PowerShell is an automation and configuration management platform. It consists of a cross-platform command-line shell and associated scripting language
Trên các hệ điều hành giống UNIX (*NIX) có sh, bash, fish, zsh ... thì trên M$ xưa nay chỉ có "cmd" - một shell thuộc loại vô cùng đơn giản. Gần đây, M$ đã phát triển PowerShell với những cải tiến vượt trội so với "cmd" cổ cũ.
Không biết "shell" là gì? xem thêm ở đây

Sau vài chục năm ghét mãi không xong, M$ (Microsoft) đã quay sang bày tỏ tình yêu với Linux


Các cụ dạy: "kẻ biết thời thế mới là anh hùng",
các cụ đã dạy chắc là không sai.

Đúng hay sai thì ai cũng thấy, M$ ngày càng được giới *NIX quan tâm hơn (ngay cả bài viết này), và người khổng lồ vẫn chưa ngã sau bao nhiêu sóng gió.
Ai từ chối thay đổi, sẽ phải chết, hoặc sống dè dè 😁

Bạn muốn trở thành Linux Sysadmin? thử bấm vào đây
Bạn muốn trở thành Windows Sysadmin? đóng 5 triệu rồi cũng bấm vào link trên🤓

Cài đặt (ubuntu 14.04)
sudo apt-get install libunwind8 libicu52
sudo dpkg -i powershell_6.0.0-alpha.9-1ubuntu1.14.04.1_amd64.deb
Cho Ubuntu 16.04, OSX... xem thêm ở đây

Dependencies:
$ dpkg -s powershell | grep -i depends (chạy sau khi đã cài đặt)
Depends: libunwind8, libicu52
libunwind8

Thursday, 11 August 2016

[Linux kernel] dm - đang mệt

dm là từ viết tắt phổ biến cho "device mapper" trong thế giới Linux.
dm xuất hiện từ phiên bản 2.6.9 [2] của Linux kernel, tức đến giờ này thì các hệ điều hành Linux-based đều có sẵn dm để dùng.

Trang chủ: https://www.sourceware.org/dm/ đã định nghĩa một cách nghiêm túc về dm như sau [3]:
The Device-mapper is a component of the linux kernel (since version 2.6) that supports logical volume management. It is required by LVM2 and EVMS. The original LVM (included in stock 2.4 kernels) does not use it.
Vậy dm:
  • là một thành phần của Linux kernel - cụ thể nó là một kernel module (wikipedia gọi nó là một "framework" [4]).
  • dùng để hỗ trợ việc quản lý các volume một cách "logical".
  • là phần yêu cầu bởi LVM2 và EVMS - nếu không biết chúng là gì - tạm bỏ qua
Trên Linux, dm thể hiện là một block device, có thể thấy ở :

Wednesday, 10 August 2016

Học Python - Lớp PyFML 07 - Khai giảng 23/08/2016

Học Python - PyFML

Đăng ký học Python - Ngôn ngữ lập trình hot nhất hiện nay. Địa điểm: Hà Nội - Sài Gòn

Thời gian - Địa điểm
19h thứ 3 ngày 23/08/2016
Phòng 701 CT1 chung cư Skylight, ngõ hòa bình 6, Minh Khai, Hà Nội

Lớp học tại HCM sẽ khai giảng sau.

Đăng ký
Điền vào mẫu: http://goo.gl/forms/BJAwtCU3v5GQPDV22




Python là gì? ăn được không ?

Mục tiêu

Monday, 8 August 2016

[Python] setup.py develop

Một Python library / application đúng chuẩn sẽ phải có 1 file setup.py trong thư mục gốc.
Tài liệu chi tiết về việc viết/dùng file này để cài đặt và upload lên PYPI như thế nào xem thêm ở đây.

Khi phát triển một python package, developer sẽ muốn "setup" nó ở chế độ "development" thay vì chế độ "production". Chế độ development giúp cho mọi thay đổi của developer lập tức có tác dụng, chứ không phải ngồi gõ lại
 python setup.py install 
sau mỗi lần sửa code.

Để cài đặt 1 project ở chế độ development, chạy lệnh:
python setup.py develop
Ví dụ:

Sunday, 7 August 2016

[Django] dùng cùng 1 database cho dev, test và production

Đây không phải là điều gì mới lạ, cũng không giành riêng cho django.

Nhưng sự hấp dẫn của SQLite -  đơn giản - không phải cài đặt cấu hình - là một nguyên nhân khiến các developer vẫn dùng nó trong môi trường dev phần mềm trên máy họ, khi mà ở production lại dùng database khác - như PostgreSQL.

Kết hợp với sức mạnh che giấu bên dưới của ORM, không ai nhận ra sự khác biệt, cho đến một ngày (sau 1 - 2 tháng trời không có gì xảy ra)...
Lệnh migrate trên CI server fail mà ở trên máy vẫn chạy, khiến developer mất vài tiếng
để tìm ra nguyên nhân và khắc phục - chuyện mà nếu như từ đầu, cùng dùng một database, sẽ không
bao giờ xảy ra.

Bài học: các môi trường dev - testing - staging - production, càng giống nhau, càng tốt 😝🤑

PS: chiến dịch ngày nào cũng viết một cái gì đó đã quay trở lại, không đảm bảo lợi hại như xưa 😂

Thursday, 28 July 2016

[CLI/docker] busybox - con dao lính tây của hệ thống nhúng Linux

xin được cười cái title một cái đã =))

Busybox là một software, nó tập hợp nhiều UNIX utilities (các câu lệnh) thành một file duy nhất.
Các câu lệnh cung cấp bởi busybox thường tương đương với các câu lệnh cung cấp bởi GNU nhưng có ít option hơn.

Cài đặt:
$ sudo apt-get install -y busybox
Hỏi nào: 
$ whatis busybox
busybox (1)          - The Swiss Army Knife of Embedded Linux
Swiss Army Knife

Chạy lệnh ``du`` cung cấp bởi busybox
$ busybox du --help
BusyBox v1.25.0 (2016-06-23 20:12:29 UTC) multi-call binary.

Friday, 15 July 2016

[bash] Phím tắt hữu ích trên bash

Phím tắt thì rất nhiều, nhưng sau đây sẽ giới thiệu một số phím tắt quan trọng giúp tăng speed quẩy trên terminal lên max

Các phím này đều là các phím tắt giống Emacs:
  • Ctrl L (hay viết tắt là ^L)  - xoá mà hình, như gõ lệnh clear
  • Ctrl U - xoá hết đằng trước cursor
  • Ctrl K - xoá hết đằng sau cursor
  • Ctrl W - xoá 1 từ đằng trước
  • Ctrl A - di chuyển về đầu
  • Ctrl E - di chuyển về cuối
  • Ctrl R rồi gõ 1 từ khoá: tìm trong lịch sử câu lệnh đã chạy 1 câu lệnh nào đó (bấm Ctrl R tiếp để chọn các kết quả tìm kiếm khác 
  • Ctrl H - xoá 1 ký tự đằng trước (như phím backspace)
  • Ctrl F - di chuyển sang phải một ký tự (như phím right arrow - mũi tên sang phải)
để đổi sang dùng như vi, có thể set file ~/.inputrc

Tuesday, 12 July 2016

Memoization là gì? LRU cache là gì?

1. Memoization
Memoization không phải là một từ Tiếng Anh có thể tìm thấy trong từ điển Oxford. Nó là biến thể của từ gốc Latin "memoradum" với nghĩa "to be remembered"
(được nhớ).

Trong lập trình, memoization là một kỹ thuật tối ưu, nhằm tăng tốc chương trình
bằng cách lưu trữ kết quả của các câu gọi function và trả về các kết quả này
khi function được gọi với cùng input đã gọi.

Hiểu đơn giản, trong python ta có thể implement memoization với dict bằng cách
lưu kết quả gọi function f vào một dict theo dạng:
{
    input1: result1, # f(input1)
    input2: result2, # f(input2)
    inputN: resultN  # f(inputN)
}
và sửa lại function để nó lấy result1 nếu input1 có trong dict.

Với bài toán tìm số Fibonacci,kết quả của câu gọi function sau bằng tổng kết quả của 2 lần gọi function liền trước, dễ thấy ta có thể sử dụng memoization để tránh việc tính lại (đồng thời
tránh luôn cả việc recursive call quá nhiều khiến vượt quá kích thước củastack )
def fib(n):
    if n <= 2: return 1
    else:
        return fib(n - 1) + fib(n - 2)

In [9]: fib(6)
Out[9]: 8

In [12]: fib(25)
Out[12]: 75025

In [13]: fib(75)
... chờ mãi không thấy

In [13]: %time fib(30)
CPU times: user 244 ms, sys: 1.83 ms, total: 246 ms
Wall time: 245 ms
Out[13]: 832040
Nếu dùng memoization để tối ưu việc tính số Fibonacci, ta không phải tính lại các giá trị đã tính rồi:

Sunday, 3 July 2016

PHG - Python tool để tạo password hàng loạt cho sysadmin

Từ một bài tập về nhà của lớp PyFML, chúng tôi đã phát triển ra một công cụ giúp
tạo password ngẫu nhiên, và tất nhiên, có thể tạo hàng loạt.

Thuật toán sinh password đảm bảo luôn có ít nhất:
- 1 ký tự chữ thường
- 1 ký tự chữ hoa
- 1 chữ số từ 0-9
- 1 ký tự đặc biệt

Giả sử sysadmin A cần tạo password có độ dài 20 ký tự cho 5 người, đồng thời tạo mã hash cho từng password một bằng chương trình ``sha256sum``.  Chỉ cần cài đặt và gõ lệnh như sau:
$ pip install phg # ver 1.0.4
...
$ phg -l20 pichu pikachu raichu charizard togepi -c 'sha256sum' -i
pichu: %D9AX63uOdzgK|5R+`J=
468d76298baed85794db5b4a1aabdef4be998cf4a92450b124f812cbfee3ecbe  -
pikachu: uj8p`5v7MjNa#Lee?$R6
0f6dad8ef8387060d347561a910814847a216737659111bea2d20e07258d450c  -
raichu: |;1wk4r,n^O2Wxln!o#.
4cbce9f8e8e5e4fadaad35ad82325d8259a36243cbe4943b1f7bdb98c937a25c  -
charizard: $emiw])v>O7{xLyCVxD\
4f386a6badf1eef2703f486fc16ac085de6986fb771e86b3132d0a3b93f841c2  -
togepi: bV.uv-a~cB#*7~X*,>%A
06d4b437c0258bf52853977799ad47336629354224dd4512afb808b7fca81c58  -
Với các option:
-l 20: độ dài 20 (length)
pichu pikachu raichu charizard togepi: danh sách 5 user sẽ được tạo password
-c 'sha256sum': câu lệnh sẽ được chạy với password sinh ra là stdin (-i)

Thursday, 2 June 2016

Học Python tại Hà Nội và Sài Gòn - PyFML 06

Đã là khoá học thứ 6 của lớp #PyFML, lớp học đã đào tạo khoảng 40 học viên với những thành tích đáng nể, những cuộc nhảy việc, tăng lương ngoạn mục.

Đăng ký ngay tại: https://docs.google.com/forms/d/1EsfPsmbzG8p5UIYwT39Z2CI2Q143TRt12mSxLz_lfcY/viewform?c=0&w=1
và xem chi tiết tại: http://fml.vn/

Sunday, 29 May 2016

SNI - giải pháp chạy nhiều SSL/TLS cert trên cùng 1 IP

Câu hỏi: có thể chạy nhiều trang web (khác domain) dùng HTTPS trên cùng 1 host không?
Câu chuyện: nhà nghèo phải host nhiều site trên cùng 1 host mà mỗi site cần một SSL/TLS cert thì phải làm sao?
Trả lời: SNI - Server Name Indication
Làm sao dùng được SNI:
kiểm tra xem webserver có hỗ trợ SNI không, phiên bản OpenSSL đã hỗ trợ SNI chưa.

Tại thời điểm hiện tại thì câu trả lời cơ bản là có:
# nginx -V
nginx version: nginx/1.7.9
built by gcc 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
TLS SNI support enabled
...
các phiên bản openssl từ 0.9.8j trở lên đều mặc định hỗ trợ SNI. Với Ubuntu 14.04, không cần phải lo nghĩ về chuyện này:
$ openssl version
OpenSSL 1.0.1f 6 Jan 2014
SNI là gì? sao lại cần?

Friday, 27 May 2016

Django 1.8 migrate siêu tốn ram, đừng khóc!

Django 1.8 là phiên bản LTS ở thời điểm hiện tại - tức nó sẽ được hỗ trợ dài lâu và có thể coi là phiên bản ổn định nhất.
Thế nhưng có một lỗi khá khó chịu, khi chạy migrate sẽ rất chậm và tốn RAM - với một project có dùng Django CMS, khi chạy lệnh ``manage.py migrate`` có thể đốt tới 2 GB RAM.
Nếu mang Django 1.9 ra so, hẳn sẽ thấy được bản này nhanh và tốn ít RAM hơn rất nhiều lần.
Và rõ ràng đây là bug!



https://code.djangoproject.com/ticket/24743
https://code.djangoproject.com/ticket/24745

Bug này đã được giải quyết, nhưng chỉ có cho bản 1.9 và không được backport lại cho 1.8.
Bản fork backport lại fix này có thể lấy ở đây:

Tuesday, 24 May 2016

ag và tìm hoài không thấy

Nếu bạn chưa biết ag là gì thì hãy đọc ngay tại đâyag có một sức mạnh kinh hoàng mà chỉ cần một lần thử, bạn sẽ tin.

ag giúp tìm kiếm từ khoá nhanh hơn grep nhiều lần, câu lệnh ngắn hơn vài lần, và đôi khi nó còn tỏ ra thông minh một cách đáng sợ nữa.
Ví dụ dưới đây trình bày một trường hợp nếu ag trong thư mục con ``cmd`` thì tìm thấy kết quả còn nếu ag từ thư mục parent thì lại không thấy gì:
src/github.com/syncthing/syncthing/cmd $ ag cert.pem
syncthing/locations.go
47:     locCertFile:      "${config}/cert.pem",
49:     locHTTPSCertFile: "${config}/https-cert.pem",

syncthing/main.go
376:    certFile, keyFile := filepath.Join(dir, "cert.pem"), filepath.Join(dir, "key.pem")
Thấy kết quả trong file syncthing/main.go
Giờ chuyển đến thư mục parent:

Monday, 16 May 2016

[Python] convert string thành integer

Chả có gì để nói nếu chỉ có:

In [2]: [int(i) for i in ('1', '123', '1235')]
Out[2]: [1, 123, 1235]
Hàm int thậm chí còn biết cách làm sạch (strip) số trước khi convert:
In [3]: int('   5   ')
Out[3]: 5
Vậy convert 1 dạng string của 1 list số thành 1 list số thế nào:

In [4]: s = '[2, 3, 4, 123, 1235]'

Sunday, 15 May 2016

Combo nguy hiểm

Trên cuộc đời có những thằng nguy hiểm thực sự và cũng có nhiều thằng thực sự tỏ ra mình nguy hiểm.  Bài này giới thiệu công cụ để tỏ ra nguy hiểm cho đối tượng thứ hai và có thể làm tăng độ nguy hiểm cho đối tượng thứ nhất - khi dùng *NIX.

Bộ combo này gồm những công cụ cực nhỏ bé, nhưng rất mạnh, có thể thay đổi trái đất, chuyển hoá vũ trụ, và thường rất đen.

1. i3wm - hay gọi tắt là i3
https://i3wm.org/
Thuộc loại chương trình
quản lý cửa sổ (Window Manager - WM ) - không nhầm lẫn với hệ điều hành Windows.
Nhiệm vụ chính quả chương trình quản lý cửa sổ là đưa ra cách sắp xếp các cửa sổ. Thông thường với Windows user cũng như Ubuntu mặc định, cửa sổ được sắp xếp mặc định theo kiểu floating (cửa sổ này chồng lên cửa sổ kia).
i3 lại thuộc loại tiling WM, tức các cửa sổ sẽ được sắp xếp cạnh nhau, nhằm tối ưu khoảng trống của màn hình.

Trăm nghe không bằng một thấy, trông ra sẽ như sau:

 


Saturday, 7 May 2016

PyJobs, GoFML, event29 và tháng 4

[NOT A TECH POST - you were warned]
Một trong số những đêm ít ỏi trong suốt 2 tháng trời khi giờ này vẫn còn tỉnh táo để viết nhảm nhí.
Hai tháng đã trôi qua từ ngày pyjobs.vn xuất chuồng.

Friday, 22 April 2016

Ubuntu 16.04 Xenial Xerus ra lò

Vẫn như thường lệ, mỗi lần Ubuntu ra bản mới, FAMILUG lại chào mừng sự kiện bằng một bài viết mới.
Hôm qua (21 tháng 4 năm 2016), Ubuntu bản 16.04 LTS đã ra chuồng.

LTS là viết tắt của Long-term support - bản hỗ trợ lâu dài (5 năm từ ngày ra), 2 bản LTS gần nhất có thể kể tới 12.04, 14.04. Cứ mỗi 2 năm, Ubuntu lại cho ra bản LTS1 lần - thường được dùng để chạy server production (cần ổn định, chắc chắn).

16.04 có code name là Xenial Xerus, khi gọi ngắn gọi người ta chỉ gọi là xenial. Xerus là tên
khoa học của loài sóc đất châu Phi (African ground squirrels)



Các tính năng nổi bật

snap

Thursday, 14 April 2016

[python] test python đơn giản như giật một sợi tox

Bài viết tiếp theo của "Người ta test/CI thế nào?"
...

Là một sysadmin, anh Chuối rất tự hào mình có khả năng viết Python giỏi như viết bash.
Hễ khi cần viết script ngắn ngắn, anh lại bật ngay vim lên và viết từng dòng thơ bằng ngôn ngữ bash, sau đó dành nửa ngày còn lại để debug tại sao nó lại không chạy. Câu chuyện cũng vậy mỗi lần anh Chuối viết script để tự động quá trình test, build phần mềm, cụ thể ở đây là một Python module.

Các bước phải làm:
  • đầu tiên là tạo virtualenv
  • rồi source virtualenv
  • chạy pip install -r requirements.txt
  • chạy flake8 kiểm tra lỗi pep-0008
  • chạy pylint kiểm tra lỗi lint 
  • install module (python setup.py install) rồi chạy test
  • chạy test bằng py.test tests/ hoặc một cách nào đó khác
  • public package nếu test thành công (python setup.py sdist)
  • dọn dẹp, rửa ráy sau khi xong xuôi.
Tuỳ thuộc vào tâm trạng của anh Chuối, công việc này có thể suôn sẻ hoặc không, tuỳ giời nữa.
Vậy một ngày anh Chuối sang tây, thấy mấy anh Chuối tây vì làm việc này nhiều quá, nên sinh chán nản, và đẻ ra một cái tool có tên là "tox".

Wednesday, 13 April 2016

[Python] Người ta test/CI thế nào?

Nhà người ta sau khi code xong, thì phải chạy test, kiểm tra chất lượng code và làm cho toàn bộ quá trình này trở nên tự động để chạy bằng 1 cái máy khác (CI server), chờ kết quả trả về.

Nhà mình cũng viết code, nhưng những phần còn lại thì hay bỏ qua. Nay kéo sang xem nhà người ta làm thế nào, copy mang về rồi nhận là của mình, vậy là vừa oai, vừa xịn, a hi hi.

1. Test
Viết code thì phải có test, nhà người ta làm thế.
Các file test đặt trong thư mục ``tests``. Nhà người ta dùng py.test để chạy test, nghe đồn nó là hàng xịn nhất trên đời rồi.

https://github.com/pallets/flask/blob/1aa8a54b175ef10a72d3c3d3f4ed112ddc6e2ea6/Makefile#L5

2. Gõ lệnh test
Gõ lệnh rất là mệt, càng dài càng mệt. Thế nên hiểu tại sao bên tây nó quá mệt mỏi nên sinh ra trò làm ngắn lại, mà thế giới gọi là dùng lệnh ``make``. Viết 1 cái Makefile, định nghĩa các câu lệnh ngắn để nó chạy các câu lệnh dài, thế là ta có 1 tập câu lệnh vừa ngắn, vừa yêu.

all: clean-pyc test

test:
 py.test tests examples

tox-test:
 tox

audit:
 python setup.py audit

release:
 python scripts/make-release.py

ext-test:
 python tests/flaskext_test.py --browse

clean-pyc:
 find . -name '*.pyc' -exec rm -f {} +
 find . -name '*.pyo' -exec rm -f {} +
 find . -name '*~' -exec rm -f {} +
 
Xem thêm ở đây 
 
3. Kiểm định chất lượng

Saturday, 9 April 2016

Tuesday, 22 March 2016

[virtualbox] Vài câu lệnh quản lý máy ảo trên Virtualbox

Thực hiện một nhiệm vụ chỉ có thể điều khiển các máy ảo của virtualbox trên dòng lệnh, bạn không còn lựa chọn nào khác là Google...

Bài này note lại một vài câu lệnh hữu ích đã được sử dụng khi thêm ổ cứng cho một máy ảo Linux chạy trên VirtualBox.


Các loại ổ cứng (disk image) Virtualbox hỗ trợ
Vì máy là máy ảo, nên ổ cứng cũng là ổ ảo. VirtualBox hỗ trợ nhiều loại định dạng ổ cứng trong đó cần kể đến VMDK và VDI.

VMDK (Virtual Machine Disk)
là định dạng được phát triển bởi VMWare, giờ đã là định  dạng mở và được sử dụng bởi nhiều phần mềm khác. Khi dùng với VirtualBox không resize được, cần phải convert về định dạng VDI để resize.

VDI (Virtual Disk Image)
là định dạng tiêu chuẩn của VirtualBox, hỗ trợ resize
https://www.virtualbox.org/manual/ch05.html#vdidetails

Các bước cần làm để thêm ổ cứng mới cho một máy ảo gồm

Wednesday, 16 March 2016

[CLI] fallocate - câu lệnh bắt đầu bằng chữ FA, để tạo ra những gì mình không có

fallocate là tên của chương trình thực hiện công việc "allocate file" (tạo file) với kích thước tuỳ ý.

Cần 1 file trống 10MB, 1G, 10GB? không vấn đề, chỉ cần 1 câu lệnh và một chớp mắt là xong.
$ whatis fallocate
fallocate (1)        - preallocate space to a file
$ dpkg -S fallocate
util-linux: /usr/share/man/man1/fallocate.1.gz
util-linux: /usr/bin/fallocate
fallocate nằm trong package "util-linux", một package chứa không ít công cụ quan trọng mà đã giới thiệu ở các bài viết khác (có thể kể tới namei).

Thử tạo 3 file lần lượt có kích thước 1GB 2GB 3GB. Trạng thái trước khi chạy lệnh
$ df -h | grep DOROOT # xem dung lượng tổng, đã dùng, còn trống của ổ có tên  DOROOT
/dev/disk/by-label/DOROOT   30G   13G   16G  44% /

Thursday, 10 March 2016

PyJobs.vn, 12 dự án vào 200.000 lượt view

Năm 2016 đến và những điều tươi đẹp đang ở phía trước...

Sau vài tháng vất vả làm đêm cho một dự án startup mới của Việt Nam, với những lời hứa ngọt bùi rồi vụt bay, quyết định ôm cả bài học lớn về để tự xây dựng những gì mình muốn, theo cách của mình, tự mình làm chủ. Mình đứng trước thách thức bản thân với 12 dự án trong vòng 12 tháng của 2016. Một thử thách đủ để lấy đi hết thời gian rảnh rỗi hay hút không ít tâm trí, sức lực trong năm nay.

Dự án đầu tiên bắt đầu bằng tình yêu với ngôn ngữ lập trình Python, với trăn trở của học viên lớp PyFML: học Python ra có ai tuyển.
Vậy là  PyJobsVN ra đời, là một công cụ tổng hợp các tin tuyển dụng liên quan đến Python. Thay vì phải mở 5-10 trang tìm việc và search Python, pyjobs.vn sẽ mang tất cả về trước mặt bạn.

Được thiết kế với khả năng tự vận hành, pyjobs.vn không cần nhân viên đi tìm nguồn việc, tự động update khi các nguồn việc có tin tuyển dụng mới. Đây cũng là sản phẩm đầu tay mà mình làmd từ đầu cho đến cuối, từ thu thập thông tin với sự giúp đỡ của một chuyên gia tự trồng, làm giao diện, thiết kế database, SEO, thêm Google analytics, share Facebook, các dịch vụ liên quan... Là một minh chứng thực thụ, là bước đầu tiên cho những dự án tiếp theo có cơ sở để phát triển theo.

Monday, 15 February 2016

[PyFML] Thông báo khai giảng lớp học Python khoá 4 (25/02/2016)

Lớp học Python tại Hà Nội - PyFML sẽ khai giảng vào ngày 25/02/2016.
Mọi thông tin chi tiết xem https://gist.github.com/hvnsweeting/4112374900ef17411f44
Thông báo này thay cho giấy mời :p

Wednesday, 10 February 2016

[CLI] namei - theo em đến cuối chân trời

Khi cho một đường dẫn và kiểm tra xem đường dẫn đó có tồn tại hay không, ls có thể trả lời có hoặc không. Nhưng namei mới là giải pháp để tìm ra đường dẫn đứt ở đoạn nào.
$ whatis namei
namei (1)            - follow a pathname until a terminal point is found
$ ls /etc/salt/minion.d/extra.conf/hihi/hehe
ls: cannot access /etc/salt/minion.d/extra.conf/hihi/hehe: Not a directory

$ namei /etc/salt/minion.d/extra.conf/hihi/hehe
f: /etc/salt/minion.d/extra.conf/hihi/hehe
 d /
 d etc
 d salt
 d minion.d
 - extra.conf
hihi - No such file or directory
Kết quả cho biết đường dẫn này không tồn tại từ phần "hihi" chứ ko phải phần "hehe".

Monday, 8 February 2016

[Python] Python tuổi gì?

Đầu xuân năm mới, đi đến đâu mọi người cũng chúc sức khoẻ, may mắn, rồi hỏi tuổi gì, đã
lấy vợ chưa...?
Python chưa "thành công" ở Việt Nam, nhưng không có nghĩa là còn trẻ, và đến năm nay cũng đã thừa tuổi lấy vợ rồi. Có người bảo Python tuổi tý, có người lại bảo mình tuổi teen ^.^

Python tên thật là Pai Văn Thờn, sinh năm 1991 (Tân Mùi), cầm tinh con dê. Tính đến nay đã được 25 tuổi, thừa cả tuổi lấy vợ lẫn đẻ con. Năm nay 25, tất nhiên là lấy vợ được vì lấy vợ xem tuổi đàn bà, còn Python, tròn tròn và dài dài, rõ phải là đàn ông.
Sẽ khá bất ngờ khi được biết rằng, Python còn sinh trước cả Java hay PHP, bảng tổng kết tuổi các ngôn ngữ phổ biến sau sẽ cho biết, tính theo năm, không phải ai cũng cùng vai phải lưa :3

Chúc các độc giả một năm mới code vui, code khoẻ, code đẻ ra tiền :D
PS: lớp PyFML sẽ mở khoá tiếp theo vào giữa tháng 2.

HVN @ familug.org Sáng mồng 1, tháng giêng năm Bính Thân 
Hết.

Tham khảo: năm sinh của các ngôn ngữ lấy từ Wikipedia.

Sunday, 24 January 2016

ag và grep

grep là công cụ không thể thiếu với một *NIX-command line user.
grep là lệnh mà người ta gõ khi cần tìm một process trong output của lệnh ps, hay tìm xem file code nào chứa một từ khoá cho trước...
grep có mặt trên mọi hệ điều hành *NIX: linux-based (ubuntu, redhad...), freebsd, openbsd, OSX...
chắc chỉ trên Windows mặc định mới không có grep.
Tính phổ biến gần như thống trị này khiến vị thế của grep giống như bash, không nhanh nhất, không mạnh nhất, nhưng vẫn được dùng nhiều nhất.

Nhưng... không thể thay thế được, không có nghĩa là không làm.
Nếu chỉ có một con chim hót hay nhất hót, thì cả khu rừng sẽ rất im lặng. [1]

ag - the silver seacher (ag là ký hiệu hoá học của bạc - thống nhất đọc 2 chữ cái là "ây gi"), là một util nhằm thay thế  ``grep``:
$ whatis ag
ag (1)               - The Silver Searcher. Like ack, but faster.
ag sẵn sàng lên tivi quảng cáo:
  • với tốc độ search nhanh hơn (theo quảng cáo là 3-5 lần)

Wednesday, 20 January 2016

[ML] Phân loại vấn đề trong machine learning

Bộ môn machine learning phân các vấn đề nó giải quyết thành 2 nhóm: supervised learning và  unsupervised learning.

Supervised /ˈsuːpəvʌɪz/
Eng:  Observe and direct the execution of (a task or activity)
Vie: giám sát  

Vậy hiểu ở đây phân thành 2 loại học có giám sát và học không có giám sát.

1. supervised learning
Các vấn đề yêu cầu chương trình tạo ra các kết quả mới dựa vào các mẫu có sẵn.
Đề bài sẽ cho các dữ liệu và kết quả đúng, cần dự đoán kết quả cho các dữ liệu mới.
Các vấn đề thuộc supervised learning có thể kể đến vài ví dụ:

Tuesday, 19 January 2016

[ML] Giới thiệu machine learning

Machine learning /məˈʃiːn  ˈləːnɪŋ/ (mơ shin lơn ning) dịch nôm na là máy học, có tài liệu tiếng Việt ghi là học máy nhưng ở đây sẽ chỉ nhắc đến là machine learning hay ML.

Machine learning là gì?
Machine learning là một ngành khoa học (science) để làm cho máy tính có thể tự học mà không cần lập trình cụ thể chi tiết việc nó học. Hay có thể cho là bạn ném cho phần mềm một thuật toán, và nó tự xử lý các vấn đề (tương tự nhau) bằng thuật toán ấy.


Machine learning là một kỹ năng (skill) nằm trong top 10 kỹ năng hot nhất cho một data scientist (nhà khoa học về xử lý dữ liệu) hiện nay.

Machine learning là một lĩnh vực khá mới, được giảng dạy ở một số trường đại học lớn trên thế giới, đáng kể nhất là Stanford - và đặc biệt hơn lớp này có khoá học online miễn phí tại https://www.coursera.org/learn/machine-learning/ (lớp tiếp theo sẽ mở vào 25/Jan/2016)

Một số ứng dụng của machine learning

Saturday, 16 January 2016

[Python] Cuối tuần làm gì?

Chọn lựa luôn là điều khó khăn mà đôi khi, ta muốn phó mặc cho số phận...
Khó quá đừng bỏ quá, khó quá hãy để Python làm:


Thử cách khác với list comprehension: