Saturday, 2 December 2017

Dùng git diff với patch

git diff hiển thị các thay đổi bạn đã thực hiện mà chưa add, commit.
Output của git diff, trông, giống như diff (câu lệnh thường để so sánh 2 file).

patch là câu lệnh nhận vào file diff, và sửa các file có thay đổi tương ứng.
Trước khi GitHub trở nên phổ biến, người ta vẫn chia sẻ "bản vá" các phần mềm bằng các file diff, người nhận được sẽ patch (vá) các chương trình dựa vào file diff nhận được.



Đây là một file diff:

Saturday, 25 November 2017

pgrep để grep process

pgrep có cài sẵn trên mọi máy tính *NIX.
Nó nằm trong gói procps, một package cơ bản, chứa các câu lệnh thường ngày như `ps`, `kill`, `top`...

$ dpkg -S `which pgrep`
procps: /usr/bin/pgrep
`pgrep` thường chỉ được dùng để lấy đầu ra, làm đầu vào cho lệnh kill, mặc định, nó trả về list các PID của process có tên ứng với từ khóa tìm kiếm:

```
$ pgrep cron
978
```

Thường sau đó sẽ là: kill -9 978
Hay trong 1 câu:

```
kill -9 $(pgrep cron)
```
Hay dùng luôn câu lệnh pkill:
```
pkill -9 cron
```

`pgrep` có option ít ai để ý tới: `-a`

Wednesday, 22 November 2017

Vượt qua giới hạn 1 deploy key của GitHub

GitHub cho phép gắn`SSH  deploy key` vào từng repo, giúp ta có thể clone repo đó về để deploy (cài đặt chạy thật). Thế nhưng mỗi key chỉ được gắn vào 1 repo duy nhất.
Đây là giới hạn rất khó chịu nếu trên 1 máy tính (máy chủ) bạn cần clone về nhiều hơn 1 repo.

Giải pháp tiêu chuẩn GitHub đưa ra là người dùng cần tạo 1 tài khỏan khác, gắn key vào, rồi add tài khỏan đó vào các repo. Như vậy tài khỏan này đóng vai trò như 1 người dùng bình thường, 1 key có thể clone nhiều repo. Xem thêm giải pháp này ở help của GitHub

Vậy nếu không tạo được tài khỏan (bạn không phải admin) thì làm sao có thể clone nhiều repo?
...
...
...

Đây là một giải pháp khá "hack", đòi hỏi có hiểu biết chi tiết về SSH, và hơi "không đẹp".

Trước tiên, cần biết rằng khi ssh sử dụng private key, SSH client sẽ thử lần lượt theo thứ tự sau:

Thursday, 12 October 2017

[Python] unittest với assertTrue

Đây không phải một bài viết dài giải thích test là gì, unittest là gì.

Python unittest

Khi sử dụng thư viện unittest của Python, ta thường dễ bị cuốn hút bởi method assertTrue, thường viết các method như sau:

self.assertTrue(7 in thatlist)
self.assertTrue(isinstance(res, list))
self.assertTrue(res > 0)
self.assertTrue(res == [1,2,3,4])

Code vẫn chạy và test bình thường, nhưng nếu test fail, output sẽ rất khó hiểu:

Monday, 9 October 2017

7 init runlevel của hệ thống Linux

Khi để bài chứa tới 3 yếu tố đáng sợ, xác suất người ta sẽ đọc hết bài sẽ giảm còn 4 %.
- 7
- init
- runlevel

Và để tránh thêm một yếu tố đáng sợ khác, tôi đã thay từ "SysV" bằng từ "hệ thống" - dù biết là rất sai.

Bài này để giải thích khái niệm Runlevel - có thể gặp khi đi phỏng vấn sysadmin - mặc dù ... nó có gì đó hơi sai sai.


Khi máy tính khởi động - không hề đơn giản - và không có trong bài này - trải qua nhiều bước, kernel (các UNIX/UNIX-like OS) sẽ chạy chương trình đầu tiên với PID 1 - chương trình đó có tên chung là init.
Chương trình này, nhìn chung sẽ đảm nhiệm các công việc: bật, tắt, restart các chương trình cần bật lên cùng máy tính (và có thể nhiều việc khác nữa). Tưởng tượng bạn là người dùng Ubuntu giao diện bình thường, vậy ai sẽ chạy "chương trình giao diện (X)"?, ai sẽ bật phần mềm quản lý kết nối mạng / wifi ...? tất cả đều do init thực hiện.

Init là gì?

Init chỉ là tên chung ám chỉ chương trình được Kernel chạy đầu tiên khi khởi động máy tính, giống như ta nói web server / HTTP server - chỉ là tên nói chung chung, còn chương trình cụ thể là NGINX, Apache2...

Monday, 28 August 2017

Thử làm một "lập trình viên Odoo"

Odoo là gì

Ố đù tự mô tả về mình:

Odoo is a suite of web based open source business apps.
The main Odoo Apps include an Open Source CRM, Website Builder, eCommerce, Warehouse Management, Project Management, Billing & Accounting, Point of Sale, Human Resources, Marketing, Manufacturing, Purchase Management, ...Odoo Apps can be used as stand-alone applications, but they also integrate seamlessly so you get a full-featured Open Source ERP when you install several Apps.


Nó là một bộ các web app phục vụ các công việc trong kinh doanh như quản lý quan hệ khách hàng, quản lý project, tính tiền/ kế tóan, tuyển dụng ... đầy đủ đến mức nó là một giải pháp "ERP" cho doanh nghiệp.


Đó là nhìn từ phía người dùng.
Còn về phía lập trình viên, Odoo là gì?

Friday, 18 August 2017

Làm website với công nghệ serverless

Sau khi Amazon AWS cloud cho ra đời sản phẩm mới: AWS Lambda, thế giới công nghệ lại một lần nữa nổi lên nhiều sóng gió, cụm từ "serverless" trở thành một từ khóa hot, như BlockChain hay Docker những năm trước.

Serverless là gì

Serverless là cái tên dành cho công nghệ chạy code mà người dùng (lập trình viên) không phải lo cài đặt / cấu hình server - họ chỉ cần viết code, còn việc chạy, hãy để nhà cung cấp dịch vụ lo (và tất nhiên người dùng chỉ lo code và trả tiền).

Kiến trúc serverless này, chỉ là "không có server" trong nỗi lo của lập trình viên, chứ code không tự nhiên mà chạy được. Các nhà cung cấp dịch vụ sẽ lo thiết kế, vận hành chạy code của người dùng.
Các dịch vụ có sẵn:
- AWS Lambda
- Google cloud functions
- Azure functions



Và những hệ thống mà các công ty có thể tự cài:

Saturday, 5 August 2017

Chuyện gì xảy ra khi bạn gõ Google.com rồi Enter?

Hay các kiến thức về network cần biết cho sysadmin/devops/ và developer nào biết thì tương lai tươi sáng không ngờ :3

Với những hiểu biết này, bạn không cần bất kỳ loại chứng chỉ về network nào như CCNA ...
trừ khi bạn sẽ là một "network admin"hay có đam mê với bằng cấp.


Chuyện gì xảy ra khi bạn gõ Google.com rồi Enter?

là một câu hỏi phỏng vấn kinh điển (của bọn tư bản dãy chết :v), thường dùng để kiểm tra kiến thức về network của ứng viên, nhưng để trả lời một cách chi tiết cụ thể, thì không hề dễ dàng gì.

Alex Gaynor, cựu director của Python Software Foundation đã tạo 1 GitHub repo chia sẻ câu trả lời chi tiết cho câu hỏi này tại What-happens-when

Nếu bạn cần một bản tài liệu chi tiết hơn về TCP/IP, Microsoft có tài liệu khá cụ thể / thiết thực (thay vì quá nhiều lý thuyết phức tạp như nhiều tài liệu khác), xem tại đây.

Một tài liệu RẤT XỊN khác nhắm tới các lập trình viên xem tại đây.

