Kho tháng 3/2007

Thứ sáu, 23 Tháng ba năm 2007 23:49:09 ICT

Đặt ảnh nền mặc định cho Nautilus

Cần hai khoá GConf. Khoá /app/nautilus/preferences/background_set dạng boolean cho biết có đặt ảnh nền mặc định không. Khoá /app/nautilus/preferences/background_filename dạng string chứa đường dẫn ảnh nền mặc định nếu background_set là true.


Cập nhật 2 lần. Lần cuối: Tue Aug 08 11:22:15+0011 2017

Tác giả: pclouds | Liên kết tĩnh | GNOME, Mánh và mẹo

Thứ năm, 22 Tháng ba năm 2007 20:39:47 ICT

VnOSS làm loạn

Đầu têu là graffiti đòi đem phát Ubuntu miễn phí ngay trước chỗ tổ chức ngày hội Windows Vista (mà hình như vào trong phát luôn thì phải). Hình ảnh của vụ nổi loạn được lưu trên flickr của b1nhb00ng.

Trong số các phần tử nổi loạn có thể điểm mặt một số "tên" như mybb, lukas, xinhgai, graffiti, lão nhị, còi, Huy mập. Một số lượng đáng kể những phần tử còn lại.. không biết tên.


Cập nhật 3 lần. Lần cuối: Tue Aug 08 11:22:15+0011 2017

Tác giả: pclouds | Liên kết tĩnh | Linux

Thứ tư, 21 Tháng ba năm 2007 22:12:00 ICT

Ctrl-Alt-Backspace có thể huỷ bỏ

Đang lò mò cái Ctrl-Backspace của Ross Burton. Không ăn. Chắc mình nhầm, đổi thử qua Ctrl-Alt-Backspace. Hậu quả là nguyên hệ thống X về với đất.

Đề nghị cho X developer: làm cái Ctrl-Alt-Backspace giống như tính năng Logout/Shutdown của GNOME. Nghĩa là nó sẽ hiện ra bảng thông báo để người dùng có thể huỷ bỏ thao tác logout/shutdown nếu muốn. Nếu sau mười giây (hoặc 60 giây) không có hành động gì thì nó sẽ logout/shutdown. X cũng nên có tính năng tương tự. Dĩ nhiên không cần đưa toàn bộ code vào X server mà có thể bắt chước cơ chế hotplug của Linux để cho phép một ứng dụng X bình thường khác lo công việc huỷ bỏ lệnh tắt X.


Cập nhật 2 lần. Lần cuối: Tue Aug 08 11:22:15+0011 2017

Tác giả: pclouds | Liên kết tĩnh | Hâm, Linux

Thứ ba, 20 Tháng ba năm 2007 22:16:12 ICT

Gentoo Linux giá bao nhiêu

Trả lời thằng K$ ham tiền: theo tính toán của ohloh.net thì Gentoo Linux giá cỡ 15 triệu đô, gần 1 triệu LOC hoặc 279 person year. Mà thực ra đánh giá này hoàn toàn thiếu chính xác bởi ohloh không kiểm tra được kho lớn nhất của Gentoo: gentoo-x86 (nhiều khả năng lớn gấp mười lần những kho được ohloh kiểm tra). Như phía ohloh thừa nhận, Gentoo là dự án lớn nhất mà ohloh từng gặp nên cũng hơi mệt nếu phải căng máy ra tính. Nếu nhớ không lầm, lần chuyển đổi gentoo-x86 từ CVS qua git cũng mất mấy ngày.


Cập nhật 3 lần. Lần cuối: Tue Aug 08 11:22:15+0011 2017

Tác giả: pclouds | Liên kết tĩnh | Gentoo

Thứ bảy, 17 Tháng ba năm 2007 16:09:31 ICT

Toạ độ thả bom

10 độ 43,8 phút Bắc, 106 độ 39,2 phút Đông (lat 10.7307, lon 106.6533).

Nhắm và bắn, bảo đảm chết. Không chết bắn lại.


Cập nhật 2 lần. Lần cuối: Tue Aug 08 11:22:15+0011 2017

Tác giả: pclouds | Liên kết tĩnh

Thứ ba, 13 Tháng ba năm 2007 19:16:04 ICT

Lẩm cẩm Ồ Ếch Ếch

Ngó cái phân bố Gentoo developer xong lại lẩn thẩn. Không biết có khi nào con số "Vietnamese Gentoo developer" vượt quá số một không ta... Chắc không quá.

Không tính bác langthang vì Cali xa quá.


Cập nhật 2 lần. Lần cuối: Tue Aug 08 11:22:15+0011 2017

Tác giả: pclouds | Liên kết tĩnh | Gentoo, OSS

Chủ nhật, 11 Tháng ba năm 2007 22:11:50 ICT

Đóng chiến dịch Ú: tiêu

Mặc dù Báo cáo Ú hết Tết nghe có vẻ khả quan khi vượt qua được F1. Nhưng softcount.cpp không thể tiêu hoá nổi kết quả của F1. Hậu quả là F2, F3 lần lượt ra đi (F3 chết vì hết đĩa do ... vne2.log.sc-train.3 quá lớn).

Trong một nỗ lực tuyệt vọng chuyển đổi từ double sang long double đã làm cho sc-train crash ở đâu đó sau khoảng 614800 câu. Lỗi là do str1 hay str2 gì đó bị hư. (Dòng in "WARNING: ... Sleft" trong SoftCounter::replay2).

Cùng đường. Bế tắc. Hẹn gặp lại vào ... hổng chừng năm sau.


Cập nhật 2 lần. Lần cuối: Tue Aug 08 11:22:15+0011 2017

Tác giả: pclouds | Liên kết tĩnh | vspell

Thứ năm, 08 Tháng ba năm 2007 22:48:07 ICT

Kinh nghiệm chuyển đổi distro "sống"

Nhân đọc bài Làm gì nếu glibc bị hư? của instcode, nhớ lại một kinh nghiệm khi thay máu hệ thống từ Fedora Core 4 sang Gentoo Linux mà không cần khởi động lại hệ thống.

Việc cài đặt Gentoo ngay trong lòng một distro khác không có gì đáng nói. Cứ tạo một thư mục, cài đặt vào đấy và mount một số thư mục đặc biệt như /dev, /proc ... rồi chroot vào cài tiếp như hướng dẫn trong Sổ tay Gentoo Linux. (Xem thêm hai bài Gentoo trong GentooMô phỏng Gentoo Document Project)

Cái khó ở đây là làm sao gỡ Fedora Core 4 ra và cài đặt Gentoo Linux vào mà không cần khởi động lại để dùng CD bên ngoài. Do đây là thao tác nguy hiểm nên trước tiên là nên tắt hết các service của hệ thống, quay về console. Sau khi quay về console xong, tạo một thư mục mới (giả sử /fc) và lần lượt di chuyển các thư mục cấp một (/bin, /sbin, /usr...) vào trong /fc cũng như di chuyển các thư mục cấp một tương ứng của Gentoo ra thư mục gốc.

Phần đau nhất là khi di chuyển /lib. /lib chứa một số thứ ảnh hưởng đến thời cuộc như libc, libm ld.so. Ngay sau khi di chuyển /lib vào /fc/lib, các ứng dụng trong /bin cũng như /sbin sẽ chết queo. Do bash có rất ít lệnh built-in, mà những lệnh quan trọng như ls, mv, cd... đều nằm trong /bin nên chúng nó chết ngắt. Nếu lúc đó thoát khỏi bash thì coi như hết cửa vào lại luôn. Cứu cánh ở đây là busybox (static build). Nhờ static build, busybox không lệ thuộc vào libc, cũng không cần ld.so vì nó chả liên kết với bất cứ thư viện nào cả. Vậy với lệnh mv từ busybox, có thể chuyển thư mục /lib của Gentoo ra ngoài thư mục gốc. Ngay sau lần chuyển này hệ thống sẽ có thể hoạt động trở lại bình thường.

Phần cuối cùng chỉ là chuyện nhỏ: cài đặt lại grub, kiểm tra lại hệ thống xem an toàn chưa. Sau đó khởi động để vào Gentoo. Nếu hệ thống hoạt động tốt thì xoá luôn /fc.

