Saturday, 27 December 2014

[algorithm] sleep sort

UPDATED: đã update phiên bản viết bằng golang ở cuối bài.
Ngày hôm nay,  cộng đồng hackernews điên đảo vì một thuật toán sắp xếp được phát minh từ năm 2011 do một người ẩn danh đưa ra với tên gọi "sleep sort".

Nguyên văn implement trên bash như sau:

#!/bin/bash
function f() {
    sleep "$1"
    echo "$1"
}
while [ -n "$1" ]
do
    f "$1" &
    shift
done
wait

example usage:
./sleepsort.bash 5 3 6 3 6 3 1 4 7
Chỉ cần google là bạn sẽ tìm thấy nguồn, bài viết này sẽ không link đến trang mà thuật toán này được công bố, đơn giản vì không thích. Nếu lười gõ google, bạn có thể bấm vào đây.

Friday, 26 December 2014

[CLI] xargs - câu lệnh để xây dựng câu lệnh

Trên UNIX-like OS, không phải câu lệnh nào cũng nhận đầu vào qua stdin, và như thế có vẻ không tiện lắm để output của câu lệnh trước làm input cho câu lệnh sau - một tính năng tuyệt vời "pipeline" của shell.

grep có thể lấy output của chương trình khác thành input của mình, ví dụ:
$ ps -fU root | grep -E '[g]etty|^UID'
UID        PID  PPID  C STIME TTY          TIME CMD
root       850     1  0 17:19 tty4     00:00:00 /sbin/getty -8 38400 tty4
root       855     1  0 17:19 tty5     00:00:00 /sbin/getty -8 38400 tty5
root       864     1  0 17:19 tty2     00:00:00 /sbin/getty -8 38400 tty2
root       865     1  0 17:19 tty3     00:00:00 /sbin/getty -8 38400 tty3
root       868     1  0 17:19 tty6     00:00:00 /sbin/getty -8 38400 tty6
-f : hiển thị khá đầy đủ các loại thông tin
-U: chỉ hiển thị các process được chạy bởi user có tên được chỉ định

Thế nhưng rm, cp, mv, printf hay nhiều câu lệnh khác không có tính năng đọc từ stdin, vì vậy xargs xuất hiện như giải pháp hoàn hảo để giải quyết vấn đề này.

Ví dụ sau sẽ in ra tất cả các user trên máy, sử dụng ký tự "__" để phân cách các user:

Wednesday, 24 December 2014

[CLI] printf

printf là gì?
$ whatis printf
printf (1)           - format and print data
$ which printf
/usr/bin/printf
Chú ý các shell thường implement hàm printf có tính năng tương tự, để nâng cao hiệu năng do thường được sử dụng thường xuyên và sẽ không cần chạy printf ở process con. Về cở bản thì chức năng giống nhau và có thể dùng lẫn. Để đảm bảo đúng bài tut này, hãy gõ đầy đủ /usr/bin/printf

Cú pháp
printf FORMAT ARGUMENTS
printf sẽ in ra terminal các argument đã định dạng theo với < FORMAT >. Tất cả các tham số truyền vào sau FORMAT đó đều là các ARGUMENTS.

Tuesday, 23 December 2014

[Sec] SASL

Simple Authentication and Security Layer (SASL)

Nhìn tên thì có vẻ gì đấy bí hiểm nhưng bạn sẽ ngạc nhiên khi mở trang wikipedia của nó [1] ra vì nó rất ngắn. Cộng với chữ Simple ở đầu, hãy tin rằng đây là một thứ dễ hiểu và bạn sẽ hoàn toàn hiểu nó sau khi đọc hết bài này. Thậm chí RFC4422 cũng chỉ dài có 31 trang [2].

SASL là gì?
SASL là một framework cho việc cung cấp 2 dịch vụ:
- Authentication (xác thực)
- Security layer (tầng bảo mật)
cho các protocol (giao thức) hướng kết nối [3] (TCP là một trong số đó).

SASL để làm gì?
khi một giao thức đã hỗ trợ SASL, bạn không cần phải code thêm để xác thực người dùng (cơ bản nhất là sử dụng một cặp username/password) mà chỉ việc "đá quả bóng trách nhiệm" sang cho SASL (có thể là một thư viện hay một daemon), SASL sẽ thực hiện công việc xác thực người dùng theo cách bạn đã chọn, đồng thời cũng cung cấp các tính năng security như khả năng đảm bảo dữ liệu khi truyền được nguyên vẹn và bí mật.

Wednesday, 17 December 2014

[G01E01] 2 mũ n

Loạt bài về những quan tâm bất thường đến những thứ có vẻ bình thường.

ý nghĩa của chữ G sẽ được giải thích nếu có 10 bài viết trong series này.

Có bao giờ bạn nghĩ mình sẽ nhớ hết các luỹ thừa của 2?

2^0 = 1
2^1 = 2
2^2 = 4
2^3 = 8
2^4 = 16
2^5 = 32
2^6 = 64
2^7 = 128
2^8 = 256
2^9 = 512
2^10 = 1024
2^11 = 2048
2^12 = 4096
2^13 = 8192
2^14 = 16384
2^15 = 32768
2^16 = 65536

Sunday, 14 December 2014

[Programming] phê ROT13

Lâu rồi cảm giác phê ấy mới trở lại ~^.^~
Giống như mỗi lần vắt óc giải một bài ProjectEuler và bấm vào nút check kết quả thấy nó màu xanh :3

