Not only is the Internet dead, it's starting to smell really bad.:2009年07月分

2009/07/02(Thu)

[NetBSD][GSoC] Efficient wide character regular expression

@

uebayasiさんにメールで教えていただいたのだけど(いつもありがとうございます) この記事
要は自分で書くのが難しいことに気付いたので TREちう実装をmergeするということらしいです。
例年のSoCらしくなってまいりましたwww

30秒ほど眺めただけだけど、mbrtowc(3)で変換して内部wchar_t(=tre_char_t)で処理し
性能対策としてMB_CUR_MAX=1の時だけmbrtowc(3)は使わないちゅー実装みたいね。

こうなるとnvi-1.81のwregex(Henry Spencer regexベース)にmultibyte regexの
皮を被せた場合に比べて、どんぐらい性能優位なんだろかちゅーとこかな。

まぁCitrus的には各encodingに最適化されたregex実装をsetlocale(3)で切り替える
(今そーゆー実装は鬼車くらいか)ちゅー夢はありますが(夢見てるだけー)
とりあえずはこの手のwchar_tベースの実装が先にあるだけでもありがたいです。

後はgrep is very slow in UTF-8ちゅー話題がMLで定期的にループするのを我慢すれば以下略

LC_COLLATEは実装されてないから[A-Z]以下略

2009/07/04(Sat)

今日

@

ここんとこ十二指腸潰瘍悪化でダウンちう、もう胃カメラは飲みたくないでござる。
ちうことでBoFはごめんなさい。

@

いつの間にかrc.subr(rcNG)にはonestartちうのが実装されてたのか。
Windowsのサービスでいうとこの「手動」設定が欲しかった俺歓喜。

これまでマシンのブート時にには起動したくないdaemonだけど
/etc/ppp/ip-{up,down}からは起動/停止したいなんてゆー場合には
例えば/etc/rc.d/ntpdateを実行しても

$ntpdate is not enabled - see rc.conf(5)

と怒られるので、ごにょごにょしてやる必要があったのだけども、今は続けて

Use following if you wish to perform the operation:
  /etc/rc.d/ntpdate onestart

とsuggestしてくれる模様。

でもこれ結局Windowsのサービスでいうとこの「無効」設定が出来なくなったちうことだよな。
どうせなら/etc/rc.confでdaemon=YES or NOだけでなくOCCATIONALとかキーワード
追加すりゃ後方互換保てたと思うのだけども。

@

胃が痛過ぎて(何度も吐いた)動けなくなる寸前だったのでH2ブロッカー胃腸薬を買いにお出かけ。
改正薬事法のおかげで薬剤師のいる薬屋じゃないと買えなくなりやがったからな。
カキヘラ規制といい、まじこの国の規制獣どもはミギーもヒダリーも逝って由。

2009/07/05(Sun)

今日

@

Love will keep us together by James Taylor Quartet、PVあったんだ。
BeatlesのRooftop showのオマージュなんだろうけどイミフ。
新譜出てたのか、 つかJames TaylorとJames Taylor Quartetは全く関係ないお。
さすがはkonozama、間違えて買った人ご愁傷様。

@

超久しぶりにcvs initとかしてみたんだけど

cvs [init aborted]: usage is restricted to member of the group cvsadmin

とか怒られた、 この変更をNetBSD独自で入れてんのに、/etc/groupにcvsadminはデフォで入れてないと。
たうぜんpkgsrc/devel/scmcvsの方はこの変更は入ってない。

ちうかcvsadminにぞくしてナイト、自分の/homeにすらcsitory作らせてもらえんって
ずいぶんと嫌な仕様だな…

何で今更cvs initかっちゅーと、cvsupでNetBSDのcvs repositoryのミラーを再取得したんだが
今netbsd-baseとかnetbsd-distribって配布しとらんのね、中身カラッポだった。
なんで自前でCVSROOT用意する羽目に。

ちうか^2 supfileのtagの指定間違ってた…

2009/07/08(Wed)

今日

@

ここ数日ぶっ倒れとった、それにしても 寝苦しいね。

@

obacheさんとこ、 その発想はなかった>>rc自体を削除。
ちうかonestartそんな昔からあったのかー。

