Invisible là một nghệ sĩ!!!

21 01 2008

Mẫu câu “XXX là một nghệ thuật mà YYY là một nghệ sĩ” được sử dụng khá rộng rãi trong nhiều lĩnh vực, riêng về lĩnh vực “coding” thì tạm thời có một câu “Coding là một nghệ thuật mà coder là một nghệ sĩ”… Và thật đáng tiếc, Invisible đã tự phong cho mình là nghệ sĩ khá lâu rồi!

Hôm nay, mặc dù vẫn quanh quẩn bên sự nghiệp coding, nhưng lại khác… Cho nên, hãy quên đi việc Invisible là nghệ sĩ, cho đến khi đọc hết blog này…

Là coder, một khi đã đeo đuổi sự nghiệp coding, dòng máu nghệ sĩ sẽ theo đó mà len lỏi vào mọi ngõ ngách của mỗi dòng code viết ra… Lúc này, việc đặt tên cho các identifier (project, class, method, variable…) sao cho “nghệ thuật” cũng làm đau đầu các “nghệ sĩ”… Với hiểu biết nông cạn của Invisible, blog này chỉ tập trung vào những từ viết tắt liên quan đến máy tính… Mà cũng ko phải, Invisible chỉ liệt kê ra đây một vài quy tắc đặt tên mà bản thân tâm đắc nhất…

1. Bạn biết bao nhiêu từ viết tắt có 3 ký tự? Có ai kô biết CPU? Ai không biết DVD? Ai biết EOF?… Với geek/nerd thì họ có thể liệt kê hàng chục ngàn từ, nhưng nếu ai dạng cùi cùi như Invisible thì khoảng vài chục từ là chấp nhận được rồi… Do đó, kể ra đây thì khá nhiều, nhưng bà con mình ít nhất phải biết TLA là gì! TLA là gì? Là “Three Letter Acronym”… TLA là ví dụ của chính định nghĩa của hắn!

2. Bạn có biết kỹ thuật qui nạp trong toán học kô? Bạn biết đệ qui hông? Qui tắc độc đáo thứ 2 chính là dùng kỹ thuật đó… Số lượng này ko nhiều, nhưng nếu là mê máy tính cỡ Invisible, phải biết ít nhất một số đứa nổi tiếng:

  • GNU ~ GNU is Not Unix ~ Ah, nó muốn nhấn mạnh: GNU is Not Unix, is Not Unix, is Not Unix…
  • WINE ~ Wine Is Not an Emulator ~ Ngày xưa nó thật sự là một emulator (WINdow Emulator), theo dòng thời gian, với những tính năng mới, nó đã vượt ra ngoài một Emulator, và bố cáo thiên hạ là: Tao hông phải là một emulator thôi đâu!!
  • LAME ~ LAME Ain’t an MP3 Encoder ~ LAME đơn giản muốn khoe ngoài là một “MP3 Encoder”, hắn có thể làm hơn vậy nữa!!
  • RPM ~ RPM Package Manager ~ Àh, nó được xem như là “Redhat Package Manager”, nhưng khi distro nào cũng có thể sử dụng nó, cho nên nó trở thành một “Package Manager” và đệ qui chính bản thân nó…

3. Qui tắc còn lại mà Invisible cũng tâm đắc, đó là tiếp đầu ngữ “Yet Another”! Nổi bật trong đám này là YACC ~ Yet Another Compiler Compiler (vì hầu như bé nào luyện môn Compiler đều biết), nhưng bạn có biết tên của công ty Yahoo kô phải là một từ đơn ko? Uhm, nó là Yet Another Hierarchical Officious Oracle…

Đến đây, nếu ai đó phát biểu “Đặt tên là một nghệ thuật mà người đặt tên là một nghệ sĩ” thì hiển nhiên Invisible lại tự phong mình là một nghệ sĩ như trong tiêu đề entry này cũng không ngoa!





SongToast-1.0.0 – A General Purpose Winamp plugin

4 12 2007

Cuối cùng cũng xong cái Winamp plugin đầu tay.. Hix, lâu ngày hông code “C lọng cọng”, giờ lọng cọng luôn rồi, code/copy/paste thì nhanh mà để chạy được thì lâu

Khi đang viết blog này thì thằng “Unknown” ở đâu nhảy dzô phỏng vấn:

Unknown: Viết SongToast làm chi vậy cha?
Invisible: Thường ngày, khi “cha” ngồi code, “cha” thường bật Winamp (my favourite media player) lên, vừa rung đùi, rung tai… và code…
Unknown: Vậy thì sao?
Invisible: Thì phải thu nhỏ cái cửa sổ Winamp, maximize cái của sổ Eclipse, cho nên nghe nó hát chí chóe mà đâu có biết bài đang hát tên gì, đứa nào hát đâu!
Unknown: Ặc, đúng là Invisible!
Invisible: Ừa, bởi vậy, kỳ này nghe bài nào, liếc xuống cái cửa sổ gần systray là biết ngay liền…
Unknown: Ặc, reinvent the wheel! Sao hông nghía cái Toaster này đi http://www.myplugins.info/toaster.htm … Nó chắc chắn ghê gớm hơn cái của cha 1000 lần!
Invisible: Ặc, ai biết đâu, cứ tưởng kô có thằng nào nghĩ ra được ý tưởng này… Mà khi code gần xong, google một số thứ thì mới biết nó ấy chứ!…
Unknown: Ặc, ngu quá! Vậy giờ có viết ra cũng có ai thèm xài đâu?
Invisible: Ặc, cái của mình làm được một số thứ mà cái Toaster kia cóc làm được đó cưng!
Unknown: Hehe…
Invisible: Cái thứ nhất là do “cha” mày lưu settings vào registry cho nên hông bị lỗi unicode như thằng kia, cái thứ 2 là SongToast có thể update Yahoo status của mày nữa!
Unknown: Ặc! Sao khi nào cha cũng mê Yahoo Messenger vậy? Thấy cái gì khoe cũng dính đến “Yahoo”, nào là Yahoo Plugin, Yahoo IMShield, giờ thì là Yahoo Status…
Invisible: Kệ cha con ơi! Mai mốt cha mày mở công ty hoạt động về lĩnh vực Instant Messenger đó. Chờ đi!…
Unknown: Ừh chờ, chờ cho đến kiếp sau, chờ mãi thôi, wờ wớ wớ…
Invisible: :”>

Mặc cho nhân gian chê cười, Invisible vẫn release SongToast version 1.0.0…

INSTALLATION GUIDE

Bước 1: Download
- Song Toast [Coder Version]: Dùng MFC in shared libraries (need MFC71.dll and MSVCR71.dll).
SHA1 Checksum: 9267e41eeb314431a24481b7f9a0f5b0a6378c81
- Song Toast [General User Version]: Static linking, kô cần MFC library. <- Nếu hông biết download đứa nào trong 2 đứa thì click dzô đây!
SHA1 Checksum: d9d4eca34e22b090c4482749ca120883b2bc2310

Bước 2: Extract & copy “gen_SongToast.dll” vào thư mục “C:\Program Files\Winamp\Plugins\”.

Bước 3: Restart Winamp.

Với tinh thần “share for all, all will share!”, Invisible hiến dâng source code luôn!





Lông Vịt – The most stupid coder ever [3]

19 03 2007

Hôm nay Lông Vịt dậy thật sớm… hơn bình thường một chút… Việc đầu tiên là anh power-on cái PC, double-click vào cái Total Commander, browse đến folder chứa nhạc, click chọn 2 bài “Games People Play” và “Garden of Black Roses” rồi fire-up cái Winamp… Trong điệu nhạc xập xình, anh đứng đó nhún nhảy như một thằng điên… Chà, tập thể dục buổi sáng đem lại cho anh một cảm giác thật sảng khoái… Ước gì ngày nào trong tuần anh cũng được cảm giác đó nhỉ?… Nhưng có lẽ cảm giác đó sẽ kô kéo dài lâu, bởi anh và nhóm của anh đang bị khách hàng coi “như con”…

Hmm, cũng xin giới thiệu một chút về nhóm anh và dự án anh đang làm… Nói chung cũng do thời cuộc đẩy đưa mà Lông Vịt trôi dạt đến bộ phận phát triển Web của công ty “FCG-S“… Í, khoan, đây không phải là một chi nhánh công ty FCG (hồi xưa là PSV), mà đó là tên viết tắt của “Fast-Cheap-Good Software”… Ờ, department của anh, nếu trừ anh ra thì còn lại khoảng “nửa” người, lý do ông đại ca của anh cũng là manager của một dự án khác… Với nguồn nhân lực dồi dào như vậy cho nên anh nghiễm nhiên trở thành *designer – coder – tester – teamleader – analyzer – architector…*, nói một cách gọn gàng là *all-in-one-developer*. Với thành công của dự án “Web 2.0” hôm trước (sếp đã khen anh, chính xác là: “Giỏi! Code của mày rất scalable!”), anh vững bước với một dự án Web khác, lần ngày lại viết bằng ASP, đây là một hệ thống E-Commercial chuyên về mọi lĩnh vực kinh doanh buôn bán (nó đây nè)…

