Li-Wen Hsu’s Blog

June 29th, 2007

Tools

It is impossible to sharpen a pencil with a blunt ax. It is equally vain to try to do it with ten blunt axes instead.
Edsger W. Dijkstra

Dijkstra 資工系的同學一定都不陌生,講到最短路徑問題,一定都會提到他的 Dijkstra’s algorithm
還有 Floyd–Warshall algorithm。當然,Bellman-Ford algorithm 也很重要,
因為在 Dijkstra 的方法中,不允許負邊存在。
(上面的「陌生」要擺個 link 到國語辭典去的原因是,原來我已經廢到連是那個「陌」都想不起來了…)

dds@ (Diomidis D. Spinellis) 的 blog 看到這篇 The Tools we Use [1]

dds@ 是 Code Quality: The Open Source PerspectiveCode Reading: The Open Source Perspective 的作者,
看起來都是相當值得一讀的好書。
Code Reading 好不容易排隊借了回來,但是只看完第一章就一直丟在旁邊了。
今天發現後面又有人預約,看來又要重新排一次隊了…
而 Code Quality 這本在我連推薦了三次之後,我們的浩然終於在六月20日發訂了…
(隔壁王水大圖書館早在四月24日發訂了,但是是過了兩個月還是在發訂中…照這樣的處理速度…民國那一年才會看到書阿 @_@
真讓人有點想就敗下去了…Code Quality, Code Reading,必竟也好久沒有買書了,把錢花在這也比買糟糕物好得多。)

說了這麼多不太相關的東西,來談談 dds@ 的這篇文章吧,
首先他拿出了一張圓餅圖,展示了在 FreeBSD ports 裡面的軟體要 build 起來需要用那些工具,還有執行多久。
原來之前他在 -arch@-hackers@ 討論關於 Process accounting changes
acct(5) 的精確度從 15ms 調到 1ms 是是為了要做這個實驗阿(當然也有可能是相反過來,做完了這個以後才想找個東西來實測看看。
不過我相信,任何 work 都會有他的動機在,就算是 just for fun,也是很棒的阿! :-)

第二段的一句相當有意思:

Using a shiny IDE on top of 1970’s technologies is equivalent to wearing an iPod while ox-ploughing: the work becomes less burdensome, but we’re unlikely to reap substantial productivity improvements from such a change.

所以在後面他說只有把 abstraction 的程度提高,才是真正增加生產力的方法。

在文中他也提到了 C++ compiler 平均一次執行的時間是 1.6s,遠比 C 的 0.17s 多,代表了隨著技術的進步,
電腦和人腦的 trade off 越來越不平衡。也就是說,人可以越來越懶?或著是說,人可以把更多的心思花在更深層的思考上,
旁枝末節的苦工,就交給電腦去做吧。就像唐鳳說過的「大巧不工」— 「最巧妙的程式,就是不用寫程式的程式」。
所以 Perl 像強力膠一樣把 CPAN 黏在一起,而大家也像是吸了強力膠一樣,為 perl 深深著迷。

dds@ 說:

However, nowadays CPU power is a resource a) we can afford to use and b) we can’t afford not to use.

其實我們的聖杯戰爭也一樣,人腦強的是 symbolic reasoning 的能力,
歸納出方法之後,交由電腦的 concrete execution 去完成我們想的工作。這也是電腦科學中,演算法令人著迷的地方。
(為什麼我會想到求婚大作戰中那個妖精說的:「祈願吧,說出來我就替你實現!」呢?哈利露亞~thesis~ XD)

上過 Compiler 課的同學應該都聽老師講過這個故事:

Two success stories of the 1970s that raised the level of abstraction for a specific domain were Stephen Johnson’s parser generator yacc, and Michael Lesk’s lexical analyzer generator lex. Together these two tools and the theory behind them transformed the task of writing a compiler from wizardry into a standard rite of passage for computer science undergraduates.

yacc 和 lex 就是 abstraction 提高生產力最好的例子。

另外這也道出了,科學家和工程師另人著迷的地方,就是讓不可能成為可能,最後變成我們生活的一部份。
Google 說的 R==D 這種態度才是對的阿!)

最後,每次提到 tools 相關的東西,就一定會想到 gugod 的 talk: 利器善事。這是 OSDC.tw 2006 中,我最喜歡的一場。那句結語令我印象深刻:(沒錯,我又忘了是那個「象」了…)

Teach your tools to teach you to do the right thing.

