New FAMILUG

The PyMiers

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)