Wednesday, 2 August 2017

Cắm sạc 90 watts vào laptop dùng sạc 60 watts có cháy không?

Hay các khái niệm cơ bản về điện cần biết - để dùng, không phải để thi.

Mình học vật lý khá tốt. Học phổ thông thì 9-10, mà ở đại học, thi thì qua. Nhưng chỉ là giỏi tính toán, chứ không hiểu gì. Volt, ampere, watt đều biết tính, chỉ ko biết để làm gì thôi 
Hãy quay lại câu hỏi ở đây và đưa ra những khái niệm cần thiết để trả lời.

Sạc HP: Output: 18.5V and 3.5A, 65W.
Laptop Dell latitude:  19.5V and 3.34A / 4.62A.




Cái gì khiến thiết bị điện cháy? Nếu đã từng cắm cái tivi / máy khâu của Nhật vào ổ điện Việt Nam, bạn sẽ thấm thía điều này.  
Ở Nhật Bản, người ta dùng điện thế 110V, còn Việt Nam, Mỹ... là 220V. Cắm thiết bị vào dòng điện có điện thế cao hơn sẽ cháy.

Hiệu điện thế (voltage)

đơn vị Volt - là khái niệm tương tự như áp suất. Nó là áp lực đặt lên các hạt electron. Dễ hiểu khi đặt áp lực lớn lên 1 thứ ko chịu được áp lực ấy sẽ xảy ra vấn đề.
Vì vậy các thiết bị phải có cùng hiệu điện thế - sai số trong 5-10% là vẫn OK.

Wednesday, 26 July 2017

RAM nhanh hơn SSD, HDD bao nhiêu?

RAM nhanh hơn SSD cỡ 1500 lần,
Và hơn HHD cỡ 100.000 lần.

Máy tính ngày nay nên thường set swap với kích thước ~ 20% kích thước RAM.

Page là một mảnh bộ nhớ.
Paging là hành động tạo một bản copy của một page. Vd copy từ RAM vào swap.

Theo

A typical reference to RAM is in the area of 100ns, accessing data on a SSD 150μs (so 1500 times of the RAM) and accessing data on a rotating disk 10ms (so 100.000 times the RAM).

https://www.redhat.com/en/about/blog/do-we-really-need-swap-modern-systems

Hết.
HVN at https://Pymi.vn
Đăng ký học #Python tại Sài Gòn khoá 15 khai giảng 3/8/2017. Xem chi tiết tại https://pymi.vn

Thursday, 6 July 2017

Không sudo pip, hãy virtualenv

- "Mình không cài bằng pip được..."
- "chạy sudo pip ... nhé "

Đó là những câu hỏi và trả lời thường xuất hiện, khi người ta nói về pip. Đây là vấn đề chung với những người dùng không hiểu về phân quyền trên UNIX và thường sẽ làm mọi thứ trở nên rắc rối thêm bằng cách chạy sudo.

## sudo - câu lệnh thần thánh


Một mẩu truyện nhỏ cho thấy sức mạnh của `sudo`, khi ta nói mà đối phương không nghe, thêm `sudo` vào đầu là mọi thứ đều sẽ hoạt động.

### sudo - SUperuser DO

Trên các hệ điều hành *NIX có chia ra nhiều user để nhiều người  dùng chung một máy tính. Trong đó, mọi máy tính luôn có user `root` - user có quyền năng tối thượng, thường được gọi là quyền admin hay superuser, có thể thực hiện bất kỳ thay đổi gì trên máy tính. Do có quyền năng vô hạn như vậy, nên khi thực hiện việc gì cũng ẩn chứa nguy hiểm, một câu lệnh gõ nhầm cũng có thể phá huỷ hệ thống, và nếu như ai cũng là root thì hệ thống sẽ loạn, người dùng không hiểu biết có thể cài đặt các loại virus/malware lên máy tính (hi Windows).

Để giải quyết vấn đền này, người ta sản xuất ra phần mềm tên "sudo", cho phép cấp quyền cho các user nhất định. Với sự tồn tại của sudo, người ta thay đổi cách dùng máy tính:

Friday, 30 June 2017

systemd là gì

$ whatis systemd
systemd (1)          - systemd system and service manager

systemd thuộc nhóm chương trình: system and service manager - nó quản lý (bật/tắt/khởi động lại...) các dịch vụ chạy trên máy từ lúc bật máy cho đến lúc tắt máy. Nó cũng quản lý luôn cả hệ thống (system) cụ thể là các công việc: set tên máy (hostname), cấu hình loopback interface (lo trong output của lệnh `ip addr`), thiết lập và mount các filesystem như /sys /proc ...

systemd thường là process đầu tiên được chạy sau khi bật máy (có PID = 1) và còn được gọi là init system. Các chương trình khác cùng loại có thể kể tới Upstart (trên Ubuntu đến bản 14.04), launchd của OSX, supervisor viết bằng Python, sysV là hệ thống init cổ điển viết bằng shell script...

Việc chuyển sang systemd là quyết định của Debian - distro mà Ubuntu dựa vào, vậy nên Ubuntu đã phải tiếc nuối bỏ đi đứa con ruột của mình là Upstart với một bài viết mạnh mẽ đầy nước mắt của founder Ubuntu




Không bàn cãi thêm về chuyện hơn thua, ta vẫn phải tiếp tục tiến về phía trước với Systemd.

## Các khái niệm của systemd

systemd quản lý các "unit"

Thursday, 29 June 2017

[Python] import sys

sys là thư viện builtin của Python, nó chứa các thông tin liên quan đến chính chương trình python interpreter bạn đang chạy, và cũng cho phép thay đổi một vài thông số. Nó không phải là thư viện chứa các thông tin liên quan đến hệ điều hành như nhiều người lầm tưởng (sys - system - và nghĩ là hệ điều hành).

help(sys) có thông tin đầy đủ về từng giá trị và function, hãy thử xem hệ thống của bạn có gì.

Script
import sys

SKIP = ('path', 'modules', '__doc__', 'path_importer_cache', 'meta_path')

for attr in sorted(sys.__dict__.items()):
    if not callable(attr[1]) and attr[0] not in SKIP:
        print(attr[0], ':', attr[1])

Kết quả khá dài, nhưng một vài thông tin đáng chú ý có thể kể tới:
- version: phiên bản Python đang dùng, bản C đã build chương trình Python interpreter đang chạy 
version : 3.5.2 (default, Nov 17 2016, 17:05:23)
[GCC 5.4.0 20160609]
- builtin_module_names: tên các module builtin
- platform : linux - nền tảng hệ điều hành đang chạy
- byteorder : little endian
- float_info : các thông số liên quan đến kiểu float

Kết quả

Monday, 19 June 2017

Python Data Science Handbook by Jake VanderPlas

Một cuốn sách viết bởi Jakevdp, một cái tên khá đặc biệt trong thế giới Python. Anh là tác giả của thư viện vẽ hình Numpy theo phong cách XKCD.

Anh vừa cho ra mắt cuốn sách "Python data science handbook" ở định dạng Ipython, có thể đọc / clone free trên GitHub

Monday, 12 June 2017

SSD là gì? mua SSD loại nào?

Mặc dù dùng SSD đã lâu (có sẵn trong máy laptop lúc mua), nhưng giờ mới là lần đầu mình tự đi chọn mua SSD. Bài này tổng hợp các khái niệm, hiểu biết về SSD giúp bạn hiểu tại sao nên dùng SSD, các ưu điểm nhược điểm là gì, và chọn chúng theo tiêu chí nào cho phù hợp khi giá thành của loại ổ cứng này ngày càng giảm.


# SSD là gì?

SSD là một loại ổ cứng cho máy tính.
Nhưng so với ổ cứng truyền thống (HDD - hard disk drive), nó có nhiều cải tiến / kiến trúc rất khác biệt.

SSD - solid state drive - một thiết bị ở trạng thái rắn (solid). Nói như vậy không có nghĩa HDD là ở thể lỏng, mà HDD ở thể "động".

## Cấu tạo cơ bản của HDD 

Trong HDD có chứa một đĩa từ, đĩa từ này sẽ quay với tốc độ rất cao  trong HDD (nhờ từ trường - 7200 vòng / phút và 5400 vòng / phút với loại cho laptop - Spindle speed: 5400 RPM Round Per Minute).

Việc quay nhiều (7200 RPM) khiến:
- tiêu thụ nhiều điện năng
- tốc độ đọc ghi đĩa thường cao hơn
- sinh nhiều nhiệt hơn (đĩa quay, ma sát sinh ra nhiệt làm nóng thiết bị)
- có thể gây tiếng ồn

Do đó các laptop thường dùng loại 5400 RPM, chậm hơn, nhưng mát và tiết kiệm điện (pin) hơn.

Sử dụng HDD còn có nhược điểm là dễ hỏng hóc khi va đập/ có di chuyển khi đĩa đang quay (máy đang bật).

HDD thường có kích cỡ 3.5 inches cho máy bàn và 2.5 inches dành cho laptop.

Đĩa mềm (Floppy disk) cũng có cấu tạo đĩa từ quay tương tự.

## Cấu tạo cơ bản của SSD

Thay vì dùng đĩa từ để lưu dữ liệu, sử dụng công nghệ lưu trữ khá giống với các USB stick [USB flash drive], khi sử dụng các thẻ nhớ flash memory (NAND flash non-volatile memory).

Một thiết bị phần cứng gọi là controller (một bộ xử lý nhúng chạy code ở firmware-level) thực hiện quản lý tương tác giữa các NAND memory với máy tính. Controller ảnh hưởng quan trọng đến hiệu suất của SSD.

Vì không sử dụng đĩa từ quay, SSD có các ưu điểm:
- không nóng
- không bị ảnh hưởng bởi va chạm, di chuyển
- ít tốn điện hơn
- sử dụng mạch bán dẫn - thường nhỏ / nhẹ

Flash-memory trước đây chậm hơn HDD, nhưng nhờ sự cải tiến về controller, nó trở nên nhanh hơn HDD nhiều lần.

### Nhược điểm

Do cấu tạo sử dụng flash-memory, SSD thường có tuổi thọ (dựa vào số lần đọc ghi) thấp hơn HDD.

Dù có nhiều thiết bị được bảo hành tới 10 năm, nhưng trong điều lệ bảo hành có ghi rõ, nếu block (một khối lưu trữ) được đọc ghi quá nhiều lần vượt quá tuổi thọ cho phép, nó sẽ bị chai (wear), và sẽ không được bảo hành vì điều đó.

## Kích thước

Phổ biến ở kích thước 2.5 Inches, có loại nhỏ hơn thì khoảng 1.8 inches (thường có chuẩn mSATA). Ngoài ra loại theo chuẩn vào ra M.2 thường có hình dáng nhỏ như 1 thanh RAM.

## I/O interface - chuẩn vào ra 

SSD có nhiều cổng giao tiếp với máy tính khác nhau.

Phổ biến nhất có các loại:
- SATA 2.0: tốc độ cho phép: 3Gb/s
- SATA 3.0: tốc độ cho phép: 6Gb/s
- SATA express
- mSATA
- PCIe
- M.2

Chọn loại phù hợp mà mainboard của bạn hỗ trợ.

## Mua SSD loại nào?

Một điều khá thú vị, là các ông lớn trong ngành sản xuất HDD đều không có mặt trong thị trường SSD này, mà hầu hết là các nhà sản xuất USB/Thẻ nhớ danh tiếng trên thị trường. Có thể kể tới: SanDisk, Kingston, Adata, ... hay những cái tên chỉ nổi lên vì SSD như Crucial, OCZ nhưng thú vị hơn cả là Intel và Samsung cũng tham gia dẫn đầu cuộc đua này.

Samsung với dòng 850 EVO đã chiếm không ít thị phần SSD và rất được ưa chuộng. Nhưng đặc biệt chú ý khi dùng dòng Samsung EVO 8XX với máy cài Linux/BSD  mặc dù lỗi này có vẻ đã được fix, hãy chắc chắn về phiên bản kernel bạn đang dùng.
Xem thêm các dòng SSD có vấn đề trên Linux

Xem bảng so sánh độ ưa chuộng các loại SSD ở đây: http://ssd.userbenchmark.com/

Nếu định dùng FreeBSD, chú ý chọn SSD nào có hỗ trợ lệnh TRIM tốt xem các SSD không hỗ trợ TRIM ở link Linux trên.

# Kết luận

Nếu bạn có ít tiền và muốn tăng tốc con máy tính đã già nua của mình thì thay HDD bằng SSD luôn là một đầu tư xứng đáng. Máy sẽ nhanh gấp cả chục lần, điều mà trước kia ta thường nhầm tưởng là phải thêm RAM hay CPU.

Hết.
HVN at http://www.familug.org/ and http://pymi.vn
Đăng ký học lập trình #Python 3 từ con số 0 tại PyMI.vn - lớp Sài Gòn khai giảng đầu tháng 8, lớp Hà Nội khai giảng giữa tháng 9. Xem chi tiết tại https://pymi.vn/ #PyMI #PyFML

Wednesday, 31 May 2017

apt changelog và wannacry

Wannacry làm mưa làm gió trên "cộng đồng mạng" của các "Windows" user.
Dùng Linux/OSX, bạn sẽ không quan tâm lắm...

Sau Wannacry, người ta lại phát hiện ra một lỗ hổng của Samba và đặt tên là "Sambacry",
lỗ hổng này cho phép một user không có quyền root nhưng có thể chạy các chương trình như root.
Vì vậy nó cũng được coi như một lỗ hổng rất nghiêm trọng.
Ubuntu ngay lập tức ra bản fix cho lỗ hổng này.


Trên Ubuntu 16.04, package sau khi đã fix có phiên bản là: released (2:4.3.11+dfsg-0ubuntu0.16.04.7)

Câu lệnh `apt-get changelog samba` giúp ta lấy thông tin thay đổi của package:

Wednesday, 24 May 2017

Di chuyển trong file

Là một ngôn ngữ bậc cao, Python cung cấp các function giúp người dùng có thể đọc file dễ dàng theo từng dòng hay tất cả nôi dung của file. Vậy nhưng trong những trường hợp cần thiết, Python vẫn có thể can thiệp sâu xuống dưới tầng thấp hơn và thực hiện những yêu cầu phức tạp hơn.


Mở file - text stream

Mở file trong Python sử dụng funtion open('ten_file'), mặc định ta sẽ mở file để đọc (read) ở dạng "text mode". Ta mặc định file cần mở là một file text (thường là .txt, .csv ...)
>>> f = open('/etc/hosts')
>>> print(f)
<_io .textiowrapper="" encoding="UTF-8" mode="r" name="/etc/hosts">
Ta đọc toàn bộ nội dung của file vào bộ nhớ bằng method read:
>>> content = f.read()
>>> print(len(content))
918
Sau khi đọc đến cuối file (gặp ký tự EOF - end of file, một ký tự đặc biệt đánh dấu sự kết thúc của một file), nếu ta vẫn tiếp tục đọc, sẽ chỉ thu được empty string vì không còn gì để đọc.

Tuesday, 23 May 2017

Tính năng bảo mật kinh khủng của z.com

Thằng em bên cạnh yêu hàng được quảng cáo nhiều ở Việt Nam, nó dùng z.com - một nhà cung cấp domain/host được quảng cáo khá nhiều trên các kênh thông tin.
Mọi thứ đều có vẻ ổn, cho đến một ngày nó ngồi ở The Coffee House tại một con phố thơ mộng của Hà Thành. Nó login vào z.com để quản lý website, và liên tục bị logout sau mỗi lần login rồi bấm vào một mục bất kỳ trong control panel.




