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:

Saturday, 29 November 2014

[partition] Tại sao cần phân vùng ổ cứng?

1. Bí mật được bật mí
- ổ cứng truyền tải dữ liệu từ các track phía ngoài (hay còn gọi là các track đầu tiên) nhanh hơn các track phía trong (các track sau).
(hãy nhớ cái đĩa CD hình tròn, cái đĩa cứng có cái lõi cũng vậy vậy). Bí mật này giải thích rất nhiều "bí quyết" khi phân vùng ổ cứng.
Xem thêm hình trên wikipedia để hiểu về track (http://en.wikipedia.org/wiki/Disk_sector)
- các phân vùng nhỏ sẽ yêu cầu "đầu đọc" di chuyển ít hơn so với các phân vùng lớn. Di chuyển ít với lượng dữ liệu cần thực hiện không đổi tức là nhanh hơn.
(các điều trên đúng với ổ cứng từ được sử dụng phổ biến (HDD), và không đúng với ổ cứng rắn SSD).

http://ocz.com/consumer/ssd-guide/ssd-vs-hdd

2. Tại sao cần phân vùng ổ cứng?

Lịch sử
Ngày xưa dùng Windows, lý do để phân vùng ổ cứng (chia ổ) để "dễ sắp xếp" hay lý do kỹ thuật hơn là "để lúc cài lại Win thì chỉ việc format ổ C đi rồi cài lại vào đấy, dữ liệu các ổ khác sống khoẻ re".

Trên Ubuntu, cơ bản tất cả cũng sẽ nằm trên 1 partition (lúc cài đặt nó hướng dẫn thế), cùng lắm thì với advance user, Ubuntu giới thiệu việc tách riêng /home ra một partition khác. Một tác dụng dễ thấy của việc táchnày là để dùng nhiều OS (Linux-based OS) trên cùng một máy, lúc cần chỉ việc mount partition /home đó vào một thư mục và lại có thể truy cập các dữ liệu của mình.

Vậy còn lý do gì khác?

  • Trên UNIX-like OS, các directory (thư mục) được chia rõ ràng để đảm nhiệm các công việc khác nhau. /etc, /usr, /var, /tmp ... vì làm công việc khác nhau nên chúng có những đặc tính khác nhau. /etc hay /usr thường chỉ để đọc trong khi /var hay /tmp thường dùng để ghi (và cả đọc). Nếu biết phân vùng hợp lý để đẩy /var và /tmp ra phía ngoài rìa đĩa thì performance (hiệu năng) sẽ được cải thiện.

Thursday, 27 November 2014

[BSD] DragonFly BSD 4.0 chào Việt Nam

Một trong vài tin hot nhất trong giới công nghệ trong ngày hôm qua (25 Nov 2014) chính là việc DragonFly BSD release bản 4.0.

..WARNING:: Bài viết hướng tới super user / experienced user, có thể coi như 1 bài tut và làm theo từng bước.

DragonFly BSD (DFBSD) là gì?
"dragon fly" trong tiếng Việt là con chuồn chuồn.


Một hệ điều hành UNIX-like, tách ra và phát triển từ hệ điều hành FreeBSD bản 4.8 (BSD version 4.x được đánh giá là phiên bản hệ điều hành ổn định (stable) nhất của mọi thời đại)
Tác giả chính: Matthew Dillon, từng là một developer của FreeBSD, lý do tách ra do mâu thuẫn về quan điểm khi có một thay đổi lớn về kiến trúc ở bản FreeBSD 5 (đọc thêm ở trang chủđây)

Để làm gì?
Chơi cho vui :3
Với một hệ điều hành nhỏ, lượng developer không lớn, sẽ dễ dàng hơn cho các dân chơi hiểu sâu hơn về hệ điều hành, kernel ..., bởi với lực lượng không đông đảo, người ta sẽ tập trung nguồn lực vào những thứ được xem là quan trọng nhất. Xem thêm về system design ở đây.

Bài viết này sẽ thử nghiệm cài đặt một workstation chạy trên một máy ảo Virtualbox để dev python với vim, pip, tmux trên DragonFly BSD 4.0

Thursday, 13 November 2014

[rabbitmq] ghi chú nhanh về user chạy rabbitmq

Bài viết sử dụng dẫn chứng trên:
# lsb_release -d; dpkg -l rabbitmq* | grep rabbit
Description:    Ubuntu 12.04.4 LTS
ii  rabbitmq-server                  3.1.2-1                            AMQP server written in Erlang
User chạy process rabbitmq luôn luôn là user ``rabbitmq``, cho dù bạn đã dùng user ``root`` để start service hoặc sử dụng câu lệnh ``rabbitmqctl` bằng ``root`` user.
Lý do là vì các bin script do package rabbitmq cung cấp luôn kiểm tra user gọi câu lệnh và set nó về ``rabbitmq`` nếu có thể.

Bằng chứng:

Saturday, 8 November 2014

[cmd] linux utilities - có gì cần thiết?

Một danh sách các command line tool tuyển chọn bởi FAMILUG.

Những dòng hiện "nothing appropriate." là nhưng built-in command của bash hoặc là các tool chưa cài đặt trên máy chạy script này.

./linux-util.sh
FAMILUG's list of essential Linux utilites 1.0
TOTAL: 80
man (1)              - an interface to the on-line reference manuals
man (7)              - macros to format man pages
ls (1)               - list directory contents
cd: nothing appropriate.
pwd (1)              - print name of current/working directory
grep (1)             - print lines matching a pattern
head (1)             - output the first part of files
tail (1)             - output the last part of files
cut (1)              - remove sections from each line of files

Wednesday, 5 November 2014

[Python] python -v

Số man page mình đã từng đọc có thể... không thể đếm được (vì không nhớ)
nhưng buồn cười thay manpage của python thì lại chưa bao giờ đọc :v

Hôm nay đọc, và mò ra được một tí hay ho:

-v
Khi chạy python -v, python sẽ in ra một message mỗi lần một module được khởi tạo (initialized), hiển thị nơi mà nó được load (có thể là filename hoặc built-in). Đồng thời cung cấp các thông tin về quá trình dọn dẹp module khi kết thúc chương trình.
Rất hữu ích cho nhưng ai muốn tìm hiểu cơ chế hoạt động của python.
 $ echo -e print \'meomeo\' > /tmp/meo.py
 $ python -v /tmp/meo.py

Tuesday, 4 November 2014

[Ruby] Cài đặt/sử dụng rbenv

Cho những ngày tháng không Facebook :">

Vì sao chọn rbenv ?

  • Nhẹ
  • Cài đặt đơn giản
  • Sử dụng dễ
  • Mỗi folder 1 gem version khác nhau được, hoặc set 1 version dùng chung (global)
  • Không cần quyền sudo, user bình thường cũng có thể cài ruby và deploy 1 ruby app.

 

Cài đặt RBENV

Hướng dẫn cài đặt này đã test cho Ubuntu 12.04 LTS.

Cài cái gói phụ thuộc (Dependency packages)
Phần này cần sudo để cài.

sudo apt-get install autoconf bison buixld-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev git curl

Friday, 31 October 2014

[Python] đổi thay

Hay bài học về sử dụng 2 python standard library: argparse & logging.

Khi viết chương trình Python, nếu không phải loại script chỉ dùng 1 lần, thì có hai module mà bạn sẽ luôn hối hận nếu không dùng nó ngay từ đầu. Đó là argparse để parse các tham số đầu vào của chương trình và logging để lưu lại/ hiển thị các thông tin lúc chương trình chạy.

Bởi mọi dòng code đều chỉ là tạm thời, thiết kế chương trình ban đầu cũng chỉ là tạm thời, 2 module này sẽ giúp bạn sống cùng những thứ tạm thời ấy.

1. argparse

Luôn dùng argparse khi cần parse command line argument!

Với một chương trình đơn giản, sử dụng sys.argv trực tiếp có vẻ nhanh và tiện, nhưng ngay khi bạn nhận ra mình cần thay đổi một option nào đó, mọi sự đẹp đẽ giả tạo đó bắt đầu đổ vỡ.
Nếu đã tin vào điều này, bạn có thể chuyển qua phần 2 và bỏ qua câu chuyện nhảm nhí phía dưới.

Friday, 24 October 2014

[CLI] nối dòng

Một bạn giấu tên hỏi: làm thế nào để nối nhiều dòng thành một dòng trong linux ?

Trả lời:
có rất nhiều cách để làm việc này, sau đây là vài cách đơn giản.

Tạo đề bài để test:
# for i in {1000..1005}; do echo $i; done
1000
1001
1002
1003
1004
1005
Xem thêm cách tạo dữ liệu giả ở đây: http://www.familug.org/2012/10/generate-random-data-part1.html

Tuesday, 21 October 2014

[WeeklyVim] retab (đổi tab thành spaces)

Để sửa 1 file đã chứa các ký tự "tab" (\t) thành space:

mở file đó ra


:set expandtab
:retab
:wq #(save, quit)

Xong.

Monday, 20 October 2014

[Python] đếm trong list

Tuy code Python đã lâu, nhưng giờ mình mới để ý list chỉ có 9 public method, một con số không phải là lớn, và nếu bạn không nhớ hết, đôi khi bạn sẽ thấy bất ngờ.

Đề bài: đếm số phần tử True trong list bools dưới đây:
In [2]: import random

In [13]: nums = [random.randint(0,10) for i in range(10)]

In [15]: bools = [True if i % 2 == 0 else False for i in nums]

Sau khi nghĩ xong cách bạn sẽ làm, hãy bấm để xem tiếp

Wednesday, 15 October 2014

[bash] shell grammar (phần 1)

Theo quan sát của mình, hầu như mọi người học các ngôn ngữ lập trình đều theo cách rất cơ bản, học đầy đủ từ đầu đến cuối, sách này sách kia, nhưng với bash hầu hết người ta lại không học theo lối đó. Vì vậy có không ít điều rất đỗi bình thường của bash mà người dùng nhiều năm cũng không biết.

Chuỗi bài viết này tổng hợp đầy đủ (hay ít nhất là theo man 1 bash là thế) về "cú pháp" "NGỮ PHÁP" trong bash.

Bash gồm có:
- câu lệnh đơn (simple command)
- pipeline
- list
- các câu lệnh ghép (compound command)
- coprocess
- function definition

1. simple command
là một câu lệnh bình thường, ví dụ:
$ls -la
$ rm -r /tmp/pigmovie 2>&1 > /dev/null
TỪ KHOÁ:
exit status: giá trị một chương trình / câu lệnh trả về khi chạy trong shell. Là một số nguyên, với giá trị 0 biểu diễn cho câu lệnh chạy thành công, các giá trị khác (có thể âm) biểu diễn một lỗi nào đó đã diễn ra. Bash lưu exit status của câu lệnh cuối cùng nó chạy ở biến $?, có thể echo ra để xem:

Tuesday, 30 September 2014

[bash] shellshock - từ gốc đến ngọn

Shellshock là gì?
shellshock là tên của lỗi bảo mật của phần mềm bash mới được phát hiện (tháng 9/2014) và hiện đang gây một cơn sốc trên Internet. Nó không phải sốc theo kiểu "cộng đồng mạng phát cuồng", hay "cộng đồng mạng bị sốc", mà là kiểu sốc "cộng đồng mạng" cơ bản là không tham gia vào :D

Shellshock có nguy hiểm không?
Cực kỳ nguy hiểm! cực kỳ là đến mức nào? Hãy google với từ khoá "shellshock dangerous" để tìm ra câu trả lời cho chính mình.
Nói thẳng ra thì người dùng Windows không bị ảnh hưởng (trực tiếp), còn ai không biết thì chẳng thấy nguy hiểm gì. Giống như dịch Ebola, ai biết nó gây chết người trong vài ngày thì thấy sợ, ai không biết nó là cái gì thì làm sao mà thấy nó nguy hiểm?!!!

Lỗi này có từ năm 1993 1989 [Thanks Le Manh Cuong] và đến nay đã 25 năm từ khi nó ra đời, nhưng đến giờ mới được phát hiện. Hãy tưởng tượng trong 25 năm ấy, hacker có thể dễ dàng vào máy tính của bạn với quyền root (tức muốn làm gì thì làm),  chẳng phải login hay ssh gì hết, và không để lại dấu vết của một cuộc xâm nhập :3

Bài viết này phân tích câu lệnh dùng để tìm ra xem phiên bản bash đang dùng có bị dính lỗi bảo mật shellshock hay không.

Câu lệnh sau giúp thực hiện điều đó (theo link wikipedia ở cuối bài):
env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
Nếu sau khi gõ enter mà thấy hiện ra
vulnerable
this is a test
Tức là phiên bản bash bạn đang dùng có dính lỗi bảo mật này.

Để hiểu rõ chuyện gì đã xảy ra, ta sẽ từ từ phân tích câu thần chú vừng ơi mở ra đầy thần bí này. Lần lượt dạo qua một vài khái niệm của bash để có thể hiểu câu lệnh quá xúc tích trên:

Friday, 26 September 2014

[python] except Exception

Đừng dùng ``except:`` trừ khi bạn biết mình đang làm gì!

Đoạn code sau có thể làm bạn bất ngờ và cho thấy một trường hợp có thể bạn không muốn dùng ``except:`` mà thay vào đó là ``except Exception:``

In [1]: import sys
 
In [3]: try:
    sys.exit(1)
except Exception:
    print 'In except'
   ...:    
An exception has occurred, use %tb to see the full traceback.

SystemExit: 1

To exit: use 'exit', 'quit', or Ctrl-D.
In [4]: try:
    sys.exit(1)
except:         
    print 'In except'
   ...:    
In except

Ở phần code [4], statement "except:" đã "bắt" được một exception xảy ra khi hàm sys.exit(1) chạy (function này thực hiện công việc  raise SystemExit exception). Trong khi mục đích của người dùng CÓ THỂ là exit script với return code = 1 thì đoạn code lại nhảy vào phần handle exception.

Tóm lại:

Wednesday, 24 September 2014

[Terminology] Vài từ tiếng Anh mà các chuyên gia công nghệ hay đọc nhầm

NOTICE: bài này lấy phiên âm từ trang http://www.oxforddictionaries.com , dựa vào cơ sở này để làm căn cứ.

1. domain
Không ở đâu định nghĩa từ này đọc là ĐU MÊN cả.

domain /də(ʊ)ˈmeɪn/
(bấm vào link có phần đọc mẫu)
http://www.oxforddictionaries.com/definition/english/domain?q=domains

chữ "o" trong domain đọc giống chữ "o" trong "so" "blow" hay "go"

so  /səʊ/
go /ɡəʊ/

Hãy nghe thử:



2. cache

Tuesday, 23 September 2014

[Python] collections.Counter

Mỗi khi cần đếm, hãy dùng Counter, vì nếu bạn là sếp và đã thuê kế toán, tại sao phải ngồi đếm tiền :3

Counter là một class trong stardard library "collections" và chức năng của nó là đếm. Kết quả của việc đếm là thu được 1 dict chứa các object và số lần nó xuất hiện khi sử dụng Counter.

Nếu bạn là sếp và đã có người khác đếm hộ -> hãy bỏ qua bài này
Nếu bạn là python programmer và phải đi đếm để kiểm tiền, hãy bấm đọc tiếp :3

Monday, 22 September 2014

Lạc

bài này viết nhảm nhí và đừng lãng phí thời gian để đọc nó!

Monday, 15 September 2014

[python] logging: đừng format log message!

Xem đoạn code sau:
In [7]: import logging

In [8]: logging.basicConfig()

In [9]: log = logging.getLogger('familug')

In [10]: log.error('%s: %d', 'meo', 10)
ERROR:familug:meo: 10

In [11]: log.error('%s: %d' % ('meo', 10))
ERROR:familug:meo: 10

Bạn có thể giải thích xem câu lệnh log ở [10] hay [11] tốt hơn?

Nếu câu trả lời là [11] hoặc như nhau thì bạn nên đọc tiếp...

Thursday, 4 September 2014

[python] đếm số dòng của 1 file.

Để đếm số dòng của một file, trên UNIX-like OSes, ta có thể dùng lệnh ``wc``. Lấy file /etc/passwd làm chuột bạch:
$ wc -l /etc/passwd
      86 /etc/passwd
Trong python, các nhanh nhất để làm việc này là:
(hãy tự trả lời trước khi xem đáp án)

Monday, 1 September 2014

[shell] globbing (not regex)

1. Tên bài viết bằng tiếng Anh vì tác giả không thể tìm ra từ tiếng Việt nào cho phù hợp.
2. globbing không phải là regex matching.
3. bài này nhiều ký tự hoa mắt, xin hãy đọc từ từ, chỗ nào thấy sai thì comment ngay, nếu không globbing / regex mãi là một khái niệm mờ mịt.

Bài viết thực hiện trên:
~ uname -sr
Linux 3.13.0-32-generic
Terminology (thuật ngữ)
1. globbing
- globbing là toán tử expand một wildcard pattern thành danh sách các pathname match pattern đó.

1.1  wildcard pattern
là các pattern có chứa ký tự wildcard (wildcard characters).

1.2 wildcard character

Saturday, 30 August 2014

Chạy lệnh với quyền của user khác

Vì sao phải làm thế?
vì đôi khi các chương trình cần chạy dưới một user nhất định hoặc nó có thể tạo file trong lần chạy đầu tiên, nếu lần đầu chạy với user root thì lần sau chạy với user thường, chương trình không có quyền ghi đè lên file đã tạo và sẽ gây lỗi.

Có thể sử dụng ``su`` hoặc ``sudo`` để giải quyết vấn đề này.

su là một thứ đã tồn tại từ rất lâu rồi, trong khi sudo thì khá mới.

# for i in su sudo; do whatis $i; echo in package $(dpkg -S `which $i` | cut -f1 -d':'); done
su (1)               - change user ID or become superuser
in package login
sudo (8)             - execute a command as another user
in package sudo

Friday, 29 August 2014

[python] time delta in seconds

UPDATED: thêm bằng chứng từ code C
Có một lỗi mà khi sử dụng module ``datetime`` trong python 2, có thể bạn đã mắc phải.

Trả lời câu hỏi sau, không dùng đến code:
In [28]: (datetime.datetime(2014,8,30,16,45,2) - datetime.datetime(2014, 8, 29, 16, 45, 2)).seconds

Trả về kết quả là bao nhiêu?


Nếu câu trả lời là 0, bạn không cần đọc tiếp bài này.
Nếu câu trả lời khác, hãy cùng tìm hiểu tại sao:

Wednesday, 27 August 2014

[bash] quoting

Single-quote (Tức dấu ')
Tất cả các ký tự nằm trong 2 dấu ' ' sẽ giữ nguyên ý nghĩa của nó.
$ echo '$? `date` \\'
$? `date` \\
Double-quote (Tức dấu " )
Các ký tự sau có ý nghĩa đặc biệt khi nằm trong " ":
$, `, \, @
(dollar sign, backquote, and backslash, @)

$ echo "$? `date` \\"
0 Wed Aug 27 09:21:48 ICT 2014 \
 Chú ý, dấu "~" không nằm trong danh sách nói trên, vì thế:
$ echo "~"
~
$ echo ~
/Users/hvn
Tham khảo:
http://pubs.opengroup.org/onlinepubs/009604599/utilities/xcu_chap02.html
Từ khoá: POSIX double quote

Friday, 22 August 2014

[Python] __new__ và __init__, zip

Vài ghi chép vụn vặt...

Bài viết dùng python 2.7.5.

1. zip
Trả lời cho các câu hỏi: hàm zip trong python là gì? hàm zip trong python làm gì?


cái tên hàm rất rất rất dễ hiểu nếu bạn biết zip là gì: nó là cái khoá kéo (phéc măng tuya ???). Có 2 dải, và nó sẽ ghép chúng thành từng cặp (tuple). Với function zip, nó có thể zip nhiều list với nhau (2 trở lên, và sẽ cắt ở độ dài của list ngắn nhất - nếu kéo khoá mà 1 bên hết thì phải dừng lại thôi :D)

Code (viết trên ipython):
In [8]: numbs = range(1,10)

In [9]: name = ['C', 'Python', 'Java', 'Ruby', 'Perl', 'Go']

In [10]: zip(numbs, name)
Out[10]: [(1, 'C'), (2, 'Python'), (3, 'Java'), (4, 'Ruby'), (5, 'Perl'), (6, 'Go')]
In [11]: adjs = ['perfect', 'awesome', 'bloated']

In [12]: zip(numbs, name, adjs)
Out[12]: [(1, 'C', 'perfect'), (2, 'Python', 'awesome'), (3, 'Java', 'bloated')]
Chú ý: ở dòng [9], tên biến nên đặt là ``names`` thay vì ``name``, tác giả quá lười nên không đổi lại nên đành để vậy.

2. __new__ và __init__ 

Friday, 8 August 2014

[basic] hostname

Trả lời câu hỏi sau:

Trong các hostname dưới đây, có những hostname nào đúng:

  1. "KuteNhatXom"
  2. "tuong.ot."
  3. "xoai_chua.com"
  4. "fami-lug1.org"
  5. "89.vn"
và nếu tự tin mình trả lời đúng hết thì bạn không nhất thiết cần đọc bài này.
Không chắc lắm? bấm để đọc tiếp.

Tuesday, 5 August 2014

[NGINX] luật matching khi chọn location để xử lý 1 request

Syntax: location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
khi nhận được 1 request, NGINX cần chọn location để xử lý request đó, quá trình này gọi là matching.

Vài từ khoá
Các dấu = ~ ~* ^~ gọi là các modifier.
Một location có thể được định nghĩa bởi một "prefix string" hoặc regular expression (regex - nếu không biết regex là gì hãy Google, giải thích khái niệm này nằm ngoài tầm của bài viết).
location /images  {
} # là một location dùng "prefix string"

location ~* \.(gif|jpg|jpeg)$ {
} # là một location dùng regex.
Regex
Để sử dụng các regex, cần dùng modifier ~ hoặc ~*.
~ : regex matching có phân biệt hoa thường. Tức
location meomeo
khác với
location MeoMeo
~*: regex matching không phân biệt hoa thường.

Thứ tự xử lý

[OS] niceness

Như đã viết một ít ở bài này http://www.familug.org/2013/12/monitoring-iostat-hien-thi-cac-thong.html . niceness là một khái niệm không nên xa lạ với bất kỳ ai.

nice là gì?
là một khái niệm tương đương với priority nhưng ngược lại.
Khi CPU hoạt động, việc phân chia, lập lịch cho các process sẽ sử dụng khái niệm priority để tính mức độ ưu tiên. Một process được set priority càng cao (ưu tiên cao) sẽ được sử dụng CPU trước so với các priority thấp hơn. Khái niệm nice được đưa ra với ý nghĩa ngược lại của priority:
priority cao - niceness thấp
priority thấp - niceness cao

niceness
 (độ nice - độ tốt) là một kiểu dùng từ hay ho, khi nói 1 process có niceness cao tức là nói process đó "tốt bụng", sẵn sàng nhường CPU cho các process khác. Mức độ tốt bụng của 1 process được đánh số từ -20 đến 19. 0 là giá trị cơ bản, khi không chỉ định gì, một process sẽ có niceness = 0.

Trong manpage của renice lại nói niceness là 20 mới là nicest (giá trị nice cao nhất), nhưng khi thử set giá trị này thì không được (theo wikipedia thì giá trị max này là 19 hoặc 20, tuỳ hệ điều hành)
# renice 20 -p 19287
19287 (process ID) old priority 0, new priority 19
Các chương trình liên quan niceness 

Thursday, 31 July 2014

Mobile Apps

Của nhà trồng được, trong page này (nhìn trên list các page) là các mobile apps được viết bởi các thành viên FAMILUG.

http://www.familug.org/p/mobile-apps.html

Nếu bạn có một chiếc android stupid phone, hãy nhấc máy lên mà download các ứng dụng này về, đảm bảo bạn sẽ thấy yêu hơn các App mà máy mình đã có :v

Các sản phẩm mobile của thành viên FAMILUG


Tôm Cua Cá 

Friday, 25 July 2014

Chào! trello.com

Lâu lắm mới thò tay vào code giải đố, cảm giác ngu si stupid dâng trào.

Trello.com mới tách thành công ty riêng và đang tuyển nhiều vị trí bao gồm cả developer (làm remote ok).
Đề bài:

https://trello.com/jobs/developer

Find a 9 letter string of characters that contains only letters from
acdegilmnoprstuw
such that the hash(the_string) is
910897038977002
if hash is defined by the following pseudo-code:
Int64 hash (String s) {
    Int64 h = 7
    String letters = "acdegilmnoprstuw"
    for(Int32 i = 0; i < s.length; i++) {
        h = (h * 37 + letters.indexOf(s[i]))
    }
    return h
}
For example, if we were trying to find the 7 letter string where hash(the_string) was 680131659347, the answer would be "leepadg".)