Có một cách khác để chuyển /lib mà không cần busybox. Tuy nhiên cách này chưa thử. Đây là cách Gentoo sử dụng để nâng cấp các gói phần mềm trong hệ thống:

Chép /lib vào /fc/lib để dành.

Lập danh sách các tập tin bên trong /lib kèm md5sum của nó để kiểm tra lại

ở bước sau.

Tương tự, lập danh sách cho các tập tin trong /lib của Gentoo.

Chép /lib của Gentoo vào /lib ở thư mục gốc, cho chúng nó vô tư đè lên

nhau. Do chép đè chỉ cần một lệnh cp nên không có cái gì chết cả (giai đoạn chết nằm ngay trong khoảng thời gian cp đang chạy).

Đối chiếu hai danh sách đã lập, trích danh sách những tập tin chỉ có trong

/lib của FC4. So sánh lại md5sum luôn cho chắc. Sau đó xoá những tập tin còn lại trong /lib của FC4


Cập nhật 3 lần. Lần cuối: Tue Aug 08 11:22:15+0011 2017

Tác giả: pclouds | Liên kết tĩnh | Gentoo, Linux, Mánh và mẹo

Thứ tư, 07 Tháng ba năm 2007 21:19:55 ICT

Ô chữ Linux Gazette #136

Kết quả ô chữ 135 là… viết sai chữ mosaic. Cái "gave the signal that the Internet was coming" là sputnik (vệ tinh của Nga?). Ngôn ngữ giống C dùng để báo cáo là aer (cần phải kiểm tra cái này). Bởi sai mosaic nên cũng không đoán ra "Snow Crash, neutral interface desk" (có đoán cũng đố có ra). Cái "true when 18D is run" là "offline" (18D là cái quái gì?). Tương tự, ifdown là "opposite of 23A" và tương tự, ifup cho 18D Phần giao tiếp thư mục có thêm "du" ngoài "cd" và "ls". Câu 22 là câu nhảm nhất: viết tắt cho thư mục home là dấu ngã (tilde), có vậy mà nghĩ không ra.

Kết quả số #136 có khá hơn số trước. Bạn instcode (hân hạnh được làm quen) có chỉ cho thêm ba chữ là morse (4), slt (14) và third (12). Ô 12 cũng dễ cáu vì cứ nghĩ triple hay thrice. Sự giúp đỡ quý báu của bạn instcode giúp gợi mở các ô còn lại. Hàng ngang 17 nhiều khả năng là screen (dù đụng hàng với (an)tiquest của ô 15). Kết quả sau cùng là:

  1. gnome/gbt
  2. nih
  3. osi
  4. morse
  5. endless
  6. bbs
  7. apache
  8. cadera
  9. ipmask
  10. bison
  11. (us)bpap
  12. third
  13. (sy)sadm(in)
  14. slt
  15. (an)tiquest nhưng mà bị biến thành “tnquest” vì ô 17
  16. cea (hổng biết cái này)
  17. screen/struts
  18. coding
  19. random
  20. hrs
  21. toa(sters)
  22. squeak
  23. ultra(linux)
  24. rdn (relative DN)
  25. (pico con)sul
  26. uid
  27. ids (đoán)
  28. ether(ape)
  29. has
  30. enk
  31. rds(d)
  32. tnod
  33. srand
  34. sgms
  35. tasks

Cập nhật 3 lần. Lần cuối: Tue Aug 08 11:22:15+0011 2017

Tác giả: pclouds | Liên kết tĩnh | Linux

Thứ ba, 06 Tháng ba năm 2007 21:16:52 ICT

Cross compile với Gentoo