Hôm nay là ROT13, thật ra nó chẳng có gì phức tạp cả, nhưng sau khi implement được ROT13 sử dụng một ngôn ngữ mới thì lại phải phê.

Tại sao lại là ROT13 - 13 - 13 - 13 ?
ROT13 ("rotate by 13 places") là một phương pháp "mã hoá" đơn giản bằng việc thay thế 1 chữ cái bằng chữ cách nó 13 chữ cái trong bảng chữ cái tiếng Anh. Lý do có số 13 (mà không phải 14 hay 15 cho trăng tròn) bởi bảng chữ cái tiếng Anh gồm 26 chữ, và nhờ vậy mà để giải mã các ký tự đã bị đảo đi, người ta chỉ cần dịch nó đi tiếp 13 chữ là thu được kết quả ban đầu. Tưởng tượng bảng chữ cái là một vòng tròn như sau: ... a b c ... x y z a b c ...

Hoặc tưởng tượng khác đi một chút, hãy chia bảng chữ cái làm đôi và xếp cạnh nhau, ta có:
a  b  c  d  e  f  g  h  i  j  k  l  m
n  o  p  q  r  s  t  u  v  w  x  y  z
ROT13 chỉ việc thay một chữ cái bằng chữ tương ứng ở nửa bên kia (a - n, b - o, ... ).

Tất nhiên nếu thích, bạn có thể phát minh ra vài cái ROT với một số khác, kiểu ROT6, ROT9, ROT906 đều được cả, chỉ là nó không thể dùng 1 phương pháp duy nhất mà lại vừa "mã hoá" lại vừa "giải mã" được mà thôi. ROT5 và ROT47 là hai phương pháp cũng phổ biến sau ROT13.

Friday, 12 December 2014

Phát hiện giật mình về GCC, gcj, g++...

=)) giật tít kênh14 phải gọi là thánh :3

compiler là gì? trình biên dịch là gì?
là một loại phần mềm biến code thành mã máy (thứ mã kỳ diệu để điều khiển máy tính).

Ngày xửa ngày xưa, thời học C, có dùng gcc để compile code C, và mình cứ nghĩ nó chỉ để compile C thôi (G là GNU , CC đoán là C compiler). Đến nay mới phát hiện ra bí mật diệu kỳ này:
GCC là viết tắt của GNU Compiler Collection - một tâp hợp nhiều compiler cho các ngôn ngữ khác nhau bao gồm: C, C++, Objective-C, Java, Fortran, Ada, golang.

Sự thật thì ngày xưa gcc là viết tắt của "GNU C compiler", nhưng đã từ rất lâu rồi, sau khi thêm các compiler khác vào project thì project GCC mới đổi ý nghĩa như vậy.

Java??? wth?
Chính xác là java, và compiler của nó có tên là GCJ , thế nhưng từ ngày Sun công khai mã nguồn của jdk, project GCJ đã chết và cơ bản giờ chỉ còn ở đó cho đẹp.  (tin update cuối cùng của project này check cách đấy 3 giây là "September 22, 2009")

C++? vậy G++ là cái gì?

Wednesday, 10 December 2014

sysctl - cấu hình các tham số kernel khi đang chạy

sysctl là một công cụ đơn giản (vâng, đơn giản hơn cả ls), công việc của nó chỉ có hiển thị hoặc thay đổi một tham số nào đó của kernel. Vấn đề biết phải thay đổi tham số nào, để làm gì mới là phần ... phức tạp.

Hỏi theo phong cách CCGU:
# whatis sysctl
sysctl (8)           - configure kernel parameters at runtime
# whereis sysctl
sysctl: /sbin/sysctl /etc/sysctl.d /etc/sysctl.conf /usr/share/man/man8/sysctl.8.gz
Hiển thị 1 parameter có tên là net.ipv4.ip_forward (để cho phép forward gói tin) :
# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0
Thay đổi giá trị của parameter nói trên:
# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
Các settings của sysctl nằm ở /etc/sysctl.conf và có thể trong thư mục /etc/sysctl.d, để thay đổi có hiệu lực cả sau khi reboot, cần sửa các file này thay vì set trực tiếp bằng sysctl.

Các parameter mà sysctl thao tác được liệt kê ở dạng file tại thư mục /proc/sys.
 Option: -a hiển thị tất cả các tham số hiện tại sẵn sàng
# find /proc/sys -type f | wc -l # đếm số file trong /proc/sys
693
# sysctl -a | wc -l 
error: permission denied on key 'net.ipv4.route.flush'
error: permission denied on key 'net.ipv6.route.flush'
error: permission denied on key 'vm.compact_memory'
713
Có một chút chênh lệch về số lượng ở đây, lý do có sự chênh lệch này là do output của sysctl có nhiều giá trị khác nhau cho cùng 1 parameter:

Tuesday, 2 December 2014

[postgres] Xem các số liệu thống kê về Postgresql

Postgresql cung cấp rất nhiều thông tin về chính nó, các database, ... đại loại là tất cả các thông số mà bạn sẽ cần.

Postgres có sẵn nhiều view, chỉ việc mở ra và xem, danh sách các view trong bảng này:
http://www.postgresql.org/docs/9.2/static/monitoring-stats.html#MONITORING-STATS-VIEWS-TABLE

Để xem các stats này sử dụng postgres chạy lệnh psql:
# su postgres -s /bin/sh
$ psql
psql (9.2.4)
Type "help" for help.

postgres=#

Gõ một query để xem, ví dụ với view "pg_stat_database":

postgres=# select * from pg_stat_database;

output sẽ khá là khó nhìn. Giống thế này: