Skip to main content

Posts

Showing posts from 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 .

[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:...

[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.

[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.

[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

[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 ...

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ì?

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 . ...

[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:

[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). 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 ...

[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ủ và đâ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 de...

[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:

[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 t...

[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

[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

[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.

[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

[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

[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 để ...

[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 Cuo ng ] 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ì ...

[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:

[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

[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

[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...

[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)

[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

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

[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:

[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

[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, ...

[basic] hostname

Trả lời câu hỏi sau: Trong các hostname dưới đây, có những hostname nào đúng: "KuteNhatXom" "tuong.ot." "xoai_chua.com" "fami-lug1.org" "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.

[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...

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á  https://play.google.com/store/apps/details?id=com.dc.bautom

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:

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:

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

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.

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 đã tr...

[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

[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.

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 ...

[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 đ...

[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 mor...

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 æ s k ə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: Polymorphically Statically typed Lazy Purely functional

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 ub...

Ý 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ên và theo đ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

[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 ...

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...

[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.

[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.

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...

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...

[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)

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...

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).

[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

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.

[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...

[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

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 c...

[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-0...

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- t...

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!

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...

[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 -- Python Documentation Utilities 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 docum...

[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                                                                                                    ...

[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 **

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

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ì!"

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:

[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

[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.

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.

[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ó.

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.

Popular posts from this blog

Tài liệu và hướng dẫn học Python

Để tiết kiệm thời gian, tốt nhất là đi học PyMI Updated: 130617 Sau đây là các tài liệu khuyên dùng: Vì nhiều lý do, nên học python2.7 tại thời điểm hiện tại (giờ là tháng 6/2013 - muốn biết tại sao thì tự tìm hiểu) python 3.5+ (giờ là tháng 2/2017) Chuẩn bị: 1. biết bật tắt máy 2. biết cài python 3. tập gõ 10 ngón - gõ 2 ngón hay 1 ngón cũng không sao, nhưng 10 ngón là cách dễ nhất để gõ nhanh nhất. Tài liệu - Nên dùng tài liệu tại trang chủ của Python làm chính, tham khảo thêm các tài liệu khác tại http://www.familug.org/2016/12/free-ebook.html Căn bản, mới học 1.1 Python PyMI.vn https://pymi.vn/tutorial/ 1.2. Python offical tutorial kết hợp làm bài tập trên HackerRank  (đề bài bằng tiếng Anh, nhưng Google translate 1 lúc cũng ra vì có nhiều ví dụ mẫu đi kèm). Học viên của Pymi.vn có rất nhiều học viên đã tự học với Learn Python the hard way nhưng chưa thấy ai thành công cả. Hai link dưới nên đọc sau khi đã nắm được những phần cơ bản của ngôn ngữ pytho...

The PyMiers

New FAMILUG