Trang chủ > Uncategorized > Linux mập

Linux mập

Trước hết nói về pipeline, niềm tự hào Unix. Ví dụ về đoạn mã kiểm tra chính tả (chép từ wikipedia):

curl "http://en.wikipedia.org/wiki/Pipeline_(Unix)" | \
sed 's/[^a-zA-Z ]/ /g' | \
tr 'A-Z ' 'a-z\n' | \
grep '[a-z]' | \
sort -u | \
comm -23 - /usr/share/dict/words

Giải thích ngắn gọn:

  • curl lấy nội dung trang web
  • sed chuyển kí tự không phải chữ cái và khoảng trắng thành khoảng trắng
  • tr chuyển chữ hoa thành chữ thường và khoảng trắng thành dấu xuống dòng
  • grep bỏ các dòng trống
  • sort xếp từ theo thứ tự và bỏ từ lặp
  • comm để lấy ra từ không có trong từ điển

Cái triết lí của Unix “Write programs that do one thing and do it well" cũng từ pipeline mà ra. Chính xác hơn, là từ câu nói của Doug Mcllroy, người phát minh ra pipe trong Unix:

This is the Unix philosophy: Write programs that do one thing and do it well. Write programs to work together. Write programs to handle text streams, because that is a universal interface.

Trong quyển “Pattern-oriented software architecture”, khái niệm này còn có tên có tuổi hẳn hoi: Pipes and Filters pattern, một trong ba architectural pattern (pattern để xây dựng kiến trúc tổng quát cho phần mềm).

Mà kể ra thì pipeline nhìn cũng đẹp thật, gọn gàng, hiệu quả. Cho nên các Linux fanboy (như mình ngày xưa) hay lấy nó làm cái cớ hạ Windows xuống và vênh mặt lên tự hào (nói nữa sợ mất tính khách quan). Tiếc là “Write programs that do one thing and do it well” chỉ còn là quá khứ. Bạn thử nhìn vào hình dưới và đọc những dòng màu xanh nước biển:

 Untitled1

Tất nhiên là gần như không thể đọc được. Bởi vì cái ls này đã quá ham hố làm hai thứ: liệt kê thư mục và định dạng dữ liệu xuất (chia cột, tô màu). Mà nó lại không làm tốt việc tô màu.

Không phải mình tự nghĩ ra đâu, mà là Rob Pike và Brian W. Kernighan (đồng tác giả “The C Programming Language”) nói thế trong paper “Program design in the UNIX environment”:

An example of the first approach is Berkeley’s version of the ls command, which lists the filenames in a directory. Let us call it lsc to avoid confusion. The 7th Edition ls command lists filenames in a single column, so for a large directory, the list of filenames disappears off the top of the screen at great speed. lsc prints in columns across the screen (which is assumed to be 80 columns wide), so there are typically four to eight times as many names on each line, and thus the output usually fits on one screen. The option -1 can be used to get the old single-column behavior.

…The automatic columnation in lsc is reminiscent of the ‘‘wild cards’’ found in some systems that provide filename pattern matching only for a particular program. The experience with centralized processing of wild cards in the UNIX shell shows overwhelmingly how important it is to centralize the function where it can be used by all programs.

One solution for the ls problem is obvious — a separate program for columnation, so that columnation into say 5 columns is just ls | 5…

Thế nên đừng tường cứ có pipe được là thành “do one thing and do it well”.

Chuyện này có từ thời BSD, nhưng thôi cứ chửi GNU cho tiện (vì bây giờ GNU rất phổ biến trên Linux). Vậy là từ cái đống lệnh pipe phức tạp nhưng dễ quản lí (vì mỗi người một việc) bây giờ chúng ta có một đống lệnh pipe phức tạp và khó quản lí (nhiều người cũng làm được một việc, chọn ai bây giờ). Tốt nhất là cứ theo kiểu Windows, thân ai người đấy lo, thiếu chức năng thì viết lệnh mới.

Dùng câu này trong “Pattern-oriented software architecture” để kết là hợp nhất:

The Pipes and Filters pattern, in contrast, is less often used, but is attractive in areas where data streams can be processed incrementally. Surprisingly, some system families modelled in this fashion turn out to be poor candidates for this paradigm, neglecting areas where this pattern could be used more beneficially.

Tags:
  1. Chưa có phản hồi.
  1. No trackbacks yet.

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s

%d bloggers like this: