Friday, 16 May 2014

[RPi] Hello again

Lần cuối cùng cắm Raspberry Pi vào chơi là cách đây 8 tháng rồi:
 
pi@raspberrypi ~ $ last
pi pts/0 192.168.25.114 Fri May 16 10:02 still logged in
root tty1 Fri Sep 20 16:17 still logged in
reboot system boot 3.6.11+ Fri Sep 20 16:17 - 10:02 (237+17:45) 

Sau 8 tháng bỏ không, em RPi vẫn chạy ngon lành và sẵn sàng cho một cuộc chơi mới. 

Để lần mò sờ vào em RPi không phải chuyện đơn giản, cắm dây mạng vào và cắm điện, RPi bừng tỉnh sau giấc ngủ ngàn thu và thủ ngay lấy một IP trong mạng. Làm sao để tìm được ra em nó giữa hàng trăm máy tính trong cùng mạng LAN?

Không biết cách nào tốt hơn, nhưng mình đã dùng cách này:

nmap -sP 192.168.25.1/24

Và ngồi tìm ra máy nào chỉ open mỗi port 22
-_-, cảm giác thật stupid nhưng cuối cùng ta cũng chui được vào nó.
Hết.

Wednesday, 7 May 2014

[Python] Xử lý python version

Lấy từ https://github.com/s3tools/s3cmd/blob/v1.0.1/s3cmd#L10

[Python] Ternary Operator

https://docs.python.org/3.3/faq/programming.html#is-there-an-equivalent-of-c-s-ternary-operator

[on_true] if [expression] else [on_false]

x, y = 50, 25
small = x if x < y else y
Before this syntax was introduced in Python 2.5, a common idiom was to use logical operators:
[expression] and [on_true] or [on_false]
However, this idiom is unsafe, as it can give wrong results when on_true has a false boolean value. Therefore, it is always better to use the ... if ... else ... form.

Sunday, 4 May 2014

Y2038 - Year 2038 problem

hay còn gọi là Unix Millennium Bug.

Cho những người thích đọc wiki

http://en.wikipedia.org/wiki/Year_2038_problem

Cho fan python

In [8]: import datetime
In [10]: datetime.datetime.fromtimestamp((2**32 /2 - 2))
Out[10]: datetime.datetime(2038, 1, 19, 10, 14, 6)
Kết quả trên là 10 giờ do sử dụng GMT+7
Để lấy kết quả UTC:
In [31]: import time

In [32]: time.gmtime(2**32/2-2)
Out[32]: time.struct_time(tm_year=2038, tm_mon=1, tm_mday=19, tm_hour=3, tm_min=14, tm_sec=6, tm_wday=1, tm_yday=19, tm_isdst=0)


năm 2038 có gì hot?

để hiểu rõ vấn đề này cần có chút hiểu biết về 1 kiểu dữ liệu trong C được gọi là  signed 32-bit integer 
kiểu dữ liệu này chỉ có thể biểu diễn giá trị dương lớn nhất là 2**32 / 2 - 2 = 2147483646
(signed - có dấu âm/dương, tức nó biểu diễn được từ - (2 ** 32 /2 )đến 0  đến 2 ** 32 - 2 )

tmux revised

Một bài viết nữa về tmux, theo phong cách tìm hiểu bản chất và liệt kê vài câu lệnh hữu ích.

1. Tác giả tác phẩm 
Tác giả: Nicholas Marriott <nicm@users.sourceforge.net>
Các lib tmux depends on : ncurses  libevent
URL            : http://tmux.sourceforge.net/

2. Phân tích cấu tạo, hoạt động 

Các thành phần
session: là 1 tập hợp các pseudo terminal dưới sự quản lý của tmux. Mỗi session link với 1 hoặc nhiều window. Session giữ nguyên trạng thái khi mất kết nối (detach) với client và có thể được reattach.
Mỗi sessions được hiển thị trên màn hình bởi 1 client và tất cả các session được quản lý bởi 1 server duy nhất. Server và client là các process riêng biệt, mỗi client tương tác với server qua một socket được tạo ra trong thư mục /tmp

window: một window sẽ chiếm tòan bộ màn hình và có thể bị chia nhỏ thành nhiều "pane" chữ nhật nhỏ hơn. Mỗi pane là 1 pseudo terminal riêng biệt. Nhiều tmux instance có thể connect vào cùng 1 session, 1 session có thể chứa 1 lượng tùy ý số window


status line: nằm ở dưới của màn hình hiển thị thông tin về session hiện tại và cũng là chỗ để nhập vào các tmux command.
pseudo terminal: Xem man 7 pty để biết thêm về pseudo terminal
pane: những ô chữ nhật nhỏ được tạo thành khi chia nhỏ 1 window.

Hoạt động