Bài này theo đánh giá cá nhân là một bài toán rất bình thường nên trello.com chỉ dùng để kiểm tra xem ứng viên có biết code hay không chứ không kiểm tra gì khác.

Lời giải bằng python:

Thursday, 17 July 2014

npm - Node.js package manager

Node Package Manager (npm) là package manager cho Node.js , giống như pip đối với python, gem đối với ruby, cabal đối với Haskell...

Thực hiện trên:
# lsb_release -d
Description:    Ubuntu 12.04.4 LTS
1. Cài đặt npm
apt-get install npm
2. Tìm hiểu khát quát về npm và Node.js
Trước khi đi sâu vào phần "sử dụng npm", ta thử nghiên cứu về khía cạnh system xem NPM này có gì hay:
$ apt-cache show npm
...

Depends: nodejs, nodejs-dev, node-node-uuid, node-request, node-mkdirp, node-minimatch, node-semver, node-ini, node-graceful-fs, node-abbrev, node-nopt, node-fstream, node-rimraf, node-tar, node-which
Cho thấy npm depends vào nodejs và nhiều package khác  =))
Description-en: package manager for Node.js
 Node.js is an event-based server-side javascript engine.
Định nghĩa Node.js:

Wednesday, 16 July 2014

Chơi pokemon firered - leafgreen bằng giả lập VBA-M trên Linux

... hay chơi game GBA nào cũng được (GoldenSun, Yugi, Dragonball, Mario ...)
VisualBoyAdvance là một trình giả lập máy Nintedo Gameboy Advance rất phổ biến với bất kỳ ai từng chơi pokemon. Nhưng không phải ai cũng biết là trình giả lập này cũng hỗ trợ cả Linux.

Thay vì phải hì hục tìm các game phát triển riêng cho Linux thì bạn chỉ cần cài VBAm và hưởng thụ cả rổ game nổi tiếng ngon lành đã phát triển cho máy GBA của Nintedo.

1. VBA và VBA-M
VBA đã ngừng phát triển. VBA-M là một phiên bản được tiếp tục phát triển từ VBA-M.
VBA-M is a fork from the now inactive VisualBoy Advance project, with goals to improve the capatibility and features of the emulator with: 
2. Cài đặt

Tuesday, 8 July 2014

[WeeklyVim] set spell - spellchecker để kiểm tra chính tả trong vim

:set spell
hoặc viết vào file .vimrc dòng:
set spell
Lệnh trên giúp enable spellchecker trong vim, nó sẽ bôi đen các lỗi chính tả (tiếng Anh)

Dùng
[s ]s để di chuyển đến các từ viết sai chính tả.

Đọc thêm:
Từ vim, gõ :help spell

Monday, 30 June 2014

Project Euler went offline

NOTICE
On Sunday 15 June 2014 it was discovered that Project Euler had been hacked and a decision was made to take the website offline. Project Euler has existed since 2001 and after thirteen years of it being carefully nurtured to become what it has become today we hope you understand that this decision was not made lightly. No one feels this sadness more than the team.
As the strength and priority of Project Euler is the rich and challenging problem set it provides then we are pleased to be able to allow the problems to remain accessible. However, please note that full functionality of the website, including the ability to check answers, register, and login to existing accounts, remains disabled. Over time certain features may be reinstated, but currently there is no definite time frame which can be stated. In addition no new problems are likely to appear until the website is back up and running again.

Friday, 27 June 2014

Sức khỏe... chuyện muôn thuở

PS1: cám ơn bạn +Nguyen Ha đã góp phần giữ gìn sự giàu đẹp của Tiếng Việt.
PS2: vẫn sai và sửa lại :v 


Là vốn quý gía nhất của mỗi con người, đầu xuân năm mới, người ta vẫn chúc nhau sức khoẻ đầu tiên.
Là điều mà không ai muốn nhắc tới, rồi cũng một ngày phải nhắc tới.
Là thứ mà ai cũng muốn có nhưng ít ai muốn luyện tập, nó chả khác gì sinh viên lười học mà vẫn muốn điểm cao.

Và là cái giá đắt phải trả cho những ai đam mê, một thứ gì. Những người chơi violin nhiều (nhiều ở đây là rất nhiều, là có thể tới 10.000 tiếng) - có thể gây hỏng tai, không lạ, bởi âm thanh phát ra từ violin rất lớn. Những người thành tài, sẽ luôn phải mang theo tật.

Khi các trường đại học ngày càng mọc lên như nấm, và trường quái nào cũng có khoa công nghệ thông tin. Thế nhưng có lẽ, chả có trường nào dạy sinh viên môn sức khoẻ trước khi dạy IT cả (đấy là tôi đoán thế, vì tôi học trường đại học công nghệ hàng đầu Việt Nam và họ chả dạy gì :3).

Những chuyên gia tôi quen, những người đã trong ngành hơn 10000 giờ thực thụ, họ đều mắc phải 1 trong các căn bệnh không mấy dễ chịu. Ngồi máy tính nhiều bạn sẽ mắc những căn bệnh sau (và có thể gọi là "bệnh nghề nghiệp") - và nó phổ biến cho dân văn phòng, những người cả ngày ngồi máy tính.

1. Xương khớp

Thursday, 26 June 2014

[bash] are you REALLY a bash user?

Nếu ngày nào cái màn hình trước mặt bạn cũng là cái terminal,
hẳn  69% bạn là một người biết dùng terminal.
Và nếu bạn dùng Ubuntu hay 96% các hệ điều hành Linux-based, thì bạn đang dùng bash trong cái terminal đó.

Gõ thử xem mình có phải đang dùng bash không:
$ echo $BASH_VERSION
4.3.18(1)-release
Nếu câu trả lời là có (như trên ^) thì đúng là bạn đang dùng bash rồi.

Vậy dùng bash thế nào cho nó đúng điệu :3
Hãy tận dụng những tính năng của nó.

1. for; while
Bash giúp giải quyết các công việc lặp đi lặp lại bằng một vòng lặp, muốn ping 10 ip từ 192.168.1.2 -> 192.168.1.11?
đơn giản:
$ for i in {2..11}; do ping -w1 -c1 192.168.1.$i; done

Wednesday, 25 June 2014

[cmd] find - tìm thấy mà không xoá được, why?

Đọc giả cuteanlame có một directory chứa các file sau:
# find /tmp/findtest -name '*-*' -or -name '*_*'
/tmp/findtest/meomeo_1
/tmp/findtest/meomeo_2
/tmp/findtest/gaugau-3
/tmp/findtest/meomeo_3
/tmp/findtest/gaugau-2
/tmp/findtest/gaugau-1
Bạn ấy muốn xoá các file có dấu "-" và dấu "_" trong tên, nên bạn làm thế này:
# find /tmp/findtest -name '*-*' -or -name '*_*' -delete
Nếu nhìn vào câu lệnh trên bạn đọc chính xác được lệnh find sẽ làm gì thì bạn không cần đọc tiếp bài này nữa. Và cũng xin chúc mừng vì bạn còn có thể dùng lệnh ``find`` tốt hơn rất nhiều người, thậm chí cả những superuser với kinh nghiệm dùng Linux 20 năm.

Monday, 23 June 2014

trello.com

Trong quá trình đi tìm các web app để quản lý thời gian, tớ đã sử dụng qua khá nhiều phần mềm quản lý project với mong muốn có 1 tool để quản lý các "project" cá nhân.
Sau youtrack, redmine, asana, agile zen, github/bitbucket issues, planbox ... thì tớ dừng chuyến phiêu lưu ấy lại tại sân bay "trello.com".

trello có một giao diện đơn giản, với các board (kanban) và trong board chia làm nhiều cột 





Giao diện thân thiện, cách dùng đơn giản, quảng cáo vậy thôi, dùng hay không thì tuỳ :3

https://trello.com/

Bỏ Facebook đi và N trang web...

Nếu ban đã đọc được dòng chữ đó đâu.đây vài ngày.qua, hẳn bạn sẽ nghĩ bài viết nói đúng ... nhưng chẳng có gì thay đổi.

Trong list N website ấy, có quora, có stackoverflow...

Và 5 phút trước tôi đã gỡ tất cả đống phần mềm ấy khỏi điện thoại.
Thứ quý giá nhất bạn có đó là thời gian. Và khi bạn đánh đổi nó lấy bất cứ điều gì thì 69% là bạn đang lỗ.
Đọc quora nhiều 96% là tốt hơn chơi FB, nhưng thứ gì đốt quá nhiều thời gian của bạn trong khi bạn có thể làm việc BẠN THẤY có ích hơn ... thì đều như nhau cả.

Tất nhiên không ai có thể sống cả ngày bằng lý trí được, nhưng hãy biết quý trọng thời gian của mình. Dành 15 phút và thử nghĩ xem nếu 7 ngày nữa là sinh nhật tuổi 40 của bạn...
Sẽ đau đầu lắm đấy!

Sunday, 22 June 2014

[Review] Learn python the hard way

Một câu nói rất hay mà tớ lượm được trong " Learn python the hard way":

Programming as a profession is only moderately interesting. It can be a good job, but if you want to make about the same money and be happier you could actually just go run a fast food joint. You are much better off using code as your secret weapon in another profession.
                                                                                            -- Red Shaw --

Chuyện bên lề.
Cuộc sống đầy dãy những thay đổi và điểm ngoặt!
Và một trong những điểm ngoặt lớn nhất trong cuộc đời tớ là khi tớ đặt chân vào thế giới của những programmer, và chính xác hơn đó là thời điểm tớ bắt đầu biết đến python.
Python giúp tớ tiếp cận với một thứ gọi là 'tư duy logic'
Python giúp tớ ...bla..bla
Và bây giờ, tớ có cảm giác.. tốt lên
Đầu tiên tớ học python tại đây:
https://docs.python.org/2/tutorial/index.html

Haizz, thật buồn khi phải nói rằng. một tháng đầu tiên, chắc tớ chỉ biết print string, và cao cấp hơn là viết được chương trình tính 100!
Vì sao lại vậy?
Lí do có lẽ do tớ lười + đầu đất ... bla...bla...
Và một lý do quan trọng hơn là :
https://docs.python.org/2/tutorial/index.html

Friday, 20 June 2014

[CLI] less - view file trên terminal


root@hvn-do-workspace:~# whatis less
less (1)             - opposite of more
root@hvn-do-workspace:~# whatis more
more (1)             - file perusal filter for crt viewing
Các UNIX developer khá là vui tính trong chuyện trả lời "whatis". Một câu trả lời cũng vui tính không kém khi hỏi :
# whatis git
git (1)              - the stupid content tracker
Khái niệm
Cơ bản thì less là 1 chương trình để view file text trên terminal. ``less`` chỉ để view chứ không edit file, các UNIX-like OSes đều cài sẵn ``vi`` và ``less``. So với ``vi``, khi xem các file lớn, ``less`` không cần phải đọc toàn bộ input file trước khi start (``vi`` sẽ đọc toàn bộ và nhét vào RAM) vì vậy less sẽ start nhanh hơn.

``less`` là một phiên bản cải tiến của ``more``, đây là một kiểu chơi chữ trong tiếng Anh:
less is more

Có 2 cách dùng ``less`` cơ bản:

1. less filename
đọc input file tên là filename 
Ví dụ:
less /etc/passwd 
 2. some commands | less
đọc qua pipeline (|) output của câu lệnh trước nó
Ví dụ:
ls -la | less (dùng khi output quá dài)
Các phím tắt
j : xuống
k : lên
space: xuống 1 màn hình
q: quit
/ tu_khoa: search down
? tu_khoa: search up
-N : hiển thị số dòng (bấm -N, enter)

Đọc thêm

Wednesday, 18 June 2014

tcpdump - lưu giữ mọi khoảnh khắc của network

thanhnguyen@thanhnguyen:~$ whatis tcpdump
tcpdump (8)          - dump traffic on a network
Có thể nói, tcpdump là một trong những lệnh hữu dụng nhất trong quản trị mạng.

Tại sao?
Có những lúc bạn thắc mắc về các vấn đề kết nối mạng, hoặc thỉnh thoảng không biết tại sao một server không RESPONSE một ping request của bạn...
Trong những trường hợp như thế, tcpdump là một tool vô cùng hữu ích đối với bạn, nó có khả năng capturing packets khá mạnh mẽ. Nó hoạt động trên network layer và có thể capture tất cả các packets ra vào máy tính. Ngoài ra, có thể sử dụng tcpdump để capture và save các packets tới một file nào đó và phân tích sau.

Sau đây, là một số option phổ biến khi sử dụng tcpdump command.

-i option
Được sử dụng để xác định interface. tcpdump capture các packets gửi tới và truyền đi qua một interface cụ thể. => Chọn Interface để tcpdump capture các packet

find - tìm hoài mà không thấy

người hãy nói
vì sao em không tìm được nó là tại làm sao:
root@elasticsearch-1:~# ls -l /var/run/crond.pid ; find /var/run -name 'cron*' | wc -l
-rw-r--r-- 1 root root 6 Jun 11 12:08 /var/run/crond.pid
0

Câu lệnh trên: khi dùng lệnh ls cho thấy file  /var/run/crond.pid có tồn tại, nhưng khi dùng lệnh find thì tìm không ra.
Hacker +Lam Tung  đã tìm ra một giải pháp (thêm dấu / ở cuối path):

root@elasticsearch-1:~# find /var/run/ -name 'crond*'
/var/run/crond.reboot
/var/run/crond.pid

Bài viết thực hiện trên:
$ lsb_release -a; find --version | grep find
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 12.04.4 LTS
Release:        12.04
Codename:       precise
find (GNU findutils) 4.4.2

Vậy tại sao find lại không tìm được, sau một hồi điều tra, thám tử cô nan đã tìm ra:

[Haskell] Haskeller, not hacker

Haskell /ˈhæskəl/
haskeller là từ chỉ những người dùng ngôn ngữ Haskell
hacker /ˈhakə/
Cho thêm từ hacker và để mọi người nhớ cách đọc của haskell

Haskell là gì?


Định nghĩa copy nguyên văn từ homepage haskell.org

Haskell is a computer programming language. In particular, it is a polymorphically statically typed, lazy, purely functional language, quite different from most other programming languages. The language is named for Haskell Brooks Curry, whose work in mathematical logic serves as a foundation for functional languages. Haskell is based on the lambda calculus, hence the lambda we use as a logo.

Như những gì họ chọn, 4 đặc tính nổi bật của Haskell gồm:
  1. Polymorphically
  2. Statically typed
  3. Lazy
  4. Purely functional

Tuesday, 17 June 2014

Chơi với docker, fail lần 1

Như phần tiếp theo của bài viết này
http://www.familug.org/2014/03/vm-tu-virtualbox-en-docker.html

hôm nay mình xin kể về chuyện chơi cùng Docker, và tại sao lại thất bại, tại sao lại tạm thời chia tay chỉ ngay sau nụ hôn đầu.

Tin đồn rằng vài ngày trước, một tổ chức nguy hiểm có tên xưa cũ là dotCloud đã chính thức thả  ra (release) một yêu nữ tên là Docker - một cái tên nghe là nghĩ đến sắt thép và không được mỹ miều cho lắm (http://blog.docker.com/2014/06/its-here-docker-1-0/).

Và không gì hơn nếu thiên thời, địa lợi, nhân hoà, chính lúc ấy mình cần cài một cái máy ảo để testing vài thứ. KVM không có trên OS X, Virtualbox gần như là lựa chọn duy nhất dẫu không mấy mặn mà. Vậy là Docker được mang ra nghịch.

Cài đặt:
Không có gì đặc biệt hay khó khăn, cứ theo tut mà cài  https://docs.docker.com/installation

Sau khi cài xong thì chạy thôi, dễ như ăn kẹo cao su :3
$ docker run ubuntu:12.04 /bin/echo 'hello thon'
hello thon
thật ra nó sẽ phải download image ubuntu 12.04 một lúc, xong mới chạy được như trên. Việc sử dụng không có gì phức tạp, cứ như tut mà làm :3 https://docs.docker.com/userguide/dockerizing

Để tương tác trực tiếp, chạy lệnh "run" với option '-i'

Thursday, 12 June 2014

Ý tưởng - Cơ hội

Là những thứ nếu bạn không nắm bắt, có khi, sẽ phải hối hận cả đời.

Có một người đàn ông kể rằng:
trước kia ông từng có nhiều ý tưởng, chúng có vể hơi bất khả thi, khó thực  hiện, hoặc
đôi khi vì ông không dám theo đuổi thực hiện nó. Rổi 3 năm sau, ông ta thấy một thằng nào đó, ôm cái ý tưởng đấy cùng với hàng triệu đô.

Tất nhiên cái từ "có một người đàn ông" không đủ thuyết phục để làm 1 câu chuyện nghe như bịa trở thành có phần giống thật, nhưng đã bao giờ bạn trong hoàn cảnh tương tự?

Nếu nảy ra 1 ý tưởng, hãy ghi nó lại ở nơi mà bạn biết mình sẽ tìm thấy nó ở đấy,
hay mang đi tặng làm "quà" cho bè bạn,
cũng có thể gồng mình lêntheo đuổi nó.

Cơ hội chỉ đến một vài lần trong đời, hãy nắm lấy nó.

Nói nhảm trước thềm worldcup :3

Monday, 9 June 2014

[network] ping - pong

Vô tình hôm nay hàm "command of today" của tớ trả về kết quả cho lệnh ping, và nó đặt ngay câu hỏi cho tớ rằng "ping là gì?", có chắc bạn sẽ trả lời đúng như những gì lệnh whatis trả về?

$ whatis ping
ping (8)             - send ICMP ECHO_REQUEST to network hosts

Bài viết thực hiện trên:
# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 12.04.4 LTS
Release:        12.04
Codename:       precise
Hãy nhìn thật kỹ và phân tích từng dòng output:

$ping dantri.com -c1
PING dantri.com (222.255.27.51) 56(84) bytes of data.
64 bytes from static.vdc.vn (222.255.27.51): icmp_req=1 ttl=55 time=251 ms

--- dantri.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 251.466/251.466/251.466/0.000 ms

-c1 là option nói rằng chỉ gửi 1 ICMP ECHO_REQUEST duy nhất, nếu không có option này ping sẽ gửi lần lượt, liên tục cho đến khi nó nhận được SIGINT (user bấm Ctrl C)

Dòng output đầu tiên

PING dantri.com (222.255.27.51) 56(84) bytes of data.

Sunday, 8 June 2014

Giới thiệu và hướng dẫn sử dụng cơ bản iptables (Firewall)

1. iptables là gì?

thanhnt@Thanhnt:~$ whatis iptables
iptables (8) - administration tool for IPv4 packet filtering and NAT
Trước đây, gói firewall/NAT được sử dụng phổ biến trên linux là ipchans, dần dần bị thay thế dó có nhiều bug và thiếu tính năng, iptables ra đời.

So với ipchains, iptables có những ưu điểm vượt trội như:
  • Tích hợp cao với linux kernel
  • Có khả năng phân tích packet hiệu quả
  • Filter packet được dựa trên các MAC address và các giá trị của flags trong TCP header
  • Hệ thống log có các tùy chọn phù hợp, dựa trên mức độ và chi tiết reports
  • Translation địa chỉ mạng tốt hơn
  • Hỗ trợ tích hợp với các web proxy programs
  • Có khả năng ngăn chặn một số cơ chế tấn công theo kiểu DoS
...............

2. Một số lệnh cơ bản khi làm việc với iptables

[MacOSX] Khám phá Mac OS X (phần 1)

UPDATE 2017: bài viết này viết khi tác giả lần đầu dùng OSX, bạn nên dùng Brew thay vì MacPorts https://brew.sh/

Trăm nghe không bằng một thấy
trăm thấy không bằng một sờ

hãy cùng đi khám phá Mac OS X để trở thành 1 normal stupid user của hệ điều hành này.

Bài viết thừa nhận người đọc là 1 Linux / UNIX user.

Xách khoai lên và đi!

Trước tiên, bạn cần biết rằng Mac OS X là 1 variant của BSD, nó cũng là 1 UNIX-like OS.

Kiểm tra kernel version
$ uname -a
Darwin VietHungs-MacBook-Pro.local 12.5.0 Darwin Kernel Version 12.5.0: Mon Jul 29 16:33:49 PDT 2013; root:xnu-2050.48.11~1/RELEASE_X86_64 x86_64
Kiểm tra software version
$ sw_vers
ProductName:    Mac OS X
ProductVersion:    10.8.5
BuildVersion:    12F37
http://unix.stackexchange.com/questions/582/how-can-i-tell-what-version-of-os-x-im-on-from-the-command-line

Xem model identifier của máy

Mỗi dòng máy MacBook có một model identifier riêng (mà trong các bài hướng dẫn, người ta thường dùng tên này chứ không phải là MacBook Air mid 2013 blah blah).

Để xem model identifier:
Bấm vào quả táo góc trên, trái > About this Mac > More Info ... nếu bạn không thấy Model Identifier ở đâu > System report nếu vẫn chưa thấy > Ở đây sẽ nhìn thấy các thông tin về máy, phần cứng ...

VD:

Model Name:    MacBook Pro
Model Identifier:    MacBookPro10,1

Test trên OS X 10.9.4

Cài đặt phần mềm
Sau khi cài đặt xong thì tất cả ấn tượng chỉ có đẹp và lung linh, nhưng để làm việc được thì việc cài đặt cũng gian nan không ít.

Là 1 python programmer, sysadmin, linux cute user tất cả những gì cần để tớ có thể làm việc:
  1. vim
  2. git, tig
  3. bash
  4. pip/virtualenv + python 2.7
  5. irssi (IRC client)
  6. web browser
  7. Email client
  8. XMPP (Gtalk) chat client
  9. Gõ tiếng Việt 

1. vim
$ vim --version
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled May 15 2013 15:38:58)
Compiled by root@apple.com

