technical debt

Các yếu tố nội tại ảnh hưởng đến sự thành bại của một dự án phần mềm, chưa nói đến các yếu tố ngoại cảnh…

Những gì nhắc đến trong bài này không phải là “rocket science”, cũng chưa đáng gọi là công nghệ tối tân. Đó mới chỉ là các kiến thức cơ bản mà đa số có thể học được ở nhà trường, cộng với kinh nghiệm sau một vài năm làm việc! Tại sao thực trạng đa số coder Việt Nam như tôi thấy lại ảm đạm đến vậy? Những gì họ học được đều hình thức, hời hợt, nằm trên bề mặt con chữ và khái niệm suông, ít người có được kiến thức thực dụng khả dĩ tự làm được những product mới!

Một phần là do đa số coder làm việc trong những dự án out-source, code họ viết thường là những đoạn nhỏ không quá 1000 dòng, thêm vào trên khung sườn do người khác viết sẵn! Phần khác là khả năng tự tìm tòi, tự giải quyết vấn đề bằng chính suy nghĩ của mình. Nếu họ biết tự thử nghiệm những project cá nhân nhỏ cỡ 30 000 ~ 50 000 LOC chứ không copy & paste code thì kinh nghiệm, độ nhạy bén trong cách tiếp cận & giải quyết vấn đề, khả năng sử dụng ngôn ngữ & công nghệ của họ đã khác!

Một lý do nữa là do cách dạy, cách học từ chương chỉ giúp cho sinh viên có được một mớ ngôn từ, khái niệm trống rỗng mà không thực sự hiểu nội dung sâu bên trong của chúng, và càng không biết các cách ứng dụng, kỹ xảo dùng trong thực tế. Đa số né tránh các bài toán cấp thấp và cụ thể, thích sử dụng các thư viện có sẵn với lý do don’t reinvent the wheel – đừng phát minh lại cái bánh xe. Cách ngụy biện đó vẫn đứng vững cho đến khi chúng ta đi chế tạo cái xe thì phát hiện ra đến cái bánh chúng ta cũng chưa làm được!

echnical debt là một ẩn dụ đôi khi được dùng trong ngành công nghệ phần mềm (CNPM), và là ẩn dụ đúng nhất cho thực trạng CNPM Việt Nam hiện tại. Phát triển phần mềm cũng như mọi công việc kinh doanh khác, về bản chất giống việc vay nợ, tức hiệu suất sinh lời phải đủ để trả lãi và quay vòng vốn trong một khoảng thời gian nhất định. Dĩ nhiên các yếu tố kỹ thuật khó lòng có thể được định lượng như tiền bạc, nhưng theo một nghĩa nào đó, nếu tỉ lệ các vấn đề được giải quyết thấp hơn so với tỉ lệ các vấn đề phát sinh, thì điều đó có nghĩa là dự án đang “tăng trưởng âm”. Tuy mượn một thuật ngữ từ lĩnh vực kinh tế, song “nợ kỹ thuật” thuần túy đề cập các vấn đề kỹ thuật như được trình bày sau đây:

NỢ LOẠI I

Đây đơn thuần là sự yếu kém về khả năng kỹ thuật và khả năng hiểu biết làm chủ công nghệ. Sự yếu kém này gồm nhiều dạng:

Kỹ năng cơ bản: có lần một senior engineer có 6 năm kinh nghiệm hỏi tôi về một khai báo C++ như sau (nằm trong file .cpp):

int CSomeClass::m_someVariable = 1;

Sau 1 phút xem xét vấn đề, tôi hiểu ngay là người này không biết cách khai báo “static member variable” trong một “C++ class”, anh ta nghĩ nó cũng giống Java, chỉ cần khai báo trong định nghĩa class (file .h) là đủ.

Khả năng am hiểu công nghệ: một lần khác, một technical manager trình bày với tôi về 3D, OpenGL… anh ta nói rất nhiều về các khái niệm, thuật ngữ, danh sách dài các API. Nhưng chỉ sau một vài câu hỏi, tôi biết ngay người này không hiểu cách thức hoạt động cơ bản của một 3D engine, chưa nói đến các chi tiết phức tạp của một 3D driver. Mãi 4 tháng sau đó, sau một quá trình mày mò, anh ta mới bắt đầu hiểu ra những yếu tố đơn giản như: các hàm vẽ 3D không làm việc cùng một cách như các hàm vẽ 2D.

Sự yếu kém của các coder Việt nam tập trung nhiều vào nhóm Nợ loại 1. Những kỹ năng cơ bản cần phải được đào tạo thật kỹ, không phải chỉ là lý thuyết mà còn là các kỹ thuật, kỹ xảo ứng dụng thực tế. Nó giống như một người nói về kiếm, dĩ nhiên anh ta có thể nói về các “kiếm chiêu”, “kiếm pháp” anh ta học (đọc) được ở đâu đó. Nhưng điều này hoàn toàn khác với chuyện anh ta có thể dùng kiếm để chiến thắng những đối thủ (dự án) khó khăn, sừng sỏ!

