Saturday, December 2, 2006

Lông Vịt - The most stupid coder ever...

Invisible dạo này kô có đủ thời gian để làm một cái blog hay hay, xin lỗi những người *hâm* mộ  ... Hôm nay, hên làm sao, lục trong máy thấy có một vài đống chữ, tiện tay hốt lên đây cho blog đỡ hiu quạnh ...

Những đoạn code "cân não"...

Trong series "Những đoạn code cân não", Invisible sẽ lần lượt giới thiệu với các bạn làm quen những lập trình viên kỳ cựu trong làng coder của thế giới... Hôm nay chúng ta hân hoan chào đón LTV: "Lông Vịt" !!!...

1. Randomized...

Lông Vịt là một LTV kỳ cựu, anh đã thử qua kô biết bao nhiêu công ty trong một khoảng thời gian đủ ngắn mà vẫn chưa muốn dừng chân. Hôm nay đã là tuần thứ 2 anh làm việc tại công ty Ep-I-T kể từ khi anh được sếp giao cho module *chọn nhân viên tư vấn cho khách hàng*. Đại ý là khi nhận được một request từ khách hàng trong giờ hành chánh, nếu 2 nhân viên tư vấn đang available thì sẽ chọn random một nhân viên để tư vấn cho khách hàng. Module của anh Lông Vịt chạy cực kỳ tốt, nhưng có cái gì đó sai sai... Sau khi dò qua hàng ngàn dòng code, sếp của anh đã phát hiện:

ids = SelectIdleUsers(2);
if (hour >= 7 && hour < 18) {
    if (rand() > 0.5) {
        Owner->LoadById(ids[0]);
    }
    if (rand() < 0.5) {
        Owner->LoadById(ids[1]);
    }
}


"Cân não" ở chỗ nào chưa ai biết trừ lão sếp, cũng kô biết Lông Vịt sẽ ở lại công ty Ep-I-T bao lâu, nhưng chắc chắn anh sẽ trở lại vào một ngày gần đây với "Những đoạn code cân não" mới ...

2. SQL - A "sequential" query language??...

Lông Vịt ra trường đã lâu, nhưng hiếm ai biết một quá khứ hào hùng của anh lúc còn là SV. Thời đó, khi mọi người đang say sưa lưu trữ và đọc dữ liệu một cách thủ công dùng flat file: text có, binary có, linh tinh có... thì Lông Vịt đã tiếp cận với "công nghệ" mà anh ấy gọi là "truy vấn tuần tự". Mọi DBMS như Oracle, DB2, MSSQL, PostgreSQL, MySQL... anh đều ít nhất một lần... chạy thành công vài câu truy vấn . Biêt được khả năng bẩm sinh của anh, lần này sếp giao anh viết một đoạn code để cập nhật một logging table... Lông Vịt sớm nhận ra ngay những bảng "liên quan" khi sử dụng bộ quản lý đi kèm *Oracle Enterprise Manager*:

tbl_monthly_log: [time], [user_id], [action_id], [log_data]
tbl_action: [action_id], [action_name], [action_level]
tbl_global_log: [time], [user_id], [action_id], [log_data]

Đại ý là hệ thống này cần theo mọi hành động của từng user trên mỗi tháng. Đến cuối tháng sẽ chọn lựa những hành động "đáng lưu ý" để lưu trữ lại và xóa đi những dữ liệu logging trong tháng (xóa nội dung table tbl_monthly_log). Hiểu vấn đề, Lông Vịt bắt tay vào coding... Dưới đôi tay thon dài như trái chuối, cộng với kỹ năng *gõ phím kô thèm nhìn màn hình* của Lông Vịt, hàng ngàn dòng code tuôn ra trên màn hình... Qủa là *phản xạ kô điều kiện* của Lông Vịt (mà *Sinh Học* gọi nó là "bản năng" còn giới *Coder* gọi nó là "trâu bò" ):

ResultSet rs = dbRequest.ExecuteQuery("select ml.*, a.action_level from tbl_monthly_log as ml, tbl_action as a where ml.action_id = a.action_id");

// Populate result-set to a list of LogRecord
LogRecords records = GetLogRecords(rs);