5.99.15なんか気がつくとパニクって再起動してることが多い。

@

Neil Young Archive Vol.1、どうしてこうなった…誰買うんだよ…

British followers of Japanese fashion、どうしてこうなった…

2009/07/12(Sun)

週末

@

給料と一緒に臨時収入の振り込まれてたので、懸案のMacMiniを買うべと某家電量販店。
しかし根っからの吝嗇貧乏性守銭奴しみったれな性格なので、こんなショボイ弁当箱に
7万からの金出すのなにそれこわい状態になってしまい、ひとまず買わずに帰ってきた。
そもそも俺DVI端子のある表示装置もってないんだよな。

@

6月末から現場が大手町 → 田町の芝浦側に引っ越したのだが、ワンフロア200人は
常駐してるのに、トイレが個室3つしかねぇとか給湯室がワンルームマンションの流しより
ショボイとか、これは現代建築の敗北ちゅーひでぇ使い勝手のビルで困る。
新築でこれつーのは、どこまでアメニティを減らせるのかの人体実験なのかも(鶏舎的な意味で)。

あとあれだ、田町にはまともな本屋無いのか、まぁ帰り道に川崎下車すっからいいけど。
前のビルは丸善本店がすぐ近くだったので昼休みでも行けたんだがな。

2009/07/18(Sat)

今日

@

アポロ11号月着陸40周年直前に クロンカイト氏死去ですか。
追悼に From The Earth To The MoonのDVDでも観るかー。

2009/07/20(Mon)

[NetBSD] insufficient _ctype_ bits

@