Với khả năng designing/coding nhuần nhuyễn, cộng thêm khả năng search-copy & paste, anh đã hoàn thành rất nhanh phần web-ui, business-logic và storage… Nói kô ngoa, một tuần là anh code xong, một tuần nữa để test và fix bug, thêm 1 ngày để package & release… Ấy vậy mà sau khi deploy trên cái dedicate server của thằng khách hàng, chạy khoảng 1 tuần thì nó dở chứng gì kô biết, khách hàng chửi sếp anh như con, sếp anh chửi anh như thú, anh thì tự dày vò mình như giặt quần áo… Dĩ nhiên sau đó Lông Vịt được cử ngay lên “hiện trường” để tìm hiểu, và đập vào mắt anh là số khách hàng đăng ký trong trang đó lên đến hơn 1.000.000 mà account ai cũng có tên đại loại “bà_mày_#######“, “instcode_#######“… (# là chữ số..)… Hmm, sao lạ vậy ta? Anh nhớ là anh đã chống DoS ở phần đăng ký thành viên bằng cách kiểm tra Security Code (Verification code) rồi mà ta? Và anh kiểm tra cái register form:


(Bà con nhà mình có thể vào xem trực tiếp cái form tại: http://www.gso-media.com/home/register.asp)

Ờ, bình thường mà? Có gì lạ đâu? Sao mà flooding phần register user được?… Vô lý… Thường Kiệt!… Lý nào lại vậy?… Vô lý hết sức!… Bình thường mà? Chẳng thấy gì lạ…

P/S: Cáo lỗi những coders nào đã code cho trang gso-media đó! Hehe, cái này nhảm nhí cho vui thôi mà… Bà con nhà mình cũng biết chọn lọc phần thông nào là của Invisible-Lông Vịt, phần nào là Gso-media-Lông Vịt nha!…





Lông Vịt – The most stupid coder ever [2]

13 02 2007

Chào những người bạn! Người ta vẫn nói “coding là một nghệ thuật mà trong đó coder là nghệ sĩ”, bạn bao giờ tự hỏi mình đã là nghệ sĩ hay chưa? Hmm, tại sao phải quan tâm đến khía cạnh “nghệ thuật” và “nghệ sĩ” trong khi về bản chất, coders chỉ là những con người thành thạo một ngôn ngữ để nói chuyện với máy tính nào đó?…

Đúng vậy, đó là suy nghĩ của một coder, mà nói kô ngoa, là một trong những người chung thế hệ với những người khai hoang cho nền tin học nước nhà: Lông Vịt. Các bạn hẳn chưa quên những ngây ngô ngớ ngẩn ngu ngốc của anh trong “Lông Vịt – The most stupid coder ever…” thì hôm nay, anh lại xuất hiện bên cạnh những dòng code rồng bay phượng múa… Dzô!!!

An alternating way to reverse the sign:

Ngày xưa, khi anh còn là SV, trong khi mọi người đua nhau học VB, PHP, Java, C#… thì anh vẫn lui cui gõ từng dòng code C đen, rồi đến C++, VC++… Đúng vậy, anh khinh, anh khinh những ngôn ngữ mà phải cần một cái thằng thứ ba để thông dịch những dòng code của anh cho máy tính hiểu… Những cái thằng thông dịch đó kô thể nào đem lại cho anh cái mà anh cần: Performance… Vậy mà trời xui đất khiến làm sao, đến khi làm LV, rồi đến khi đi làm, anh lại phải cặm cụi chăm chút từng dòng code Java do anh gõ ra… Anh khinh, anh khinh những đống code được viết ra bởi cái ngôn ngữ lai căng giữa Object Oriented & Functional Programming của C++ (OOP & FP)… Ừh, “Java vô địch!”…

Ah , anh chợt nảy ra một ý tưởng mà anh nghĩ là “useful” cho những ai muốn *đổi dấu của một số cho trước*, ví dụ “1000″ sau khi đổi là “-1000″, “-1000″ -> “1000″… Vậy là anh gõ ngay vào Eclipse:

// Reverse the sign of the given number
public static long reverseSign(long n) {
     String sNumber = String.valueOf(n);
     long val;

     if (sNumber.charAt(0) == '-') {
          val = Long.parseLong(sNumber.substring(1));
     }
     else {
          val = Long.parseLong('-' + sNumber);
     }
     return val;
}

Hì, đúng là những dòng code thật là *nghệ thuật* do *nghệ sĩ* gõ ra! Cách đặt tên biến theo “Hungarian” coding standard anh vẫn mang theo kể từ khi anh tạm biệt thế giới Win32/MFC, cái cách dùng modifier “public static” càng cho thấy FP vẫn còn đeo đuổi anh, cái cách đặt vị trí những biến ngay đầu khối như nhắc nhở người ta “code của tui là compatible với Ansi-C”, cách dùng các dấu ‘{‘ & ‘}’ thật chuẩn mực như Code Complete đã nói… Nhưng anh ơi!… Anh sao mà… *lông vịt* quá đi!!!…

The power of Web 2.0:

Bây giờ bỏ qua những sung sướng sau khi đọc đoạn phía trên… Vậy có bao giờ bạn nhận được những lời *cảm thán* của đồng nghiệp như vậy chưa: “Trời ơi, mày code ghẻ quá!…”, “Đúng là lông vịt!”… Ừh, có lẽ sau hôm nay, nhưng riêng với Lông Vịt thì phải nói là “rất thường xuyên”… Ấy, khoan vội chê Lông Vịt “ghẻ”! Nếu nói một cách ngắn gọn, mọi nền tảng lý thuyết Lông Vịt đều nắm trong lòng bàn tay (chỉ có cái chưa lưu vào những nếp nhăn của đống bã đậu trên đầu, hehe)… Khi nhắc đến “Software Engineering” anh nghĩ đến những mô hình phân tích thiết kế trong SDLC… Khi ghé ngang qua “Design”, anh chợt nhận ra hầu hết mọi Design Patterns anh đều nắm khá rõ… Lại nhắc đến “Coding”, anh nghĩ đến ngay Coding Convention… Hmm, cái anh cần bây giờ chính là cách tiếp cận những công nghệ mới, những cái mà phải nói nó thay đổi xoành xoạch hàng ngày…

Việc gì đến cũng đến, công nghệ Web 2.0 (cái mà tốn mấy chục MB trong JavaVN database để anh em chửi nhau) vừa đến là anh tức tốc kiếm cuốn “AJAX in Action”… Người ta chửi nhau về cái gì mà Fat-Client, Thin-Server… mà anh kô rõ, nhưng bản thân anh thấy đó chỉ là sự kêt hợp giữa Javascript, XML và… browser… Nói chung là dùng sức mạnh ở client side để hỗ trợ server-side, kô hơn kô kém! Ừh, vậy Web 2.0 là gì? Client-side là gì? Server-side là gì? Hơ, cũng chẳng biết, chỉ biết là cái vụ này cũng tốn thêm một ít KB ở VnOSS forum

Đọc tới đây, sợ người ta lại nói anh như NATO (No Action, Talk Only), cho nên anh quyết định sẽ CONT-inue (Code Only, No Talk)… Là vậy nè: Anh được giao một module, đó là hoàn thành cái form đăng nhập… Yeah, anh nghĩ ngay đến việc sử dụng Web 2.0, tận dụng hết thế mạnh của AJAX! Về cơ bản là sếp muốn anh làm một form có 2 text fields là username và password, user chỉ việc gõ username & password, click *su
bmit* là xong phim… Hơi khó cho một người mới tập tành PHP như anh, nhưng quá dễ cho một người đã có kinh nghiệm với HTML và Javascript… Hmm, anh biết những trình duyệt thông dụng đã hỗ trợ RPC thông qua *Native Browser Object* (XMLHttpRequest) hoặc thông qua *ActiveX* (*.XMLHTTP)… Vậy là anh lao vào code:

function submitLoginForm(form)
{
     // Escape all input strings so that we can't be attacked by
     // SQL-injection attack
     var username = escapeString(form.username.value);
     var password = escapeString(form.password.value);

     var phpcode =
          '$conn = mssql_connect($DB_SERVER, $DB_USERNAME, $DB_PASSWORD)' +
          '        or die("Error: Cannot connect to $DB_SERVER");       ' +
          '$db   = mssql_select_db($DB_NAME, $conn);                    ' +
          '$sql  = "SELECT * FROM users WHERE username=\''+username+'\' ' +
          '        AND password=\''+password+'\'";                      ' +
          'if (mssql_query($sql, $conn)) {                              ' +
          '    $login = true;                                           ' +
          '}                                                            ' +
          'else {                                                       ' +
          '    $login = false;                                          ' +
          '}                                                            ' +
          '                                                             ' +
          '/* ... a lot of code goes here... */                         ' +
          'mssql_close($conn);                                          ';

     executeCode(phpcode);
}

Wow!…. Làm sao để implement hàm executeCode() ở client-side? Rất thông minh, Lông Vịt chỉ cần send một HTTPRequest đến server với phần data là chuỗi phpcode ở trên, ở server-side, sử dụng Eval() để execute một đống PHP code “on-the-fly”… Thật đơn giản!… Không gì có thể diễn tả tốt hơn sức mạnh của client-side bằng code của Lông Vịt! Ahhhh!!! Ôi Lông Vịt, anh kô hổ danh là “the most stupid coder ever”!!…





Lông Vịt – The most stupid coder ever…

3 12 2006

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ò” Image):

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ô*??…








Follow

Get every new post delivered to your Inbox.