I know I believe in nothing but it is my sweet nothing.:2008年06月分

2008/06/01(Sun)

週末

もう6月かよ。

横浜西口。
ケータイの電池切れてて連絡取れず1時間遅れ、ご心配お掛けいたすますた。
アルカリ単3が2本タイプの非常用充電器だとうちの機種はピクリともしないのよな。
探し回ってカメラ用のCR123Aリチウム電池使うタイプをゲッとして何とか復活。
充電池なぞこの世からなくなってしまえ、がー。

葉山。
いつもの立石公園のレストラン、遅めの昼食。

134号。
げろ混み、やっぱ城ヶ島方面行くべきだったな。

江ノ島。
お土産屋さんが軒を連ねる通りで、地元のねこと遊ぶ。
ご機嫌を損ねたようで2殴打1口撃食らってYou Lose、ごめんよ。

またねこと暮らしたいねぇ、なんて言葉が口をついて出るけど
どんなねこでも死んだ子の面影を必死に探してしまうだけだぬ。

夕食に海鮮丼うまうま、だがちと値段が高すぐる。

Minolta Leitz CL持った初老の男性とバッタリ、Hi-Matic Eな俺様、敗北。
野性動物なら腹を上に寝転がり非抵抗ポーズでんな。

2008/06/03(Tue)

[NetBSD] nvi-1.81.6 その3くらい

yamtさんから新しいnviってi18n的に大丈夫かどうかreviewを依頼されたので
先日ざーっとソース眺めて発見した怪しげな部分を報告したり。

といったとこ。

とりあえずカーソル位置が変なのを直さんとマルチバイト圏には常用は無理げなので
そっから調査しないとな、多分wcursesのせいだと思うんだけど。

2008/06/04(Wed)

VMWare Server + Win2k

いつも場所を忘れるので メモ、1.0.6出すなら対策いれといてホシス。

[NetBSD] nvi-1.81.6 その4くらい

wcursesとnviのどっちが悪いのかを確認するために
pkgsrc/devel/ncurseswを突っ込んでみるべ。
まあncursesのwide-character実装がまともなのかどうかは知らんけど。

PREFER.ncursesw=        pkgsrc
PKG_OPTIONS.nvi=        wide-curses

ちゅうかんじ。

ncurseswだとカーソル位置はおkなのでこりゃwcursesの問題だね。
しかし:set allの表示は同様にダメダメなのでこれはnviあるいは
libcあたりの問題、なんかvfwprintf(3)あたりが腐ってる希ガス。

[NetBSD] nvi-1.81.6 その5くらい

おk、:set all問題については把握した。

$ cat >test.c
#include <locale.h>
#include <stdio.h>
#include <wchar.h>
int
main(void)
{
        setlocale(LC_ALL, "");
        printf("%ls\n", L"hoge");
}
^D
$ make test
$ ./test
h

これはひどい。

2008/06/05(Thu)

昨日

Ry Cooderの紙ジャケを今更買ってくる、1st~3rdはやはり神すぐる。

いつのまにか ...in the hand of inevitable / James Taylor Quartetが
ボーナストラック付で再発されててちょっとうれしい。
しかしP-VINEってとこに泣いた、Acid Jazz is dead.
次は Bigger Pictureもおながいしまふ。
輸入盤だと"Believe (Mark Yardley Remix)"入ってないのと曲順が違うのよな。
Message from the Godfatherも廃盤らしくてオフィシャルから消えてるし。
弱小レーベルを転々とし杉だと困るな。

おかげでまたオルガン欲しい病が再発してきた。
RolandのVK-8はTonewheel Breakボタンで電源On/Offによるベンドアップダウンのエミュできるのか。
まああのダメなデザインじゃ買わないけど、D-Beamとかアホかwww
本家のXK-3cも十分ヒドイけど、デザイン的にはKORG CX-3(2代目)がいちばん無難かな。
でもどっちもVK-8のTonewheel Breakのよな機能はなさげなのだな。

げ、 Rhodes Mk7なんて出るのかー!ゴクリ…置き場所さえ確保できれば…あと価格…
知らない間にRolandはFenderから取得したRhodesの商標権手放してたのね。
まぁMK60/80とかVK-1000とかしょーもない製品しか出せなかったしにゃ。

2008/06/06(Fri)

今日

花屋、もう向日葵売ってま。

某パソコン量販店で散財。

しかしHDD 1TBが2万円もせず売ってるんだなぁ。

[NetBSD] nvi-1.81.6 たぶんその6

aymeric氏がvfprintfの%ls問題は修正してくれた模様。
これでsinglebyte圏ではにゃにも問題がなくなったってしまったので
multibyte圏ががむばるしかないということですね、わかります。

  ( ゜д゜)
