注: 実際に噛まれたわけではない
プログラムからその意味への関数を考えて、その関数を微分するとどうなるだろう?
それは拡張性を意味したりしないだろうか。
つまり、プログラムの小さな変更で意味が大きく変更できると微分は大きくなるはずだ、とか。
もちろん、行いたい変更にたいするところが重要なのであるが。
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]