NetBSDではctype.hで定義されてる_ctype_ちうテーブルがunsigned charで定義されてるので
8bit charの環境では(ぉ、isblank用のフラグが足りてない問題があるのだけども
それを6.0でのlibc major crunkのタイミングまでに 解消せんとあかんのですが
とりあえず こんな感じで いきまひょかね。

結局on the flyで32bit(runetype) -> 16bit(ctype)する部分のコストは
今のlibcでも32bit(runetype) -> 8bit(ctype)しとるし我慢することにした。
_CTYPE_*と_RUNETYPE_*を分離してrune側のコードはそのままにして 手抜き工数削減。

あとこのpatchだとcrosstoolのビルドがctype.hのuglyなmacroの問題で通らないので
src/tools/compat_defs.hを弄らんとあかんのですが、めんどくせーなー。
is*/to*をマクロにするとかもうやめてーなー。

昨日

@

はこっち出なかったなー、でも夕焼けと夕立が交差して綺麗だったので
カメラ持ってフィルム2本使ってきたけど。

2009/07/21(Tue)

[NetBSD] libc major crunk

@

src/lib/libc/compatの下がワケワカメ、libc12とlibc13を同時にbuildできるように
という意図らしいのは判るけど、保守する手間がかかりすぎるしlibcだけやる理由がなぁ。
他の/libとか/usr/libモノはpkgsrc/emulations/netbsd*_compat*で提供してるわけだし。
FreeBSDみたいにcompatにuuencodeしたバイナリ入れときゃいいと思うんだけどな。
# まぁその為に保守する枝が一本必要にはなるわけだけど。

同じようなことはXFree86がlibXaw6とlibXaw7でやってるけど、あっちは
そんなにソース差分が無かった希ガス。

それとよく読んでないけど__LIBC12_SOURCE__ってknobも変、このままだとlibc13には
__RENAME()が残ったままになるよな希ガス、むしろknobは__LIBC13_SOURCE__として
major crunkのタイミングでHEADからは!__LIBC13_SOURCE__の部分を消すってやった方が
効率がいいと思うんだけどなぁ。

@

いろいろsrc/gnu/dist/gcc4/libstdc++-v3/config/os/bsd/netbsd/*が酷い様な気がする。
というかlibstdc++自体が邪悪、というか^2 C++自体[省略されました]

[FreeBSD] pecoff DoS

@

pecoff DoSって これと同件か、もう4年前から放置プレイ中なのね。
HEADではpecoffサポートごとkillしたのに、releaseの方は直し忘れたと。
まぁKNF混じりpatchは放置したくなるよなぁwww

NetBSDの場合exec_read_from()は元からu_longを引数にとるので問題なさそうだけど
まぁkernel作り直してまでは確認してないので以下略。

[NetBSD] i18n fold(1)

@

以前( その1その2)コードレビューしたi18n fold(1)がcommitされとるな。
realloc(3)でsizeof(wchar_t)し忘れとるような気もするが
大体レビュー通りに直してるっぽい(テストしとらんが)。

まぁどっちみちstateless encodingにしか対応してないので、そのうち完全に
書き直し必要なるんですけどねー。

それとやっぱりGNUのfold(1)には是非--cjkwidthというキショいものを実装して欲しい(ぉ

2009/07/23(Thu)

[NetBSD] ctype(3)

今のNetBSDのctype(3)の実装って

unsigned char[1 + UCHAR_MAX] _C_ctype_ = { 0, ... };
unsigned char *_ctype_ = &_C_ctype_[0];

#define isdigit(c)      ((int)((_ctype_ + 1)[(c)] & _N))

な感じなんだけど、これ

unsigned char[1 + UCHAR_MAX] _C_ctype_ = { 0, ... };
unsigned char *_ctype_ = &_C_ctype_[1];

#define isdigit(c)      ((int)(_ctype_[(c)] & _N))

の方が良かったよな、まぁ最適化かかりゃ同じになりそだけど。

まぁでもこのコードってEOF == -1前提なのでほんとは

unsigned char[UCHAR_MAX] _C_ctype_ = { ... };
unsigned char *_ctype_ = &_C_ctype_[0];

#define isdigit(c)      ((int)(((c) == EOF) ? 0 : _ctype_[(c)] & _N))

とすんのが筋ではあるけど。ただctype.hがEOFの為にstdio.hをincludeするのは以下略

本当にどうでもいい話だ…

2009/07/26(Sun)

[NetBSD] nvi-1.81

@

30秒ほど眺めた感じだと bin/41781、regcomp.cのp_simp_re()が返す戻り値が正しくなさげ。

Index: regcomp.c
===================================================================
RCS file: /cvsroot/src/dist/nvi/regex/regcomp.c,v
retrieving revision 1.4
diff -u -r1.4 regcomp.c
--- regcomp.c   18 Jan 2009 03:45:50 -0000      1.4
+++ regcomp.c   26 Jul 2009 03:35:54 -0000
@@ -651,8 +651,11 @@
                        (void)REQUIRE(MORE(), REG_EBRACE);
                        SETERROR(REG_BADBR);
                }
-       } else if (c == (unsigned char)'$')     /* $ (but not \$) ends it */
+       }
+#if 0
+       else if (c == (unsigned char)'$')       /* $ (but not \$) ends it */
                return(1);
+#endif

        return(0);
 }

とかするとマッチするので(まぁ今度は行末がマッチしなくなるんだけど)
ここの前段の部分をいじった時におかしくしたっぽい、そのうち調べる。

あーそうか以前のコードだとエスケープだった場合、cの空きビットを利用して
フラグ立ててたのでc == '$'が偽になるんだけど、cがRCHAR_T(=wchar_t)になったので
空きビット(そもそも無い)を利用しないように書き直したせいで
ここが常に真で通過しちまうというわけだ。

あとでpatch書く、ちうかまだ開発環境復帰出来てないのどうすんべや。
ssh key回収するのにThinkPadばらすのマンドクセ。

@

ちうか5.99.15ってファイル壊れまくりなんですがなんぞこれ、fts_readできねぇとか
rmが文句垂れて削除できないファイルが大量に…

しゃあないからmount optionから -o log はずしてfsckかけて様子見るか。

今日

@

あやうく昼に出したnetbsd-bugsへのpostが最後の言葉になるとこだった、なにそれこわい。
ニュースになったら2chのパンパカ遭難スレでDQNwwwメシウマwwwいわれてたんだろーなー。

たかが中古価格2~3万(まぁそれでも玉数少ない希少品なんだけどね…)のレンズを置き忘れたことに気づいて
探しに戻ろうと日のとっぷりと暮れた海岸の岩場を歩いてたら、滑って転んで(受験生注意)あともうちょっとで 顔がザクレロに。
もう何度となく来てるとこなので甘く考えてしもうた、ちょうど灯台が逆光になる場所だったしなぁ。
誰も同情せん理由だ罠。

んでこんだけ苦労して見つからんかったwwwwwちょwwww

2009/07/28(Tue)

今日

@

netbsd-advocacyより 悪魔を憐れむ歌、なにそれこわい。

そいやゴダールのONE PLUS ONE/Sympathy for the daemon devilって DVD出てたのね。
おっちゃん昔買った輸入VHSは当然字幕無しで演奏シーン以外ワケワカメですた。

Sympathy for the devil(from Rock and Roll Circus)
タラコはいいからNicky Hopkins(piano)もっと撮って欲しかったもな。

↑の パク…オマージュ、でも'90年代の幕開けを告げた名曲だよねこれ。

@

自称アーキテクトその実ヘボ職人の気まぐれサラダでもう現場はメチャメチャでござる。
i am an architect, they call me butcher!

@

nviからいまどきregisterをnukeしたいでござる。

[NetBSD] ctype(3)

isakiさんとこ、エロくないです草食系です。

NetBSD では _ctype_ がそもそも 127 までしかないので 128~255 の結果はたぶん正しくないんじゃないかなあ(未確認)

えっと_ctype_の指してる_C_ctype_(src/lib/libc/gen/ctype_.c)とか_RuneLocale#rl_ctype_tab
(src/lib/libc/locale/runetype_local.h)は、ctype.hに定義されてる_CTYPE_NUM_CHARSマクロを使って
サイズを決定してます、んでこれは1 << CHAR_BIT(=8) + 1(EOF用)すなわち256なので128~255も問題なく扱えます。

そして

#include <ctype.h>
#include <stdio.h>
int
main(int ac, char *av[])
{
       int c = 0x80000000;
       printf("%d\n", isalpha(c));
       return 0;
}

がsegvる件ですが、これ isalpha(3)の仕様では

The c argument is an int, the value of which the application shall ensure is representable
as an unsigned char or equal to the value of the macro EOF. If the argument has any other value,
the behavior is undefined.

引数cはint型だが、その値はunsigned charの範囲とEOFマクロの値であることを「アプリ側が」保証すること。
もしそれ以外の値が入ってきたら未定義動作でおk。

となってるので、何が起きても文句言えないのですよね。

これを正しいマナーで書き直すとman 3 ctypeのCAVEATSや JPCERTの文書にも書かれている通り

-       printf("%d\n", isalpha(c));
+       printf("%d\n", isalpha((unsigned char)c));

と必ずunsigned charにキャストする対応を忘れんなよ、ということです。
# fgetc(3)なんかからの戻りはそのまま渡してもおk

一方OpenBSDの場合、isalpha(3)はマクロではなく関数になってます。

__CTYPE_INLINE int isalpha(int c)
{
	return (c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)c] & (_U|_L)));
}

多くのアプリがunsigned charへのキャストをし忘れてるなら、内部で強制的にやればいいじゃない
ちうアントワネット風味なところにOpenBSD文化を感じるのですが、これってsigned char環境では

	char *s = "\xFF";
	isalpha(*s);

のようなコードの場合、暗黙の整数拡張によって'\xFF'はあろうことかEOF(-1)に化けてしまうので
正しい結果が得られないのですよな。

unsigned charへのキャストを忘れてもlibc側でのフェイルセーフが働いてるよーと思わせて
その実落とし穴があるちゅう状態なわけでして、私はこれむしろ有害だよなーと思ってます。
tech-userlevelでも「余計なもの(スコア:-1)」「OpenBSD(笑)」って意見が多かった記憶。

FreeBSDの場合はそれ以前の問題で、ctype(3)とwctype(3)が共通のバックエンド(__runetype)を呼んでるせいで
rune(3)の呪いとかとってもエンガチョなことになってるので以下略。

めんどくさがらずに仕様が求める通りにアプリの方を直そうぜー、がNetBSDの選んだ男坂ちうことで。