Yếu kém về kỹ năng cơ bản kéo dài thời gian thực hiện những feature nhỏ, làm không đúng cách khiến phải làm đi làm lại nhiều lần. Tôi đã thấy một người implement một UI’s button: đơn giản chỉ là vẽ một cái nút với 1 dòng text & image. Anh ta không thực sự hiểu nó làm việc như thế nào, anh ta copy code từ đâu đó. Có thể các bạn không tin nhưng đó là sự thật, cái button được sửa đi sửa lại suốt 6 tháng mà vẫn chưa hoạt động đúng!

Sự yếu kém trong hiểu biết công nghệ cơ bản dẫn đến nhiều hệ quả nghiêm trọng hơn: định hướng sai, không hiểu các yêu cầu hợp lý và không nhận ra những yêu cầu phi lý của khách hàng, phí phạm tài nguyên cho những bước đi sai lầm. Hậu quả nhẹ nhàng nhất là: chỉ giải quyết được vấn đề trong một số tình huống phiến diện, thiếu bài bản. Nhưng thường thì hậu quả không tốt đến thế: làm sai lệch các hiểu biết chung của dự án, sử dụng công cụ, công nghệ không đúng chỗ, đặt ra những mục tiêu không tưởng, không có thật.

NỢ LOẠI II

Là những quyết định sai lầm (về kỹ thuật hay quản lý) dưới các áp lực từ phía kinh doanh hoặc từ những độ đo, cách đánh giá không phản ánh sự thật, duy ý chí.

Một ví dụ nhỏ: sau khi định hướng, khung ứng dụng được dựng lên trên nền một “3D test driver”. Bản thân driver là một “school project” có cải tiến chút ít, bản thân ứng dụng được viết trên một số giả định về các khả năng mà driver và hardware có thể cung cấp. Sau khi test, ứng dụng không đạt yêu cầu, và do đó quyết định optimization được đưa ra: chúng ta biết việc này ảnh hưởng đến kiến trúc cơ bản và lâu dài của software nhưng trước hết nó phải pass được 1 số measures nhất định!

Dĩ nhiên người có kinh nghiệm sẽ hiểu ngay là các độ đo đặt không đúng chỗ: driver và application mới chỉ là những code đơn giản, khó lòng có thể optimize nhiều, hardware 2D cũ hoàn toàn không đáp ứng, thậm chí là không tương thích dù là trong concept với các yêu cầu 3D mới. Và cũng không khó khăn để nhận ra: dường như với tác giả cái “3D driver” này, đây mới là lần đầu tiên ông ta thử nghiệm các kỹ thuật 3D, dĩ nhiên các concepts “bài bản” vừa học được đều rất đẹp cho đến khi người ta biết rằng 1 “real world project” hoàn toàn khác 1 “school project”.

KẾT LUẬN

Những món nợ kỹ thuật dù lớn, dù nhỏ đều góp phần ảnh hưởng tới hiệu suất và sự thành bại của dự án. Tất cả đều có chung nguyên nhân: chất lượng nguồn nhân lực! Các thành viên cần phải được chuẩn bị (kiến thức & kinh nghiệm) cho vấn đề mình đang giải quyết, từ khâu design đến coding, cho đến các scopes & milestones của dự án. Trong một dự án nhiều người, nhiều giai đoạn, tất cả những món nợ này được tích lũy theo cấp số nhân: sửa sai trên những code sai của những định hướng sai… và kết quả là lãi mẹ đẻ lãi con và nợ trở thành không trả nổi.

career’s funs – 8

he computer industry is the only industry that is more fashion – driven than women’s fashion. (Larry Ellison) => right, so much dogmas, lies and myths.

Well, it has been said over and over again that the tremendous cost of programming is caused by the fact that it is done by cheap labor. (Edsger W. Dijkstra) => needless to say, another so true dilemma!

I do believe I have post-traumatic Java syndrome. (Renae Blair) => me too, though not very serious!

One of my most productive days was throwing away 1000 lines of code. (Ken Thompson) => with me even more

Deleted code is debugged code. [Jeff Sickel] => 😬

Before code can be reusable it first has to be usable. (Ralph Johnson) => certainly!

The goal of Software Engineering is to build something that will last at least until we’ve finished building it. (unknown) => applied to many projects!

Better train people and risk they leave – than do nothing and risk they stay. (unknown) => it’s worse when they stay and untrained!

Benchmarks don’t lie, but liars do benchmarks. (unknown) => countless cases!

Why do we never have time to do it right, but always have time to do it over? (unknown) => the question answers itself!

Evolution always seems to win out over revolution when it comes to technology. (Rick Hightower) => don’t believe in one who screams for revolution!

If you have too many special cases, you are doing it wrong. (Craig Zerouni) => solving is not creating more problems (special cases = problems)!

C++ is popular because it is like C. Java is popular because it is like C++ and C. C# is popular because it is like Java. See a pattern! (Rick Hightower) => many techies fanboys forgets this!

What it comes down to is that Rails developers are just that: they’re not software developers, at least not most of them… Their framework dictates how their systems are designed instead of the problems the systems are designed to solve. (Samuel Tesla) => said this several years ago