while (records.HasMoreRecord()) {
    LogRecord record = records.NextRecord();
    if (record.GetActionLevel() >= LOGGING_LEVEL) {
        LPSTR lpzSQL = CreateSQL(
            "insert into tbl_global_log (time, user_id, action_id, log_data) values (%u, %d, %d, %s)", record.GetTime(), record.GetUserId(), record.GetActionId(), record.GetLogData());
        dbRequest.ExecuteUpdate(lpzSQL);
        FreeSQL(lpzSQL);
    }
}
// Clean up...
...

Kô tốn nhiều thời gian để coding và kiểm lỗi, đoạn code anh một lần nữa được đánh giá là "perfect"... Nhưng than ôi, khi chạy trên dữ liệu thật (cỡ vài chục/trăm ngàn records) thì anh mất gần hàng chục phút ngóc mỏ ngồi đợi... Lần này sếp kô tự thân đến xem nữa mà lại sai một thằng SV mới ra trường, kinh nghiệm của nó mà theo anh, chỉ mới bằng ngón út của mình, đến làm công việc gọi là "xem code thử"... Sự tự ái, khinh thường, bối rồi, xấu hổ, ngưỡng mộ dần dần chuyển hóa trên khuôn mặt của anh... Trời, kô biêt thằng quỉ nó làm cái quái gì mà thời gian chạy giảm đi 10 lần là ít... Lông Vịt chỉ còn biêt câm nín, nhìn như trời trồng vào cái màn hình LCD 24 inches... Hix, anh thầm nghĩ *tuổi đời có phải là thước đo cho kinh nghiệm kô* ??...

Saturday, November 11, 2006

(~_~) Brainstorming!!! (~_~)

Hôm qua Lihavim giới thiệu đọc được chuỗi bài trên báo Tuổi Trẻ "Làm thế nào dịch chuyển núi Phú Sĩ?"... hehe, khá hay! Hôm nay hơi rảnh, động não một tí để tăng nếp nhăn trên trán...

Hmm, phải giải hết những bài toán dạng này một cách triệt để bằng Logic Toán học .. Dùng định luật De Moorgan múc luôn .. hehehe...

Sau đây là những câu hỏi:
1. Bạn phải nói một câu, nếu nói đúng thì sẽ bị chặt đầu còn sai thì sẽ bị treo cổ!
2. Bạn đi đến 1 ngã ba, có 2 con đường để đi đến A và B, mỗi con đường có 1 người chỉ đường, một người nói thật và 1 người nói dối, không biết người nào nói thật người nào nói dối và có một điều là họ kô biết nhau. Giờ phải hỏi mỗi người một câu để tìm đường đến A (tổng cộng 2 câu).
3. Bạn đi đến 1 ngã ba, có 2 con đường để đi đến A và B, mỗi con đường có 1 người chỉ đường, một người nói thật và 1 người nói dối, không biết người nào nói thật người nào nói dối. Giờ phải hỏi 1 câu để tìm đường đến A.
4. Có 2 ngôi làng: một làng thì mọi người trong làng luôn nói thật và ngược lại, dân của 2 làng này lại hay qua lại với nhau. Giả sử bạn đang đứng trong 1 làng, giờ bạn hãy hỏi 1 câu với 1 người dân bất kỳ đang ở trong làng đó để xác định đây là làng nói thiệt hay nói dối!
5. Bạn đi đến 1 ngã ba, có 2 con đường để đi đến A và B, có 1 người chỉ đường đứng ở đó, người này có thể là 1 người luôn nói thật hoặc là 1 người luôn nói dối. Giờ phải hỏi 1 câu để tìm đường đến A.

Luật:
- Chỉ được đặt một câu hỏi đúng/sai
- Câu trả lời nếu có cũng chỉ là đúng/sai
Ký hiệu:
!       : NOT logic
&      : AND logic
|      : OR logic
^     : XOR logic
~     : Biến đổi tương đương
=>    : Quan hệ "Suy ra" ~ "IF.. THEN", quên mất thuật ngữ chuyên ngành rồi ...

Động não đi anh em!!!!

Tạm thời giải bài 1 (dễ nhất... hehe)
1. "Tao sẽ bị treo cổ!":

Xem các mệnh đề sau:
- A: câu nói của bạn mang giá trị đúng
- B: bạn sẽ bị treo cổ.
- C: bạn sẽ bị chặt đầu.