Liên hệ gấp support, đội support của z.com làm việc rất nhanh và hiệu quả, thậm chí gọi điện để giải

Saturday, 20 May 2017

Học lập trình Python tại Hà Nội lớp PyMi.vn khoá 14


Đăng ký học lập trình #Python 3 từ con số 0 tại PyMI.vn - lớp Hà Nội khai giảng đầu tháng 6, lớp Sài Gòn khai giảng đầu tháng 8. Xem chi tiết tại https://pymi.vn/

Nhập email vào http://invite.pymi.vn/ để nhận thư mời tham gia forum hỏi đáp Python, Django, Golang, Linux ...

Friday, 12 May 2017

Học Elixir trong một giấc mơ

Lý do bạn thích học Haskell, LISP, Erlang, Elixir, Ocaml, Scala... những ngôn ngữ lập trình hàm (functional programming language) có vẻ hay ho, mà không bao giờ thành công là gì?



Sau đây là vài lý do mình gặp phải:

- Quá nhiều khái niệm mới
- Nhồi nhét hết các khái niệm xong không có gì để làm
- Chọn ngôn ngữ "xịn" nhất: trong mảnh đất functional programming, rất nhiều cái tên hấp dẫn khác như Haskell, Ocaml, Racket, Scheme, CLisp, Scala,...

Để khắc phục điều này, ta sẽ:

- Chỉ tập trung vào những khái niệm đã quen thuộc, học thật nhanh, tra cứu khi cần
- Có một ý tưởng để thực hiện
- Tập trung vào Elixir vì mỗi ngôn ngữ đều có điểm mạnh/ yếu riêng, nhưng khi nắm được một ngôn ngữ, học các ngôn ngữ khác sẽ trở nên dễ dàng hơn nhiều do đã quen thuộc các khái  niệm và lối tư duy của functional programming.


Nếu không có gì để làm, nuốt xong các khái niệm, 1 tuần sau bạn sẽ lại quên.

Elixir/Erlang hoàn toàn đủ khả năng để cho bạn lập trình loanh quanh mấy thuật toán, giải các bài toán / vấn đề trên HackerRank. Nhưng điểm sáng của ngôn ngữ này, thực ra chỉ toả sáng khi ta dùng nó để phát triển các hệ thống lớn, cần chạy phân tán, hay chạy song song... Ít khi một người sẽ làm hẳn một project lớn như vậy. Vì vậy, ta thường không có đất dùng cho Elixir hay Erlang.

Một cách ứng dụng để chơi với ngôn ngữ mới nữa "nhỏ hơn", là viết các câu lệnh thực hiện một việc gì đó (CLI). Vậy nhưng Elixir/Erlang không toả sáng/ đơn giản trong công việc này, nó CÓ THỂ làm được, nhưng trên thực tế không mấy ai làm.

Ví dụ standard khi học Erlang là làm một hệ thống chat. Trên thực tế, hệ thống chat của "Whatsapp" được viết bằng Erlang hệ thống này đã được bán lại cho FaceBook với giá 19 TỶ đô la Mỹ (PS: FaceBook trước đó cũng đã mua lại Instagram - một hệ thống viết bằng Django/Python với giá 1 TỶ đô la Mỹ)

Ta có thể làm 1 website sau khi học Elixir, đây là lĩnh vực hiện tại mà Elixir mạnh nhất.

Đã xong phần ý tưởng, bây giờ hãy học Elixir.

Thực hiện trên:

```
$ elixir --version
Erlang/OTP 19 [erts-8.0.2] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Elixir 1.3.2
```
Xem bản đã format đẹp tại đây: https://hvnsweeting.github.io/elixir-trong-mot-giac-mo/


Friday, 5 May 2017

[Linux] Từ super user đến Sysadmin

(Hay một định nghĩa về "Linux Sysadmin")

Bạn có thể dùng hệ điều hành nhân Linux (Ubuntu, Fedora...) OSX được 5 năm, nhưng điều đó không biến bạn thành "Sysadmin".
Bạn có thể biết apt/yum chạy thế nào, dpkg làm gì, bạn biết compile kernel, upgrade kernel, làm đủ trò trên máy tính của bạn, gõ các dòng lệnh, viết bash nhoay nhoáy, nhưng điều đó không biến bạn thành sysadmin.
Bạn là một Linux Super user!



Hệ thống hỏi đáp quốc tế StackExchange có hẳn 1 trang tên là "Super User", nơi dành cho các super user:

Super User is a question and answer site for computer enthusiasts and power users.

Và một trang riêng dành cho các "Sysadmin":

Tuesday, 25 April 2017

Những câu hỏi chưa có lời đáp

(những ý tưởng của một sản phẩm nào đó)

Cuốn sách bán chạy nhất ở Việt Nam trong tháng này là cuối nào? 

Nếu tây có best-seller thì ở Việt Nam, số liệu ấy lấy ở đâu?
Trang bán sách online lớn nhất Việt Nam TIKI vẫn có vẻ quá bé để đưa ra một con số thuyết phục.
"Tôi là Bê-tô" - một cuốn truyện rất nổi tiếng của Nguyễn Nhật Ánh có ghi trên bìa rằng đã xuất bản 100.000 cuốn, vậy ở Việt Nam còn cuốn nào hơn?

Xe Hải Vân hay gặp tai nạn là đúng hay sai?

Đường lên Điện Biên có 2 hãng xe lớn, Hải Vân - một hãng từ miền xuôi lên, làm ăn rất chuyên nghiệp, nhưng đã có mấy vụ cháy xe hay lật xe. Cổ phần - công ty gồm các nhà xe tư nhân của Điện Biên gộp lại, chất lượng được cải thiện đáng kể từ khi có Hải Vân cạnh tranh.

Tin đồn chỉ là tin đồn, hay những nhận xét không có con số chỉ là cảm tính, bởi không chỉ có mỗi xe Hải Vân gặp tai nạn trên đoạn đường rất nguy hiểm từ Hà Nội lên Điện Biên.
Vậy phải lấy số liệu thống kê ở đâu để đưa ra bằng chứng bằng con số chứng minh xe Hải Vân kém an toàn hơn xe cổ phần?

Saturday, 22 April 2017

Học JavaScript - phần 1 - number, boolean, string

(từ Python nhảy sang - kèm so sánh với Python)
JavaScript (JS) - /ˈdʒɑːvəˌskrɪpt/

Why?

- Mình thích thì mình học thôi 😚
- Syntax/Khái niệm 2 ngôn ngữ giống nhau đến 70%, bạn phải bỏ ra rất ít công để thụ được nhiều lợi.
- Dù thích hay không, JavaScript (từ đây ghi là JS) vẫn là ngôn ngữ duy nhất ở phía client khi duyệt web. Ngôn ngữ duy nhất chạy trên browser FireFox, Chrome, IE, Safari ... Đến cả Google, dù đã cố gắng lắm, nhưng vẫn không thể đưa Dart thay thế vị trí của JS

Để làm gì?

- Học JS để có thể viết code ngay trên FireFox/Chrome lúc nào mình muốn, không phải cài đặt, mọi lúc mọi nơi.
- Có thể điều khiển, tương tác với website qua code dễ dàng (bấm vào nút này, nút kia).
- Nếu bạn muốn làm Web Developer, biết JS là một điều bắt buộc.

Loạt bài viết này sẽ

- Lướt qua các khái niệm phổ biến của JS phía client (chung cho cả JS phía client lẫn server (Node.js)
- Học JS để tương tác với HTML DOM. Không học JS để xử lý phía server, khi ta đã có Python rồi, chẳng có lý do TỐT gì để dùng JS cho phía server. Nếu tốc độ là điều quan trọng? hãy dùng Golang. Học 1 syntax dùng cho cả 2 phía là một lý do YẾU. Cái giá phải trả cho việc dùng JS làm backend đủ để ta học 1 ngôn ngữ Backend khác tốt hơn (VD Golang/Erlang). (Đây là ý kiến cá nhân, tranh cãi đầy trên mạng: http://lmgtfy.com/?q=why+not+node+js )

Bài viết sử dụng FireFox 52.

Bắt đầu!

Bật Web console (FireFox) lên để gõ code. (Chrome cũng làm được tương tự).

Web Console trên FireFox

String trong Swift - phần 1



Biểu diễn các kí tự là vấn đề được đề cập đến đầu tiên khi các bạn tiếp cận một ngôn ngữ. Việc giao tiếp giữa máy chủ và client - cụ thể tại đây là thiết bị điện thoại đều được chuyển hóa qua dạng kí tự, ví dụ như response nhận lấy từ request thường thấy có dạng json.

Trong bài viết này, mình xin tổng hợp một vài cách thức cơ bản liên quan đến việc biểu diễn kí tự trên ngôn ngữ Swift và bài toán nhỏ để thực hành mà các bạn gặp phải trong lúc làm việc trong thực tế.

Và trong các bài viết sau, mình sẽ đề cập đến những kĩ thuật phức tạp như formating, comparing, sorting... 

Tất cả các ví dụ trong bài, mình sẽ sử dụng version mới nhất của Swift là 3.0.1

Để biểu diễn chuỗi kí tự trong Swift, ta sử dụng struct có tên là String để biểu diễn.

I - Initializing a String:

Có rất nhiều cách để khởi tạo một chuỗi

Thursday, 13 April 2017

4G là gì? LTE là gì?

Mấy ngày nay thấy các nhà mạng thi nhau thông báo đổi miễn phí Sim 3G lấy Sim 4G, ừ thì đổi thôi. Vậy

4G là gì và 4G hơn gì 3G?

4G ở đây không phải là game-gái-guitar-gym mà chữ G là "Generation" - thế hệ.
4G là thế hệ thứ 4, sau 3G (thế hệ thứ 3) của công nghệ truyền thông không dây.

3G là thế hệ mạng thứ 3 của viễn thông, với tốc độ khá nhanh giúp cho Smartphone trở nên phổ biến. 4G hơn 3G ở chỗ: nhanh hơn - nhanh đến mức có thể xem clip HD mà không giật.

Đây là tốc độ của 4G và 3G của nhà mạng Viettel:

4G Viettel

Tuesday, 4 April 2017

SLA và 99.99% uptime

Mỗi dịch vụ online đều có một chính sách cam kết về chất lượng.
Khi bạn mua GSuite (gồm Email, GDoc ...) của Google để phục vụ cho doanh nghiệp của mình, thì phía Google phải cam kết về chất lượng dịch vụ - và nói chung là cam kết về độ ổn định / sẵn sàng của dịch vụ. Từ khoá cho khái niệm này là SLA (Service Level Agreement).


Ở điều kiện lý tưởng, người ta thường nghĩ tới 100%.
Trên thực tế, đó là một con số không tưởng, ngay cả những ông lớn internet như Google hay Amazon cũng chỉ dám đưa ra quanh mức 99.XX % uptime.
Liệu 99.9 % có khác so với 99.99% và có khác với 99.999% không?
Con số % này khá khó để ta đưa ra cái nhìn rõ ràng, nhưng khi tính trên thời gian bằng giây của 1 năm, khác biệt là thấy rõ:

In [1]: for p in [99.9, 99.99, 99.999]:
    ...:     down_in_s = 86400 * 365 * (100-p)/100
    ...:     print("%f%% : allows to down %f seconds/year == %f minutes/year -> %f seconds/day"
    ...:           % (p, down_in_s, down_in_s/60, down_in_s/365))
    ...:
    ...:
99.900000% : allows to down 31536.000000 seconds/year == 525.600000 minutes/year -> 86.400000 seconds/day
99.990000% : allows to down 3153.600000 seconds/year == 52.560000 minutes/year -> 8.640000 seconds/day
99.999000% : allows to down 315.360000 seconds/year == 5.256000 minutes/year -> 0.864000 seconds/day
Một dịch vụ cam kết uptime 99.99% chỉ được phép down ~ 52 phút trong 1 năm hay 8.6 giây mỗi ngày.  Và 99.999 %? chỉ được phép down 5 phút 1 năm 😱

Monday, 3 April 2017

Kubernetes - rồi cũng đến đít

Gần 1 tháng sau bài "từ đầu" ra đời http://www.familug.org/2017/03/kubernetes.html
mình vẫn chưa động vào Kubernetes. Vậy nên viết nhanh phần đến đít, không mai kia rơi vãi hết.

Bài này KHÔNG PHẢI HƯỚNG DẪN DÙNG K8s, ai cần hướng dẫn thì vào trang chủ xem.

Bài này tổng kết về kinh nghiệm sử dụng K8s: Khái niệm, kiến trúc, troubleshoot, ...
dựa trên trí nhớ mong manh còn sót lại chút ít sau những cơn lụt ở Sài Gòn...


Kubernetes

Các khái niệm trong K8s

K8s đưa ra một lô 1 lốc các khái niệm. Vậy nên muốn dùng k8s, phải nắm chắc các khái niệm.
Xem thì có vẻ nhiều, nhưng đó là những thứ mà nếu như k8s không đưa ra, thì một ngày nào đó, bạn cũng lại tự "phát minh" ra (và 99,96 % là tệ / tạm bợ hơn nhiều).

Pod

Pod là một khái niệm rộng hơn container, nhưng đa số trường hợp thì đánh đồng nó với container cũng không sao. Pod là 1 nhóm (1 trở lên) các container thực hiện một mục đích nào đó (chạy software nào đó - pod có nhiều container là khi các app có quan hệ rất chặt chẽ - theo ví dụ K8s đưa ra là trang upload ảnh và trang hiển thị ảnh.)

Nếu k8s chỉ có mỗi khái niệm pod, thì dùng k8s giống như dùng docker bình thường. Tức
muốn thêm tính năng gì thì ta phải tự kiến trúc/ thiết kế/ thực hiện.

96% thông tin bạn cần về pod, nằm trong output của lệnh : describe pod PODNAME
$ kubectl get pods --selector='app=audit'
NAME                                READY     STATUS    RESTARTS   AGE
audit-deployment-3585156150-mlcv3   1/1       Running   0          14d
$ kubectl describe pod audit-deployment-3585156150-mlcv3
Name:        audit-deployment-3585156150-mlcv3
Namespace:    default
...

Service (svc)

Service đưa ra khái niệm về - service 😂

Wednesday, 29 March 2017

Phải set locale trong Upstart

Upstart là init system của Ubuntu trước 16.04.
Nếu còn dùng upstart, khi viết file cấu hình cho nó trong /etc/init/xyz.conf bạn phải set locale cho nó vì mặc định, upstart không sử dụng biến môi trường nào ngoài TERM và PATH.


http://upstart.ubuntu.com/cookbook/#job-environment

Nếu không set locale, một vấn đề có thể gặp phải, ví dụ như khi bạn chạy code python bằng gunicorn, thông qua upstart. Function os.path.isfile có thể raise Exception khi nhận tên file là một đoạn string chứa kỹ tự không nằm trong bảng mã ASCII:
if os.path.isfile(content_string) and not is_raw:
     File "/usr/local/pymi/env/lib/python3.4/genericpath.py", line 30, in isfile
        st = os.stat(path)
UnicodeEncodeError: 'ascii' codec can't encode character '\xfa' in position 2: ordinal not in range(128)
Thêm dòng này vào file upstart:

Monday, 27 March 2017

Đừng gọi cái máy chủ là server

Có một khái niệm khá phổ biến trong giới IT, đó là gọi cái máy chạy các dịch vụ là "server".
Cách gọi này không sai, nhưng sẽ gây nhầm lẫn.
Khi những phần mềm như "Apache2" hay NGINX được gọi là Web server,
PostgreSQL server được gọi là data base server.
Vậy một máy chủ chạy cả 2 thứ trên gọi là gì?

Cách tốt hơn là nên gọi các máy chủ là host, VM, hay machine như Google


Trích từ cuốn sách miễn phí về SRE của Google

Wednesday, 22 March 2017

bash exit status không là -1

Trong một đề tuyển dụng nào đó, có một yêu cầu là: script trả về exit status -1 nếu phát hiện lỗi.

exit status của một câu lệnh / script / chương trình là một giá trị số được trả về khi chương trình kết thúc.
Thông thường, chương trình trả về 0 tức là đã thành công, và khác 0 nghĩa là lỗi.



Dùng bash, đơn giản ta sẽ gõ câu lệnh built-in trong bash: exit -1
$ echo "exit -1" > /tmp/test.sh
$ bash /tmp/test.sh
$ echo $?
255
Exit code ở đây là 255 chứ không phải -1. Thử với một giá trị khác:
$ echo "exit 5" > /tmp/test5.sh
$ bash /tmp/test5.sh
$ echo $?
5

Friday, 17 March 2017

Xoá cache, clean RAM trên Android là vô dụng

Thậm chí là có hại.

Trước tiên, bạn cần biết rằng Android là hệ điều hành sử dụng Linux kernel.
Tức nó có phần nào đấy giống với các hệ điều hành dùng Linux kernel khác như Ubuntu, Fedora, ArchLinux ...

Trên Ubuntu, bạn KHÔNG BAO GIỜ phải clean RAM hay xoá cache.
Cách tính phần RAM còn có thể sử dụng trên Linux là có bao gồm cả phần cache

Sunday, 12 March 2017

Bitcoin Core với JSON-RPC

Update: Cảm ơn các thành viên trong Pymi đã đọc và cho những đóng góp  ý kiến để bài viết đc hoàn thiện.

Đây là một bài hướng dẫn cài Bitcoin Core và thiết lập JSON-RPC cho Bitcoin Core version v0.14.0. Nếu bạn chưa biết gì về Bitcoin Core có thể tìm hiểu ở phần link tham khảo. Server sử dụng Ubuntu 14.04 (cấu hình tối thiểu 2GB RAM, 125 GB ổ cứng), có thể tham khảo về cấu hình server bitcoin tại đây.

1. Add repo của Bitcoin Core

Chạy lệnh sau:
apt-get install -y software-properties-common && \
add-apt-repository ppa:bitcoin/bitcoin -y && \
apt-get update

2. Cài đặt Bitcoin Core cùng các thư việc hỗ trợ

Friday, 10 March 2017

Kubernetes từ đầu ...

Một công nghệ xây dựng dựa trên 15 tinh hoa vận hành hệ thống Google.
Một sản phẩm của chính Google, viết trên ngôn ngữ lập trình phát triển tại Google (Golang).
Một công nghệ mới được công bố từ giữa năm 2014, nhưng đã chiếm lĩnh thị phần không nhỏ trên các hệ thống cloud.
Một từ khoá nóng nhất mà các sysadmin/devops đều muốn có trong danh sách kỹ năng của mình.
Đó là Kubernetes !


Kubernetes là gì

Kubernetes hay K8s là một hệ thống để quản lý các "container".
Theo Kubernetes GitHub repository:
Kubernetest - Production-Grade Container Scheduling and Management
Kubernetes is an open source system for managing containerized applications across multiple hosts, providing basic mechanisms for deployment, maintenance, and scaling of applications.
Nói một cách dễ hiểu, nếu bạn biết dùng Docker hoặc rkt [0] để chạy các container, thì K8s là giải pháp để quản lý chúng (quản lý bao gồm: tạo, sửa, xoá, xếp lịch(schedule), hay mở rộng (scale)...) trên nhiều máy. Như vậy, để có thể sử dụng được K8s, bạn phải biết dùng Docker.

Ai cần Kubernetes?

- Các doanh nghiệp lớn, có nhu cầu thực sự phải scaling hệ thống nhanh chóng, và đã sử dụng container (Docker).
- Các dự án cần chạy >= 5 container CÙNG LOẠI cho 1 dịch vụ. (Ví dụ dùng >=5 máy cùng để chạy code website XYZ). Còn nhỏ hơn thì tốt nhất không dùng - đừng mang dao mổ trâu đi giết gà.
- Các startup hiện đại, chịu đầu tư vào công nghệ, để nhỡ về sau có to ra, thì to rất dễ 🙄
- Các sysadmin/DevOps muốn tăng lương, nhảy việc, vọc công nghệ mới 🤑

K8s là gì?

Sunday, 5 March 2017

[Python] fractions - tính toán phân số trên Python

Trong một bài viết gần đây, chúng tôi đã giải thích hiện tượng "kỳ lạ" khi 0.1 + 0.1 + 0.1 KHÔNG BẰNG 0.3 khi sử dụng Python hay nhiều ngôn ngữ lập trình khác (C, Java, PHP, Ruby, Golang ...). Nếu bạn vẫn còn thấy nó chưa hết lạ, bấm vào đây để làm quen.

Một giải pháp xử lý vấn đề này là sử dụng thư viện "fractions" có sẵn của Python để tính toán các số hữu tỷ (phân số - rational number). Tập số hữu tỷ được ký hiệu là tập Q khi học ở phổ thông:
các tập số
Thư viện ``fractions`` có một kiểu dữ liệu tên là Fraction, nó giúp biểu diễn các phân số và thực hiện tính toán trên Python. Fraction có thể nhận nhiều dạng đầu vào khác nhau:
- Tử số và mẫu số
- String biểu diễn phân số
- Một số integer hay float
Các đoạn code sử dụng Python 3 với IPython.

Ta import thư viện trước:
In [3]: from fractions import Fraction as F
Đầu vào là tử số và mẫu số:
In [4]: F(16, 10)
Out[4]: F(8, 5)

Saturday, 25 February 2017

Diễn đàn thảo luận Python, Django

Bạn cần giải đáp thắc mắc về Python, Django 🤔?
Vô ngay



Các chuyên gia chém gió đang chờ đợi để mổ xẻ câu hỏi của bạn 😎

Kênh cung cấp cả phòng chém gió về hệ thống Linux, DevOps, Docker hay kể cả Golang

Wednesday, 15 February 2017

File /etc/resolv.conf chỉ chứa được 3 nameserver

File /etc/resolv.conf trên các hệ điều hành dùng nhân Linux dùng để chứa thông tin về DNS server mà máy sẽ sử dụng.

Ví dụ muốn dùng Public DNS server của Google thì viết vào file này nội dung:
nameserver 8.8.8.8
nameserver 8.8.4.4 # thêm dòng nữa cho chắc, nhỡ cái đầu toi ta dùng cái 2 😎
nameserver 208.67.222.222 # đây là OpenDNS server
nameserver 9.6.6.9 # dòng này không có tác dụng, chỉ 3 dòng nameserver đầu tiên có tác dụng.

Đây là bug được report từ năm 2005 nhưng tới nay vẫn chưa được giải quyết, xem tại RedHat

Đây là nội dung file /etc/resolv.conf của 1 server bình thường:
root@81023a4b3012:/# cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 8.8.8.8
nameserver 8.8.4.4
Chú ý là nameserver chứ không phải servername.
như NGINX là HTTP server, Postfix là SMTP server thì đây là nameserver (DNS server).

Tuesday, 14 February 2017

[systemd] journalctl cho người mới tập chơi

Lên Ubuntu 16.04, hệ thống init Upstart đã được thay thế bằng hệ thống systemd, kèm theo nhiều thay đổi khác, trong đó đáng chú ý nhất là cách xem log trên server mãi mãi thay đổi từ đây.
Không còn syslog, rsyslog ... nữa mà tất cả log đổ vào một chương trình duy nhất, có tên journald

Tìm hiểu câu lệnh journalctl

sử dụng các câu lệnh tìm hiểu câu lệnh
$ for cmd in whatis whereis; do $cmd journalctl; done
journalctl (1)       - Query the systemd journal
journalctl: /bin/journalctl /usr/share/man/man1/journalctl.1.gz
$ dpkg -S $(which journalctl)
systemd: /bin/journalctl
Vậy journalctl được cung cấp bởi package ``systemd``, nó là một cộng cụ để query (truy vấn) "the systemd journal" (journald).

systemd journal

là một daemon , một bộ phận của systemd, là một system service thực hiện thu thập và lưu trữ dữ liệu logging. Nó nhận dữ liệu từ nhiều nguồn như kernel log message (kmsg), system log messages (syslog), stdout/stderr của các system service, audit record thông qua hệ thống audit.

Mặc định log sẽ được chứa trong /run/log/journal/, bởi dữ liệu trong /run sẽ bị mất sau khi reboot, log cũng sẽ bị mất theo (có thể config để thay đổi điều này).

Các câu lệnh journalctl thường dùng

Monday, 13 February 2017

[Python] function là object

Nếu có coi function là một cái gì đó đặc biệt, khác biệt với mọi thứ còn lại trong Python thì có thể bạn đã sai, hay ít nhất cũng cần nghĩ lại sau khi xem các đặc điểm của function trong bài này.

Python lambda
Function là object, như mọi thứ khác trong Python. Integer là object, string là object, và function không phải ngoại lệ.
$ python3
>>> type(5)
<class 'int'>
>>> type('http://pymi.vn')
<class 'str'>
>>> type(True)
<class 'bool'>
>>> type(len)
<class 'builtin_function_or_method'>
Nếu biết về lambda trong Python, bạn sẽ thấy rõ hơn function là cái gì:
>>> double = lambda x: x*2
>>> type(double)
<class 'function'>
>>> double(21)
42
lambda tạo ra 1 object kiểu function (tưởng tượng ra 1 cục tròn tròn), sau đó ta gán (bind) tên ``double`` cho object đó. Nó tương tự như việc gán tên cho 1 string:

>>> name = "PyMI"
>>> type(name)
<class 'str'>
name -----> (string PyMI)
double ------> (function x:x*2)

Bản chất cú pháp định nghĩa function trong python là nó sẽ tạo ra một function object, và bind cái tên của function vào object ấy.
>>> def double(x):
...     return x*2
...
>>> type(double)
<class 'function'>
>>> double(7)
14
Để bind một cái tên khác vào cục function object này, gán tên mới như bình thường:
>>> gap_doi = double
>>> gap_doi(7)
14
Phép gán (=) thực chất nói rằng: tạo ra một cái tên và bind nó vào cái cục object mà double đang bind tới.

gap_doi ----> (function object) <----- double

Function là  callable object

function là object như bao object khác, điều mà khiến nó có vẻ khác biệt là bởi khả năng "gọi" được, tức viết được theo dạng
function(argument) 
khả năng này có được nhờ function object có method tên là __call__.
Một object có method __call__ gọi là 1 callable object: có thể kể tới function, class hay bất cứ kiểu dữ liệu nào thoả mãn điều kiện ấy.
>>> len.__call__([1,2,3])
3
>>> len([1,2,3])
3
>>> class Foo():
...     pass
...
>>> Foo.__call__()
<__main__.Foo object at 0x10d8c3b70>
>>> Foo()
<__main__.Foo object at 0x10d8c3898>

Function nhận đầu vào là function 

Function mà nhận function khác làm đầu vào được gọi là "higher order function".

``len`` là một function
>>> id(len)
4517823904
id là function có thể nhận đầu vào là một function, id là một "higher order function".

Function ``do`` sau đây là một higher order function:
>>> def do(function, argument):
...     return function(argument)
...
>>> result = do(lambda x:x*2, 'Python')
>>> print(result)
PythonPython
Các decorator đều là các higher order function.

map

map là higher order function thường được dùng.
map nhận đầu vào là 1 function và 1 list (chính xác hơn thì là iterable), rồi map gọi function ấy với từng phần tử của list, thu được 1 tập các kết quả sau khi gọi function.
>>> map(lambda x: x*2, [1,3,5])
<map object at 0x10d6b5128>
>>> list(map(lambda x: x*2, [1,3,5]))
[2, 6, 10]
Nếu không thấy quen dùng lambda, có thể viết dài hơn sử dụng cú pháp def:
>>> def double(n):
...     return n*2
...
>>> list(map(double, [1,3,5]))
[2, 6, 10]
Function là object, tức ta có thể tạo 1 list các function:
>>> funcs = [id, type, str, len]
>>> type(funcs[0])
<class 'builtin_function_or_method'>
>>> for func in funcs:
...     print(func.__name__, func(['Python', 'Golang']))
...
id 4520086984
type <class 'list'>
str ['Python', 'Golang']
len 2

Lambda với list comprehension

Tạo 5 function, mỗi function in một số từ 0 đến 4
Tạo 1 list 5 function bằng list comprehension:
>>> fs = [lambda: print(x) for x in range(5)]
>>> for f in fs:
...     f()
...
4
4
4
4
4
Cả 5 function ở đây đều refer đến "i", vì thế ta không thu được 5 functions lần lượt in từ 0 đến 4.
Cách làm đúng:
>>> import functools
>>> for f in [functools.partial(lambda x:print(x), x) for x in range(5)]:
...     f()
...
0
1
2
3
4
Function là object.
Hết.
Welcome to functional programming and Python 😱
HVN at http://www.familug.org/ and http://pymi.vn 

Wednesday, 8 February 2017

Cấu hình hệ thống email để không bị quẳng vào Spam


Mail spam và OpenDKIM

Cài đặt và vận hành 1 hệ thống email là một trong những thứ lằng nhằng nhất khi làm sysadmin.
Một hệ thống email hoàn chỉnh hoạt động sẽ cần đến khoảng một chục thành phần khác nhau, nhưng hoạt động là chưa đủ, để email gửi ngon lành, không bị vào Spam thì phải hiểu thêm một đống thứ nữa.

Khi gửi mail đến Gmail, hệ thống Gmail sẽ coi mail của bạn là spam nếu email đó chưa authenticated. Xem đầy đủ tại đây: https://support.google.com/mail/answer/81126?hl=en#authentication

Google yêu cầu hệ thống của bạn khi gửi mail phải
- "Sign message" bằng DKIM
- Phải có SPF DNS record tương ứng với hệ thống mail
- Phải có DMARC policy (DNS record)

Một hệ thống mail chỉ có mỗi mail server (MTA-E.g: postfix) thì khả năng vào sọt rác là rất cao, thậm chí còn bị Gmail reject , không nhận mail.

Cài đặt OpenDKIM

Xem tại Ubuntu wiki ArchLinux wiki
chú ý: khi dùng với postfix, mặc dù đã config
cho postfix đọc từ UNIX socket trong /var/run/opendkim nhưng sẽ báo lỗi

postfix/smtpd: warning: connect to Milter service unix:/var/run/opendkim/opendkim.sock: No such file or directory
Mặc dù file đó có tồn tại.
Bởi nếu postfix được cấu hình chroot thì file thực sự mà postfix cần đọc là
/var/spool/postfix/var/run/opendkim/
Nếu đã đổi path mà gặp lỗi mới: Permission Denied thì cần chỉnh lại cho user opendkim và postfix đều có thể đọc ghi được socket này. Xem thêm tại stackexchange.

Kiểm tra mail có bị coi là spam không?

Để kiểm tra 1 email có khả năng gửi thành công không, gửi mail tới điạ chỉ cung cấp bởi https://www.mail-tester.com/ và xem kết quả. Nếu được 10/10 điểm thì mới có khả năng vào inbox.



Sau khi mail đã config đầy đủ, gửi mail đi và Gmail nhận được, ta có thể mở mail ra và chọn "Show original" để xem chi tết các header.

Sunday, 5 February 2017

Dựng HTTP server bằng một câu lệnh

Đôi khi ta cần dựng 1 HTTP server, trong một nháy mắt 😎
Để:
- xem nội dung 1 file html
- chia sẻ file siêu tốc (tất nhiên không an toàn, ai có link cũng tải được)

Giải pháp:
- mọi giải pháp cần file config như NGINX, Apache đều bị loại do vượt quá yêu cầu thiết lập dưới 1 phút.

Các giải pháp được đề cử 😍

busybox

Nếu không có sẵn trên máy
# apt-get install -y busybox
$ busybox httpd -f -p 9999 -h
-f : chạy foreground
-p: port
-h: home, thư mục sẽ phục vụ, mặc định là thư mục hiện tại
Khi truy cập vào IP:9999, ta sẽ nhận được response 404 nếu không có file index.html nào trong thư mục được phục vụ. Để truy cập các file khác, ta phải tự chọn trên URL chứ không có danh sách.
Ví dụ: để tải file destroy.mp4 trong thư mục phục vụ , truy cập vào http://IP:9999/destroy.mp4

Twisted 

là một Python package
trước tiên phải cài twisted:
$ pip install twisted
$ twistd -n web -p 8080 --path .
Truy cập IP:8080 sẽ nhận được danh sách các file trong thư mục chỉ ra bởi --path

Python2

$ python -m SimpleHTTPServer 8000
Khi truy cập vào IP:8000 ta sẽ thấy danh sách các file của thư mục ta chạy câu lệnh.

Python 3

Tuesday, 31 January 2017

[PyFML] Đăng ký học Python

Khoá 11 của lớp #PyFML sẽ khai giảng vào 19h ngày 13 tháng 2 năm 2017 (Thứ 2)
Lớp học python tại thành phố Hồ Chí Minh khai giảng cuối tháng 2.

Đăng ký ngay tại http://pymi.vn


Monday, 30 January 2017

[Python] Tuổi gì làm quan?

Mê tín dị đoan đã ăn sâu vào từng nếp nghĩ, từng hoạt động của người Việt Nam. Cứ dịp tết, người ta đốt hàng tấn tấn vàng mã và vẫn tiếp tục cầu mong cho môi trường được trong sạch, thế giới khỏi nóng lên hay không khí đỡ ô nhiễm.


Bản thân tôi là một người được ăn học, cũng đạt đến trình độ đại học cấp nhà nước, cũng là người hành theo Phật dạy tu nhân tích đức, làm điều lành. Nhưng việc để những thứ không rõ ràng, không có cơ sở khoa học ảnh hưởng đến cuộc đời mình là điều không chấp nhận được với một người làm khoa học. Mục tiêu năm nay sẽ là sử dụng tri thức, toán học, lập trình để tạo ra những công cụ chính xác luận đoán theo bộ môn khoa học Tử Vi của Trung Quốc, một mặt để loại trừ những mê tín không có cơ sở.

Vậy tuổi gì thì làm quan?

Xưa nay dân gian hay suy luận theo trực giác như: con hổ hay con rồng to, mạnh, đẹp, sẽ làm quan, con chó, con lợn, con ngựa, con gà thì chỉ làm dân thôi, liệu điều này có đúng?
Và tất nhiên nếu chỉ dựa vào Chi (tuổi con gì) để phán làm quan thì thật là thiếu cơ sở, ở đây ta bỏ qua vấn đề này và coi như một bài tập thống kê.

Chi là gì?

Chi hay đầy đủ là "địa chi", trong tiếng Tàu đọc là zhi, tiếng Tây gọi là "earthly branch"
còn hiểu ra thì là 12 con giáp trong văn hoá Việt/Tàu.

Thế nào là "làm quan"?

Wednesday, 25 January 2017

2017Project_1: Blog

Năm ngoái, cũng trong khoảng đầu năm, mình đã tung ra quyết định thực hiện 12 project trong 12 tháng theo thanh niên Levels ở bên tây.

Dự định đã fail hoàn toàn, kết quả chỉ có vài dự án được chạy:
- pyjobs.vn (giờ đã chuyển về domain http://jobs.pymi.vn/) Site viết bằng Go với Echo framework, crawler viết bằng Python2 với Scrapy, web service nhận và xử lý data viết bằng Flask. Database dùng PostgreSQL.
- fml.vn Site landingpage cho lớp học Python dựng bởi TuDoAnh , đã thay bằng PyMi.vn
- pymi.vn Trang giới thiệu và đăng ký học Python của lớp PyFML, lưu dữ liệu đăng ký trong SQLite, site dùng Flask

Xem chi tiết các công nghệ sử dụng tại: https://builtwith.com/?q=pymi.vn

Giờ đã ngấp nghé tết nguyên đán, lịch tây thì cũng sắp sang tháng 2, nhưng dự định không phải là 12 startup nữa mà là gì thì chưa biết.

Project đầu tiên của năm nay là:

Friday, 6 January 2017

[Python] Thêm, sửa dữ liệu trong pandas DataFrame

Tạo một DataFrame kích thước 5x4, xem cách tạo tại đây.
Việc thêm hay sửa giá trị, trong pandas gọi là "setting".

Tạo DataFrame

In [1]: import pandas as pd
In [2]: import numpy as np

In [3]: indexes = pd.Series(pd.date_range('20170106', periods=5))

In [4]: indexes
Out[4]:
0   2017-01-06
1   2017-01-07
2   2017-01-08
3   2017-01-09
4   2017-01-10
dtype: datetime64[ns]

Thursday, 5 January 2017

[Linux] Máy còn free bao nhiêu RAM?

Ai dùng Linux, một thời gian sẽ biết cách kiểm tra dung lượng bộ nhớ (memory - RAM) còn trống bằng lệnh free:
$ free -m 
             total       used       free     shared    buffers     cached
Mem:           992        789        203          0         43        413
-/+ buffers/cache:        332        660
Swap:            0          0

Lệnh này không dễ đọc và rất nhiều người sẽ nhầm tưởng là máy còn free 203 MB RAM.
Điều này đúng hay sai phụ thuộc vào khái niệm "free" của từng người.

Wednesday, 4 January 2017

4k là gì?

Khi nói nhà tôi vừa mua một màn hình 4k (4k monitor) nghĩa là muốn khoe cái gì? 🤑

4k (4kilo = 4000), để chỉ độ phân giải theo chiều NGANG KHOẢNG 4000 pixel, và chiều cao vào cỡ 2000 pixel. [1] Có nơi còn gọi là 2160p.

Trước kia, người ta thường sử dụng chiều cao (hay chiều dọc - vertical) của màn hình làm tiêu chuẩn đánh giá độ phân giải.
Các độ phân giải của clip trên youtube thường thấy là:
240p, 360p, 480p, 720p, 1080p, 2160p để chỉ các độ phân giải có số pixel theo chiều dọc tương ứng là 240, 360 ...
thì ngày nay bắt đầu có sự chuyển dịch khi lấy chiều ngang làm tiêu chuẩn (4k).
Các thuật ngữ này được dùng phổ biến khi quảng cáo Ti Vi.

Màn hình CRT cũ sử dụng tỷ lệ ngang:dọc là 4:3
thì các màn hình mới hiện nay đều dùng tỷ lệ là 16:9 (hoặc 16:10).

Với lần lượt từng tỉ lệ, ta có các độ phân giải tương ứng: (code trên python3 và ipython)
In [10]: verticals = [240, 360, 480, 720, 1080, 2160]

In [14]: modern_resolution = [(int(v/9*16), v) for v in verticals]

In [15]: crt_resolutions = [(int(v/3*4), v) for v in verticals]

In [16]: crt_resolutions
Out[16]: [(320, 240), (480, 360), (640, 480), (960, 720), (1440, 1080), (2880, 2160)]

In [17]: modern_resolution
Out[17]: [(426, 240), (640, 360), (853, 480), (1280, 720), (1920, 1080), (3840, 2160)]

4k có ý nghĩa khác theo 2 tiêu chuẩn