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
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
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
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
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
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
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
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 Gentoo và
Mô 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 và 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
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à:
- gnome/gbt
- nih
- osi
- morse
- endless
- bbs
- apache
- cadera
- ipmask
- bison
- (us)bpap
- third
- (sy)sadm(in)
- slt
- (an)tiquest nhưng mà bị biến thành “tnquest” vì ô 17
- cea (hổng biết cái này)
- screen/struts
- coding
- random
- hrs
- toa(sters)
- squeak
- ultra(linux)
- rdn (relative DN)
- (pico con)sul
- uid
- ids (đoán)
- ether(ape)
- has
- enk
- rds(d)
- tnod
- srand
- sgms
- tasks
Cập nhật 3 lần. Lần cuối: Tue Aug 08 11:22:15+0011 2017
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
, ARCH
và
ACCEPT_KEYWORDS
cho đúng (nếu có tối ưu riêng cho CFLAGS
và
LDFLAGS
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
và /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
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
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 wikipedia và wikipedia.
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