Từ đề bài ta có những dữ kiện gì:
a. Nếu nói đúng, bạn sẽ bị chặt đầu: A => C ~ !(A & !C) ~ !A | C
b. Nếu bạn nói sai, bạn sẽ bị treo cổ: !A => B ~ !(!A & !B) ~ A | B
c. Bạn chỉ có thể bị chặt đầu hoặc treo cổ: !(B & C) ~ !B | !C
=> Do đó có luật: Mệnh đề sau phải mang giá trị đúng: S = (!A | C) & (A | B) & (!B | !C)

Để đươc sống sót, chúng ta phải làm sao phá vỡ qui luật đã đưa ra, tức là làm sao để S sai, phát biểu của chúng ta chính là đưa vào hệ thống trên một mệnh đề nữa để làm cho nó bị vỡ ra... hehhee...

Lập bảng chân trị sẽ thấy:
A 1 1 1 1 0 0 0 0
B 1 1 0 0 1 1 0 0
C 1 0 1 0 1 0 1 0
S 0 0 1 0 0 1 0 0

Trích ra "những con đường sống" ...

A 1 0 1 0 1 0
B 1 1 0 0 1 0
C 1 1 0 0 0 1
S 0 0 0 0 0 0

Hehe, xác suất để sống sót rất cao, ngu lắm mới rơi vào 2 trường hợp cái S đúng .. Vậy ta sẽ nói gì?
1. B=1 & C=1: "Tui sẽ bị *Chặt đầu* và *Treo cổ*"
2. B=0 & C=0: "Tui sẽ kô bị *Chặt đầu* và kô bị *Treo cổ*"
3. A=1 & B=1 & C=0: "Tui nói đúng và "Tui sẽ bị *Treo cổ* và Tui kô bị *Chặt đầu*" ~ "Tui sẽ bị *Treo cổ*"
4. A=0 & B=0 & C=1: "Tui nói sai và "Tui kô bị *Treo cổ* và Tui sẽ bị *Chặt đầu*" ~ "Tui kô bị *Chặt đầu*"
5. Kô phải mệnh đề : "Trời hôm nay đẹp quá!.. Nhưng nhớ là đừng có nói: "Invisible giỏi quá!"... Bị chặt đầu liền á ...

Hè hè, làm tiếp cái câu thứ 2, câu này quá đơn giản ...
2. "1 + 1 = 2 phải kô?":

Đơn giản quá, có đến 2 câu, chỉ cần 1 câu đầu để xác định ai giả ai thật (đưa ra một mệnh đề mà mình biết chắc là đúng và chờ câu trả lời), câu sau thì xác định tiếp hướng nào là hướng đi đến A...
1. Hỏi đại một trong 2 người: "Hai con đường này đều đi đến A?" -> Xác định được bé nào là "xạo sự" hay là "thật"...
2. Xác định bé nào là bé nào rồi thì hỏi tiếp xem đường đến A..

3. "Thằng kia sẽ nói đường này là đến A?"...
4. "Đây có phải là làng của anh kô?" - (Mèo Rù)
5. "Anh sẽ trả lời "Đúng" nếu tôi hỏi *Đường này là đường đến A?*?"...

Để gần một tuần rồi, coi như chưa ai giải ra câu 5 trừ bé Bihax (con gái *Chăn Nuôi Trồng Trọt* của BK đó nha!!!) ... Mặc dù câu trả lời này theo Lạc Thuỷ Anh là hông có tính *người*, lộn , ý nói là câu đó nó "Toán" quá... Ừh, đã Toán thì cho Toán luôn ...

"Mày là người nói thiệt" XOR "Đường bên trái là đường đến A" ...

Hmm, hù chút vậy thôi... Invisible thấy 3 câu cuối đều có một một cách giải như nhau, tất cả đều liên quan đến một thằng chuyên nói xạo và một thằng chuyên nói dối, lộn , chuyên nói thiệt... và một vấn đề cần biết...

OK, bây giờ giả sử C là một mệnh đề bất kỳ mình mà mình hỏi với một thằng bất kỳ:
- Gọi f(clause) là kết quả *Thằng nói thiệt trả lời* cho cái *clause*.
- Gọi F(clause) là kết quả *Thằng nói xạo trả lời* cho cái *clause*.
Với f, F là 2 phép biến đổi, coi như là 1 function đi cho dễ hiểu...

Do đó ta có:
1. Nếu clause là P = "Mày là thằng nói thiệt" thì P mang giá trị *Đúng* nếu xuất hiện *trực tiếp* trong f(clause) và P mang giá trị *Sai* nếu nó xuất hiện *trực tiếp* trong F(clause).
2. Nếu clause là *khác* P, giả sử là C. Khi đó:
Hỏi thằng nói thiệt mệnh đề C có đúng hay kô? Nó trả lời: f(C) = C
=> Tức là nó luôn trả lời theo giá trị của mệnh đề C
Hỏi thằng nói xạo mệnh đề C có đúng hay kô? Nó trả lời: F(C) = !C
=> Tức là nó luôn trả lời bằng cách phủ định giá trị của mệnh đề C

Vậy giả sử ta muốn biết một giá trị của *clause* có đúng hay không thì phải làm sao *nếu* ta chưa xác định được ta đang hỏi thằng nào? Chỉ có một cách, đó phải làm sao để cả 2 thằng, luôn *cùng* trả lời *Đúng* hoặc *Sai* cho câu hỏi của mình đưa ra và dĩ nhiên sau đó *phải* xác định được giá trị của  C khi biết câu trả lời. Tức là phải làm một loạt các biến đổi T1, T2... Tn *tương đương* (khó giải thích quá ) *trên* 2 hàm f(clause) và F(clause) sao cho kết quả cuối cùng là *giống nhau* và *xác định được* giá trị mệnh đề cần biết.