Cài sẵn, chỉ cần config là dùng được.

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

Thursday, 24 April 2014

100.000 lượt view

Vậy là thấm thóat cũng đã 4 năm trôi qua kể từ FAMILUG thành lập (bài viết đầu tiên vào tháng 5 năm 2010). Bao nhiêu thăng trầm, bao nhiêu vui buồn, bao nhiêu nỗ lực, bao nhiêu kỷ niệm, tất cả đã ở lại đằng sau để thời gian đưa chúng ta về phía trước, FAMILUG đã đạt mốc view KINH KHỦNG 100.000 lượt view. Thật ra, chúng ta muốn chào mừng việc đã vượt qua mốc 99.999 :3

Bấm vào đây để đọc lại bản nghị quyết thành lập cho vui :3


Từ một nhóm sinh viên ngơ ngác tập dùng Ubuntu từ bản 10.04, giờ đây các thành viên đã trở thành các hacker mũ hồng, các lập trình viên, chuyên viên công nghệ ngổ ngáo. FAMILUG chẳng giúp gì được cho mọi người, nó cũng chỉ là cái cớ để làm 1chầu bia, để là chỗ đôi lúc ai muốn xả gì thì chui vào. Nhưng đâu phải ai cũng nhận ra, con người ta, ĐÔI KHI chỉ cần những điều đơn giản như thế.

Nhờ chính sự F5 ko mệt mỏi của các bạn mà FAMILUG đã đạt được thành công như ngày hôm nay. Vậy nên để chào mừng sự kiện này và để thu tiền đóng domain cho năm tới, tôi xin công bố buổi tiệc liên hoan chúc mừng FAMILUG sẽ tổ chức vào 1 ngày không xa.

Cảm ơn vì đã nghe nói nhảm :))

Tuesday, 22 April 2014

[CLI] fdisk và cfdisk

Hai công cụ chức năng tương đối giống nhau và cùng dùng để chỉnh sửa partition table.

Định nghĩa:

hvn@archhvn: ~ () $ whatis fdisk
fdisk (8)            - manipulate disk partition table
hvn@archhvn: ~ () $ whatis cfdisk
cfdisk (8)           - display or manipulate disk partition table

bình thường thì chả ai đi format hay xem partition table cả, vậy nên trừ khi bạn làm việc này thường xuyên (nghĩa là - bạn thường xuyên phải format ổ cứng, hoặc bạn là 1 sysadmin) thì bạn mới động đến các câu lệnh này.

cfdisk thì có giao diện curses-based
fdisk thì dùng giao diện CLI tương tác  (fdisk  is  a  dialog-driven program), nó đưa ra câu hỏi, bạn đưa ra câu trả lời.

Cả 2 đều dễ dùng và trực quan.

Một điểm khác biệt đáng chú ý là:

[python] Tính ngày

Đề bài: tính xem có bao nhiều ngày từ ngày X/Y/Z đến ngày x/y/z

Bài làm:

In [1]: import datetime
 
In [8]: datetime.datetime(2014, 12, 31) - datetime.datetime(2014,1,1)
Out[8]: datetime.timedelta(364)

In [9]: datetime.datetime(2014, 1, 2) - datetime.datetime(2014,1,1)
Out[9]: datetime.timedelta(1)

Saturday, 19 April 2014

Cổ tích

hãy cho đi khi còn có thể,
bởi đến một lúc nào đó, khi mọi thứ trở nên thừa thãi, cho đi chẳng còn ý nghĩa gì.

Lòng tốt không bao giờ được đền đáp xứng đáng, thế nên, những câu chuyện cổ tích luôn có đoạn kết có hậu! Khi quyết định làm việc tốt, hãy chấp nhận điều này.

Cho một buổi sáng thứ 7 không yên bình...

Thursday, 17 April 2014

Vài chú ý khi viết file cron/crontab

1. nên dùng absolute path của các file executable, ví dụ:

thay vì viết

rm XYZ

hãy viết

/usr/bin/rm XYZ

để lấy absolute path, dùng lệnh:

$ which rm
/usr/bin/rm

bận

là có thể không thực sự bận như thế nhưng bạn vẫn cảm thấy như thế.

Cuộc đời ít ra vẫn công bằng ở chỗ mỗi ngày cho người ta 24h, không hơn, không kém. Và nếu như bạn giành quá nhiều , hay không quá nhiều trong số vốn ấy để làm những việc mình không thấy thoải mái, thì rồi bạn sẽ thấy mệt mỏi.

Nếu bạn đi làm ở công sở 8h/ ngày + ngủ 7h /ngày = 15h
bạn còn 24 - 15 = 9 tiếng - (ăn tối, tắm giặt, ! tè) = 7 tiếng, rồi - thời gian tham giao thông 1-2 tiếng, vậy bạn cò tầm 5 tiếng free mỗi ngày (ở đây thừa nhận bạn là 1 người sống theo nếp sống phổ biến).

Bạn làm gì trong 5 tiếng ấy?
(thường nó sẽ rơi vào buổi tối nếu bạn làm 8 tiếng ban ngày).


Thursday, 10 April 2014

[cmd] rev

$ whatis rev
rev (1)              - reverse lines of a file or files

$ echo familug | rev
gulimaf

Một bài toán có sử dụng rev như 1 thành phần quan trọng trong 1thuật toán thông minh:

Yêu cầu: lấy tất cả những phần sau dấu / sau cùng

/etc/pacman.d/gnupg/gpg.conf
/etc/pacman.d/gnupg/pubring.gpg~
/etc/pacman.d/gnupg/secring.gpg
/etc/pacman.d/mirrorlist.pacnew

Wednesday, 26 March 2014

Từ information đến skill

4h sáng,
tự dưng thèm 1 bát mì tôm trứng, cực kỳ!
Nhưng nhà không tàng trữ thứ đồ ăn độc hại ấy. Đành ôm bụng đói và sáng  dậy quyết định sẽ làm 1 bát phở bò :v

Theo ngài Sherlock Holmes, người ta thông minh nhất khi bụng đói, cũng là lúc mà người ta hay nói nhảm nhất :3 (thật ra câu này đọc trong Conan, thằng Conan bảo Sherlock Holmes nói thế mà mình google mãi không ra)

Từ khóa:
- information: thông tin
- skill: kỹ năng
- knowledge: kiến thức

Làm cách nào để biến 1 đống information thành 1 skill?

Để trở thành 1 skill, cần - hoặc phải hiểu nó - hoặc phải quen tay với nó. Nếu chỉ hiểu thôi, rồi người ta sẽ quên nó (theo thời gian và không gian), và cuối cùng thì vẫn phải quen tay thì mới biến nó thành skill được.


Monday, 17 March 2014

[VM] Từ VirtualBox đến docker

