New FAMILUG
The PyMiers
Saturday, 31 December 2016
Friday, 30 December 2016
Vì sao 0.1 + 0.1 + 0.1 không bằng 0.3?
by
H
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:
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.
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?0.1 + 0.1 + 0.1 == 0.3
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ệufloat
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 754Số 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ỷ
Thursday, 29 December 2016
Wednesday, 28 December 2016
[pandas] Truy cập nội dung DataFrame
by
H
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.
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)
[Swift] Phân biệt let và var - giữa struct và class - [phần 1]
by
Unknown
Để 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:
"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."
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"Hai dòng code trên có ý nghĩa như sau:
var darling = "Beautiful Girl"
"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
by
H
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: pandasNOTE: pandas phụ thuộc vào package numpy, tức cài xong pandas thì đã có cả pandas lẫn numpy.
Successfully installed pandas-0.19.2
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
by
H
Trong package dpkg có gì?
$ 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
by
H
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:
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):
In [1]: import subprocess as sprChuyện này không có gì sai cho đến khi có gì đó sai sai xảy ra.
In [2]: output = spr.check_output(['ls', '/etc/hosts'])
In [3]: print(output)
b'/etc/hosts\n'
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
by
H
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ý.
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:
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
by
H
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ỳ 😶
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.
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 ansibleNếu thấy dòng trên sau khi chạy lệnh pip tức là đã thành công.
...
Successfully installed ansible-2.1.0.0
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
by
H
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:
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.
- 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.
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 rustmathBấ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() {Giải thích:
let x = 42;
if x % 2 == 0 {
println!("{} is even", x);
} else {
println!("{} is odd", x);
}
}
- 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.
Sunday, 4 December 2016
[Ebook] Tài liệu học lập trình miễn phí
by
H
Tiêu chí:
- Miễn phí
- Chất
- Nhóm theo ngôn ngữ.
Bash 🤓
- LinuxCommand
- ABS (Advanced Bash Scripting)
- Tutorial
- Dive into Python
- The Hitchhiker’s Guide to Python!
- Automate the Boring Stuff with Python
- Invent Your Own Computer Games with Python
- Hacking Secret Ciphers with Python
- How to Think Like a Computer Scientist
- SICP Python version
- Learn Python the hard way
- More ebooks: http://pythonbooks.org/free-books/
- Poignant Ruby
- Learn Ruby the hard way
- Real world Haskell
C
- Modern C
- Miễn phí
- Chất
- Nhóm theo ngôn ngữ.
Bash 🤓
- LinuxCommand
- ABS (Advanced Bash Scripting)
Python 😘
- hướng dẫn Python Tiếng Việt- Tutorial
- Dive into Python
- The Hitchhiker’s Guide to Python!
- Automate the Boring Stuff with Python
- Invent Your Own Computer Games with Python
- Hacking Secret Ciphers with Python
- How to Think Like a Computer Scientist
- SICP Python version
- Learn Python the hard way
- More ebooks: http://pythonbooks.org/free-books/
Ruby 🙄
- Poignant Ruby
- Learn Ruby the hard way Haskell 😏
- Learn You a Haskell- Real world Haskell
C
- Modern C
Monday, 21 November 2016
[Sec|Django] Social media fingerprinting
by
H
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:
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.
Saturday, 19 November 2016
Học Python - lớp PyFML 11
by
H
Thông báo khai giảng lớp học Python
- Khoá 201611 - 29 tháng 11 năm 2016,
Đăng ký học tại đây.
- Khoá 201611 - 29 tháng 11 năm 2016,
- HN: SGarden coworking space, số 19, ngõ 376, Khương Đình, Hà Nội.
Đăng ký học tại đây.
Friday, 18 November 2016
[vim] Dùng Go font với Gvim
by
H
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ỳ ý.
Để xem guifont đang dùng giá trị gì, gõ:
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:hSIZENế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
by
H
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.
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
by
H
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
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
commandsẽ dừng ngay khi ``command`` fail, phần if không bao giờ được chạy.
if [ $? -ne 0 ]; then ...
Monday, 31 October 2016
Kiểm tra máy ảo, liệt kê danh sách các device
by
H
Kiểm tra xem máy có phải máy ảo không:
Còn đây
là kết quả khi chạy trong một Docker busybox container:
# dmesg | grep -i virtualĐây là một máy ảo KVM.
[ 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
Còn đây
là kết quả khi chạy trong một Docker busybox container:
/ # dmesg | grep -i virtualLiệt kê danh sách các block device
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
# 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!
by
H
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 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:
Cài đăt: https://www.rust-lang.org/en-US/downloads.html
Kiểm tra version:
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
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.
Cài đăt: https://www.rust-lang.org/en-US/downloads.html
Kiểm tra version:
$ rustc --versionNhững người code Rust được gọi là : Rustaceans
rustc 1.12.1 (d4f39402a 2016-10-19)
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.rsRust là compiled language, tức phải "build" từ file source ".rs" thành file binary, sau đó chạy file binary.
fn main() {
println!("Hello, FAMILUG!");
}
$ rustc main.rs
$ ./main
Hello, FAMILUG!
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
by
H
Thay vì phải viết
Trích tài liệu của Jinja:
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.
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'] }}
This is important if an object has an item and attribute with the same name. Additionally, theattr()
filter only looks up attributes.
Sunday, 16 October 2016
[Backup] Ký tự % trong crontab
by
H
Một ngày mưa, viết crontab backup dữ liệu về máy, gặp ngay lỗi
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
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:
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
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 will be executed by /bin/sh or by the shell specified in the SHELL variable of the cronfile.
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
by
H
Đọ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 😗
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
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.
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
by
H
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 |
Cú pháp
Ví dụ:name = value
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ị).>>> my_age = 6 >>> your_age = 9 >>> our_ages = my_age + your_age >>> print(our_ages) 15
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
by
H
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ệt
và xanh hoà bình nữa.
Nhưng sự thật chỉ có đúng hoặc sai, và Python thì có
Đúng tức là không sai, và sai nghĩa là không đúng:
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:
Dùng toán tử>>> not True False >>> not False True
not
để đảo ngược giá trị của biểu thức.
Dùng is
để kiểm tra xem CÁI NÀY có là CÁI KIA khôngVà tất nhiên, một là một, còn hai là hai:>>> 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
>>> 1 is 1 and 2 is 2
True
Tuesday, 4 October 2016
Tính toán bằng Python - phần 2
by
H
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 ^
.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,...>>> 2 ** 7 128 >>> 2 ** 8 256 >>> 10 ** 7 10000000 >>> 2 ** 1000 10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376
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.>>> 4 ** (1/2) 2.0 >>> 27 ** (1/3) 3.0 >>> 2 ** (1/2) 1.4142135623730951 >>> 4 ** 2.0 16.0
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
by
H
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.
Nghe đọc phát âm tại từ điển Cambridge
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 (
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":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:>>> 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
Có thể thấy to cỡ nào thì Python cũng xử lý được cả.>>> 12312421312321 + 658347654397897897073214123412 658347654397897909385635435733
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
by
H
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ờ.
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)
Thursday, 15 September 2016
[CLI] tail -F, F hoa F***
by
H
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 đó:
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
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!
by
H
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
by
H
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):
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.
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ì?
by
H
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).
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).
file robots.txt nằm ở đường dẫn /robots.txt của site.
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
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).
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ậtAllow: 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Đ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).User-agent: * Disallow:
Friday, 26 August 2016
[Python] Tải nhạc từ youtube bằng dòng lệnh
by
H
Lên mạng có bài nhạc hay,
cảm thấy có tội nếu không tải về 😜
Cài đặt
cảm thấy có tội nếu không tải về 😜
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 PythonCà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í
by
H
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.Saturday, 20 August 2016
Python tutorial Tiếng Việt
by
H
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.
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
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.
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
by
H
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)
Dependencies:
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)
Cho Ubuntu 16.04, OSX... xem thêm ở đâysudo apt-get install libunwind8 libicu52 sudo dpkg -i powershell_6.0.0-alpha.9-1ubuntu1.14.04.1_amd64.deb
Dependencies:
$ dpkg -s powershell | grep -i depends (chạy sau khi đã cài đặt)libunwind8
Depends: libunwind8, libicu52
Thursday, 11 August 2016
[Linux kernel] dm - đang mệt
by
H
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
Wednesday, 10 August 2016
Học Python - Lớp PyFML 07 - Khai giảng 23/08/2016
by
H
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ònThờ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 ?
- Ngôn ngữ lập trình dễ đọc nhất 🌏
- Mạnh mẽ 🐍, đơn giản (không phải tự quản lý memory như C,C++), thực tế (không magic - hư cấu như Ruby ), ngắn gọn súc tích (không dài lê thê như Java ), ... Tất nhiên là cũng có nhiều điểm yếu, nhưng lúc mới ❤️ nhau thì người ta chỉ cần biết những điểm khỏe thôi, yếu đâu về sau tự lòi ra hết.
- Sử dụng phổ biến hàng đầu trên thế giới (http://githut.info/ http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html http://stackoverflow.com/tags)
- Sử dụng bởi các tập đoàn công nghệ hàng đầu thế giới: Google, Dropbox , Microsoft , Amazon, Facebook , Mozilla , Uber ...
- Là ngôn ngữ sử dụng để tạo ra OpenStack - hệ thống public cloud phổ biến và hiện đại nhất thế giới
- Công cụ mạnh mẽ trong tính toán khoa học, lập trình web, lập trình hệ thống (https://www.python.org/about/apps/)
- Phổ biến trong các startup quốc tế .
- Python trong tiếng Việt nghĩa là "con trăn", mà ở Việt Nam thì không có gì là không ăn được cả
Mục tiêu
Monday, 8 August 2016
[Python] setup.py develop
by
H
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
Để cài đặt 1 project ở chế độ development, chạy lệnh:
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 installsau mỗi lần sửa code.
Để cài đặt 1 project ở chế độ development, chạy lệnh:
python setup.py developVí dụ:
Sunday, 7 August 2016
[Django] dùng cùng 1 database cho dev, test và production
by
H
Đâ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 😂
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
by
H
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 busyboxHỏi nào:
$ whatis busybox
busybox (1) - The Swiss Army Knife of Embedded Linux
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
by
H
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:
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)
Tuesday, 12 July 2016
Memoization là gì? LRU cache là gì?
by
H
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:
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 )
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:
{và sửa lại function để nó lấy result1 nếu input1 có trong dict.
input1: result1, # f(input1)
input2: result2, # f(input2)
inputN: resultN # f(inputN)
}
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):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:
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
Sunday, 3 July 2016
PHG - Python tool để tạo password hàng loạt cho sysadmin
by
H
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:
-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)
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.4Với các option:
...
$ 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 -
-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
by
H
Đã 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/
Đă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
by
H
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ó:
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 -Vcá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:
nginx version: nginx/1.7.9
built by gcc 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
TLS SNI support enabled
...
$ openssl versionSNI là gì? sao lại cần?
OpenSSL 1.0.1f 6 Jan 2014
Friday, 27 May 2016
Django 1.8 migrate siêu tốn ram, đừng khóc!
by
H
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:
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
by
H
Nếu bạn chưa biết ag là gì thì hãy đọc ngay tại đây vì ag 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ì:
Giờ chuyển đến thư mục parent:
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.pemThấy kết quả trong file syncthing/main.go
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")
Giờ chuyển đến thư mục parent:
Monday, 16 May 2016
[Python] convert string thành integer
by
H
Chả có gì để nói nếu chỉ có:
In [2]: [int(i) for i in ('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:
Out[2]: [1, 123, 1235]
In [3]: int(' 5 ')Vậy convert 1 dạng string của 1 list số thành 1 list số thế nào:
Out[3]: 5
In [4]: s = '[2, 3, 4, 123, 1235]'
Sunday, 15 May 2016
Combo nguy hiểm
by
H
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:
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
by
H
[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.
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ò
by
H
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
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
by
H
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:
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".
...
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.
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?
by
H
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.
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
Thông báo mở lớp lập trình Python và Golang
by
H
Lớp Golang cho người đã biết lập trình ngôn ngữ khác GoFML01
Lớp Python cho tất cả mọi người PyFML05
FB page: https://www.facebook.com/pyfml
Tuesday, 22 March 2016
[virtualbox] Vài câu lệnh quản lý máy ảo trên Virtualbox
by
H
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
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ó
by
H
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.
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
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 fallocatefallocate 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).
fallocate (1) - preallocate space to a file
$ dpkg -S fallocate
util-linux: /usr/share/man/man1/fallocate.1.gz
util-linux: /usr/bin/fallocate
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
by
H
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.
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)
by
H
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
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
by
H
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/heheKế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".
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
Monday, 8 February 2016
[Python] Python tuổi gì?
by
H
Đầ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.
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
by
H
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``:
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 agag sẵn sàng lên tivi quảng cáo:
ag (1) - The Silver Searcher. Like ack, but faster.
- 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
by
H
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ụ:
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
by
H
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
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ì?
by
H
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:
Khó quá đừng bỏ quá, khó quá hãy để Python làm:
Thử cách khác với list comprehension:
Subscribe to:
Posts (Atom)