Nói sơ qua về cross-compile. Vào những ngày xa xưa, khi phát triển chương trình thì viết trên máy nào, biên dịch và chạy trên máy đó luôn. Đến khi chương trình tiến bộ hơn một chút thì bắt đầu khoe hàng, viết trên máy này nhưng đem chạy chương trình sang máy khác. Từ đó tách bạch được hai máy: máy dùng để biên dịch và máy dùng để chạy. Bình thường hai máy này giống nhau (cùng họ). Trong trường hợp cross-compile, hay máy này không tương thích với nhau nữa (như máy biên dịch là Linux còn chạy là Windows, hoặc máy biên dịch là x86 trong khi máy chạy là ARM). Cái khó của cross-compile là ở chỗ hầu hết các công đoạn phát triển phần mềm đều sử dụng mô hình "hai máy là một" nên đôi khi có sự nhầm lẫn giữa hai máy nhưng không phát hiện ra. Đến lúc phát hiện ra nhờ cross-compile thì đã muộn, lỗi trở nên cực kỳ khó phát hiện và sửa.

Quay lại Gentoo. Do phương châm của Gentoo là "if it moves, compile it" nên không ngạc nhiên gì khi Gentoo hỗ trợ cross-compile. Mà nói cũng đúng thôi, khi máy chạy là máy loại yếu thì việc dùng máy biên dịch là một máy mạnh hơn để san sẻ công việc là một điều rất hấp dẫn.

Cross-compile bao gồm hai phần: phần toolchain (gcc, binutils, glibc...) và phần ứng dụng thông thường. Biên dịch toolchain luôn nhức đầu ngay cả khi không cross-compile nên Gentoo có một công cụ riêng để hỗ trợ cross-compile toolchain: crossdev (trên thực tế lệnh được dùng là crossdev-stable). Nhiệm vụ của crossdev không nhiều: phát sinh một số ebuild mới cho các gói toolchain và biên dịch tường gói một. Các gói này nằm trong phân loại "cross-...", cũng dễ phân biệt. Gọi crossdev cũng đơn giản, chỉ cần cho nó biết đích đến là gì với tham số -t là nó lo tất tần tật phần việc còn lại. Có thể xác định số phiên bản của gcc, binutils, kernel... nếu cần thiết. Ví dụ trường hợp đơn giản cross-compile cho ARM thì chỉ cần một dòng (và dĩ nhiên kiếm phim gì đó xem trong khi chờ đợi)

crossdev-stable -t arm

Trước kia, phần cross-compile toolchain luôn được coi là phần khó nhất. Và Gentoo đã giải quyết gọn đẹp vấn đề với một lệnh. Đời không suông sẻ thế vì phần khó hơn nhiều lần là cross-compile các ứng dụng.

Việc đơn giản nhất khi cross-compile ứng dụng là cho nó biết nó phải dùng cross-toolchain thay vì toolchain bình thường, thông qua hai biến CHOST và CBUILD nói sau. Việc phức tạp hơn là quá trình biên dịch diễn ra trên một hệ thống hỗn hợp, chứa các tập tin phát triển (.h, .a, .so) của cả "máy biên dịch" và "máy chạy". Ở đây phải nói thêm một chút là "máy biên dịch" là biên dịch cho máy đích. Kết quả của máy biên dịch thì không chạy được, phải chạy trên "máy chạy" nằm ở cái máy vật lý khác. Còn cái "máy chạy" nằm chung với "máy biên dịch" chính là hệ thống Gentoo Linux đang sử dụng. Máy này chỉ dùng để hỗ trợ quá trình biên dịch, không tạo ra kết quả sao cùng nào cả (và nếu có thì vác qua máy kia cũng không chạy được). Mếu chương trình không hỗ trợ cross-compile tốt, nó có thể "dùng nhầm" những thứ trên "máy biên dịch" mà nó cứ tưởng là đồ của "máy chạy". Hậu quả dễ nhận thấy là quá trình biên dịch sẽ thất bại. Nhưng tìm và sửa lỗi thì khó hơn nhiều.

Bởi vì để hai cái "máy" giả đó chung chạ với nhau trên cùng một cái máy thật thì nhức đầu và khó quản lý (chưa kể hai thằng có thể xung đột, dành nhau cùng một chỗ trên hệ tập tin). Vậy nên chắc ăn cứ tách riêng hai thằng cho chúng khỏi đánh nhau. Phần "máy chạy" là máy hệ thống đang dùng nên dĩ nhiên được ưu tiên ở nguyên chỗ cũ. Phần "máy biên dịch" sẽ được đưa toàn bộ vào một thư mục, ví dụ /cc.