Bài này không trình bày dài dòng về các công nghệ ảo hóa.
Bài này là một dạng nhật ký về hành trình sử dụng những công nghệ ảo hóa trên chính chiếc laptop của mình.

Cuộc hành trình bắt đầu

ngày xửa ngày xưa...
khi mà thế giới loài người văn minh mới chỉ có Windows, một ngày nọ, chàng trai xứ sở hoa ban quyết mang Linux lạc hậu đến thế giới hiện đại này. Có lẽ là trước đó, nhưng bộ nhớ giới hạn chỉ có thể nhớ đến đây.VirtualBox là phần mềm ảo hóa đầu tiên mình sử dụng để chạy Ubuntu.

1. VirtualBox
Cũng không nhớ nổi lý do vì sao mình chỉ dùng VirtualBox mà chưa 1 lần cài VMWare vào máy. Trải nghiệm với VirtualBox khá dễ chịu, bởi ngày ấy mình vẫn còn là 1 cute user của Windows. Và quá trình tập tành cài đặt Ubuntu cũng được thực hiện ở đây.

VirtualBox là một giải pháp ảo hóa hóa phần cứng. VirtualBox chạy cả trên Windows, Linux và Mac. Nhờ VirtualBox, người dùng có thể chạy các hệ điều hành khác ngay trên hệ điều hành mình đang dùng. Đặt 1 chân sang thế giới khác!

Nhưng hãy tin, thay đổi là việc khó khăn, phải nhấn mạnh hơn là cực kỳ khó.
Bởi thế cho nên, trên kinh nghiệm bản thân, mình chẳng bao giờ tin rằng 1 đứa dùng chỉ Ubuntu trên 1 cái máy ảo sẽ dùng Ubuntu trên 1 cái máy thật. Trừ 1 vài trường hợp bất bình thường, và nó sẽ cài Ubuntu lên máy thật. Tất nhiên, dual boot.

Sunday, 16 March 2014

[bash] Script tạo user trên Linux OS-based

Script này cần 2 arguments, 1 là username, 2 là password (loại password đơn giản, không hỗ trợ các password cần escape ký tự đặc biệt) và chạy với quyền root.

https://github.com/hvnsweeting/tinyscripts/blob/master/chuser.sh

Tested on

$ bash --version | grep bash ; uname -r
GNU bash, version 4.2.45(2)-release (x86_64-unknown-linux-gnu)
3.13.5-1-ARCH

Sunday, 9 March 2014

Một số lệnh liên quan đến card sound trên Linux

Cơ bản là tự dưng 1 hôm loa không hát nữa, sửa mãi nó không khỏi.
Nay đã sửa xong, viết hồi ký. Mỗi lần sửa chữa này mất rất nhiều thời gian và học được không ít điều mới.

Bài viết thực hiện trên:
# uname -r
 3.13.5-1-ARCH

ALSA (Advanced Linux Sound Architecture) là một thành phần của Linux Kernel cung cấp driver cho các card sound.

PulseAudio là một "sound server". Máy tớ không dùng pulseaudio. (máy cài Ubuntu 12.04 mặc định là có dùng PulseAudio)

0. alsamixer
Dùng câu lệnh alsamixer để mở bảng "mixer" và chỉnh âm (các loại volume).

1. aplay


$ whatis aplay
aplay (1)            - command-line sound recorder and player for ALSA soundcard driver   

$ aplay -l  # List all soundcards and digital audio devices
**** List of PLAYBACK Hardware Devices ****
card 0: MID [HDA Intel MID], device 0: ALC269VB Analog [ALC269VB Analog]
  Subdevices: 0/1
  Subdevice #0: subdevice #0