說了這麼多(而且覺得好亂好沒內容 @@…) 還是乖乖回去造我的輪子吧…


[1] Diomidis Spinellis. The Tools we Use. IEEE Software, 24(4):20–21, July/August 2007

Filed under: Murmuring, Research, Computer, Programming — lwhsu @ 06:27

May 6th, 2007

FreeBSD Anonymous CVS over SSH Setup

什麼是 Anonymous CVS? OpenBSDOpenBSD AnonCVS 有很詳細的說明。
一般使用 anonymous CVS 的方法有兩種,pserver 和 over ssh,pserver 設定很簡單,照官方文件來就好;
而 over ssh 的會牽涉到 chroot(2) 的東西,比較複雜一點。
(我也在思考是否可以用 ~/.ssh/authorized_keys 裡的設定來達到這個效果,但是還沒有試出來,目前先能動就好)
OpenBSD 也提供一個 wrapper: http://www.openbsd.org/anoncvs.shar
解開來以後,照裡面的文件就可以將自己的 Anonymous CVS server 弄起來
FreeBSD 的 wrapper (ftp://ftp.freebsd.org/pub/FreeBSD/development/FreeBSD-CVS/anoncvs.shar)
基本上是從 OpenBSD 的 wrapper 改來的。

有趣的是,我們可以 dig 到 ftp.freebsd.org 有兩筆 A Record:

ftp.freebsd.org. 180 IN A 62.243.72.50
ftp.freebsd.org. 180 IN A 204.152.184.73

但是實際連進去看的時後,會發現只有 204.152.184.73 這台機器有 pub/FreeBSD/development/FreeBSD-CVS/anoncvs.shar
(喂喂… data 要保持 consistency 阿)

可惜的是,這兩份文件都已經過時,照上面的方法,是完全弄不起來的。連 anoncvssh.c 都沒辦法 compile。
麻煩的事情總是會大量消耗人體 CPU time,所以照 sched_hll(4) 的原則,這個 job 的 priority 就越來越低了….
(sched_hll — How Lazy Lwhsu Scheduler,請別相信我的鬼話…XD)
直到昨天晚上因為被雨困在實驗室,才再把這東西搞定。

  1. 首先,你要有一個正常 work 的 cvs mirror,這個在 Mirroring FreeBSDHow to Mirror FreeBSD 章節裡面說過了,本文不再贅述。以下假設你的 cvs mirror data 放在 /home/ncvs 下。
  2. 因為要用 ssh,為了要讓 anoncvs 可以不用密碼,我們要對系統預設的 ssh(8) 做些設定上的修改:
    /etc/ssh/sshd_config:

    PermitEmptyPasswords yes

    /etc/pam.d/sshd:

    auth required pam_unix.so no_warn try_first_pass nullok

    重新起動 sshd

    # /etc/rc.d/sshd restart

  3. vipw,加入 anoncvs 這個 user:

    anoncvs::32766:32766::0:0:Anonymous CVS User:/home/anoncvs:/home/anoncvs/anoncvssh

    當然別忘了,mkdir -p /home/anoncvs
    至於 group 的部份,加不加就沒那麼重要了。

    anoncvs:*:32766:

  4. 我改了一個 anoncvssh.c
    (希望不要有什麼問題,寫 setuid(2) 的程式總是叫人心驚膽顫,尤其這個還是要 setuid root 的 @_@)
    compile 好之後,放到 /home/anoncvs/anoncvssh ,並且將之 setuid root。
  5. 建立起必要的目錄和檔案,設定權限:

    # cd /home/anoncvs
    # touch .hushlogin .profile

    /home/anoncvs/.plan 放下面的東西:(不弄也不會怎樣)

    To use anonymous CVS in doing CVS operations on your local machine,
    first make sure you’re running a reasonably up-to-date copy of CVS
    (FreeBSD 2.2.5 or later) and then set the environment variable
    “CVSROOT” to anoncvs@anoncvs.tw.FreeBSD.org:/home/ncvs as follows:

    csh:

    setenv CVSROOT anoncvs@anoncvs.tw.FreeBSD.org:/home/ncvs

    sh/bash/ksh:

    CVSROOT=anoncvs@anoncvs.tw.FreeBSD.org:/home/ncvs
    export CVSROOT

    Then run your cvs commands as normal.

    建目錄們

    # mkdir -p home/ncvs lib libexec tmp usr/{bin,lib}
    # chown anoncvs tmp

    tmp 是為了給 cvs server 寫暫存檔用的,其他的目錄還是給 root:wheel 好

  6. 一定要有 ld-elf.so.1,不然什麼東西都不會動啦 XD

    # cp /libexec/ld-elf.so.1 /home/anoncvs/libexec/ld-elf.so.1

    usr/libexec 下的是個 symbolic link

    # ln -s /libexec/ld-elf.so.1

    chroot 以後會變成指到 /home/anoncvs/libexec/ld-elf.so.1 的。

  7. cvs 一定要搬過來:

    # cp /usr/bin/cvs /home/anoncvs/usr/bin

    看看 cvs 要什麼東西:

    $ ldd /usr/bin/cvs

    然後 /lib 的 cp 到 /home/anoncvs/lib 下,本來在 /usr/lib 的 cp 到 /home/anoncvs/usr/lib 下。

  8. 如果覺得上兩步很煩,丟個 static linked 的 cvs 到 /home/anoncvs/usr/bin 下我想應該也是可以的。

  9. 弄了這麼多,重要的就是這一步,要有東西給人家 check out :

    # mount_nullfs -o ro,noatime /home/ncvs /home/anoncvs/home/ncvs/

    還有為了要有 /dev/null :

    # mount_devfs devfs /home/anoncvs/dev/

    (沒有 devfs,mknod 造出來的 null device 不會動…)

  10. 大功告成,換台機器

    $ cvs -d anoncvs@xxx.xxx.xxx.xxx co <module>

    試試看結果吧。

Filed under: FreeBSD — lwhsu @ 09:09

May 4th, 2007

Ports Tree Frozen for Xorg 7.2 merge

故事是從這邊開始的:kris 昨天寫了一篇 HEADS UP: xorg upgrade plans
X11R7.2 終於要進 official ports tree 啦

今天早上, marcus 就把 ports repository 的 avail 改了,Ports Freeze 正式開始!

上面那些只是為了方便以後回來翻的 XD
最好笑的是在 #bsdports 上面的這句:

12:35 < @GeJ> Did someone send an email to miwi? I mean, I’m worried about his health. god knows what may happen if the guy doesn’t have his 80+ daily commits.

這個情形大概會持續好幾個星期吧(雖然 Guide 上面說通常是一到兩週,不過我覺得這次時間應該不會比以往 Release cycle 的時間短…必竟這次還要加個大怪物進去,不像以前只是要修 package building fail 的,不是那種實在不行就 mark broken 就好 XD)
所以,這段時間就乖乖地來寫論文好了…(應該會吧?)
(阿之前吃的一堆 PR 該怎麼辦呢?就…就…就先放著吧)
算算也差不多是是當上 Committer 滿月的日子 XD 順便把學到的東西記錄一下好了。

Fresh Ports Committer 的四個基本作業 :

  • Add a new port
  • 東西先丟到目的 category 下,像是 textproc

    Tools/scripts/addport -n -a -l 111267 -d py-hyperestraier-python

    一樣先把東西丟到目的 category 下,這次是 security
    不一樣的是, -l 後面要用 -1,代表沒有 PR

    Tools/scripts/addport -a -l -1 -d py-gnutls

    參考資料:clsung (mentor) 當年的筆記 [ports] add new port

  • Removing an Existing Port
  • 這也有寫好的 script 可以用,但是用別人寫的 script 總是怕怕的,這玩易兒為什麼老是要去把 ports repository 裡面所有東西都 check out 出來才甘心阿 @_@ (雖然也都被我 cancel 掉就是了…)

    ~/cvsroot/ports 下,其實也不一定要在這邊做啦…

    Tools/scripts/rmport devel/crossgo32 devel/crossgo32-djgpp2 devel/crossgo32-djgpp2-pdcurses

    然後寫寫 MOVED,寫寫 commit log 就可以送出拉。(現在到了真正要 ci 的時候還是會有點怕怕的…)

  • Repository Copies
    這個其實不難,大意就是把皮球踢給 portmgr XD
    詳情看 Committer’s Guide 裡面 Repository Copies 的部份
    步驟簡單整理如下:

    1. change State 為 repocopy 還有 change Responsible 為 portmgr
    2. 記得要在 Why: 那邊寫清楚要把什麼 copy 到那邊去,不然會被 portmgr 罵 @_@

    3. portmgr 做完之後就會被 assign 回來,這時候裡面的東西除了檔名以外都是舊的,所以就像平常一樣快快樂樂 update 就好 :D
    4. 其它地方的東西該改的改一改,這次就差點忘了要去加 lang/Makefile 裡面的 SUBDIR,還有 CVSROOT 裡面的 modules
    5. 還好是在 Ports Tree Frozen 之前想起來,不然到時候還要找 portmgr Approve 事情就複雜了…

    作業成果:ports/112223: [NEW PORT] lang/gnat-gcc42
    注意到了嗎?Responsible Changed 裡面有個 :

    lwshu->lwhsu

    我在 Big5 的世界會因為許的關係受到很多不公平的對待…想不到 ASCII 的世界也對我不好阿…
    之前 gnn 在 irc 上面也是把我名字叫錯好幾次…Orz
    (不過學到了一句話 “blames his keyboard” XD)

  • Regular port update
  • 這就沒有什麼太多好說了,大概做的事和以前做得差不多,反正就是改改改,tinderbox testing,過了就 ci,porttools 很好用,請多愛用。That’s all.
    阿對了,還有也可以處理別人的 PR,tinderbox testing 不過就退稿 XD

大致上就是這些工作啦,Mk/ 下面的東西,小朋友沒事不要亂動。據說新手要等到那天把 ports INDEX break 了才可以從 mentorship 裡面被放出來…大概就跟拔到獅子的鬃毛就會長頭髮的道理一樣吧 XD

References:

Filed under: FreeBSD — lwhsu @ 23:10

October 11th, 2006

Resource Limits

剛剛, 商業團體的 ieon (在msn) 還有 far (在 IRC) 問,
有沒有辦法限一個 process 的 resource limits

直覺上是用 limits 限單一 user,從 /etc/login.conf 也是差不多,
要執行程式前用個 wrapper 把 process 變成受限的 user
這樣的解法感覺上不是相當漂亮。

IRC 上,mhsin 提到了 setrlimit(2) 然後也是用 wrap 的方法,
不過 kcwu 說,用 limits(1) 就可以
(果然 manpage 要多看,我一直以為 limits 是要設 global value 的…)

不過這個方法是限,cpu time,也就是 top(1) 時看到的 TIME 那欄

我比較好奇的是,有沒有限 WCPU (weighted cpu percentage) 的方法?

之前 openfoundry 那邊用 jail 也是有 resouce limits 的問題,
就是關於 WCPU 的部份 (似乎是 moztw.org 造成的問題 XD)
這在今年的 SoC 有了初步的成果:

而作者(Chris Jones)在 FreeBSD WikiJailResourceLimits 提到:

This system does not prevent a jailed process from monopolizing the CPU when there are no other runnable processes; rather, it only prevents a jail from using more CPU time than its share if there are other jailed processes (in which case they will tend to share CPU time in proportion to their respective CPU share allocations).

雖然不能限制單一 process 占據整個 cpu, 不過一想, 整台電腦就只有他在吃cpu時,
就給他吃嘛 :)