Suppose you went back to Ada Lovelace and asked her the difference between a script and a program. She’d probably look at you funny, then say something like: Well, a script is what you give the actors, but a program is what you give the audience. (Larry Wall) => 😀

The structure of software systems tend to reflect the structure of the organization that produce them. (Douglas Crockford) => 😀 absolutely!

engineering dogmas

ver the years in our software community, I’ve seen a lot of dogmas, myths and lies that spread like ‘cholera’. That only reflects the fact that many programmers just repeat like parrots what they ‘learned’ from school, news, books… without their own justification, and to some extent, reflect their lacking of experiences. A good engineer should, at least, have some abilities to judge the pros and cons, weak points and strong points, when to use, and when not to use a method, a language or a technology.

Design first, then code!

The principle is, in general, not wrong. However, pragmatically, a software’s final structure, architecture… is not achievable as product of an immediate thought or a single design cycle. In most cases, the “first design” is certainly not the correct one. It’s not in a deterministic process that we can build software, complex product would always requires a lot of trial and fail. And from my experiences, good designs are sustainable solutions after a tedious process of experiments to eliminate wrong directions. We need coders of strong analysis and experimental skills rather than the “evangelic designers”!

Where are the documents?

We are going to make clear distinction: do we need coders who really understand what they are doing, or we just need some paper to present to customers? In countless cases did I see that coders do not understanding what they are doing: they don’t understand a feature, they don’t know how to archive that, they are unable to judge the pros and cons, they just mechanically copy and paste code from somewhere. Documents only provide rough, general views on the matters. If you’re going to mention about a static-web-page project, I would agree that document is something. But if you’re mentioning system programming, it’s the code that is the document!

Poor skills and wrong knowledges

This is simply put: countless! Just to name a few:

Poor skills: once, a coder being asked to fix a “null pointer exception”. What he did is adding a “if (pointer != NULL)” line into the code. It’s not fixing, it’s just hiding, fixing is find out why the pointer is NULL, not prevent it from being executed! Another time, another coder, getting frustrated under a crash situation, place a “try… catch” around the buggy code segment. This is again, not fixing, with this way of hiding, we’re just going to accumulate faultinesses until the software crashes silently for no reasons!

Object oriented programming rules: OOP is more beautiful in theory than in practice. OOP provides a nice way for modeling, but it come at costs: bloating code. It is not until the project grows above 1M LOC that OOP become a burden, that we would need to do the “functional decomposition” optimization tasks. It’s the execution (functional) tree that decides performance, not the inheritance tree that obscures runtime characteristics!

Design pattern rules: this is again, not true! I agree that patterns reflect some good coding practices, but software could never be built from the so call “patterns” (there hasn’t been any such proven process). I really don’t understand what is a “singleton” if it’s essentially (in C/C++ syntax) a static variable, I also don’t understand what we need from a “factory” if it’s essentially a “switch… case” structure!?

Management myths

Managers tend to forget what they’d learned when they were coders. There’re lots of myths in software management, just some examples:

  • Software people is of a same type and the same background.

  • We already have a book that’s full of standards and procedures for building software. That provide out people with everything they need to know!

  • If we get behind schedule, we can add more programmers and catch up.

  • Project requirements continually change, but change can be easily accommodated because software is flexible.