Để cài một ứng dụng vào /cc bằng Gentoo, chỉ cần đặt biến ROOT trước khi gọi emerge. Vậy là coi như xong phần đơn giản thứ hai.

Quay về phần đơn giản thứ nhất, CHOST và CBUILD. Như đã nói, có hay cái máy là máy biên dịch và máy chạy. Máy biên dịch chính là CBUILD còn máy chạy là CHOST (và có thể cần đặt cả CTARGET). CBUILD chứa kiến trúc của máy biên dịch (không phải kiến trúc đích mà nó sẽ tạo ra), thường là i686-pc-linux-gnu. CHOST là "máy chạy" sản phẩm. Cách đặt CHOSS/CBUILD khi cross compile toolchain khác chút ít nhưng vì crossdev lo dùm hết rồi nên cũng chả cần quan tâm. Vậy để biên dịch một gói, ta làm đại loại như sau:

ROOT=/cc CBUILD=i686-pc-linux-gnu CHOST=arm-unknown-linux-gnu emerge blah

Lệnh trên chắc chắn không chạy, vì emerge còn cần một số thứ hỗ trợ, như make.conf. Bởi vì không thể sửa /etc/make.conf được (đó là nguồn sống của toàn hệ thống) nên ta tạo /cc/etc/make.conf và chỉ cho emerge biết thông qua biến PORTAGE_CONFIGROOT (chỉ đến /cc). Trong /etc/make.conf cần đặt lại thông số CHOST, ARCHACCEPT_KEYWORDS cho đúng (nếu có tối ưu riêng cho CFLAGSLDFLAGS thì dĩ nhiên cũng phải điều chỉnh lại). Xong chép /etc/make.globals sang /cc/etc và liên kết thư mục của profile tương ứng đến /cc/etc/make.profile như khi cài đặt Gentoo Linux. Đấy, đến đây thì emerge sẽ không khiếu nại um sùm vì thiếu cái này thiếu cái kia nữa. Nhưng ... vẫn không chạy.

Nói rồi, cross compile chả có gì sung sướng cả. Sau khi emerge hả hê chạy thì đến lược gcc làm mình làm mẩy. Nên nhớ là gcc mặc định tìm kiếm các tập tin cần thiết trong những thư mục chuẩn như /lib, /usr/lib/usr/include mà những chỗ đó chứa toàn hàng để biên dịch "máy chạy" chứ không dùng để biên dịch được. Nhào vô đó thế nào cũng có thằng "ok, tao tìm được tập tin .h rồi" để rồi nó lại kêu gào "invalid format" khi liên kết vì, ví dụ, nó phải liên kết một tập tin dành cho ARM với một thư viện của x86. Có thể đặt lại CFLAGS và LDFLAGS để thêm tuỳ chọn -I với -L vào nhưng các thư mục chuẩn ở trên vẫn được ưu tiên đặc biệt và ta thì vẫn cứ đập đầu vào bàn phím. gcc có một tuỳ chọn trong trường hợp này là --sysroot (mặc dù nếu dùng biến môi trường SYSROOT chẳng hạn thì sẽ tốt hơn). --sysroot báo cho gcc biết tìm các thư mục đó trong thư mục xác định bởi --sysroot (ở đây là /cc). Đấy, cuối cùng chúng nó cũng hết cãi nhau vì sai định dạng. Chúng... chết sớm hơn!

Chúng chết sớm hơn nữa (trong giai đoạn configure) là bởi vì gcc và glibc cung cấp một số tập tin .h, .a và .so mà những tập tin đó (giả định đang nhắm đến ARM) vẫn còn nằm trong /usr/arm-unknown-linux-gnu, ngoài tầm ngắm của --sysroot. Cách đơn giản mà hiệu quả là chép y chang toàn bộ nội dung của /usr/arm-unknown-linux-gnu vào trong /cc. Giờ phần configure sẽ phải chạy, và một số gói sẽ biên dịch thành công. Lệnh biên dịch giờ sẽ dài ra thêm:

PORTAGE_CONFIGROOT=/cc ROOT=/cc LDFLAGS="--sysroot /cc" CFLAGS="--sysroot /cc" CBUILD=i686-pc-linux-gnu CHOST=arm-unknown-linux-gnu emerge blah

