注: 実際に噛まれたわけではない
プログラムからその意味への関数を考えて、その関数を微分するとどうなるだろう?
それは拡張性を意味したりしないだろうか。
つまり、プログラムの小さな変更で意味が大きく変更できると微分は大きくなるはずだ、とか。
もちろん、行いたい変更にたいするところが重要なのであるが。
http://www.tdiary.org/20061210.html ということなので対応する。
Binary 2.0カンファレンス 2006 で話してきた。
ネタと発表時間があっていなかった。
最初は Ruby 側の workaround まで入れようと思ったのだが、ざっと書いた段階で 36枚になってしまい、gcc の変化につながる流れだけに絞った。それでも時間はオーバー気味だった感じである。
workaround のほうが笑える話になるとは思うのだが、問題自体を説明しないのもなんだし。
「楽々 ERD レッスン」を読む。
「諸般の事情でスライド6枚」 という件について考えてみる。
この「諸般の事情」なる制約は、立方体の面の数からきている。
したがって、まず考えられるのが、将来、ディスプレイおよびプロジェクタが正三角形に発展するという可能性である。そうなれば正二十面体により、スライド20枚が可能になる。
また、四角形から三角形になるのは数が減っていて発展とはいえないとすれば、五角形ということも考えられる。そうだとすれば、正12面体により、スライド12枚が可能であろう。
しかし、四角形以外になるのは現実的でないという意見もあるかもしれない。
そこで、正多面体以外の多面体を検討してみた。具体的には Wikipedia の図形の一覧 から、3次元の図形を眺めてみた、ということである。
まず使えそうなのが、斜方立方八面体である。正方形が18枚で、スライド18枚である。しかし、正三角形が8枚まざっているので、純粋さに欠けるという意見があるかもしれない。
その場合、菱形十二面体はどうであろうか。これであれば、菱形が12枚で、純粋である。しかし、菱形はプロジェクタの形にはあわないという意見があるかもしれない。
では、凧形二十四面体はどうであろうか。凧型もプロジェクタの形にあわないではないかという人もいるかもしれない。しかし、ここで、スライドが3次元空間に配置されていることを思い出してほしい。3次元空間を 2次元に投影した場合、遠近法により像が歪む。近い点は画面の中心から離れ、遠い点は中心に寄る。したがって、適切な距離と方向に配置すれば、凧型を正方形に投影することは可能であろう。(たぶん)
というわけで、凧形二十四面体による、スライド24枚はどうであろうか。
tdiary を snapshot (2.1.4.20061210) に upgrade する。
tdiary を新しくして、code plugin も新しいのが動くようになったので、新しくする。
binutils-2.16.1/COPYING:1
1: GNU GENERAL PUBLIC LICENSE
binutils-2.16.1/COPYING:2
2: Version 2, June 1991
invalid citation on line 2: Version 2, June 1992
https://www.codeblog.org/planet/
んー、https は参照できないのか?
ローカルファイルは参照できるからそっちでできるか。
binutils-2.16.1/COPYING:3
3:
line1 line2
いれてみた。
debian な管理を無視して適当にいれたので、qwik のパッケージを入れ直すと消えるかも。
新しいパッケージには始めから入っている (と思う) ので、バージョンアップであれば問題ないのではないかという気もする。仕様が変わっていなければ。
鴨志田さんの発表 に名前が出ていた Succinct Data Structure を調べる。
集合について理解するのは難しくない。
wavelet tree はしばらく考える必要があったが、理解できた気がする。
ぬぅ、月例会を完全に忘れていた。
今日、主査会のあとで話題になった、2G 以上のメモリを確保できるかどうか、というのを試してみた。
% cat t.c #include <stdlib.h> #include <stdio.h> int main() { size_t s = 2.7 * 1024 * 1024 * 1024; void *p = malloc(s); if (p == NULL) { perror("malloc"); exit(1); } printf("%p\n", p); printf("%p\n", (char*)p + s); return 0; } % gcc t.c % ./a.out 0xb184008 0xb7e50cd4
というわけで、できました。
むろん、32bit である。
% uname -srm Linux 2.6.17.11 i686
これができるのは、カーネルがアドレス空間の半分は占めていない、ということによる。
さて、とすると、ptrdiff_t が疑問である。
% cat t.c #include <stdlib.h> #include <stdio.h> #include <stddef.h> int main() { size_t s = 2.7 * 1024 * 1024 * 1024; void *p = malloc(s); void *p2; ptrdiff_t d; if (p == NULL) { perror("malloc"); exit(1); } printf("%p\n", p); p2 = (char*)p + s; printf("%p\n", p2); d = (char*)p2-(char*)p; printf("%d\n", sizeof(d)); printf("%ld\n", d); return 0; } % gcc t.c % ./a.out 0xb14a008 0xb7e16cd4 4 -1395864372
うぅむ。やはり ptrdiff_t は 32bit で、この 2.7G 確保したものの両端の差を表現できない。
どうせ、ssize_t も同様であろう。
Succinct Data Structure に限らないが、前処理を必要とする高速化アルゴリズムというのは扱いが難しい
前処理のコストがかかるので、どんな場合でも自動的に適用する、というわけにはいかない
もちろん、事前にその高速化が必要であることがわかっていて、最初っからそれを使うと決めてプログラムを書く場合には大きな問題はない
しかし、後から遅いことがわかったとか、あるいは機能拡張にともなって高速化が必要になったとか、既存のプログラムを高速化しようとしたときにはそう簡単にはいかない
既存のプログラムを高速化する場合、前処理の結果として生成される補助データをどこに格納するかという点が問題になる。すぐに考えられる可能性としては2つあり、それぞれに利点・欠点がある
また、補助データの寿命の問題については共通する問題がある
「プログラムを書き換えなければならない」というのはとてもいやな欠点である。高速化のためだけに、高速化には直接関係のない箇所まで変更するのは避けたい。変更してプログラムが壊れてしまってそれを直すのは徒労である
とはいえ、グローバルなハッシュもいろいろと欠点がある
では、もっとマシなやりかたを可能にする言語機構としてはどんなものが考えられるか?
Debian で、各パッケージとシェルスクリプトの数とサイズをはかってみる。
#!/bin/sh # パッケージのリストを求める if [ ! -f out/a.pkgs ]; then dpkg -l | tail -n +6 |awk '{ print $2 }' > out/a.pkgs fi # パッケージごとに実行ファイルの内容を file で調べる for pkg in `cat out/a.pkgs` do if [ ! -f out/b.$pkg ]; then dpkg -L $pkg | ruby -ne 'f = $_.chomp; print if File.executable?(f) && File.file?(f)' | xargs file /dev/null |grep -v '^/dev/null:' > out/b.$pkg fi done # パッケージごとにシェルスクリプトをリストアップする for pkg in `cat out/a.pkgs` do if [ ! -f out/c.$pkg ]; then grep '\<shell\>' out/b.$pkg | sed 's/:.*//' > out/c.$pkg fi done # シェルスクリプトの数をパッケージごとに数えてソートする if [ ! -f out/d.wc ]; then LANG=C wc -l out/c.*|sort |grep -v ' total$' > out/d.wc fi # シェルスクリプトの数と合計サイズを調べる if [ ! -f out/e.size ]; then ruby -e ' File.foreach("out/d.wc") {|numfile_filename| numfile, filename = numfile_filename.split pkg = filename.sub(/^.*?\./, "") s = 0 File.foreach(filename) {|l| s += File.size(l.chomp.sub(/:.*/, "")) } puts "#{pkg}\t#{numfile}\t#{s}\n" } ' |sort -n -k +3 > out/e.size fi
で、結果のうちシェルスクリプトを含むものは以下のようになる。
xdg-utils 7 151357 gettext 13 126227
autotools-dev 3 79069 grub 10 71310 automake1.9 11 65785 dpatch 6 55602 metamail 14 54261 initscripts 28 53766 makedev 2 53374 ucf 3 50865 psgml 5 49128 alsa-utils 4 46688 ispell 4 44994 exim4-base 11 44358 udev 17 38419 xbase-clients 7 36121 pcmcia-cs 11 34745
openoffice.org-common 11 34104 system-tools-backends 1 31228 hibernate 3 29790 texinfo 2 29239 console-tools 6 28512 exim4-config 5 27567 initramfs-tools 13 27552 gzip 10 26558 netcat 12 26202 emacs21-bin-common 3 25276 hal 22 25214 libc6 5 25139 ppp 18 24496 dselect 6 24247 debianutils 8 23730 bzip2 8 22608 acpi-support 72 22586 cvs 3 22452 xutils 10 20227 gdm 8 19446 resolvconf 10 19039 sysv-rc 3 18828 xresprobe 6 17792 gcc-4.1 1 16283 xfonts-utils 4 15793 xutils-dev 7 15349 gs-common 29 14557 x11-common 2 14537 alsa-base 6 13886 im-switch 1 13868 autoconf 1 13409 dpkg-dev 2 12901 po-debconf 2 12633 apt 5 12101 apache2-common 7 12025 hyperestraier 8 11659 hdparm 2 11433 util-linux 2 9918 gnome-doc-utils 1 9497 findutils 2 9112 firefox 2 8550 console-common 3 8421 pppconfig 3 7378 mtools 6 7230 bash 1 6870 nfs-common 2 6861 dhcp-client 1 6705 less 1 6507 groff-base 4 6394 discover1 3 6377 fakeroot 2 6150 gnupg 3 6019 procmail 1 5859 cupsys 5 5745 apmd 3 5470 apel 2 5190 cron 3 5173 scrollkeeper 8 4969 gettext-base 1 4607 sysklogd 3 4436 xterm 3 4402 openssl 5 4251 rsync 1 4096 installation-report 3 4060 vim-runtime 6 3932 sharutils 2 3875 bsdmainutils 2 3871 ssl-cert 1 3830 nvi 2 3785 gs-esp 2 3778 avahi-daemon 1 3776 graphviz 2 3632 xserver-xorg-core 1 3573 ifupdown 2 3564 gnomemeeting 1 3485 wireless-tools 2 3277 gnupg2 1 3126 xml-core 3 3090 bin86 1 2910 tcl8.4 1 2856 bittorrent 1 2803 java-common 1 2769 dbus 1 2760 anacron 5 2726 openssh-client 2 2723 sgml-base 3 2578 dictionaries-common 2 2558 docbook-to-man 1 2521 tasksel 5 2473 netbase 1 2432 gnome-session 1 2418 menu 1 2404 tasksel-data 2 2369 pcmciautils 1 2350 modutils 6 2291 libgcj-common 2 2288 acpid 2 2248 hotkey-setup 1 2245 inkscape 8 2157 anthy 1 2152 localization-config 4 2146 foomatic-db-engine 1 2136 ca-certificates 1 2117 uswsusp 2 2068 openbsd-inetd 1 1948 libgtk2.0-0 2 1946 coreutils 1 1931 gdb 1 1923 module-init-tools 2 1904 openssh-server 1 1891 libsane 2 1864 defoma 2 1812 tdiary-mode 2 1790 emacsen-common 2 1790 powermgmt-base 1 1697 cpufrequtils 1 1671 migemo 2 1660 lpr 2 1573 scim 2 1529 portmap 1 1525 man-db 2 1466 e2fsprogs 2 1430 klogd 1 1375 gaim 2 1375 locales 1 1305 update-notifier 2 1298 python-central 3 1207 libvte4 3 1203 unzip 1 1188
linux-image-2.6.17-2-486 1 1156 gksu 1 1136 reportbug 1 1121 at 2 1121 pciutils 1 1112 xpdf-reader 2 1111 procps 1 997 liferea 2 994 laptop-detect 1 980 libhsqldb-java 5 979 ntpdate 2 969 mime-support 3 892 gcc 2 879 passwd 1 875 apache2-utils 1 760 usbutils 1 676 base-files 1 641 xpdf-common 1 628 exim4-daemon-light 1 551 exim4 1 551 sysvinit 1 541 sudo 1 541 xserver-xorg-input-wacom 1 499 gnome-volume-manager 1 439 libdevmapper1.02 1 417 bsh 2 347 aptitude 1 314 tar 1 268 i810switch 1 258 libgphoto2-2 1 249 discover1-data 1 226 python-support 3 219 python2.4 1 195 python2.3 1 195 logrotate 2 187 python-gnome2 1 172 perl 1 125 mutt 1 108 zsh 1 97 grep 3 96 openoffice.org-impress 1 64 openoffice.org-writer 1 63 openoffice.org-math 1 61 openoffice.org-draw 1 61 openoffice.org-calc 1 61 openoffice.org-base 1 61 gparted 1 55 bison 1 39
合計サイズが一番大きいのは xdg-utils で、ファイル数が一番多いのは acpi-support である。
xdg-utils 7 151357
acpi-support 72 22586
xdg-utils はなんでそんなに大きいのかとおもって調べてみると、コマンド自体をシェルスクリプトで書いてある模様。うぅむ。
-rwxr-xr-x 1 root root 14804 2006-10-23 04:36 /usr/bin/xdg-desktop-icon -rwxr-xr-x 1 root root 39026 2006-10-23 04:36 /usr/bin/xdg-desktop-menu -rwxr-xr-x 1 root root 16313 2006-10-23 04:36 /usr/bin/xdg-email -rwxr-xr-x 1 root root 24146 2006-10-23 04:36 /usr/bin/xdg-icon-resource -rwxr-xr-x 1 root root 28013 2006-10-23 04:36 /usr/bin/xdg-mime -rwxr-xr-x 1 root root 10027 2006-10-23 04:36 /usr/bin/xdg-open -rwxr-xr-x 1 root root 19028 2006-10-23 04:36 /usr/bin/xdg-screensaver
acpi-support はなんでそんなに多いのかとおもって調べてみると、/etc/acpi 下にデバイス別にファイルがある模様。これはべつに悪くない。
-rwxr-xr-x 1 root root 270 2006-08-20 18:41 /etc/acpi/asus-touchpad.sh -rwxr-xr-x 1 root root 203 2006-08-20 18:41 /etc/acpi/asus-wireless.sh -rwxr-xr-x 1 root root 78 2006-08-20 18:41 /etc/acpi/batterybtn.sh -rwxr-xr-x 1 root root 78 2006-08-20 18:41 /etc/acpi/ejectbtn.sh -rwxr-xr-x 1 root root 761 2006-10-23 02:16 /etc/acpi/hibernate.sh -rwxr-xr-x 1 root root 79 2006-08-20 18:41 /etc/acpi/hibernatebtn.sh -rwxr-xr-x 1 root root 310 2006-08-20 18:41 /etc/acpi/ibm-wireless.sh -rwxr-xr-x 1 root root 1191 2006-08-20 18:41 /etc/acpi/lid.sh -rwxr-xr-x 1 root root 77 2006-08-20 18:41 /etc/acpi/lockbtn.sh -rwxr-xr-x 1 root root 217 2006-08-20 18:41 /etc/acpi/mailbtn.sh -rwxr-xr-x 1 root root 76 2006-08-20 18:41 /etc/acpi/mediabtn.sh -rwxr-xr-x 1 root root 75 2006-08-20 18:41 /etc/acpi/mutebtn.sh -rwxr-xr-x 1 root root 79 2006-08-20 18:41 /etc/acpi/nextbtn.sh -rwxr-xr-x 1 root root 817 2006-08-20 18:41 /etc/acpi/panabright.sh -rwxr-xr-x 1 root root 287 2006-08-20 18:41 /etc/acpi/panapower.sh -rwxr-xr-x 1 root root 80 2006-08-20 18:41 /etc/acpi/playbtn.sh -rwxr-xr-x 1 root root 1357 2006-08-20 18:41 /etc/acpi/power.sh -rwxr-xr-x 1 root root 72 2006-08-20 18:41 /etc/acpi/prepare.sh -rwxr-xr-x 1 root root 83 2006-08-20 18:41 /etc/acpi/prevbtn.sh -rwxr-xr-x 1 root root 75 2006-08-20 18:41 /etc/acpi/resume.d/10-thinkpad-standby-led.sh -rwxr-xr-x 1 root root 205 2006-10-23 02:16 /etc/acpi/resume.d/13-855-resolution-set.sh -rwxr-xr-x 1 root root 205 2006-08-20 18:41 /etc/acpi/resume.d/13-915-resolution-set.sh -rwxr-xr-x 1 root root 86 2006-08-20 18:41 /etc/acpi/resume.d/15-video-post.sh -rwxr-xr-x 1 root root 470 2006-10-23 02:16 /etc/acpi/resume.d/17-video-restore.sh -rwxr-xr-x 1 root root 523 2006-08-20 18:41 /etc/acpi/resume.d/35-modules-load.sh -rwxr-xr-x 1 root root 198 2006-08-20 18:41 /etc/acpi/resume.d/40-infra-red.sh -rwxr-xr-x 1 root root 205 2006-10-23 02:16 /etc/acpi/resume.d/49-855-resolution-set.sh -rwxr-xr-x 1 root root 205 2006-08-20 18:41 /etc/acpi/resume.d/49-915-resolution-set.sh -rwxr-xr-x 1 root root 152 2006-08-20 18:41 /etc/acpi/resume.d/50-framebuffer-enable.sh -rwxr-xr-x 1 root root 47 2006-08-20 18:41 /etc/acpi/resume.d/50-time.sh -rwxr-xr-x 1 root root 304 2006-08-20 18:41 /etc/acpi/resume.d/50-tosh-restore-brightness.sh -rwxr-xr-x 1 root root 103 2006-08-20 18:41 /etc/acpi/resume.d/55-screen.sh -rwxr-xr-x 1 root root 142 2006-08-20 18:41 /etc/acpi/resume.d/60-asus-wireless-led.sh -rwxr-xr-x 1 root root 200 2006-08-20 18:41 /etc/acpi/resume.d/62-ifup.sh -rwxr-xr-x 1 root root 179 2006-08-20 18:41 /etc/acpi/resume.d/65-console.sh -rwxr-xr-x 1 root root 102 2006-08-20 18:41 /etc/acpi/resume.d/67-sound.sh -rwxr-xr-x 1 root root 142 2006-08-20 18:41 /etc/acpi/resume.d/69-services.sh -rwxr-xr-x 1 root root 662 2006-08-20 18:41 /etc/acpi/resume.d/72-acpi-pain.sh -rwxr-xr-x 1 root root 75 2006-08-20 18:41 /etc/acpi/resume.d/90-thinkpad-unstandby-led.sh -rwxr-xr-x 1 root root 342 2006-08-20 18:41 /etc/acpi/resume.d/90-xscreensaver.sh -rwxr-xr-x 1 root root 82 2006-08-20 18:41 /etc/acpi/resume.d/98-acpi-unlock.sh -rwxr-xr-x 1 root root 105 2006-08-20 18:41 /etc/acpi/resume.sh -rwxr-xr-x 1 root root 304 2006-08-20 18:41 /etc/acpi/screenblank.sh -rwxr-xr-x 1 root root 1203 2006-08-20 18:41 /etc/acpi/sleep.sh -rwxr-xr-x 1 root root 77 2006-08-20 18:41 /etc/acpi/sleepbtn.sh -rwxr-xr-x 1 root root 746 2006-08-20 18:41 /etc/acpi/sonybright.sh -rwxr-xr-x 1 root root 675 2006-08-20 18:41 /etc/acpi/start.d/10-save-dmidecode.sh -rwxr-xr-x 1 root root 142 2006-08-20 18:41 /etc/acpi/start.d/60-asus-wireless-led.sh -rwxr-xr-x 1 root root 77 2006-08-20 18:41 /etc/acpi/stopbtn.sh -rwxr-xr-x 1 root root 90 2006-08-20 18:41 /etc/acpi/suspend.d/05-acpi-lock.sh -rwxr-xr-x 1 root root 75 2006-08-20 18:41 /etc/acpi/suspend.d/10-thinkpad-standby-led.sh -rwxr-xr-x 1 root root 137 2006-08-20 18:41 /etc/acpi/suspend.d/50-irda-stop.sh -rwxr-xr-x 1 root root 343 2006-08-20 18:41 /etc/acpi/suspend.d/50-tosh-save-brightness.sh -rwxr-xr-x 1 root root 310 2006-08-20 18:41 /etc/acpi/suspend.d/55-down-interfaces.sh -rwxr-xr-x 1 root root 792 2006-08-20 18:41 /etc/acpi/suspend.d/60-generate-modules-list.sh -rwxr-xr-x 1 root root 121 2006-08-20 18:41 /etc/acpi/suspend.d/65-services-stop.sh -rwxr-xr-x 1 root root 276 2006-08-20 18:41 /etc/acpi/suspend.d/70-modules-unload.sh -rwxr-xr-x 1 root root 158 2006-08-20 18:41 /etc/acpi/suspend.d/75-console-switch.sh -rwxr-xr-x 1 root root 235 2006-08-20 18:41 /etc/acpi/suspend.d/80-video-pci-state.sh -rwxr-xr-x 1 root root 314 2006-08-20 18:41 /etc/acpi/suspend.d/80-video-vesa-state.sh -rwxr-xr-x 1 root root 106 2006-08-20 18:41 /etc/acpi/suspend.d/85-alsa-state.sh -rwxr-xr-x 1 root root 233 2006-08-20 18:41 /etc/acpi/suspend.d/90-framebuffer-stop.sh -rwxr-xr-x 1 root root 961 2006-08-20 18:41 /etc/acpi/thinkpad-lockorbattery.sh -rwxr-xr-x 1 root root 891 2006-08-20 18:41 /etc/acpi/thinkpad-stretchortouchpad.sh -rwxr-xr-x 1 root root 172 2006-08-20 18:41 /etc/acpi/tosh-wireless.sh -rwxr-xr-x 1 root root 637 2006-08-20 18:41 /etc/acpi/toshbright.sh -rwxr-xr-x 1 root root 81 2006-08-20 18:41 /etc/acpi/voldownbtn.sh -rwxr-xr-x 1 root root 79 2006-08-20 18:41 /etc/acpi/volupbtn.sh -rwxr-xr-x 1 root root 74 2006-08-20 18:41 /etc/acpi/webbtn.sh -rwxr-xr-x 1 root root 442 2006-08-20 18:41 /etc/acpi/wireless.sh -rwxr-xr-x 1 root root 940 2006-05-15 09:42 /etc/init.d/acpi-support -rwxr-xr-x 1 root root 896 2006-08-20 18:41 /etc/init.d/vbesave
xdg-utils を調べる羽目になったとしたらどう調べるかためしにやってみよう。
まず、xdg-utils が何をするものなのかを調べるために、パッケージの説明を読む。
% dpkg -s xdg-utils Package: xdg-utils Status: install ok installed Priority: optional Section: utils Installed-Size: 248 Maintainer: Per Olofsson <pelle@debian.org> Architecture: all Version: 1.0-1 Recommends: xsltproc, firefox | www-browser, xbase-clients, file, mime-support, shared-mime-info Suggests: desktop-file-utils, libgnome2-0, libexo-0.3-0, libgnomevfs2-bin, kdelibs-bin, konqueror, libgtk2.0-bin, menu Description: Desktop integration utilities from freedesktop.org xdg-utils contains utilities for integrating applications with the desktop environment, regardless of which desktop environment is used. . The following utilities are included: . * xdg-desktop-menu - Install desktop menu items * xdg-desktop-icon - Install icons on the user's desktop * xdg-icon-resource - Install icon resources * xdg-mime - Gather MIME information about a file * xdg-open - Open a URL in the user's preferred application that handles the respective URL or file type * xdg-email - Open the user's preferred email client, potentially with subject and other info filled in * xdg-screensaver - Enable, disable, or suspend the screensaver
Description のところを読むと、デスクトップの情報をいじるツールであるらしい。そして、個々の環境を気にせず使えるもののようだ。 Suggests: のところをみると、gnome とか kde という文字列が見られるので、きっと GNOME と KDE を扱っているのであろう。
個々のコマンドの説明も書いてあるので読むと、メニュー、アイコンの情報をいじったり、アプリケーションを起動したりできる模様である。
ということは、GNOME/KDE のユーザ設定をいじるというシナリオが考えられて、データフローをとてもとてもとてもおおざっぱに書いてみると以下のようになる。
xdg
また、アプリケーションを起動するのはこんな感じだろうか。
xdg
さて、5人に分割して割り当てろ、という想定に基づいて分割すると、シェルスクリプトはファイルが 7つあるので 2つ程余計である。似通った機能のところをまとめて割り当てると、 xdg-desktop-menu と xdg-desktop-icon をあわせて一人、 xdg-open と xdg-email をあわせて一人、あとは xdg-icon-resource, xdg-open, xdg-screensaver それぞれに一人ずつ、これで計5人というところか。
そういえば、両対数グラフの使いかたを習うのって、どのくらい一般的なのかな。
スミスチャートよりは一般的だと思うのだが。
Python が stdio を捨てるという話を調べてみる。
iostack というやつで、説明を読む限りはいろいろ統合するのが狙いらしい。
さて、non-blocking I/O がどう扱われるかというと、Open issues の項に入っていてあまりまじめな検討はされていないくさい。
NetworkStream の may_read, may_write, readavail が案のようだが、これらについての議論はとくにされていないようだ。
webgen を試す。以下の点が気になった。
webgen がサポートしている HTML 以外のフォーマットは Textile, RDoc, Markdown であるが、これがどれもうまくない。
Textile:
"<" をそのまま出してしまう
% /usr/bin/ruby -rredcloth -e 'puts RedCloth.new("a < b").to_html' <p>a < b</p>
RDoc (の SimpleMarkup):
Markdown:
というわけで、最初からサポートしているのはすべて却下である。ただ、新しいフォーマットをサポートするのは簡単だと書いてあるので RD を試してみると、以下のように plugin/rd.rb と config.yaml を作ると動いた。
% cat plugin/rd.rb module ContentHandlers class RDContentHandler < DefaultContentHandler summary "Handles content in RD format" register_format( 'rd' ) def format_content( txt ) str = nil IO.popen("rd2", 'r+') {|rd2| th = Thread.new { rd2.read } rd2 << txt rd2.close_write str = th.value } raise "rd2 fails: #{$?}" if $? != 0 raise if %r{<body>(.*)</body>}m !~ str $1.strip + "\n" rescue self.logger.error { "Error converting RD text to HTML : #{$!}" } '' end end end % cat config.yaml # Configuration file for webgen # Used to set the parameters of the plugins PageFileHandler: defaultPageMetaData: useERB: true blocks: - name: content format: rd
なお、useERB: true というのはデフォルトがそうなので変えていないのだが、良いことなのかというと疑われるものがある。
[latest]