Kho tháng 7/2009
Thứ sáu, 31 Tháng bảy năm 2009 06:40:29 ICT
#emacs 23.1 up and running. The first editor "server" in the world lolz
Thứ sáu, 31 Tháng bảy năm 2009 06:29:31 ICT
Cài #emacs. Hồi hộp quá. Nó mà không chạy là thê thảm ko kém lúc VirtualBox tòi.
Chủ nhật, 26 Tháng bảy năm 2009 21:53:00 EST
Thập diện mai phục, một góc nhìn
ai mê phim này thì ngừng đọc ngay...
Phim bắt đầu với mô típ lừa tình kiếm cơm. Con bé mù thính tai được nhận định là con gái cựu trùm băng Phóng dao. Hai anh đội trưởng bàn mưu vào hang bắt cọp. Anh X nhận trọng trách đóng vai Mã giám sinh phá ngục cứu người đẹp.
Anh X chứng tỏ mình cũng chả thua kém Casanova, mới một ngày mà em cứ tíu tít "anh là ai hoàng tử hay thằng điên, anh có vợ hay chưa có vợ...". Màn săn đuổi đầu tiên diễn ra tốt đẹp. Nào ngờ đại tướng thấy hay hay, gửi thêm vài đội đến nữa đánh nhau mua vui. Trận đánh diễn ra trong rừng trúc thơ mộng và đầy kịch tính (đoán là đại tướng đang ngồi trực thăng thưởng thức trận này). Băng Phóng dao thấy người mình bị ăn hiếp, tức quá đành... phóng dao. Lính đại tướng bị làm gỏi toàn bộ. Anh X và người đẹp được chào đón huy hoàng.
Lừa người thì người lừa. Nào ngờ người đẹp giả mù như... thiệt, làm anh trai mắt bẫy. Tú bà thật ra là trùm băng phóng dao. Bởi vậy mới thấy nhà nước Việt Nam hết sức chí lí khi không hợp thức hoá mại dâm: như phim chỉ rõ, hầu hết tú bà là trùm các băng nhóm mafia còn người đẹp toàn là cao thủ võ lâm. Tình tiền tù tội toàn từ đây mà ra. Quay lại với băng Phóng dao, cả anh X và Y đều bị bắt. Anh Y được đích thân chủ tướng mần thịt nhưng té ra lại là mần thưởng (một con dao trên lưng), đá đít quay về làm tay trong tiếp. Giờ mới lộ mặt anh Y cố tình gài anh X với người yêu mình theo lời chủ tướng. Ai cũng biết lửa gần rơm lâu ngày cũng cháy. Nào ngờ nó cháy... lẹ quá. Anh Y nước mắt rưng rưng nhìn người yêu rồi quay mặt bỏ đi "tau thân trâu ngựa cày ba năm vì mày, mày có ba ngày đã theo giai".
Người yêu bé nhỏ nhận mệnh lệnh sét đánh, phải thủ tiêu anh X đẹp trai. Màn "thủ tiêu" diễn ra trên đồi thơ mộng, xa xa rừng cây lá đổi màu, gió thổi hiu hiu. Hai người tranh thủ "thủ tiêu" nhau, xong nằm thở. Anh X ca bài "em ơi nếu mộng không thành thì sao", em nhỏ thủ thỉ "it's my business". Anh trai giận quá phóng ngựa bỏ đi luôn. Em nhỏ sau một hồi ngẫm nghĩ, thấy không có cách nào qua mặt chủ tướng an toàn, thôi thì ba sáu kế tẩu vi là thượng sách. Em cũng lên ngựa phóng theo anh trai.
Nào ngờ anh Y núp trong rừng, theo dõi từng tình tiết không sót tí gì. Lòng đau như cắt, giờ nhìn người yêu chạy theo trai, cầm lòng không đặng, tặng hai con dao làm quà cưới. Một dao đâm thẳng vào tim em, như một lời nhắn nho nhỏ "tim ải tim ai". Bài học rút ra là đừng có giỡn với mấy thằng thất tình. Khi yêu (hụt) chúng nó như chó dại, nửa dại nửa ngu. Anh Y răm rắp phương châm không ăn được thì đem đổ. Có cơm thừa canh nguội cũng không để thằng khác măm măm.
Anh X chờ mãi không thấy em chạy theo, biết trình độ lừa tình của mình còn kém, đành phóng ngựa quay lại năn nỉ. Chạy giữa đường thấy áo xanh phất phới, lại gần thấy em được tặng dao.
Thế giới này bốn chín phần trăm chết vì tiền, năm mươi phần trăm chết vì tình. Một phần trăm còn lại chết vì tai nạn giao thông. Hai anh điên lồng lộng khi người yêu nằm đó mà không thèm ngó mặt thằng nào, xông vào chém nhau như chém củi. Máu văng ì xèo. Cảnh tượng hùng tráng không khác gì một game Street Fighter. Đánh nhau ba ngày ba đêm, tuyết rơi trắng đồng. Em nhỏ lạnh quá tỉnh dậy, thấy người yêu mình bị chém nhiều hơn, bèn lên tiếng bảo vệ người yêu. Anh Y thấy ánh mắt em dao động, tưởng em nói giỡn chớ không dám làm thiệt, vẫy tay giả bộ quăng dao.
Đúng ra em cũng không định làm thiệt, nhưng anh ấy vung tay nhanh quá, em giật mình, theo bản năng rút dao khỏi ngực phóng đi. Máu em phun như suối chảy. Em ngất đi vì thiếu máu. Anh X vội vàng chạy tới ôm hun cú chót. Anh Y nhìn cảnh này, nản quá lủi thủi bỏ đi.
Phim đến đây là hết, vì lạnh quá, diễn viên không chịu đóng nữa. (Bài học: đừng viết kịch bản với bối cảnh là mùa đông.) Công nhận mình có khiếu bôi bác dễ sợ.
Cập nhật 3 lần. Lần cuối: Thu Aug 25 14:40:58+0003 2022
Thứ năm, 23 Tháng bảy năm 2009 08:46:13 ICT
http://ur1.ca/7scz "No reports as yet on dropping temperatures in hell." lolz
Thứ tư, 22 Tháng bảy năm 2009 16:12:15 ICT
Bệnh cũ. Ý tưởng vnfoss toàn to như núi, làm trong hơn hai tháng. Mentor còn chạy nữa là..
Thứ tư, 22 Tháng bảy năm 2009 15:47:56 ICT
Ì sống được mười ngày không cần sạc (và cũng miễn phục vụ)
Thứ hai, 20 Tháng bảy năm 2009 22:21:16 ICT
you know you are lisp-converted when you start to type (version... naturally without thinking despite the command requires version(...
Thứ bảy, 11 Tháng bảy năm 2009 19:39:18 EST
Ngày tháng năm... Melbourne chìm trong biển gió...
Sáng cuối tuần nằm thiu thiu. Nghe ầm ì, ù ù, tự hỏi không biết tiếng xe hay tiếng gió. Ra ngoài mới biết gió chứ chẳng phải xe. Gió tát vào mặt. Gió đập sau lưng. Gió vây quanh. Đâu đâu cũng gió. Gió thổi miệt mài, đê mê. Mê gió Melbourne mất rồi (với điều kiện không được thổi khi nhiệt độ dưới 10 hoặc trên 30).
Khổ! Thân già phải lặn lội đường xa từ bắc sang đông Melbourne chỉ vì cục pin (Trung Quốc!) cho Ì. Ghé vào hiệu sách. Mua sách là một thú vui tiêu tiền. Chọn cuốn sách thích mắt. Ném một mớ tiền. Sách hay? Tuyệt! Sách nhảm? Vứt!
Năm tháng ngày... gió thổi khô biển mất rồi. Tìm lại bình yên trong tê tái.
Ghé vào Yoyogi làm bát cơm thịt bò. Tính ra ở Melbourne cũng chả ăn mấy quán. Ngay ở Yoyogi cũng quanh đi quẩn lại vài ba món. Toàn sống theo nếp. Ăn chọn quán quen. Mặc toàn đồ cũ. Như Ì giờ có thằng nào ra giá 200 đô cũng không bán (dù nếu nó điên điên trả 1000 thì dám mình cũng điên điên bán tuốt).
Thèm miso soup như thèm bia. Lạ! Mấy thứ ngon ngọt chẳng ưa, toàn chọn mấy thứ gì đâu. Lại đâm đầu vào dịch. Lại ngứa vspell. Lại gãi gãi em Chân dài. Sức người có hạn mà lòng người vô đáy. Ông trời đúng là thích đùa. Chơi tiếp trò đùa của ông trời. Chừng nào hết cuộc chơi...
Cập nhật 3 lần. Lần cuối: Thu Sep 01 17:38:24+0003 2022
Thứ bảy, 11 Tháng bảy năm 2009 19:58:18 ICT
@tinhtruong:hơ, hế lô! Dân ArchLinux à? Tui "phe" Gentoo :-)
Thứ bảy, 11 Tháng bảy năm 2009 19:55:45 ICT
Sau phẫu thuật, tình trạng của Ì khá ổn định, đang hồi phục. Ì cần được theo dõi trong tuần tới, xem pin của Ì xài được bao lâu.
Thứ bảy, 11 Tháng bảy năm 2009 09:21:40 ICT
hôm nay nhận được spam "anh con nho em khong". Hmm.. spam VN tiến bộ đáng kể!
Thứ năm, 09 Tháng bảy năm 2009 18:40:35 EST
Đóng chai tương lai
Họ nhà Liễu có một khái niệm, có thể gọi là dị giáo, theo cách nhìn của các ngôn ngữ lập trình truyền thống: continuation. Continuation hoạt động như một cỗ máy thời gian, cho phép ta quay ngược về quá khứ, làm lại và thay đổi quá khứ để có một tương lai khác (tươi sáng hơn, nghe y như tiểu thuyết). Hầu hết các ngôn ngữ truyền thống lại ngầm định chạy theo trình tự thời gian, chuyện gì đã qua thì cho nó qua, không có níu kéo.
Theo đúng sách vở thì continuation được định nghĩa (và dịch ra tiếng Việt) như sau:
(call/cc proc)
"proc" là hàm một đối số. call/cc sẽ đóng gói continuation hiện tại (nói nôm na là "thời điểm hiện tại") thành "hàm thoát" và chuyển cho proc. Hàm thoát là một hàm Scheme mà khi được gọi sẽ ngưng continuation hiện thời và dùng continuation ở thời điểm hàm thoát được tạo ra (người bình thường hiểu là lên máy thời gian và quay về thời điểm tạo hàm thoát).
Lấy ví dụ đơn giản đầu tiên:
(call/cc (lambda (x) (print "hi\n")))
Khi chạy lệnh trên, thế giới vẫn bình an. Dòng chữ "hi" nhấp nháy trên
màn hình. Continuation "x" được lưu nhưng chưa dùng nên thế giới vẫn
quay đều. Thực chất lệnh trên tương đương với (print "hi\n")
hoặc
printf("hi\n");
trong C.
Lấy ví dụ phức tạp hơn tí từ "sách vở"
(call/cc
(lambda (exit)
(for-each (lambda (x)
(if (negative? x)
(exit x)))
'(54 0 37 -3 245 19))
#t))
Đoạn code trên tương ứng với C thế này:
luu_thoi_gian(exit);
for (i = 0;i < 6;i++)
if (a[i] < 0)
quay_nguoc_thoi_gian(exit, a[i]);
return TRUE;
het_luu_thoi_gian();
Khi chạy tới khi i
là 3 (a[i]
là -3) thì ma thuật xuất hiện, ta
quay về thời điểm trước khi ta nhảy vào vòng lặp for
. Đoạn code giữa
luu_thoi_gian()
và quay_nguoc_thoi_gian()
biến mất. Đồng thời ta
được mang theo cùng ta về quá khứ a[i]
, đang là -3
. Lúc đó đoạn
code sẽ thành:
return -3;
và chạy tiếp như thể for
chưa từng xảy ra! Dĩ nhiên nhiều pháp sư C
sẽ nhảy vô bảo "ớ cái đó dễ ợt, thế thẳng return a[i]
và ngay chỗ
quay_nguoc_thoi_gian()
là xong". Ừ thì xong thật. Nhưng không có ma
thuật (nói cách khác, ừ trường hợp này dễ mà). Chẹp, đúng ra với
Scheme thì không dễ đến thế vì Scheme:
- không có cấu trúc lặp
- không có
goto
Hãy thử một ví dụ dã man hơn:
(define (spawn prog)
(call/cc
(lambda (start)
(let* ((resume #f)
(suspend (lambda ()
(call/cc
(lambda (k)
(set! resume (lambda () (k #f)))
(start resume))))))
(prog suspend)))))
;; When resume is called, it continues the second continuation,
;; which actually make suspend an empty lambda, then call prog
;; again.
(define resume
(spawn (lambda (suspend)
(print "blah\n")
(suspend)
(print "bluh\n")
(suspend)
(print "bleh\n"))))
(resume)
(resume)
(resume)
Ví dụ này khó mà biểu diễn bằng C được, đại loại là có một hàm như sau:
void func()
{
printf("blah\n");
suspend();
printf("bluh\n");
suspend();
printf("bleh\n");
}
func(); // in ra blah xong thoát
func(); // in ra bluh xong thoát
func(); // in ra bleh xong thoát
Hết hồn chưa. Khi lần đầu tiên chạy để định nghĩa biến toàn cục
resume
, spawn
chạy rất "bình thường" và
- lưu continuation lần một vào biến
start
- lưu một hàm vô danh vào biến
suspend
- đặt biến
resume
là#f
- gọi
prog
với tham số là hàmsuspend
- hàm này in "blah" rồi gọi
suspend
ở trên, và suspend... - lưu continuation lần hai vào biến
k
(lưu ý đây là thời điểm prog vừa mới thực hiện xong lệnh in đầu tiên - tạo một hàm vô danh để gọi
k
với tham số#f
, lưu vào biếnresume
- quay về thời điểm tạo biến
start
, thay vào đó giá trị là resume.
Đến lúc này, chúng ta quay ngược về thời điểm spawn được gọi:
(define (spawn prog)
resume) # <-- call/cc mất tiêu
(define resume (spawn (lambda (suspend) ...) # <-- gọi spawn từ chỗ này
Do toàn bộ mã của call/cc
lần đầu biến mất, biến toàn cục resume
sẽ
nhận được hàm lưu trong bước 7. Nói đúng hơn không phải hàm mà là
closure. Hàm này chứa luôn continuation ở thời điểm suspend được gọi
lần đầu tiên.
Giờ chạy (resume)
lần một. resume
gọi continuation k
đã nói ở
trên, quay lại thời điểm "hồi xưa", chính là "khoảnh khắc" ở lần
suspend đầu tiên:
(define (spawn prog)
(call/cc
(lambda (start)
(let* ((resume #f)
(suspend (lambda ()
#f))) # <--- continuation biến mất, chạy tiếp prog
(prog suspend)))))
(define resume
(spawn (lambda (suspend)
(print "blah\n")
(suspend) # <--- hồi này dừng chỗ này, giờ chạy tiếp
(print "bluh\n")
(suspend)
(print "bleh\n"))))
Vậy là "prog" lại tênh tênh chạy qua lệnh in thứ hai, "bluh" rồi lại gọi suspend. Suspend lại tiếp tục lưu thời điểm ngay sau "bluh" và trả về resume mới...
Ba lệnh resume ở trên là để gõ ở REPL(Read-Evaluate-Print loop). Thực
chất là do suspend luôn quay về thời điểm ngay chỗ định nghĩa resume
toàn cục, nên lệnh (resume)
thứ nhất te te chạy xong lại quay về
"(define resume...
. Lệnh (resume)
thứ hai và thứ ba không bao giờ
bị đụng đến nếu chạy không thông qua REPL.
Python có khái niệm generator cũng khá giống thế này, nhưng đơn giản hơn. Chu cha ơi cái đầu của tui...
Cập nhật 2 lần. Lần cuối: Tue Aug 08 11:22:15+0011 2017
Thứ tư, 08 Tháng bảy năm 2009 14:09:33 ICT
downgraded #virtualbox and broke both my gentoo and my windows host, hic
Chủ nhật, 05 Tháng bảy năm 2009 19:53:53 EST
Cái gì mềm mềm cũng sướng
Kết luận rút ra sau khi đọc (một phần) bí kíp "The VLSI Handbook (2nd edition)" nhằm chuẩn bị nội công luộc Lisp machine. Chỉ dám đọc một số chương ở phần năm, Logic Circuits, và phần tám, Microprocessors and ASIC. Đọc đến chương 67, Logic Synthesis for Field Programmable Gate Array (FPGA) Technology, thì tay chân run lẩy bẩy, nước miếng nhiễu ướt bàn phím, không đọc tiếp được nữa.
Chừng nào chùi sạch bọt mép, mắt sáng trở lại và không còn co giật thì sẽ viết tiếp về "cái gì cứng cứng đều chán". Ôi... yêu mềm làm sao!
Cập nhật 2 lần. Lần cuối: Tue Aug 08 11:22:15+0011 2017
Thứ bảy, 04 Tháng bảy năm 2009 18:17:37 EST
Cong cong.. trong cửa sổ.. có một đường.. cong cong
Cuối cùng cũng đọc xong SICP. Mười mấy năm trước bước chân vào lập trình bằng cuốn "Pascal cho mọi người". Mười mấy năm sau, bước ra, lắc đầu mấy cái cho sạch bụi, rồi vô lại với SICP. Cũng may chưa có noi gương bao thế hệ đọc SICP, viết luôn interpreter và compiler bằng Lisp (mèn, biết đâu bữa nào rảnh quá, viết thiệt!)
Chưa thấy cuốn sách "tin học căn bản" nào mà dạy người đọc viết trình biên dịch, mô phỏng máy ảo và lập trình logic cả. "Tin học căn bản" ở MIT có khác. SICP hay, vui, hấp dẫn (cái gì có cong cong là hấp dẫn rồi). Hông hiểu sao mà MIT lại cương quyết chia tay SICP/Scheme để đón Python. Đồ... trăn! (Bảo đảm có thằng nhột)
Lịch sử LISP có chút gì đó giống giống UNIX (nhân kỉ niệm 40 năm UNIX). Cùng một (mớ) nguyên tắc cơ bản. Nhìn xa xa ai cũng lẹp lẹp như ai. Nhưng lại khác nhau quá là khác. Nếu như UNIX chia ra làm hai họ lớn là BSD và... cái gì nhỉ? Bell Labs? Thì LISP cũng gồm hai họ là Common Lisp và Scheme. Ngay cả hai phiên bản LISP của cùng một họ cũng ít nhiều khác nhau.
Quay lại SICP. Chưa thấy cuốn sách nào mà chú thích cuối trang (footnote) dài như SICP. Một cái chú thích có thể tốn nhẹ nhàng một phần ba trang. Ai bảo "nhà khoa học máy tính" khô khan? Một trong những khái niệm được sáng tác ra là "broken heart". Cũng chưa thấy ai nhảm nhí như mấy thằng mần LISP. "Thunk" ban đầu có ý nghĩa như là quá khứ của "think". Có một cái chú thích khá hay:
It's remarkable how much energy in the standardization of Lisp dialects has been dissipated in arguments that are literally over nothing: Should
nil
be an ordinary name? Should the value ofnil
be a symbol? Should it be a list? Should it be a pair? In Scheme,nil
is an ordinary name, which we use in this section as a variable whose value is the end-of-list marker (just astrue
is an ordinary variable that has a true value). Other dialects of Lisp, including Common Lisp, treatnil
as a special symbol...
SICP bắt đầu trở nên "xấu xa" từ mục 3.1.1 khi giới thiệu set!
. Thế
giới này hoàn hảo biết bao nhiêu (trong con mắt của "functional
programming") nếu không có set!
, hay nói bình dân hơn là phép gán,
là thay đổi giá trị. Nếu vạn vật là bất biến ta có thể.. tái sử dụng
lại được một cách an toàn. Từ ngày hủ da-ua để ba ngày là hư, ta không
thể muốn ăn da-ua lúc nào cũng được. Phép gán đưa khái niệm thời gian
vào mô hình máy tính, bao gồm hai khái niệm nổi tiếng (và cũng hết sức
kinh dị, tui gặp rồi) là race condition và deadlock. Có một câu khá
hay trên tường Cambridge: Time is a device that was invented to keep
everything from happening at once. Trích dẫn tiếp:
... it is ironic that introductory programming is most often taught in a highly imperactive style. This may be a vestige of a belief, common throughout the 1960s and 1970s, that programs that call procedures must inherently be less efficient than programs that perform assignments. (Steele (1977) debunks this argument.) Alternatively it may reflect a view that step-by-step assignment is easier for beginners to visualize than procedure call. Whatever the reason, it often saddles beginning programmers with "should I set this variable before or after that one" concerns that can complicate programming and obscure the important ideas.
MIT bây giờ lại "ironic" vì chuyển qua Python. Gì thì gì. Máy tính là xấu xa (không thay đổi giá trị một ô nhớ được thì mần sao?), dạy người mới điều xấu xa là chính đáng. Câu kết cuối cùng của mục 3.4 góp phần khuyến khích MIT chuyển sang Python:
The complexities we encounter in dealing with time and state in our computational models may in fact mirror a fundamental complexity of the physical universe.
Trích dẫn cuối cùng nhằm kết tranh luận về functional programming và imperative programming:
The object model approximates the world by dividing it into separate pieces. The functional model does not modularize along object boundaries. The object model is useful when unshared state of the "objects" is much larger than the state that they share. An example of a place where the object viewpoint fails is quantum mechanics, when thinking of things as individual particles leads to paradoxes and confusions. Unifying the object view with the functional view may have little to do with programming, but rather with fundamental epistemological issues.
Bàn về LISP không thể nào không nói đến LISP machine. Có lẽ trước Java chỉ có LISP là ngôn ngữ ồn ào nhất trong việc tạo CPU cho riêng mình. Đang coi. Coi xong viết tiếp...
Cập nhật 2 lần. Lần cuối: Tue Aug 08 11:22:15+0011 2017