Chuyện vẫn chưa hết (đời mà). Sẽ có một số gói gặp trường hợp hết sức trớ trêu: lệnh biên dịch chỉ thẳng ra thư viện cần liên kết bằng đường dẫn tuyệt đối, ví dụ /usr/lib/libjpeg.so, chứ không dùng -ljpeg. Đúng ra lệnh "gốc" vẫn dùng -ljpeg nhưng "nhờ" libtool và mấy tập tin .la của nó nên nó chuyển -ljpeg thành cái dòng dài thoòng kia. Cách sửa dễ ợt: xoá hết các tập tin .la trong /cc! Mạnh tay hơn nữa là đặt luôn INSTALL_MASK là *.la cho chúng chết hết.

Vậy đến thời điểm này coi như ta có thể ung dung ngồi... tìm lỗi cross-compile trong các gói phần mềm. Đôi khi sẽ có một số ứng dụng đòi cài gcc hoặc binutils gì đó vì trong /cc không có mấy gói đó (chúng sống ở hệ thống bên ngoài). Dễ nhất là cứ tống mấy cái đó vào package.provided. Êm chuyện.

Kết thúc là một liên kết tham khảo: Gentoo Cross Development Guide


Cập nhật 3 lần. Lần cuối: Tue Aug 08 11:22:15+0011 2017

Tác giả: pclouds | Liên kết tĩnh | Gentoo, Mánh và mẹo

Thứ năm, 01 Tháng ba năm 2007 23:14:23 ICT

Điểm tin Git đầu năm

Tình hình là bắt đầu lạc hậu tin tức Git. Có một số cái mới sau ngày Git 1.5.0 ra mắt:

  • Công cụ để phát sinh GNU ChangeLog từ Git log
  • Định dạng pack phiên bản 4 hứa hẹn nhanh hơn, nhỏ hơn, vân vân và vân vân
  • "Git Attributes", tương ứng với property trong Subversion
  • Nhờ Git attributes nên sẽ có thêm hỗ trợ chuyển đổi CR/LF
  • "Li khai" một git repository phụ thuộc khỏi alternative repository của nó
  • Git diff hai tập tin bất kỳ (cho dù không quản lý bằng Git)
  • Mingw port vẫn tiến đều
  • git-bundle (hình như cái này có nói lúc Git tiền-1.5.0 thì phải)

Chiều hướng phát triển cho thấy Git ngày càng bớt bảo thủ hơn.


Cập nhật 2 lần. Lần cuối: Tue Aug 08 11:22:15+0011 2017

Tác giả: pclouds | Liên kết tĩnh | Git

Thứ năm, 01 Tháng ba năm 2007 21:50:14 ICT

Một tí hàn lâm - những thành tựu toán học gần đây

Thành tựu gần đây nhất: chứng minh Poincaré conjecture, bài toán được đặt ra cách đây một thế kỷ. (Đọc hiểu được chết liền, dù chỉ để hiểu bài toán đó nói về cái gì thôi). Có khá nhiều bàn tán về cách thức công nhận thành quả này. Tác giả Grigori Perelman có một câu nói hơn bị hay, rằng phần thưởng "was irrelevant for me. Everybody understood that if the proof is correct then no other recognition is needed".

Thành tựu "cũ" hơn tí: chứng minh định lý cuối cùng của Fermat, ra đời cách đây cỡ ba thế kỷ rưỡi.

Xa hơn một tí có một chứng minh nói rằng "in any mathematical system that includes the integers, there are true statements that cannot be proved" (tuyệt vời!)

Những thành quả khác gần đây thì xem trên wikipediawikipedia.

Nói chung là... hết biết nói gì. Tiếp tục sự nghiệp cày vĩ đại, cao cả và đầy vinh quang.

Ngoài lề, vừa nhận ra đề tài "Hâm" có bài quanh năm trừ tháng tư và tháng năm. Tại sao lại không hâm vào hai tháng đó nhỉ?


Cập nhật 2 lần. Lần cuối: Tue Aug 08 11:22:15+0011 2017

Tác giả: pclouds | Liên kết tĩnh | Hâm