Filed under: FreeBSD, OS, Computer — lwhsu @ 02:43

September 27th, 2006

Programming 的熱血

大家常說,寫 code 就是要熱血阿!
有熱血的話,不知道可以造就多少「車庫傳奇」
不過要怎麼激起大家的熱血呢?

最近 Lab 大家忙著在 implement 一個東西,所以我就架起了 Subversion & Trac
想說讓大家體驗一下用 Version Control System 和 Issue Tracker
突然發現,大家會因為 revision 的編號越來越大而感到興奮 (?)
然後就很熱血的 coding, committing, 連 debugging 都覺得好玩多了!
現在 Lab 裡大家不是在喊說要打三國(好像是魔獸世界的東西…)
而是喊說:

今天一定要關掉這個 ticket!

或是

離 milestone due 還有 XX hr, 大家拼阿!

然後大家沒事的時候,就寫寫 Wiki, 開些 Ticket, 設設 Milestone, 看每天的 Timeline 都有好多東西,
真棒 :)
想不到,這些東西對於專案管理還有「激勵人心」的作用,以後一定要更大力的推廣啦 XD

BTW, 不知道老師看到這東西以後,會不會一夜之間多出一堆待解 issue 還有 milestone…
(更糟的是,還 assign 好 responsible 了…)

Filed under: Research, Software Enginnering, SQLab, Computer, Programming, Diary — lwhsu @ 00:39
Next Page »

Powered by WordPress