Cụ thể, vài biến đổi sau là *equivalent* & *resolvable*:
- T1: f(f(C) == F(F(C)) == C (confirm)
- T2: F(f(C) == f(F(C)) == !C (inverse)
Sử dụng mệnh đề P:
- T3: f(P ^ C) == F(P ^ C) == !C
- T4: f((P & C) | (!P & !C)) == F((P & C) | (!P & !C)) == C (Bihax làm nè, anh tổng quát hóa ..)
... (còn rất nhiều, kô liệt kê ra hết được )

Giải thích T4:
+ P xuất hiện trực tiếp trong f thì P = *Đúng*, do đó VT =  f((*Đúng* & C) | (*Sai* & !C)) = f(C) = C.
+ P xuất hiện trực tiếp trong F thì P = *Sai*, do đó VP = F((*Sai* & C) | (*Đúng* & !C)) = F(!C) = C.

Ghi chú: Bên ngoài cùng của phép biến đổi phải sử dụng một *mệnh đề đơn* của f hoặc F:
- Tức là chỉ f(***) hoặc F(***), với *** là bất cứ thứ gì.
- Và kô được là *mệnh đề ghép*. Ví dụ: "f(***) | f(***)", hoặc "F(***) & F(***) | f(***)"...
Lý do là theo định nghĩa ban đầu: Với một câu hỏi chứa mệnh đề C, f(C) là câu trả lời của *Thằng nói thiệt* và F(C) là câu trả lời của *Thằng nói xạo*, kô thể có trường hợp nó trả lời "ghép" được.

Áp dụng vào từng câu hỏi:
- Câu 3, 5: C = Đường bên phải đến A.
- Câu 4: C = Đây là làng nói thiệt.
(C là mệnh đề ta cần xác định đúng sai)

Okie, giờ ứng dụng các phép biến đổi tương đương ở trên vào câu hỏi:
- Câu 3, 5: T1: Nếu tao hỏi mày "Đường bên phải tới A phải kô" thì mày trả lời là gì?
=> Xem T1: Kết quả nó trả lời là kết quả của mệnh đề C.
- Câu 3: T2: Thằng kia sẽ nói "Đường bên phải tới A"?
=> Xem T2: Kết quả nó trả lời là phủ định mệnh đề C.
- Câu 5: T4: “Anh nói thật và đường bên phải là đuờng tới A” hoặc “Anh nói dối và đường bên phải là đuờng B”?
=> Xem T4: Kết quả trả lời là kết quả của mệnh đề C= "Đường bên phải là đuờng tới A"
- Câu 4: T1: Nếu tao hỏi mày "Đây là làng nói thiệt?" thì mày trả lời là gì?
- Câu 4: T1: Nếu tao hỏi người cùng làng với mày "Đây là làng nói thiệt?" thì nó trả lời là gì?
- Câu 4: T2: Nếu tao hỏi người khác làng với mày "Đây là làng nói thiệt?" thì nó trả lời là gì?

Hê, tại sao Lạc Thuỷ Anh hỏi câu khác mà vẫn trả lời được cho câu hỏi số 4? Đó là vì Mèo Rù đã dùng luật khác và mệnh đề mục tiêu khác, tạm thời chưa nghĩ ra được nó là ra sao... hé hé...

Từ đây nảy sinh ra những câu đố khác:
1. Chỉ hỏi một câu, làm sao biết đươc đó là thằng nói láo hay nói thiệt?...
2. Chỉ cần hỏi một câu, làm sao biết được đường nào là đường đến A và biết luôn được nó là thằng nói thiệt hay nói xạo?
...
Hehehe.. Coi như là bài tập về nhà ...

Hix, blog này khô quá, chỉ dành cho ai đam mê mấy cái nhảm nhí như vậy thôi ... Ai đọc tới đây mà vẫn hiểu thì tự tin lên , có thêm vài nếp nhăn trên bán cầu não rồi đó ...

Wednesday, November 8, 2006

The Best Rock Ballads

Ai có những bài này mà Bit Rate > 128kbps thì cho Invisible nha ...
Chuẩn bị có những bài này:

Alice Cooper - Might As Well Be On Mars
Van Halen - When It's Love
Damn Yankees - Come Again
M.S.G - Walk The Stage

Và thêm một chùm của Aerosmith, Scorpions, Guns n' Roses, Bon Jovi nữa ...


Aerosmith - Dream On4M
George Michael - One More Try5M
Heart - Alone5M
Def Leppard - Women10M
Nelson - Can't Live Without Your Love And Affection4M
Led Zepplin - Stair Way To Heaven6M
Europe - Coast To Coast4M
Roxette - I'm Sorry3M
Poison - I Won't Forget You3M
Motley Crue - Without You 4M
M.S.G - What Happens To Me5M
Heart - What About Love3M
Lillian Axe - The Promised Land4M

Monday, October 30, 2006

Linux Command Line

Source:  http://www.pixelbeat.org/cmdline.html

This is a list of linux commands for common operations.
Note items marked with • are valid/safe to paste without modification into a terminal, so you may want to keep a terminal window open while reading this so you can cut & paste.

Command Description
apropos word Show commands pertinent to word. See also threadsafe
  which command Show full path name of command
  time command See how long a command takes
time cat Start stopwatch. Ctrl-d to stop. See also sw
nice info Run a low priority command (info in this case)
renice 19 -p $$ Make shell (script) low priority. Use for non interactive tasks
look prefix Quickly search (sorted) dictionary
grep --color expr...ion /usr/share/dict/words Highlight occurances of regular expression in dictionary
  gpg -c file Encrypt file
  gpg file.gpg Decrypt file
alias hd='od -Ax -tx1z -v' Handy hexdump. (usage e.g.: • hd /proc/self/cmdline | less)
alias realpath='readlink -f' Canonicalize path. (usage e.g.: • realpath ~/../$USER)
set | grep $USER Search current environment
ls /usr/bin | pr -T9 -W$COLUMNS Print in 9 columns to width of terminal
  touch -c -t 0304050607 file Set file timestamp (YYMMDDhhmm)
dir navigation
cd - Go to previous directory
cd Go to home directory
  (cd dir && command) Go to dir, execute command and return to current dir
pushd . Put current dir on stack so you can popd back to it
CDs
  gzip < /dev/cdrom > cdrom.iso.gz Save copy of data cdrom
  mkisofs -V NAME -r dir | gzip > cdrom.iso.gz Create cdrom image from contents of dir
  mount -o loop cdrom.iso /mnt/dir Mount the cdrom image at /mnt/dir (read only)
  cdrecord -v dev=/dev/cdrom blank=fast Clear a CDRW
  gzip -dc cdrom.iso.gz | cdrecord -v dev=/dev/cdrom - Burn cdrom image (use dev=ATAPI -scanbus to confirm dev)
  cdparanoia -B Rip audio tracks from CD to wav files in current dir
  cdrecord -v dev=/dev/cdrom -audio *.wav Make audio CD from all wavs in current dir (see also cdrdao)
  oggenc --tracknum='track' track.cdda.wav -o 'track.ogg' Make ogg file from wav file
archives
  tar c dir/ | bzip2 > dir.tar.bz2 Make archive of dir/
  bzip2 -dc dir.tar.bz2 | tar x Extract archive (use gzip instead of bzip2 for tar.gz files)
  tar c dir/ | gzip | gpg -c | ssh user@remote 'dd of=dir.tar.gz.gpg' Make encrypted archive of dir/ on remote machine
  find dir/ -name '*.txt' | tar c --files-from=- | bzip2 > dir_txt.tar.bz2 Make archive of subset of dir/ and below
  find dir/ -name '*.txt' | xargs cp -a --target-directory=dir_txt/ --parents Make copy of subset of dir/ and below
  ( tar c /dir/to/copy ) | ( cd /where/to/ && tar x -p ) Copy (with permissions) copy/ dir to /where/to/ dir
  ( cd /dir/to/copy && tar c . ) | ( cd /where/to/ && tar x -p ) Copy (with permissions) contents of copy/ dir to /where/to/
  ( tar c /dir/to/copy ) | ssh -C user@remote 'cd /where/to/ && tar x -p' Copy (with permissions) copy/ dir to remote:/where/to/ dir
  dd bs=1M if=/dev/hda | gzip | ssh user@remote 'dd of=hda.gz' Backup harddisk to remote machine
rsync (Use the --dry-run option for testing)
  rsync -P rsync://rsync.server.com/path/to/file file Only get diffs. Do multiple times for troublesome downloads
  rsync --bwlimit=1000 fromfile tofile Locally copy with rate limit. It's like nice for I/O
  rsync -az -e ssh --delete ~/public_html/ remote.com:'~/public_html' Mirror web site (using compression and encryption)
  rsync -auz -e ssh remote:/dir/ . && rsync -auz -e ssh . remote:/dir/ Synchronize current directory with remote one
file searching
alias l='ls -l --color=auto' quick dir listing
ls -lrt List files by date. See also newest
  find -name '*.[ch]' | xargs grep -E 'expr' Search 'expr' in this dir and below. See also findrepo
  find -type f -print0 | xargs -r0 grep -F 'string' Search all regular files for 'string' in this dir and below
  find -maxdepth 1 -type f | xargs grep -F 'string' Search all regular files for 'string' in this dir
  find -maxdepth 1 -type d | while read dir; do echo $dir; echo cmd2; done Process each item with multiple commands (in while loop)
find -type f ! -perm -444 Find files not readable by all (useful for web site)
find -type d ! -perm -111 Find dirs not accessible by all (useful for web site)
locate -r 'file[^/]*\.txt' Search cached index for names. This re is like glob *file*.txt
networking (Note ifconfig, route, mii-tool, nslookup commands are obsolete)
ip link show List interfaces
  ethtool interface List interface status
  ip link set dev eth0 name wan Rename eth0 to wan
  ip addr add 1.2.3.4/24 brd + dev eth0 Add ip and mask(255.255.255.0)
  ip link set dev interface up Bring interface up (or down)
  ip route add default via 1.2.3.254 Set default gateway to 1.2.3.254
tc qdisc add dev lo root handle 1:0 netem delay 20msec Add 20ms latency to loopback device (for testing)
tc qdisc del dev lo root Remove latency added above
host pixelbeat.org Lookup ip address for name or vice versa
hostname -i Lookup local ip address (equivalent to host `hostname`)
netstat -tupl List internet services on a system
netstat -tup List active connections to/from system
wget (multi purpose download tool)
(cd cmdline && wget -nd -pHEKk http://www.pixelbeat.org/cmdline.html) Store local browsable version of a page to the current dir
  wget -c http://www.example.com/large.file Continue downloading a partially downloaded file
  wget -r -nd -np -l1 -A '*.jpg' http://www.example.com/ Download a set of files to the current directory
  wget ftp://remote/file[1-9].iso/ FTP supports globbing directly
wget -q -O- http://www.pixelbeat.org/timeline.html | grep 'a href' | head Process output directly
  echo 'wget url' | at 01:00 Download url at 1AM to current dir
  wget --limit-rate=20k url Do a low priority download (limit to 20KB/s in this case)
  wget -nv --spider --force-html -i bookmarks.html Check links in a file
  wget --mirror http://www.example.com/ Efficiently update a local copy of a site (handy from cron)
windows (note samba is the package that provides all this windows specific networking support)
smbtree Find windows machines. See also findsmb
  nmblookup -A 1.2.3.4 Find the windows (netbios) name associated with ip address
  smbclient -L windows_box List shares on windows machine or samba server
  mount -t smbfs -o fmask=666,guest //windows_box/share /mnt/share Mount a windows share
  echo 'message' | smbclient -M windows_box Send popup to windows machine (off by default in XP sp2)
math
echo '(1 + sqrt(5))/2' | bc -l Quick math (Calculate φ)
echo 'obase=16; ibase=10; 123' | bc Base conversion (decimal to hexadecimal)
echo $((0x2dec)) Base conversion (hex to dec) ((shell arithmetic expansion))
echo 'pad=20; min=64; (100*10^6)/((pad+min)*8)' | bc More complex (int) e.g. This shows max FastE packet rate
echo 'pad=20; min=64; print (100E6)/((pad+min)*8)' | python Python handles scientific notation
echo 'pad=20; plot [64:1518] (100*10**6)/((pad+x)*8)' | gnuplot -persist Plot FastE packet rate vs packet size
text manipulation (note sed uses stdin and stdout, so if you want to edit files, append newfile)
  sed 's/string1/string2/g' Replace string1 with string2
  sed 's/\(.*\)1/\12/g' Modify anystring1 to anystring2
  sed '/ *#/d; /^ *$/d' Remove comments and blank lines
  sed ':a; /\\$/N; s/\\\n//; ta' Concatenate lines with trailing \
  sed 's/[ \t]*$//' Remove trailing spaces from lines
  sed 's/\([\\`\\"$\\\\]\)/\\\1/g' Escape shell metacharacters active within double quotes
  sed -n '1000p;1000q' Print 1000th line
  sed -n '10,20p;20q' Print lines 10 to 20
  sed -n 's/.*<[tT][iI][tT][lL][eE]>\(.*\)<\/[tT][iI][tT][lL][eE]>.*/\1/p;T;q' Extract title from HTML web page
  sort -t. -k1,1n -k2,2n -k3,3n -k4,4n Sort IPV4 ip addresses
echo 'Test' | tr '[:lower:]' '[:upper:]' Case conversion
tr -dc '[:print:]' < /dev/urandom Filter non printable characters
grep 'processor' /proc/cpuinfo | wc -l Count lines
set operations (Note LANG=C is for speed) (Note also these assume no duplicate lines within a file)
  LANG=C sort file1 file2 | uniq Union of unsorted files
  LANG=C sort file1 file2 | uniq -d Intersection of unsorted files
  LANG=C sort file1 file1 file2 | uniq -u Difference of unsorted files
  LANG=C sort file1 file2 | uniq -u Symmetric Difference of unsorted files
  LANG=C comm file1 file2 | sed 's/^\t*//' Union of sorted files
  LANG=C comm -12 file1 file2 Intersection of sorted files
  LANG=C comm -13 file1 file2 Difference of sorted files
  LANG=C comm -3 file1 file2 | sed 's/^\t*//' Symmetric Difference of sorted files
calendar
cal -3 Display a calendar
cal 9 1752 Display a calendar for a particular month year
date -d fri What date is it this friday. See also day
date --date='25 Dec' +%A What day does xmas fall on, this year
date --date '1970-01-01 UTC 1234567890 seconds' Convert number of seconds since the epoch to a date
TZ=':America/Los_Angeles' date What time is it on West coast of US (use tzselect to find TZ)
  echo "mail -s 'get the train' P@draigBrady.com < /dev/null" | at 17:45 Email reminder
echo "DISPLAY=$DISPLAY xmessage cooker" | at "NOW + 30 minutes" Popup reminder
locales
printf "%'d\n" 1234 Print number with thousands grouping appropriate to locale
echo "I live in `locale territory`" Extract info from locale database
locale | cut -d= -f1 | xargs locale -kc | less List fields in locale database
LANG=en_IE.utf8 locale int_prefix Lookup locale info for specific country. See also ccodes
disk space (See also FSlint)
ls -lSr Show files, biggest last
du -s * | sort -k1,1rn | head Show top disk users in current dir. See also dutop
df -h Show free disk space
df -i Show free inodes
fdisk -l Show disks partitions sizes and types (run as root)
rpm -q -a --qf '%10{SIZE}\t%{NAME}\n' | sort -k1,1n List all packages by installed size (Bytes) on rpm distros
dpkg-query -W -f='${Installed-Size;10}\t${Package}\n' | sort -k1,1n List all packages by installed size (KBytes) on deb distros
dd bs=1 seek=2TB if=/dev/null of=ext3.test Create a large test file (taking no space). See also truncate
monitoring/debugging
strace -c ls >/dev/null Summarise/profile system calls made by command
strace -f -e open ls >/dev/null List system calls made by command
ltrace -f -e getenv ls >/dev/null List library calls made by command
lsof -p $$ List paths that process id has open
lsof ~ List processes that have specified path open
tcpdump not port 22 Show network traffic except ssh. See also tcpdump_not_me
ps -e -o pid,args --forest List processes in a hierarchy
ps -e -o pcpu,cpu,nice,state,cputime,args --sort pcpu | sed '/^ 0.0 /d' List processes by % cpu usage
ps -e -orss=,args= | sort -b -k1,1n | pr -TW$COLUMNS List processes by mem usage. See also ps_mem.py
ps -C firefox-bin -L -o pid,tid,pcpu,state List all threads for a particular process
ps -p 1,2 List info for particular process IDs
last reboot Show system reboot history.
free -m Show amount of (remaining) RAM (-m displays in MB)
watch -n1 'cat /proc/interrupts' Watch changeable data continuously
System information (see also sysinfo)
  hdparm -i /dev/hda Show info about disk hda
  hdparm -tT /dev/hda Do a read speed test on disk hda
  badblocks -s /dev/hda Test for unreadable blocks on disk hda
mount | column -t Show mounted filesystems on the system (and align output)
cat /proc/partitions Show all partitions registered on the system
grep MemTotal /proc/meminfo Show RAM total seen by the system
grep "model name" /proc/cpuinfo Show CPU(s) info
lspci -tv Show PCI info
lsusb -tv Show USB info
recode (Obsoletes iconv, dos2unix, unix2dos)
recode -l | less Show available conversions (aliases on each line)
  recode windows-1252.. file_to_change.txt Windows "ansi" to local charset (auto does CRLF conversion)
  recode utf-8/CRLF.. file_to_change.txt Windows utf8 to local charset
  recode iso-8859-15..utf8 file_to_change.txt Latin9 (western europe) to utf8
  recode ../b64 < file.txt > file.b64 Base64 encode
  recode /qp.. < file.txt > file.qp Quoted printable decode
  recode ..HTML < file.txt > file.html Text to HTML
recode -lf windows-1252 | grep euro Lookup table of characters
echo -n 0x80 | recode latin-9/x1..dump Show what a code represents in latin-9 charmap
echo -n 0x20AC | recode ucs-2/x2..latin-9/x Show latin-9 encoding
echo -n 0x20AC | recode ucs-2/x2..utf-8/x Show utf-8 encoding
interactive
mc Powerful filemanager that can browse rpm, tar, ftp, ssh, ...
screen Virtual terminals with detach capability, ...
links Web browser
gnuplot Interactive/scriptable graphing
octave Matlab like environment

Friday, October 13, 2006

IMShield

Dạo này mỗi khi gửi một cái message tới là bà con reply lại um sùm: "virus?", "phải mày gửi kô?", "có virus kô?", "phát tán virus hả mày?"... Bực mình quá nên Invisible nghiên cứu viết một cái gọi là IMShield, ai chạy cái này lên sẽ kô bao giờ thấy message của Invisible popup ra nữa , do đó sẽ kô cần reply lại ...

Tạm thời chưa có gì hết , nhưng đại loại nó có một số features sau:
1. Nearly perfect anti Buddy-Spy <-- Ai mà chơi Buddy Spy để scan offline/online bạn thì chương trình sẽ hiện ra nick của người đang spy bạn (sướng chưa, nọc nó ra oánh vào mông ), và dĩ nhiên là làm cho thằng Buddy Spy kô biết là bạn đang online ở invisible mode ... Tại sao chỉ "nearly perfect", xem hồi sau sẽ rõ ...
2. Kô cho bung cái cửa sổ Conversation từ những ai mà bạn ghét, ví dụ Invisible ...

Hết ...

Nói nhiều mà chưa làm dễ bị cười chê, nhưng vì lỡ hứa là viết một blog cho bà con spam nên mới post đó ... Dạo này bận quá, kô làm gì đươc! ... Mai mốt làm xong rồi nói tiếp hén...