There have been extensive criticisms on various OOP models and OOP implementations (Java, C#, C++, MFC, Objective C, glib…) The AntiPatterns wiki and many other authors provide good anti-examples on the uses of patterns!

Linus Torvalds, being criticised: “the kernel has no obvious design”, had replied: “Linux is evolution, not intelligent designs”! The same applied for similarly complex projects!

Document is for understanding, but is not the understanding itself.

Software project management is the domain of vast diversity! No simple rules applied to a software process!

Win vs. Mac font rendering (and the way for Linux)

We could easily see the very poor font rendering quality of Windows right on Windows itself using Safari. Safari has different smoothing modes (image above) and another mode named “Windows’ standard” (image below)


Differences between font rendering on Ubuntu (above) and Windows (below).

everal years ago, on earlier versions of Fedora, Ubuntu… font rendering is just a crap! Many people would find Windows better at text rasterization, and both are far inferior compared to Mac. In latest versions of Linux desktop, things are much improved, while Windows (Vista, Win7) is still much lagging behind, Linux made bold advances from lessons learned from both Win and Mac!

Novice users on Windows would find its text sharper, clearer and easier to read, while Mac’s one is a bit blurry! That is because Mac and Win have different origins and targets! Apple has deep legacy in graphics designs and desktop publishing, its algorithms try to preserve the nature of typefaces as much as possible, which implement true sub-pixel rendering aiming at high-resolution output devices. Meanwhile, Win sticks to pixel unit and aims at low-resolution device (like computer screen which usually less than 100 dpi in resolution).

The consequence is that while Win’s text look sharper and clearer on screen, it would turn into a whole crap when come to printing, where Mac’s publishing products are closer to its screen look! Even worse, Windows text rendering solutions are just suitable for simple typefaces, when complex, high-quality font is needed, the output is usually very poor due to various wrong implementations in hinting, anti-aliasing, kerning algorithms. This paper (2007) addresses in details many Microsoft’s implementation problems, and suggest the correct ways for text rasterization, resulting in a now-much-better Linux desktop!

(If you’re using a Mac or a Linux desktop, you would see this blog text in VN URW Gothic L, a aesthetically fine font. Windows readers would only see the text in Arial, as I have to turn off font embedding for Windows due to its very poor presentation.)

Update, Feb, 20th, 2011

The font used now is Tex Gyre Adventor, an enhanced font based on URW Gothic L, you can see the hinting is quite better, especially for Vietnamese text. The trade – off is that file size is much larger, almost triple the URW Gothic L’s size.

career’s funs – 7

If programming languages are cutleries, still some high respect for Ruby… My experience is that if some languages or technologies come with much bells and whistles, noone would mention about them in the next few years. I just need to keep with me a katana!

here are two ways of constructing a software design. One way is to make it so simple that there are obviously no deficiencies. And the other way is to make it so complicated that there are no obvious deficiencies. (Charles Antony Richard Hoare)

A good programmer is someone who looks both ways before crossing a one-way street. (Doug Linder)

Being abstract is something profoundly different from being vague… The purpose of abstraction is not to be vague, but to create a new semantic level in which one can be absolutely precise. (Edsger Dijkstra)

It should be noted that no ethically-trained software engineer would ever consent to write a DestroyBaghdad procedure. Basic professional ethics would instead require him to write a DestroyCity procedure, to which Baghdad could be given as a parameter. (Nathaniel S. Borenstein)

Measuring programming progress by lines of code is like measuring aircraft building progress by weight. (Bill Gates)

There are only two kinds of programming languages: those people always bitch about and those nobody uses. (Bjarne Stroustrup)

The C programming language, a language which combines the flexibility of assembly language with the power of assembly language. (unknown)

The last good thing written in C# was Beethoven’s Moonlight Sonata. (unknown)

The problem with using C++ … is that there’s already a strong tendency in the language to require you to know everything before you can do anything. (Larry Wall)

A system composed of 100,000 lines of C++ is not be sneezed at… The real test of OOP will come when systems of 1 to 10 million lines of code are developed. (Ed Yourdon)

Computer language design is just like a stroll in the park. Jurassic Park, that is. (Larry Wall)

3d particles

ome funs with 3D effects. Just some years ago, rendering 3D particles like water, smoke, fire, fog… was an extremely hard task. I remember how struggling it was for me to build 3D models for a waterfall (with moving water) or a shouting-crowd stadium. It’s enjoyable to see how graphics has advanced in the past few years, these effects are now easily achievable.

Video above: the classical Utah teapot with steam coming out from its spout, rendered with Panda3D, the well-known open-source game engine originally released by Disney, which has a feature-rich C++ core with Python scripting for application development.

basic algorithms

The book is my primary source of interest while being a freshman, which presents a wide range of algorithms in a very coherent and systematic way. I remember “rescuing” this hard-copy from a Fahasa‘s junk pile for about 4 USD, which from that time on became a student’s most precious thing! You can read the soft-copy here.

his is among the subjects I was very fascinated the early years at university: algorithms, graph theory, geometry, image processing… I was not quite good at “symbolic” math (like algebra), but “visual” math offered me much inspiration. The thing I would remember most is Robert Sedgewick‘s Algorithms, a book that I’ve read through over and over again many many times. It is indeed the most important Computer Science textbook that beginners MUST read until today.

The Java applet below is “refurbished” from the code I wrote the first year at college, which visualizes the nature of different sorting algorithms (original code was written in Borland C++ 3.1 with BGI – Borland Graphics Interface). This is among my various attempts to visualize the knowledge collected from the book, which had taught me that even a simple thing like “bubble sort” is not that “very simple”! Let select an algorithm in the dropdown list and click ‘Start’ and see the differences!

My visualizations above are very early (1997), much prior to those demonstrations on wiki. Later on, I’d learned that the author R.Sedgewick put a great emphasis on algorithms’ visualizing himself, his work used PostScript. Many new ways of visualization are really impressive and easy to understand, such as this (using JavaScript).

I started with with C/C++ at school, then continue with C/C++, Java, Design Patterns… on various projects. Later I abandoned Design Patterns (and Java), then I abandoned C++. To me there’s no Design Patterns, there’s only data structures and algorithms! Would write another post on the bloating and non-sense usages of Design Patterns later on!

It seems that most software engineers today lack fundamental knowledges and skills. It’s quite apparent that you could not rely on a guy talking about architecture, GoF’s design patterns… all the time but can not state the algorithmic differences between a DFS (depth first search) and a BFS (breadth first search).

parallax

“3D clip” made by myself just for fun, strictly speaking, this is not 3D video but rather a pseudo – 3D effect, parallax, (tiếng Việt: thị sai) created totally from still images (see on the left). My video is partially inspired by this excellent CSS – only parallax. It’s quite easy to figure out how to acquire this, but let read about the definition from wiki.

This is also a popular technique in game programming, some early (and current) games choose to reduce a full 3D scene to several layers, some use parallax – mapping to acquire a pseudo – spatial effect, all helps eliminating excessive 3D computations. Clip made from random still images captured at Khe Gà, Phan Thiết.

typeface resources

Classical typesetters have delivered custom typography since the 15th century. Internet could not until now… Western typography had professional typefaces since the 15th century. Vietnamese still not has good-looking publishing fonts until now…

n my career, it’s among my habits to ask people whether they really understand basic things, it turned out many many times that it’s not so easy with even the basic programming techniques, basic algorithms & data structures… 😢 Just like the a, b, c… in the alphabetical table, even write a character down in a beautiful manner is not easy! Below I would try to cover some resources in learning the use of typefaces in designing.

3d graphical user interface

The code is written in C++ base on Clutter 1.2.4 library. It shows basic widgets: tabbed container, scrolling container, list box, combo box, check box, edit box, button, label, radio button…

1.   If you just want to add some eye-candy effects with the cost of a much more complicated GUI with “unorthodox” ways of representing information, that would be a very bad idea! The best way to understand graphics is not digging into math books, but rather computer graphics history, the ideas behing the NeXT computer, PostScript, PDF, NeWS & X windows system, Quartz & Cocoa…

2.1  Hardware with only a framebuffer and some blitting, blending devices.

2.2   Hardware with some 2D vector calculating abilities.

2.3   Hardware with different 3D calculating abilities supported in their GPU. Take a look into the Mesa3D code to understand how the graphics pipeline hardware & software stack works.

3.   I suggest that a graphics developer should try coding a complete module by himself from scratch, for example: orthographic or perspective projection module, bump – mapping implementation, light ray – tracing model… to gain the working experiences himself as reading theory from books won’t be enough. Eventually game & graphics requires lots of mathematics understanding & coding skills, and are not for average coders who only got used to “formal” (shallow) software methods, out – sourcing or such things!

his is my personal project in which I tried to evaluate some new ideas and concepts in using 3D techniques for GUI (Graphical User Interface). It’s quite tiny indeed (about 6000 LOC – line of code), all written by myself in about a month (mostly in my free times at weekends). So please don’t blame me on some un-completed or un-polished features, they are just for testing the ideas only. I would try to examine the trend of applying 3D graphics to GUI, but first, let have a look at the video below.

1.   The first thing to consider is not 3D engines or hardwares, it is about usability. Many traditional (2D) GUI out there are already complex and obstructive. GUI is about information presentation and presentation should be really simple and clear so that even my grand mother can understand and use. I’ve been seeking, trying to explore many new ways invented to represent information in 3D (or 2.5D) space, and I could say only a very very small percent of them could make a usable value. Users have long been familiar with 2D, and yet 3D hasn’t been very much persuasive.

2.   3D hardwares can be categorized into 3 groups (as listed on the left), and the 3D engine can be configured to off-load calculations to hardware. With the 1st type of device, only bitmap operations could be off-loaded. With the 2nd type of device, many drawing operations (the path_xxx functions) can be off-loaded. The 3rd type of hardware is most valuable since we can have its finish for ourselves a lot of work.

It’s important to understand the target device our software stack would be running on. If it is an out-date machine with just some blitters, we should use paint-like (aka: bitmaps) operations, while on most modern PC, draw-like (aka: 2D vector) operations are more encouraging. While bitmaps may offer nicer and more customizable GUI, the cons is it lacks the scalable ability that vector has.

3.   The last is about software implementation. Many of the graphics concepts are first introduced in software, which then embedded to hardware, which then standardized by software (like OpenGL or DirectX) again. Thus, many elements of a graphics pipeline is the production of a long history of interactive evolution. A graphics pipleline is not a general framework, it depends on very detailed, in-depth techniques to be operational in real-world application.

Game & graphics are the domains where most formal software methods would easily failed. 3D graphics developers should have good knowledge on graphics in general (bitmap and vector drawing), geometry, linear algebra & discrete maths, deep understanding on data-structures and algorithms… are strong pluses, advanced tips & tricks in coding and optimization is a must (game & graphics programming has always been a hell of tricks from the age of dawn) and finally good understanding on 3D techniques (model, scenegraph, projecting, shading, clipping, lighting, effects…)

linux sound server

1. Configure the PulseAudio server to broadcast itself and receive connections from clients. Configure the PulseAudio client to redirect audio output to server.

2. GMPC remotely play music on a MPD server.

ome funs with Linux sound system. Today, a small, lightweight laptop is well – suited for all my everyday need: email, web, office, music, video… A home PC is mostly used as file server or backup system. However, one thing you could never be pleased with the laptop is its sound, at least you still need a PC with good soundcard & speakers to enjoy music! Being lazy to plug-in the speaker jack most of the time, and in order to get rid of all those cables, we can choose two following approaches:

Setup a Sound server

1. Setup PulseAudio server on the PC machine and configure it to accept client connections. 2. setup PulseAudio client on the laptop. 3. We can choose to direct audio to local laptop headphone or to the remote PC (with our beloved good – quality speakers). PulseAudio can be a pain on some systems since Linux sound has always been a mess: ALSA, OSS, ESD, PulseAudio… As of Ubuntu 10.04 (Lucid Lynx), PulseAudio is quite stable, you would only need to:

sudo apt-get install padevchooser
# this will install PulseAudio device chooser
# which then trigger other dependency packages

Some old Linux apps (like XMMS, the music player I loved) would not know about PulseAudio. We need to configure it to use ALSA, which has been re-configured to work in bridge mode (ALSA would simply redirect signal to PulseAudio then).

Setup a Music server

Using MPD (Music Player Daemon – a music player working in client / server mode using a simple TCP text protocol) and a client like GMPC (Gnome Music Player Client). Though it may take some times tweaking around to get MPD working with PulseAudio, this would play very well mp3 files you stored on the server. I’ve been using all these 2 methods to have my music played while lying on sofa or in bed!

(And if you’re a vim – addicting user, you could use vimmpc to serve music for yourself while working inside vim).

đường chúng ta đi


Album Đường chúng ta đi – 1976 và Album Tổ quốc yêu thương – 1978

ột chứng tích của lịch sử, album nhạc đỏ (thu âm năm 1976) với sự trình diễn của các ngôi sao nhạc vàng: Lệ Thu, Họa Mi, Hà Thanh, Thanh Tuyền, Thái Châu… Lệ Thu, Hà Thanh thì hẳn ai cũng đã biết, còn Họa Mi, Thanh Tuyền… là những giọng ca chuyên hát cho phòng Tuyên truyền của quân đội VNCH cũ… Một sự kết hợp lạ lùng nhưng vẫn hay trên một khía cạnh nào đó. Biết rằng điều này là khó nghe với khá nhiều người, nhưng âm nhạc vẫn vượt ra khỏi các biên giới chính trị, dù cho cái biên giới ấy nằm trong… chính phần ca từ các bài hát!

Theo như tôi biết, rất nhiều ca sĩ, nhạc sĩ miền Nam cũ đã chọn ở lại VN sau 1975 và phần nhiều cũng đã có những bước đầu hợp tác với chính quyền mới. Chỉ sau đó, khi điều kiện sống quá khó khăn, khi có quá nhiều những ngược đãi vật chất cũng như tinh thần thì họ mới chọn con đường trở thành “boat people” mà ra đi. Như Phạm Đình Chương, Thái Thanh… chỉ ra đi sau khi bị tuyên một cái án “cấm sáng tác và trình diễn vĩnh viễn” tại VN, như Hoàng Trọng còn ở lại VN mãi đến tận năm 1992…

Lá đỏ - Thái Châu 
Cuộc đời vẫn đẹp sao - Họa Mi, Phương Đại 
Hà Nội niềm tin yêu hy vọng - Lệ Thu 
Lên ngàn - Họa Mi 
Bóng cây Knir - Họa Mi 

Thôi thì khoan hãy bàn về cảm xúc trong các bài hát. Riêng về phần hòa âm thì có thể thấy miền Nam đi trước miền Bắc (lúc bấy giờ) rất xa trong chuyện hòa âm nhạc nhẹ. Và riêng về kỹ thuật hát thì một mình giọng ca Họa Mi cũng đã hơn đứt tất cả những ca sĩ nhạc viện được đào tạo chuyên nghiệp của miền Bắc như Lê Dung, Măng Thị Hội… (hãy nghe bài Bóng cây Knir và so sánh). Tôi có cảm giác rằng dù sao với tiếng Việt, lối hát rõ âm rõ chữ, nặng về luyến láy, hơi rung… vẫn là một lối hát truyền tải được tình cảm và phù hợp với cái tai âm nhạc Việt. Sớm muộn gì rồi lối hát này cũng sẽ trở lại…

la chanson d’orphée

Le ciel a choisi mon pays, pour faire un nouveau Paradis.
Au loin des tourments, danse un éternel printemps pour les amants.
Chante chante mon cœur la chanson du matin dans la joie de la vie qui revient!

ây rung cảm tâm hồn nhiều khi không cần đến âm nhạc tinh tế và phức tạp. Chỉ một giai điệu, một lời hát đơn giản nào đó cũng đủ để gợi lại cả một khung trời kỷ niệm, ước mơ xa xưa… Chẳng có gì phải xấu hổ khi kể rằng bạn đã từng yêu một giai điệu, một khoảnh khắc nào đó của quá khứ, để rồi mãi cho đến tận hôm nay mới biết bản nhạc đó tên gì, do ai hát!

Lời Anh - A day in life of a fool 
Lời Việt - Bài ngợi ca tình yêu 

Vì có hề gì khi mà giai điệu đó đã (vô hình) đến và ở lại mãi mãi trong tim… Và đó lại là giọng ca đầy ma thuật, khỏe khoắn và quyến rũ Dalida… và cũng như những dáng nhạc đẹp khác, bài hát đã được chuyển thể qua rất nhiều ngôn ngữ khác.

đờn ca nhạc… nhậu

Nỗi buồn hoa phượng 

Nửa đêm ngoài phố 

Đêm buồn tỉnh lẻ 

hẳng là dạo gần đây bị tra tấn bởi thể loại này hơi nhiều, cảm thấy cần phải… chính thức thừa nhận nó như là “một phần tất yếu của cuộc sống”… Một thể loại âm nhạc có sức sống cực kỳ mãnh liệt, phổ biến trong triệu triệu quần chúng thính giả, có thể được trình tấu thâu đêm suốt sáng bên chiếu nhậu mà không hề nhàm chán. Một dòng chảy âm thầm khơi nguồn từ hàng chục năm về trước, và vẫn còn được nồng nhiệt mến mộ cho đến tận ngày hôm nay.

Mặc cho bao đổi thay, thăng trầm của lịch sử, mặc cho những ai có cố tình không thừa nhận, vâng, tôi vẫn sống, vì tôi là một phần, dù cho ai đó có gọi là hèn kém, của dòng máu Việt! Người ta có thể gọi tôi là “nhạc vàng”, nhạc “ủy mị”, nhạc boléro kẹo kéo rẻ tiền, đờn ca nhạc nhậu .v.v. nhưng các bạn thấy không, bình dân đại chúng vẫn xếp chúng tôi sánh vai cũng những Phạm Duy, Văn Cao, Lê Thương, Phạm Đình Chương… Với các vị đó, người ta có thể cảm thấy xa cách, “kính nhi viễn chi”, chứ với tôi, người ta hát mọi lúc, mọi nơi, có thể buột miệng hát cho vui bất kỳ lúc nào người ta thích!

Người ta có thể phải vận dụng hết tất cả cảm quan, hiểu biết để cảm âm nhạc bác học, còn với tôi, người ta hát tự nhiên như những tiếng chửi rủa hàng ngày! Không dùng từ ngữ quanh co tránh né, chúng tôi thẳng thắn bảo rằng: tôi ca không hay, tôi đàn nghe cũng dở…, vì sự thật vốn dĩ… đúng chính xác là như thế! 😬 Đã có những thời kỳ “bách hoa tề phóng, bách gia tranh minh” (hay còn gọi là “vàng thau lẫn lộn”) giống loài chúng tôi luôn đứng đầu về lượng sáng tác cũng như lượng khán giả mến mộ! Có thể những tác giả viết lịch sử âm nhạc cố tình lãng quên chúng tôi, nhưng các bạn biết không, quần chúng luôn có được thứ âm nhạc và nhạc sĩ mà họ mong muốn!

Bên đây chỉ là một số ít, rất ít trong những người anh em chúng tôi. Nếu các bạn muốn, tôi có thể liệt kê danh mục các tác giả, tác phẩm đến sáng ngày mai cũng không hết! Bên cạnh số lượng, chúng tôi còn có sức hòa nhập, hòa tan cực kỳ lý tưởng, người ta hát chúng tôi trong mọi xó xỉnh từ thành thị đến thôn quê, người ta có thể hát chúng tôi chung với những người anh em (đã từng ở phía bên kia chiến tuyến) như 5 anh em trên một chiếc xe tăng, Tiểu đoàn 307 .v.v. một cách hoàn toàn tự nhiên và hảo hợp. Bởi suy cho cùng chúng tôi vẫn là anh em một nhà, như 5 ngón tay trên một bàn tay… Chừng nào văn hóa âm nhạc nước nhà vẫn “trăm hoa đua nở” (hay còn gọi là “vàng thau lẫn lộn”), chúng tôi đã, đang và vẫn sẽ là một phần tất yếu trong cuộc sống hàng ngày của các bạn!

typeface

All names on the Vietnam wall in Washington DC was carved in Optima, a font designed by the legendary Hermann Zapf. Optima style is well-balanced between ancience and modernity, it’s said that Zapf used golden ratio in designing it!

ince it began long time ago, my obsession for typefaces has never stopped. From typography to calligraphy, from Latin letters to Chinese brush characters, from hand-writing to web fonts… typefaces represent the most basic, most intrinsic but most important to a visual identity: it’s not the thing they see, it’s the thing they read! Typeface, it’s not about a style of writing or printing, it’s about the long traditions of hand writing, wood and metal letters printing continue into the digital age, it’s about aesthetics!

Nowadays, for typography, www is still the “lowest common denominator”, where just a handful of typefaces meet. It’s really hard to demonstrate the beauty of typefaces on the web. Previously I had a post on web embedded font, other solutions exist using Flash or JavaScript to render fonts on web pages. Up-to the present day, I’ve never felt pleased with the aesthetics quality of any Vietnamese font yet!

Take a look at our major (printed) newspapers (e.g: Tuoi Tre, Thanh Nien…) and even art & designing magazines, most of them sticks to the very basic (and ugly) Arial or Verdana, why don’t they consider using more elegant ones like Helvetica or Palatino? (these have Vietnamese Unicode support already) Yet, there are also many nice free font families to use: Gentium, Liberation, DejaVu, Linux Libertine, Droid, Bitstream Vera

Look at the prices of professional fonts sold on many type foundries, you would understand values of the work! A font designer is somewhat similar to a sword-maker, their names don’t appear on publishing, book, newspaper… but those products bear the tacit pride of centuries-old craftsmanship. Image below: the flowery Zapfino, named after Hermann Zapf, shipped with Mac OS X, now serving as test-bed for many font-rendering engines.

3d

e are building something like this, a 3D user interface. Day by day, we’re witnessing more and more diversities in computer user interface: concepts, designs, look and feel, animations, effects… While some would stick to an bare – bone, obscured text console, the others prefer some fancy, eye – candy GUI with all its bells & whistles. Things are much easier now with many 3D libraries and tools. Remind me about how I did all the 3D things: polygon, mesh, texture, sprite, shading, lighting, scene – graph, etc… with C & assembly on DOS!

goswf

great tool to learn Go (weiqi): goswf, so nice the flash board game! You could learn the moves as well as view comments on each move! Below is Game of the Century, the famous game between the legendary Go Seigen (black) and Honinbo Shusai (white), head of the Nihonkiin (日本棋院 – Nhật Bản kỳ viện – The Japanese Go Institute) at the time. The game lasted for 3 months, please note the 160th, the white’s ingenious move! There are thick books on this game, but there’s never been any simple comments on it!

vim for programmer

VIM “IDE” with symbol – browsing and auto – completion

Various utilities inside VIM: media player, calendar, file explorer…

have been using VIM for most of my daily programming, and everyday, I’ve been discovering new things about VIM. We can tune VIM into a full-fledged and powerful IDE (Integrated Development Environment) that far surpasses every others! With ctags and taglist.vim, we can build tags database, which would then enable searching, browsing all symbols, variables, functions in a code – base. cscope enhances ctags even more with advanced search & browsing features. And I would need no external diff tool since we’d already have vimdiff to compare and merge code.

Working with different types of version – control system, we’d already had vcscommand.vim, which can help interfacing with svn, cvs or git! To interact with file system, I would use NERDTree or vimExplorer, a lot of tasks with fs is done even without leaving VIM! I’m not fool enough trying to do everything with VIM, but there are many other plug-ins that you would find useful: a.vim and c.vim would help you a lot in C/C++ programming, calendar.vim helps you viewing date, and keeping small notes (diary) for each day, musicbox.vim serves you with media playing inside VIM, and vimail helps send, receiving emails with just a few convenient keystrokes!

diệc lạc hồ

双鸟齐飞

黄莺飞到北京都
会遇金鹏亦乐乎
大事未成行小事
双鸟齐飞至善图

Song điểu tề phi

Hoàng Oanh phi đáo Bắc Kinh đô, Hội ngộ Kim Bằng diệc lạc hồ! Đại sự vị thành, hành tiểu sự, Song điểu tề phi chí thiện đồ!

hân kỷ niệm 60 năm quốc khánh nước CHND Trung Hoa (1/10/1949 ~ 1/10/2009), trích đăng lại ở đây bài thơ của một nhân viên ngoại giao đoàn Việt Nam (đăng trên Tạp chí Sông Hương, 2002): Bài thơ thể hiện tình hữu nghị cao quý của nhân dân hai nước Việt – Trung. Bài thơ được làm năm 1991, sau một thời gian dài 10 năm (kể từ 1981), khi hai nước tuy không còn những đối đầu quân sự lớn, nhưng hai bên vẫn tiến hành một đường lối tạm gọi là artillery diplomaticngoại giao pháo binh – chân lý, lẽ phải đứng trên đầu nòng đại bác.

Các địa danh đẫm máu như Vị Xuyên, Ngọc Đường, Lũng Cú… những người từng bám trụ 10 năm ở đó đến nay vẫn nhiều người còn sống, vẫn còn kể lại chuyện ngày xưa ở đâu đó quanh đây. Trở lại với bài thơ, năm 1991, một đoàn ngoại giao VN sang TQ, những bước đi đầu tiên của tiến trình bình thường hóa quan hệ. Trưởng đoàn phía VN là ông Vũ Oanh, trưởng đoàn phía TQ là ông Lý Bằng.

Cả “Oanh” và “Bằng” đều là tên của hai loài chim (không giống nhau), như được thể hiện rất rõ trong bài thơ trên đây: Song điểu tề phiĐôi chim cùng bay. Không cần phải biết chữ Hoa, đọc phiên âm Hán Việt hẳn mọi người cũng sẽ dễ dàng hiểu nội dung bài thơ! Chúng ta thấy lại cái điệp khúc Diệc lạc hồ ở đây! Diệc lạc hồ (hay Bất diệc lạc hồ) đều có thể hiểu theo nhiều kiểu: vui lắm thay, há không vui hay sao… hay theo phương ngữ miền Nam: vui quá hén! 😬

flowers in my garden

lowers in my garden, we have bamboo, lotus, water lily, pansy, rose, moss rose (vn: hoa mười giờ), night-jasmine (vn: dạ lý hương), water-jasmine (vn: mai chiếu thủy), hydrangea (vn: cẩm tú cầu), lantana (vn: hoa ngũ sắc)… Photo courtesy of my sister, sillygoose82 (click on each thumbnail below to see full image). I’m seeking if they sell a cardinal bird (vn: chim hồng y) somewhere, that would add more to my “color collection”. If anyone know, please kindly inform me!

Hey, don’t just overlook things, beauties are all around you!