_(__つ/ ̄ ̄ ̄/_ 
  \/    /

  ( ゜д゜ )
_(__つ/ ̄ ̄ ̄/_ 
  \/    /

regex(3)は kbkさんご想像のとおり、ごにょごにょしてますね。
regex/regcomp.c の findmust()というコード中

1601         for (i = g->mlen; i > 0; i--) {
1602                 while (OP(s = *scan++) != OCHAR)
1603                         continue;
1604                 assert(cp < g->must + g->mlen);
1605                 *cp++ = (RCHAR_T)OPND(s);
1606         }

という部分があるのだけども、OPND()マクロはregex2.hでは

80 typedef unsigned long sop;      /* strip operator */
81 typedef int sopno;
82 #define OPRMASK 0xf8000000
83 #define OPDMASK 0x07ffffff
84 #define OPSHIFT ((unsigned)27)
85 #define OP(n)   ((n)&OPRMASK)
86 #define OPND(n) ((n)&OPDMASK)

となってて上位bitを別目的に使ってるげ。
深入りすることなく対策するならtypedef int64_t sopするか
いっそのことRCHAR_T as UTF-32と開き直ってiconv(3)噛ますかだけど
あんま現実的でなさげな予感。

まあ早いとこ自前のregex(3)持ちましょうってことですな。
ってもその前にcollationがあるのだけども。

関係無いけど最近のNetBSDはsys/queue.hに加えてsys/gcq.hなんてあるのね。
CIRCLEQとGCQの差はmerge operationか、場合によっては便利かも。

というかvector.hとかset.hとかmap.hねぇーマダー?

2008/06/07(Sat)

今日

四十九日、man(1)の場合 sin ? hell : heaven の振分バッチ処理 *1が完了する日。
当然cat(1)からすれば-vを実装するくらい意味の無い話。

rc.conf(5)、/etc/rc.d/*の起動条件ってYES/NOだけだけど
Windows Serviceみたいに自動/手動/無効くらい欲しくなるのは俺だけかな。

そこでSolaris10のSMFですよ(嫌です)。

*1:黄泉比良坂リサーチパークだかビジネスパークで泥のように開発と保守(ry

2008/06/08(Sun)

今日

kbkさんとこ、 nvi-1.81.6のbuilt-in regexはBSD系でよく使われてる
Henry Spencer氏の実装に、MSVCのTCHARよろしくchar -> RCHAR_Tとマクロ化する
改造を加えてデフォルトだと char、--with-widecharでbuildするとwchar_t版
として動作するようにしたものですね。

Copyright 1992, 1993, 1994 Henry Spencer.  All rights reserved.

nviの作者Keith Bostic氏はBSDな人ですし、まあ手近なものを使ったのでしょう。

FreeBSD ports方面でGNU gettext祭らすい。
我らがBSDL libintlに影響のある変更じゃなければいいんだけど。

ちら見するとgettext-toolのlibgettextpo.soのmajor crunkか、関係ないな。
ちゅうか今回の祭で再コンパイルが必要になるFreeBSD portsで
本当にlibgettextpo.soをlinkしてたものってどんだけあるんだろ。

pkgsrcの場合gettext-runtimeとgettext-toolは別パケジなので
別々にrevision上げられるのよね、FreeBSD portsもそうすりゃいいのに。

そもそもlibgettextpo.soはmajor crunkする必要あったのかね、これ。
関数が追加されただけのようなんだけど、minor crunkでいいような気ガス。

2008/06/10(Tue)

今日

また明日から腕に"4REAL"と刻んでNMEの記者を脅す仕事が始まるお。

青春パンク/駅前フォーク/繁華街ヒップホップのよに歌謡曲でサニタイズされた
日本の音楽って、非リア充(イヤな言葉だね)の防爆弁にならんよな希ガスるのは
私が洋楽厨だからなか?

xvmwareをほんのちょっぴり 更新
いちおx86_64対応してみたけど動くかどうか不明、つかx86_64 asmシラネな俺。
手元にWindows XP x64 editionなぞ持ってるので近いうちに動作検証しますわ。
GNU libiconv使う場合はImakefileを

#define UseGnuLibiconv YES

と書き換えて、さらにGnuLibiconv.tmplで

#define GnuLibiconvDir /usr/pkg

をお好きなGNU libiconvのインスコ先に書き換えてちょ。あとは

$ xmkmf -a
$ make
$ sudo make install

でおk、あとは~/.xinitrcに

xvmware &

と書いとけば良いかと。あ、あとCSI実装なのでlocale設定は忘れずにねん。
いちおNetBSDとOpenBSD with Citrus(いずれもi386)で動作確認はしました

2008/06/11(Wed)

[NetBSD] nvi-1.81.6 その7くらい

wcursesカーソル位置不正問題の調査でもすっか、これ解消すれば
とりあえずCJKでもeuc-*なら常用可能になるし。

他のwcurses使うアプリってどうよと思い、pkgsrc/editors/nanoがそれっぽいので
PKG_OPTIONS.nano=wide-curses付きで作ってみたのだが
LANG=ja_JP.eucJPで起動すると、初期表示のカーソル位置はおkなのだが
編集しはじめるとマルチバイト文字の境界を忘れるようでgdgdになるの。
つかこの問題pkgsrc/devel/ncursesw(GNU ncurses with --enable-widec)を使っても発生しねぇか?

ソースちら見したらどうやらwide-cursesの機能は使ってない模様、そゆこと~?
んでnano/src/chars.cで自前でいろいろ処理してるのだが、これENABLE_UTF-8なコードが
明らかにUCS4 hardwired wchar_tを前提しまくりんぐ。

「UTF-8!出た!UTF-8出た!得意技!UTF-8出た!UTF-8!これ!UTF-8出たよ~~!」 
俺は限界だと思った。

もうblogのタイトルこれにするか?

再度nviのソースを見返してみる。
src/dist/nvi/common/keys.h

#define INTISWIDE(c)    (!!(c >> 8))        /* XXX wrong name */

wchar_t is opaueなのでこれはダメだよな、この手の高速化(笑)をしたがる人多いけど
そ う い う の は  v i p l i b c で や れ 
なのな、まあ今回のカーソル位置ダメとは無関係だったけど。

mk.confにDEBUG_CURSES=YESを追加してlibcursesをrebuildする。
んで環境変数CURSES_TRACE_FILEを設定してnvi起動してトレースを取得。

のようなマルチバイトなテキストをオプーナした場合と

A

のようなシングルバイト以下同文の場合のトレース差分は こんなかんじ。
これ手掛かりに順にソース読んでくしかないか。

まずはこのへん、src/lib/libcurses/addbytes.cあたり。

- wadd_wch: win(0xbb87d280)_cursesi_addwchar: add character (0,0) 0x41
- _cursesi_addwchar: add spacing char 0x41, attr 0x4000000
+ wadd_wch: win(0xbb87d280)_cursesi_addwchar: add character (0,0) 0xa4a2
+ _cursesi_addwchar: add spacing char 0xa4a2, attr 0x8000000

curses_private.hにあるWCOLマクロ関連

/* macros to extract the width of a wide character */
#define __WCWIDTH 0xfc000000
#define WCW_SHIFT 26
#define WCOL(wc) ((((unsigned) (wc).attr) >> WCW_SHIFT ) > MB_LEN_MAX ? ((int)((
(unsigned) (wc).attr ) >> WCW_SHIFT )) - 64 : ((int)(((unsigned) (wc).attr ) >>
WCW_SHIFT)))

MB_LEN_MAXチェックは不要な希ガスる。
まぁさすがにwcwidthとmblenを混同してるとかでは無さげ。
この混同が発覚しやすいUTF-8ロケール(あ=U+3042 -> mblen=3 wcwidth=2)でも
eucJPロケール(あ=0xA4A2 -> mblen=2 wcwidth=2)の場合と同程度に動いてるしね。

ちなみにNetBSDちゅうかrune(3)の場合、mklocale(1)のマヌアルのSWIDTHnの項読めば判るけど
wcwidth(3)の返す範囲は0~3まで、locale-dbでも_RuneType中の2bitしか割り当ててない。

ちゅうわけで

- _cursesi_addwchar: add rest columns (1:0)
- __touchline: (0xbb87d280, 0, 0, 0)
+ _cursesi_addwchar: add rest columns (1:1)
+ __touchline: (0xbb87d280, 0, 0, 1)

の計算結果は正しいようなのだが、そもそもその計算式自体が妥当かどうかだよな。

そのうち続く。

2008/06/12(Thu)

[NetBSD] debugging wcurses

今回の障害とは関係ないのだけど、initscr(3)などから呼ばれる
src/lib/libcurses/acs.cの__init_wacs()について。

159	/* Add the SUSv2 defaults (those that are not '+') */
160         lstr = setlocale( LC_ALL, "" );
161         if ((lstr != NULL) && !strcasestr( lstr, "UTF-8" )) {

これじゃアプリ側でsetlocale(3)のidentifierを明示的に指定した場合
環境変数の値で上書きされちまうぞい、setlocale(LC_ALL, NULL)、あるいはこの場合であれば
nl_langinfo(CODESET)を使うのがすーじこーすじーこー、たーっぷりーすじーこ。

まあstrcasecmp("UTF-8", nl_langinfo(CODESET))なんてコードも
nl_langinfo(CODESET)の戻り値は*実装依存*であることを考えると
まったくもって移植性無いんだけどね。

私が書いたお遊びアプリ xvmwareなんかでも、vmwareのclipboardはUTF-8固定なので
UTF-8 localeの場合はiconv(3)呼ぶのは無駄なので、処理スキップしてぇと思うのだけど
上記の理由でぐっとこらえてるという。

話を戻して、ここの条件分岐では

193                 WACS_RARROW      = 0x2192;
...

とかやっとるけど、これもwchar_t is opaque objectの原則からしてびみょー。
どうしてもちゅーならmultibyte"\xe2\x86\x92"で保持、実行時にmbrtowc(3)を使って動的に変換すべし。
本来ならL'→'とかL'\xe2\x86\x92'が使えればいいのだけども、あれはもう規格からして(以下略
# L接頭語やU接頭語がなぜアレなのかは、またそのうち書く鴨。

んで昨日の続きより、src/lib/libcurses/addwstr.cあたり。

- add_wch: 65 : 0x4000000
- waddnwstr: (41,0,1) added
+ add_wch: 42146 : 0x8000000
+ waddnwstr: (a4a2,0,1) added

まあこの部分はどーでもよさげなので次。

- wmove: (0, 0)
- wmove: (0, 0)
+ wmove: (0, 1)
+ wmove: (0, 1)

wcwidth=2な「あ」は0~1カラムに表示されるので、この文字カーソルを移動するには
wmove(0, 0)でもwmove(0, 1)でもどっちでもおk、よって問題なさげ。

更に続く。

2008/06/13(Fri)

[NetBSD] debugging wcurses その2

昨日の続き、src/lib/libcurses/refresh.cのdoupdate()あたり。

- W: 0: 0x41604
+ W: 0: 0x3f437c4

これは

508                         __CTRACE(__CTRACE_REFRESH, "W: %d:", i);
509                         __CTRACE(__CTRACE_REFRESH, " 0x%x \n",
510                             win->lines[i]->hash);

でハッシュ値の表示なのでどうもよさげ。

-  0x1 A
+  0x1 \xa2\xa2

ja_JP.eucJPの場合は何か変な 値出てるね、こいつはここか。

513                         for (j = 0; j < win->maxx; j++)
514                                 __CTRACE(__CTRACE_REFRESH, "%c",
515                                     win->lines[i]->line[j].ch);

src/lib/libcurses/curses_private.hを見ると

 96 struct __ldata {
 97         wchar_t ch;                     /* Character */
 98         attr_t  attr;                   /* Attributes */

wchar_tなので"%c"じゃなくて"%lc"だよな。
ctrace.cはただのvfprintf(3)のwrapperなので修正しとく。

W: 0: 0x5f231c4
0x1 ああ

カラム0と1にそれぞれ「あ」が入ってる状態すか、にゃるほど。

お次は各セルのattributeのダンプか。

517                         __CTRACE(__CTRACE_REFRESH, " attr:");
518                         for (j = 0; j < win->maxx; j++)
519                                 __CTRACE(__CTRACE_REFRESH, " %x",
520                                     win->lines[i]->line[j].attr);

の出力。

-  attr: 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000
 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000
 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000
 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000
 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000
 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000
 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000
 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000
 4000000
+  attr: 8000000 fc000000 4000000 4000000 4000000 4000000 4000000 4000000 400000
0 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000 400000
0 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000 400000
0 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000 400000
0 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000 400000
0 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000 400000
0 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000 400000
0 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000 4000000 400000
0 4000000

C localeの場合、カラム0(=A)のattrは4000000、すなわちwcwidth=1でおk。
ja_JP.eucJPの場合、カラム0(=あ)のattrは800000、すなわちwcwidth=2でこれも問題なし。
カラム1の値のfc000000は、これcurses_private.hに定義されてる__WCWIDTHの値。
そんでsrc/lib/libcurses/addbytes.cにある

536                 /* Mark as "continuation" cell */
537                 tp->attr |= __WCWIDTH;

継続セルの為のマーカーちゅーコメントと一致するので問題なし。

現時点での可能性としては

あたりだとガッテンガッテンなのだが、hjklで移動する時は問題発生しないのよな。
なかなか尻尾掴めんの。

デバックは健康の為に1日10分まで、続く。

[NetBSD] debugging wcurses その3

さっきの続き。
src/lib/libcurses/refresh.cのmakech()あたり。

  makech: csp is on curscr:(0,0)
  makech: nsp is at __virtscr:(0,0)
  makech: wx=0,lch=79
- makech: nsp=(41,4000000,20,0,0x0)
+ makech: nsp=(a4a2,8000000,20,0,0x0)
  makech: csp=(20,4000000,20,0,0x0)
  domvcur: (0,0)=>(0,0)
  __unsetattr: checkms = 1, ms = TRUE, wattr = 00000000
  makech: 1: wx = 0, ly= 0, lx = 0, newy = 0, newx = 0
  makech: have attr 00000000, need attr 00000000
- __cputwchar: 0x41
- makech:(0,0) putwchar(41)
+ __cputwchar: 0xa4a2
+ makech:(0,0) putwchar(a4a2)
  makech: 2: wx = 1, lx = 0
- makech: 3: wx = 1, lx = 1
- makech: wx=1,lch=79
+ makech: have attr 00000000, need attr 00000000
+ makech: 2: wx = 2, lx = 0
+ makech: 3: wx = 2, lx = 2
+ makech: wx=2,lch=79
  makech: nsp=(20,4000000,20,0,0x0)
  makech: csp=(20,4000000,20,0,0x0)
  makech-after: curscr(0xbb87d200)-__virtscr(0xbb87d300)
- [0,0](41,4000000,20,0,0x0)-(41,4000000,20,0,0x0)
- [0,1](20,4000000,20,0,0x0)-(20,4000000,20,0,0x0)
+ [0,0](a4a2,8000000,20,0,0x0)-(a4a2,8000000,20,0,0x0)
+ [0,1](a4a2,fc000000,20,0,0x0)-(a4a2,fc000000,20,0,0x0)
  [0,2](20,4000000,20,0,0x0)-(20,4000000,20,0,0x0)
  [0,3](20,4000000,20,0,0x0)-(20,4000000,20,0,0x0)
  [0,4](20,4000000,20,0,0x0)-(20,4000000,20,0,0x0)

とくに問題無いね。
wcwidth=1ならwx=1, lx=1でwcwidth=2ならwx=2, lx=2で
画面サイズは80なのでlch=79までスペースで埋めてるだけぽ。

  makech: wx=0,lch=79
  makech: nsp=(7e,4000000,20,0,0x0)
  makech: csp=(20,4000000,20,0,0x0)
- domvcur: (0,1)=>(1,0)
+ domvcur: (0,2)=>(1,0)
  __unsetattr: checkms = 1, ms = TRUE, wattr = 00000000
- mvcur: moving cursor from (0, 1) to (1, 0)
+ mvcur: moving cursor from (0, 2) to (1, 0)
  fgoto: in_refresh=1
  fgoto: cgp=;1H
  plod: cnt=6, in_refresh=1

これもwcwidth=1の場合なら(0,1)から次の行へ
wcwidth=2の場合なら(0,2)以下略、よって問題なさげ。

  __cputchar: H
  __cputchar: ^J
  plod: returns 0
- makech: 1: wx = 0, ly= 0, lx = 1, newy = 1, newx = 0
+ makech: 1: wx = 0, ly= 0, lx = 2, newy = 1, newx = 0
  makech: have attr 00000000, need attr 00000000
  __cputwchar: 0x7e
  makech:(1,0) putwchar(7e)

以下同文。

その次、 src/lib/libcurses/cr_put.cのplod()あたり。

 doupdate: line 32 notdirty
  	80	0
  doupdate: ly=31, lx=1
- domvcur: (1f,1)=>(0,0)
+ domvcur: (1f,1)=>(0,1)
  __unsetattr: checkms = 1, ms = TRUE, wattr = 00000000
- mvcur: moving cursor from (31, 1) to (0, 0)
+ mvcur: moving cursor from (31, 1) to (0, 1)
  fgoto: in_refresh=1
- fgoto: cgp=;1H
+ fgoto: cgp=;2H
  plod: cnt=6, in_refresh=1
- plod: returns 3
+ plod: returns 2
  plod: cnt=0, in_refresh=1
  __cputchar: ^[
  __cputchar: [
  __cputchar: H
+ __cputwchar: 0xa4a2
+ plod: (0,0)WCOL(2), putwchar(a4a2)
  plod: returns 0
  __unsetattr: checkms = 0, ms = TRUE, wattr = 00000000
  ***********after*****************
  stdscr(0xbb87d280)-curscr(0xbb87d200)-__virtscr(0xbb87d300)
- [0,0](41,4000000,0x0)-(41,4000000,0x0)
- [0,1](20,4000000,0x0)-(20,4000000,0x0)
+ [0,0](a4a2,8000000,0x0)-(a4a2,8000000,0x0)
+ [0,1](a4a2,fc000000,0x0)-(a4a2,fc000000,0x0)
  [0,2](20,4000000,0x0)-(20,4000000,0x0)
  [0,3](20,4000000,0x0)-(20,4000000,0x0)
  [0,4](20,4000000,0x0)-(20,4000000,0x0)

うーむ、C localeの時は__cputwchar()は呼ばれないのに
ja_JP.eucJP localeだと呼ばれるはなじぇ?
しかもこの後のログを見ていくと都合3回呼ばれてる。

+ __cputwchar: 0xa4a2
+ plod: (0,0)WCOL(2), putwchar(a4a2)

...

+ __cputwchar: 0xa4a2
+ plod: (0,0)WCOL(2), putwchar(a4a2)

...

+ __cputwchar: 0x7e
+ plod: (0,0)WCOL(1), putwchar(7e)

怪しいなぁ。

ソースを読んでみる。

    412                                 if ((curscr->lines[outline]->line[outcol].attr
    413                                     & WA_ATTRIBUTES)
    414                                     == curscr->wattr ) {

現在のスクリーンのattriuteとセルのattributeが一致した場合、__cputwchar()を
呼ぶみたい、attrの値が初期化されてないとか壊れるとかだろーか。
それかこのif文中でやってる処理自体が間違いとか。

そのうち続く。

2008/06/14(Sat)

[NetBSD] debugging wcurses その4

うーむ。

Index: cr_put.c
===================================================================
RCS file: /cvsroot/src/lib/libcurses/cr_put.c,v
retrieving revision 1.25
diff -u -r1.25 cr_put.c
--- cr_put.c	28 May 2007 15:01:54 -0000	1.25
+++ cr_put.c	14 Jun 2008 08:58:55 -0000
@@ -413,7 +413,9 @@
 				    & WA_ATTRIBUTES)
 				    == curscr->wattr ) {
 					if (WCOL(curscr->lines[outline]->line[outcol]) > 0) {
+#if 0
 						__cputwchar(curscr->lines[outline]->line[outcol].ch);
+#endif
 						__cursesi_putnsp(curscr->lines[outline]->line[outcol].nsp,
 								outline,
 								outcol);

とかすると初期表示のカーソル位置は正常になるのだが
hlでのカーソル移動がメタメタになるね、putwchar()の副作用がもろもろの原因くさい。

そのうち続く。

昨日

花屋、暑くなってきたので切花の傷みが早い。

bloglinesでうちのRSS feedが6/4以降更新されないのはホワーイ?
crawlerは定期的に来ててこっちも200返してるのだが。
pubDateがRFC822準拠じゃないから無視されてるのかと
修正してみたけどそれでもだめにゃにょか、もう知らん。

いい加減ThinkPad x61をセッタップしねぇとな、ってまだやってなかったんかい。
メモリ1Gで十分なんだけど、2Gも安いし買ってくるべきか。
某パソ量販店でUMAXが4980で永久保証、Buffaloの業務用が7500で6年保証。
どっちがいいのかサパーリわかんね。

RSS

RSS 0.91のDTD読んだらitem以下にはpubDate無いのね、これは恥ずい *1
ちゅーわけでskeltonに手をいれてRSS versionを2.0に変更。

bloglines問題、ググると他サイトでも発生しているみたいだにゃ。
301が返るとredirect先をGETはしてくけど、timelineに反映されない感じ。

*1:必殺、一時資料読んでませんが何か?

[NetBSD] debugging wcurses(intermission)

wcurses作者のruibiao氏が調べるゆうてるのでいろいろ送りつけてみる。
ちとtech-userlevelに送るにはファイル大きかったかな orz

まだ全部のwcursesコードに目を通してないのでぱっと目についた
ぁゃしぃ処理だけ指摘しといたけど、一度は濃厚なreviewが必要かもね。
つかGSoCの時点でmentorになっとけちゅー噂もある。

  ( ゜д゜)
_(__つ/ ̄ ̄ ̄/_ 
  \/    /

  ( ゜д゜ )
_(__つ/ ̄ ̄ ̄/_ 
  \/    /

2008/06/17(Tue)

[NetBSD] nvi-1.81.6 + ISO-2022-JP

「あ」と入力してENTERで確定した後、そのまま続けて「い」と入力すると

^[$B$"^[(B$$

「あ」の後にESC + ( + B が入ってlocking shiftがUS-ASCIIになってしまうのな。
keyin時に毎回'\0'食わせるとかでstateをリセットしてしまってるのだろかにゃ。
とりあえずnvi/wcursesのどっちの問題か切り分けんとな。

今日

死刑廃止論には冤罪の可能性というまあ納得できる面も無きにしも非ずなのだけど
元々はあれ創世記4章14~15を忠実に実行しようという宗教原理主義じゃないのかね。

日本の場合、孔子の言葉「罪を憎んで人を憎まず」思想も混じってるわけだけど
あれ原典だと「悪其意 不悪其人」で「人相風体でなくちゃんと犯行動機で罪を裁け」
くらいの意味らしいんだよな *1

となると今報道されてる「エクストリームヲタ芸=理解不能=心の闇」なんて短絡は
まさに人相風体で裁く行為なのだが、果たしてこんなんで裁判員制はマトモに機能するのかいね。

と、今アクション連載中の「サマヨイザクラ」読んで思った【現実の事件とはなんら関係ありません】。
つかリアルの方は裁判前にあーだこーだいうのは私刑に他ならないので以下略

*1:大岡裁きってやつも、重罪の場合は情状酌量なぞせずむしろ苛酷な判決らしいね。

RSS

bloglinesをRSSリーダーにお使いの方は こっちを使うと見れるようになります。

...ってもそもそも更新あったことにきづかないかw

2008/06/18(Wed)

[NetBSD] debugging wcurses その5

とりあえず解決方法めっけた。

Index: cr_put.c
===================================================================
RCS file: /cvsroot/src/lib/libcurses/cr_put.c,v
retrieving revision 1.25
diff -u -r1.25 cr_put.c
--- cr_put.c	28 May 2007 15:01:54 -0000	1.25
+++ cr_put.c	18 Jun 2008 05:11:44 -0000
@@ -409,9 +409,8 @@
 				    == curscr->wattr)
 					__cputchar(i);
 #else
-				if ((curscr->lines[outline]->line[outcol].attr
-				    & WA_ATTRIBUTES)
-				    == curscr->wattr ) {
+				if ((curscr->lines[outline]->line[outcol].attr)
+				    == curscr->wattr) {
 					if (WCOL(curscr->lines[outline]->line[outcol]) > 0) {
 						__cputwchar(curscr->lines[outline]->line[outcol].ch);
 						__cursesi_putnsp(curscr->lines[outline]->line[outcol].nsp,

これでとりあえずwcwidth > 1でも動くよになったくさい。
tech-userlevelに投げてレビューまち。
これでとりあえずEUC-JPとUTF-8では常用可能っぽい。

残るはregex問題だけど、 aymeric氏から個人メール来てるので返事書かんとな。
そいと昨日のISO-2022-JPのlocking shift問題の調査だぬ。

今日

bloglinesダメポ、新しいRSSも最初の1回だけでその後更新してくれねぇ。
あっちのサポート掲示板ではもう諦めムード漂ってまんがな。
一度www.hi-matic.org -> www.hi-matic.org への転送を解除しようかしら。

そろそろ買い占めておこうと思い、某家電量販店にいったらKodak EPNは既に消えてた、ぁぅぁぅ。
店員さんに聞いたら5月末で終了だたそだ、失敗した。

ここ最近のkernel、電源ケーブルぶっこ抜いてofflineして再度onlineにすると100%刺さるの。
調べるか、とほほほ。

bloglines

直った模様。
ちゅうわけで新規linkは消しマスタ。

2008/06/19(Thu)

debugging wcurses その6

直ったとオモタらPuTTYだと問題なくてもxtermとかktermだとぁぅぁぅだった orz
これは恥ずかしい、訂正メール投げねぇとな。

debugging wcurses その7

何がダメかちゅーと、カーソルがwcwidth=2の場合
0:1セルのfgとbgの色が反転表示になるはずなのに、1:1セルしかならんのよね。

@@ -7890,23 +7892,26 @@
 doupdate: line 23 notdirty
        80      0
 doupdate: ly=22, lx=1
-domvcur: (16,1)=>(0,0)
+domvcur: (16,1)=>(0,1)
 __unsetattr: checkms = 1, ms = TRUE, wattr = 00000000
-mvcur: moving cursor from (22, 1) to (0, 0)
+mvcur: moving cursor from (22, 1) to (0, 1)
 fgoto: in_refresh=1
-fgoto: cgp=ESC[1;1H
+fgoto: cgp=ESC[1;2H
 plod: cnt=6, in_refresh=1
-plod: returns 3
+plod: returns 2
 plod: cnt=0, in_refresh=1
 __cputchar: ^[
 __cputchar: [
 __cputchar: H
+__cputchar: ^[
+__cputchar: [
+__cputchar: C
 plod: returns 0
 plod: returns 0
 __unsetattr: checkms = 0, ms = TRUE, wattr = 00000000
 ***********after*****************
 stdscr(0xbb940180)-curscr(0xbb940100)-__virtscr(0xbb940200)
-[0,0](41,4000000,0x0)-(41,4000000,0x0)
-[0,1](20,4000000,0x0)-(20,4000000,0x0)
+[0,0](a4a2,8000000,0x0)-(a4a2,8000000,0x0)
+[0,1](a4a2,fc000000,0x0)-(a4a2,fc000000,0x0)
 [0,2](20,4000000,0x0)-(20,4000000,0x0)
 [0,3](20,4000000,0x0)-(20,4000000,0x0)
 [0,4](20,4000000,0x0)-(20,4000000,0x0)

これのこの部分

 __cputchar: ^[
 __cputchar: [
 __cputchar: H

VT100のマヌアルなんか読むと現在のカーソル位置をHOMEにセットするなのだけど、その次の

+__cputchar: ^[
+__cputchar: [
+__cputchar: C

インド人カーソルを右に ってとこがPuTTYとxterm他で挙動が違うのかね?
ちゅうか

-fgoto: cgp=ESC[1;1H
+fgoto: cgp=ESC[1;2H

この指示どおりにエスケープ吐いてないよな希ガスるのだけど
VT100はよーわからんちん。

ボスケテえろいひと。

debugging wcurses その8

ぁぅぁぅktermでは問題なかったっす、設定マティガイ。
んでuxtermもおkっぽい、こりゃCSI xtermがなんかダメっぽいな。
PuTTYは元々問題ないし、TTSSHだとncursesw使っても問題がある。

今日

pcc-listより Converting GCC to C++
オワタw

外部委託のプログラムにバグめっけたので「○○(その会社のある都市名)に
Trac(バグ追跡ツール) でツッコんどく(障害報告しておく)か」とひとりごちると
5分と経たぬ間に武装警官に囲まれる20XX年、87分署シリーズかよ。

ちゅうことで あなたに不利な証拠として/ ローリー・リン=ドラモンド の新作が待ち遠しい。

2008/06/20(Fri)

debugging wcurses その9

rxvt,rxvt-unicode,Eterm,mltermで問題なし、CSI xtermとTTSSHのこた忘れんべ。
そのうち時間のある時にttyrecあたりでダンプ取ってみますかいの。

nvi-1.81.6のwchar_t 24bit問題。
とりあえずtypedef int64_t sopとかして逃げんべとおもたのだけど
NetBSD付属のXFree86-4.5.0だとGB18030 locale対応してないのでテストでけんなわ。
どうすべ、xorgとか入れたくないしbackportするしかねぇかな。
そもそもGB18030おkなinput methodってあるのだっけ。

Windowsから入力するにしてもPuTTYもTTSSHもGB18030未対応なのよな。
あきらめてISO-2022-JPでテストするっても、こっちはnvi側が壊れてるからにゃ。

まぁこの件に関してはaymeric氏とnviの現在のメンテナの方にメール書いたので(後で投げる)
そっちの反応を待ちますかね、ISO-2022-JP問題についてはまだ未調査なので伏せておく。
一度にあーだこーだいうとアレだし。

まぁそもそもja_JP.ISO2022-JP localeなんぞNetBSDにしかないし
常用する人はそれこそ私以外いないだろし

LC_CTYPE=ja_JP.eucJP EXINIT="set fileencoding=ISO2022-JP inputencoding=eucJP" /usr/bin/nvi hoge.txt

でも十分だ罠。

今日

花屋、2回目の月命日。

男声VOCALOIDTom Waitsなら買うぞw、たうぜん Bone Machineの頃の凶器声でひとつ。
つか も出たことだし、そろそろ紙ジャケリマスタきぼん。

2008/06/21(Sat)

[NetBSD] 4.99.66

にうpしたら電源ケーブル抜き差しで刺さらなくなった。

2008/06/23(Mon)

[NetBSD] 4.99.66

あれ?やっぱり電源抜き差しで刺さるわ。

[NetBSD] debugging nvi-1.81.6(24bit wchar_t problem)

nvi-1.81.6のメンテナの方からお返事北。
とりあえずtypedef unsigned long sopをRCHAR_Tとuint8_t operatorに分割の方向でいきましょと。
ところで誰が修正するのかな(こっちみAA略)
Control-Xについてはバイナリ入力を想定ちゅう事で、wchar_tを直入力したいのではないちゅうこと。
ぐるぁーそうすっとset displayencoding的なものが必要になるよな希ガス。
ってもそれやっちゃうとwcursesの存在意義が皆無になるしの。

GB18030で4byteコード領域まで対応したinput methodを探さないとテストできへん問題は
よく考えればLC_ALL=zh_CN.GB18030 EXINIT="set inputencoding=eucJP" nviで起動して
半角カナとか補助漢字ぶち込めば4byteコードになるよな。
前iconv(3)のモジュール書いた時も似たよなことやった事を思い出した。

何の修正もせずに(つまりwchar_t=24bit)4byteコード喰わせるとゲロ吐いてぽなくなり。

Program received signal SIGSEGV, Segmentation fault.
0x0807586e in v_event_get (sp=0xbb912800, argp=0xbfbfe7dc, timeout=0, flags=4)
    at /usr/src/dist/nvi/common/key.c:629
629             if (istimeout || FL_ISSET(evp->e_flags, CH_NOMAP) ||
(gdb) bt
#0  0x0807586e in v_event_get (sp=0xbb912800, argp=0xbfbfe7dc, timeout=0,
    flags=4) at /usr/src/dist/nvi/common/key.c:629
#1  0x0808c26e in v_txt (sp=0xbb912800, vp=0xbfbfe944, tm=0x0, lp=0x0, len=0,
    prompt=0, ai_line=0, rcount=1, flags=75793416)
    at /usr/src/dist/nvi/vi/v_txt.c:481
#2  0x08085e68 in v_ii (sp=0xbb912800, vp=0xbfbfe944)
    at /usr/src/dist/nvi/vi/v_itxt.c:166
#3  0x08093d04 in vi (spp=0xbfbfeba4) at /usr/src/dist/nvi/vi/vi.c:234
#4  0x080780e6 in editor (wp=0xbb902040, argc=0, argv=0xbfbfecf4)
    at /usr/src/dist/nvi/common/main.c:412
#5  0x0804da2c in main (argc=1, argv=0xbfbfecf0)
    at /usr/src/dist/nvi/cl/cl_main.c:123

よしよし、これでテストできますな。

週末

妖精さんが寝てる合間にMinolta SRT101初期型 + MC Rokkor 55mm/F1.7をぽちったらしい。
本体は露出計が動いてないので一度軍艦部開けてみないとな、スクリーンもちとカビが。
これ露出計連動糸切ると大変みたいなんだな、注意してかからねば。
それにしても重いわこれwユージン・スミスは4~5台ぶら提げてたけどようやるわ。

2008/06/26(Thu)

[SCM][BTS] いろいろ

subversion 1.5で手元のリポジトリを作り直したり。
merge情報を保持するよになったみたいだけど、いまのとこ使い道なさげ。

あと前から疑問なのだがworking copyにsvn copyしたファイルが
svn diffに現れてこない & さらに変更を加えた場合copy前との差分になる
のは、頭がフットーしそうだよおっっなアホ仕様だよな。
これのせいでNからOに機能を移植してOに対するpatchを作成して配布する
なんて作業をしてるとややこしくてかなわん、FreeBSDとは逆にcvs(1)に回帰したくなってきた。

分散型SCMはいまいち好きになれんので以下略。

Trac-0.11もでてたけど相変わらずいろいろとアレだ、そもそもうちではBTSやwikiとしては
一切使ってなくてsubversion用のリポジトリブラウザの機能オンリーなので
とっととviewcvsにスイッチしたいのだけど、あっちも文字コード周りに問題あった記憶がある。

Scarabのいろいろな バグの状況がtrunkではどうなってるか軽く調査。

jakarta-tomcat-4.1.29のバグで一行検索がまともに動かない件は
SCB2303で4.1.36にupdateされたので解消してるはず。
アップロードファイルの文字化け問題もこれでpatchなしで解消できると思う。

javamailは相変わらず1.3なのでSMTP Authには非対応。
commons-emailは1.0rc5 -> 1.0に更新されてるので SCB1197のkludgeなしでもPOP before SMTPはOKげ。
まあSMTP Authは私が前書いたpatchをmergeするよか
1.1で既にSMTP Authが可能なのでjavamail含めてversion upで対応でんな。
ただしcommons-emailはバイナリ互換性壊すような変更やらかす前科があるので
単純な入れ替えで済むかは試してみないと判らん。
というかcommons-emailのよな皮かぶせなくても、javamailは充分シンプルだと思うのだが。

*.apache.orgものはhttpdだけ仕方なく使うというのがいいよな。
プログラムの勉強にソース読むのは反面教師としてだけにしとけと常々思う。

日本語検索ダメポ問題は SCB2413を対策したcommit logに

* to improve the search results for non-English text,
  the Analyzer used by Lucene can now be changed in the Scarab.properties


とあってソース弄らんでもAnalyzerを選択できるようなことが書いてあるのだけど
コードは相変わらずStandardAnalyzer決めうち、実際には修正されてないっぽい。

ResourceBundleについては*_ja.propertiesは変わらず歯抜けが多いまま。
Scarabは対応するlocalized messageが存在しないと例外吐いて落ちるダメ実装なので
今後も対策が必要。

今日

ベトナム帰還兵が刃渡り30cmのMacBook Airを所持を理由に警官に(以下略
it's a long road~

火星で 白い物質発見。氷?いいえ、ケフィアです。

Life on Mars?by David Bowie の邦題って「火星の生活」なのだけど、この歌詞って
家出少女が退屈なSF映画観ながらタコ型宇宙人を指して
「火星に生命体なんているもんか!(Is there Life on Mars?)」とひとりごちる詩で
超なっち級の誤訳ですがな、最近の紙ジャケ再発ではいいかげん直ったんだろか。

David Bowieといえば、曲名を忘れて
「ほら、えーっと あのニワトリにエサやるような曲」にコーヒー噴いた。

2008/06/27(Fri)

今日

at 渋谷、青春パンクの路上ライブに内心中指おったてつつ
東急本店近くのシネ・アミューズでドキュメンタリー" JOY DIVISION"を観てきた。

有名なBBC Something else出演時の ライブ映像のシーンで不覚にも
このMAD思い出して小岩井はちみつ牛乳噴きかけた。

映画"Control"でIan Curtisが赤子の娘を抱こうとしない理由が
このドキュメンタリーで補完できたわ、泣ける。

2008/06/29(Sun)

週末

今日も渋谷。
カップうどん底に月見落として皿のみにat 表参道があったからか
やたらと警察官が警戒体制でモノモノしいやね。

ニューヨークに旅立つ友人の送別会。
酒飲んだ後スタジオ入って2時間ほどだらだら劣化Captain Beefheart風味セッション。
終電ないのでカラオケ、あんま洋楽が充実してなくていまいち。
Space Oddityby David Bowie のオケが過剰に良く出来てたが
映像があまりに酷くてワロタ。

時々Xのmouse cursorがmotionはするのだけどもclickできなくなる症状でるな。
wsconsの方でuls_attachtimeout()のメッセージを吐いてるので何かdeadlockしてる臭い。