card 0: MID [HDA Intel MID], device 3: HDMI 0 [HDMI 0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

Tuesday, 4 March 2014

[bash] Brace expansion

$ for i in {1..11}; do echo hostxxx-$i; done                                                               
hostxxx-1
hostxxx-2
hostxxx-3
hostxxx-4
hostxxx-5
hostxxx-6
hostxxx-7
hostxxx-8
hostxxx-9
hostxxx-10
hostxxx-11
$ for i in {01..11}; do echo hostxxx-$i; done                                                             
hostxxx-01
hostxxx-02
hostxxx-03
hostxxx-04
hostxxx-05
hostxxx-06
hostxxx-07
hostxxx-08
hostxxx-09
hostxxx-10
hostxxx-11

Monday, 3 March 2014

awk và cut

Các tiện ích UNIX (UNIX utilities) thường nhận đầu vào là text, và output ra cũng là text. Để các chương trình nối lại được với nhau, tức dùng output của chương trình này làm imput cho chương trình kia, người ta sử dụng pipeline (" | ").

Cũng vì điều nói trên, mà việc bóc tách dữ liệu từ output của 1 chương trình là cần thiết, bởi 1 chương trình có thể sinh ra nhiều dòng text, trong khi bạn chỉ cần 1 dữ liệu nào đó trong đống text đấy. Bạn có thể copy bằng tay, nhưng bạn sẽ không muốn làm như thế nếu phải làm 1000 lần, okay?

2 trong số nhiều công cụ phục vụ mục đích trên là "cut" và "awk", mục đích chính (được dùng nhiều nhất) là dùng để cắt theo cột. Các ví dụ sau sẽ minh họa tính năng của cut và awk

$ echo "one/two/three" | cut -d'/' -f1
one
$ echo "one/two/three" | cut -d'/' -f2
two
$ echo "one/two/three" | cut -d'/' -f3
three
$ echo "one/two/three" | cut -d'/' -f2-
two/three
$ echo "one:two:three" | cut -d':' -f2-
two:three
$echo "/one/two/three" | cut -d'/' -f2
one

Và awk

hvn@lappy: ~ () $ echo "one:two:three" | awk -F':' '{print $1}'
one
hvn@lappy: ~ () $ echo "one:two:three" | awk -F':' '{print $1}'
one
hvn@lappy: ~ () $ echo "one:two:three" | awk -F':' '{print $2}'
two
hvn@lappy: ~ () $ echo "one:two:three" | awk -F':' '{print $1 $2}'
onetwo

Từ các output nói trên, hãy nhớ rằng cut và awk đều coi vị trí số 1 là vị trí trước "separator" đầu tiên (separator được chỉ định bởi -d với cut và -F với awk)

Sunday, 2 March 2014

Lấy External IP


Để lấy public IP của máy mình hiện tại, dùng lệnh:

$ dig +short myip.opendns.com @resolver1.opendns.com
113.190.182.179

Ngoài ra còn vài cách khác, có thể kể đến

$ curl icanhazip.com
113.190.182.179

source: https://coderwall.com/p/lyrjsq?utm_campaign=weekly_digest&utm_content=Privately+receive+personally+curated&utm_medium=email

Hết!

Saturday, 1 March 2014

List các địa chỉ mà máy mình đang connect tới

Nhân dịp rỗi việc, tự dưng thấy mạng chậm nghĩ máy mình bị hack, đành phải kiểm tra.

Dưới đây là 1 đoạn command trông khá tởm, sẽ sớm chuyển thành 1 script để mọi người tiện dùng.
Tác dụng là lấy top những  địa chỉ domain mà máy mình đang connect tới.

sử dụng câu lệnh ss -a để liệt kê các kết nối máy mình đang thực hiện

$ for i in `ss -a | grep -v 'Peer' | grep -v '*' | tr -s ' ' | cut -d' ' -f5- | sort | uniq -c| sort -nr| head | tr -s ' ' | cut -d' ' -f3 | cut -d ':' -f1 `; do echo "$i: $(dig -x $i +short)"; done
54.221.234.83: ec2-54-221-234-83.compute-1.amazonaws.com.
23.62.109.199: a23-62-109-199.deploy.static.akamaitechnologies.com.
31.13.68.33: edge-star-shv-03-hkg1.facebook.com.
198.252.206.25: stackoverflow.com.
173.252.102.241: channelproxy-shv-06-ash2.facebook.com.
108.160.163.108: snt-re4-8d.sjc.dropbox.com.
Mình viết khá là thô thiển nên mời mọi người tung ra các phiên bản ngắn hơn của các câu lệnh trên :D

1. dẫn đầu là 1 địa chỉ dùng cloud amazonaws, vào địa chỉ ấy thì đó là trang của dropbox (máy mình đang chạy dropbox)

Monday, 24 February 2014

[Python] docutils package (hay nhật ký tìm hiểu 1 python package)

Bài viết này dành cho những ai biết các khái niệm pip, virtualenv, package/module trong python. Hoặc những ai muốn xem ví dụ sử dụng một số câu lệnh để khám phá 1 directory.

Docutils is a modular system for processing documentation into useful formats, such as HTML, XML, and LaTeX. For input Docutils supports reStructuredText, an easy-to-read, what-you-see-is-what-you-get plaintext markup syntax.

Tóm lại module (hay package) này thực hiện các công việc giúp đọc 1 file .rst (reStructuredText) và cho phép xuất ra các output khác nhau (HTML, XML, LaTeX)

Ví dụ:
 rst2html.py monitor.rst out.html
Document của docutils khá là sơ sài, có mỗi page này có vẻ có chút thông tin:
http://docutils.sourceforge.net/docs/dev/hacking.html


Các bước hoạt động

docutils chuyển đổi 1 file .rst sang .html qua 4 giai đoạn:
1. Reader : đọc document từ source file và chuyển cho Parser
2. Parser: phân tích document nhận được, tạo 1node tree document.
3. Transform: thực hiện tranform ví dụ như biến 1 reference thành 1 link cụ thể.
4. Writer: nhận node tree sau khi transform và thực hiện ghi ra file đích.

Introspect docutils (soi và ngắm)

Sunday, 23 February 2014

[Python] Đọc kỹ hướng dẫn sử dụng, trước khi dùng

Code chơi chơi sai thì không chết
nhưng thuốc chữa bệnh không đọc là chết người.

Nếu bạn code python theo style sysadmin (thực hiện automate các task, tương tác với file ...) thì standard modules thân yêu nhất của bạn nên là: os , sys

Nay lần đầu tớ dùng os.walk, và không đọc hướng dẫn sử dụng.
Hậu quả là mất ~30 phút để debug (trong khi nếu đọc chỉ mất < 5 phút)
In [4]: import os                                                                                                                                    

In [5]: help(os.walk)
...
Caution:  if you pass a relative pathname for top, don't change the
current working directory between resumptions of walk.  walk never
changes the current directory, and assumes that the client doesn't
either.


Lesson learned!
Hết.

Thursday, 20 February 2014

[WeeklyVIM] Mở nhiêu file, dịch chuyển thư mục từ bên trong vim

để edit nhiều file (chọn file từ shell), có thể làm theo bài viết http://www.familug.org/2013/03/weeklyvim-edit-nhieu-file-voi-vim.html

Để edit nhiều file từ trong VIM, có thể chuyển sang normal mode và gõ
:n file1 file2 filen

hoặc để mở hết các file trong thư mục:
:n *

hay để "recursive", gõ
:n **

Tuesday, 18 February 2014

ssmtp: gửi gmail từ command line


Bài viết thực hiện trên:

$ lsb_release -r
Release:        12.04
Bạn có muốn post status FB qua CLI?
Chỉ cần vào tk FB, chọn setting => mobile, lấy cái email private đó. Gửi mail từ CLI đến email vừa lấy được => Xong con ong!

Để gửi mail (mặc định là Gmail) từ CLI, có nhiều cách, đơn giản nhất là cài ssmtp

$ whatis ssmtp
ssmtp (8)            - send a message using smtp
# cài ssmtp
$ apt-get install ssmtp -y


Sau khi cài xong cần cấu hình cho ssmtp ở /etc/ssmtp, cần sửa 2 file
revaliases và ssmtp.conf

Thursday, 13 February 2014

Chuyện thứ tự

Con người ta thường có xu hướng đề cao thứ tự những sự việc trong đời.
Bởi thế, những cái đầu tiên, cái thứ nhất luôn được sách vở nâng cao và biến thành 1 "suy nghĩ chung" rằng cái đầu tiên mới quý, mới tốt.

Ước mơ đầu tiên của bạn có phải là ước mơ tuyệt vời nhất?
Chuyện tình đầu tiên của bạn có phải chuyện tình đẹp nhất?
Bạn có yêu thích cái điện thoại đầu tiên của mình nhất?
Ngôn ngữ lập trình bạn học đầu tiên bạn có thích  nó nhất?


Chỉ để bạn hiểu rằng, thứ tự diễn ra của những điều ấy không quan trọng, quan trọng là bạn thích/ muốn gì.

Nên cũng đừng buồn nếu không nhớ "ngày bé mình ước mơ gì!"

Thursday, 6 February 2014

Các địa chỉ mua bán tin cậy tại HN

(giới thiệu bởi thành viên FAMILUG)

Sửa chữa laptop ở đâu?

suachualaptop24h http://www.suachualaptop24h.com/

Mua tai nghe ở đâu?

songlong http://songlongmedia.com/
tainghe.com.vn http://tainghe.com.vn/index.php

...

ai có gì thì comment vào nhé

Tạo "máy ảo" với LXC

Bài này hướng dẫn dùng LXC để tạo các "máy ảo Linux" (NOTICE: không tạo được các "máy ảo" Windows/BSDs ...) dựa trên các template có sẵn. Container là từ dùng để chỉ "máy ảo" ấy.

Bài viết mặc định rằng bạn đang dùng Linux Kernel ở phiên bản đã hỗ trợ LXC.

Bài viết thực hiện trên
$ lsb_release -a; uname -r
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 12.04.3 LTS
Release:        12.04
Codename:       precise
3.8.0-26-generic
Trước hết cần cài đặt package "lxc", package này chứa các script giúp cho việc tạo/ sửa /xóa ... các container.


$ sudo apt-get install -y lxc

Xem danh sách các template có sẵn:

Sunday, 26 January 2014

[game] Robot Odyssey - DroidQuest

NOTICE: để chơi được game này, bạn cần có khả năng đọc tiếng Anh kha khá (hoặc ôm bên cạnh 1 quyển từ điển)

Robot Odyssey (hereinafter: RO) được đánh giá là computer game khó nhất mọi thời đại


Không nói dài dòng vì nếu bạn không chơi thì làm sao biết nó khó :v

Do game trên Windows 95 nên để chơi trên Linux, ta dùng bản clone trên Java có tên là DroidQuest
http://www.droidquest.com/

Link download

Saturday, 18 January 2014

[system] ldd - print shared library dependencies

$ whatis ldd
ldd (1)              - print shared library dependencies

ldd có sẵn trên máy bạn vì nó nằm trong package glibc

Từ khóa
shared libraries: hiểu đơn giản hết cỡ thì nó là các library được chương trình load vào khi chạy. (Chi tiết xem ở cuối bài)

Theo man 1 ldd 
ldd prints the shared libraries required by each program or shared library specified on the command line.

Vậy ldd dùng để xem 1 chương trình (hay một library) phụ thuộc (sử dụng) library nào.

Friday, 17 January 2014

bash vs dash vs zsh vs python cho scripting

ubuntu / debian chuyển sang dùng dash làm /bin/sh 3-4 năm trước, vì dash nhanh và nhẹ hơn
dash 0.5.7-4:
A POSIX compliant shell that aims to be as small as possible
 archlinux tiếp tục sử dụng bash và không bao giờ chuyển sang dash
hvn@archhvn: ~ () $ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Aug 25 19:06 /bin/sh -> bash
freebsd replace tất cả các script perl bằng POSIX shell script (perl is bloat)

dash hay bash
đây là đánh đổi giữa tốc độ / tính portable và tính năng
bash có nhiều tính năng hơn dash (ví dụ: array) nhưng nặng/chậm hơn dash, không POSIX compatible.
man 1 bash
BUGS
       It's too big and too slow.

Tuesday, 14 January 2014

[bash] array

Array là một data type cơ bản trong bash. Sử dụng rất dễ dàng, hiệu quả lại mênh mang.

Tạo 1 array và assign nó cho 1 variable cute:

hvn@archhvn: ~ () $ cute[0]=lam
hvn@archhvn: ~ () $ cute[1]=hiep
hvn@archhvn: ~ () $ echo ${cute}
lam
hvn@archhvn: ~ () $ echo ${cute[0]}
lam
hvn@archhvn: ~ () $ echo ${cute[1]}
hiep
hvn@archhvn: ~ () $ echo ${cute[@]}
lam hiep
hvn@archhvn: ~ () $ echo ${cute[*]}
lam hiep

Dấu @ và dấu * để chọn hết các phần tử trong array cute.
Khi không chỉ rõ index, array sẽ trả về phần tử (element) đầu tiên
Nếu phần tử không tồn tại, array sẽ trả về empty string.
Dùng ${XXX} để thay thế một variable bằng value của nó.

Friday, 10 January 2014

Memcached, redis và các key-value store

Memcached và gần đây là Redis, là những cái tên bạn nên biết. Vì chúng:
  • Rất đơn giản
  • Hữu ích
  • Đầu tư 1 thu lãi 10
Memcached đọc là Mem-kaʃ-di

chữ d được đọc riêng ra, vì d ở đây là viết tắt của daemon (như httpd, ftpd ...)
Chứ cache đọc là /kaʃ/ giống hệt như "cash" chứ không có "kết" nào ở đây cả.


Đơn giản
- Cài đặt dễ dàng
- Sử dụng đơn giản - dễ hơn tất cả các loại database - nếu bạn biết database là gì.


Memcached thường được sử dụng để lưu trữ các giá trị tạm thời, các chương trình thường được lập trình để đọc dữ liệu từ memcached trước khi đọc từ database (vì memcached đọc ghi trên RAM nên nhanh hơn rất nhiều lần so với đọc ghi database - trên disk)

Các hệ thống key-value store thường được sử dụng bởi các phần mềm, các lập trình viên thay vì người dùng cuối. Bởi vậy để minh họa cho việc sử dụng memcache/redis, ta cần phải dùng code.