読者です 読者をやめる 読者になる 読者になる

sevilwm-0.9.0

なんか最近欲しいなーと思っていた、 window の位置を記憶するとかそのへんをやろうかという試みを。色々適当なところ多いんで今度なおす。

http://shinh.skr.jp/tmp/sevilwm-0.9.0.tgz

やりたいことはまぁ色々あったんですが、とりあえずランタイムに window の位置やらキー設定を変えたい(こっちは未実装)というのがありました。しかしまぁスクリプト言語組み込むとかは sevilwm 的に好みじゃないので以下のようなものになりました。

/tmp/sevilwm_$DISPLAY というディレクトリを作って、その下に unix domain socket を配置してあります。こっから情報が取れます。

% ruby unixclient.rb /tmp/sevilwm_$DISPLAY/info
% ruby unixclient.rb /tmp/sevilwm_$DISPLAY/windows
% ruby unixclient.rb /tmp/sevilwm_$DISPLAY/config_keys.def

など。 unixclient.rb は配布パッケージにつけておいたけど、 unixcat とか telnet -u がある環境ではそっち使っても良いかと。で /tmp/sevilwm_:0.0/ctrl に命令を送り込むと状態を変えれるようにしようかと。

% ruby unixclient.rb /tmp/sevilwm_$DISPLAY/ctrl
VDESK(2)
WIN("mlterm", 0, 30, 1, 564, 340, 1, 0, '\0')
SHUTDOWN()

などとして vdesk の変更やら window の移動なんかができます。

でまぁ重要なのは WIN(...) っていうのは /tmp/sevilwm_$DISPLAY/windows が吐くフォーマットと一致してるので、ここから取得したものを再度喰わせれば状態の復帰ができます。あとはまぁちょっとスクリプト書けば focus のあたってる window をスクリプトで適当な位置に移動する…とかも書けると思います。

あと window の初期位置の設定も /tmp/sevilwm_$DISPLAY/windows の出力でできるようになっていて、これを config_win.def って名前で吐いてやって再コンパイルすればいいようになっているはずです。詳しくは config_win.def を参照。

あ、あとは CLICK_FOCUS がデフォになってて、ソースを統一しました。 CLICK_FOCUS いやな人は Makefile 修正してください。

TODO:

  • バグとか適当に書いた部分をなおす
  • ctrl に config_key.def を喰わせられるように
  • config_win.def を吐けるように (confdata.o みたいなのを objcopy で作ればすぐできる)
  • たぶん Ruby で unixclient.rb よりは便利なフロントエンドを書く
  • info の吐いてる情報はこれで十分?
  • ctrl にもっと機能を。具体的にはコマンドラインフラグで渡してるヤツとか
  • ignores を入出力できるように
  • つか ev_wm_restart するとコマンドラインフラグ忘れるのはなんとかすべき
  • ev_wm_restart した時に window の順序が逆転するのをなんとかできるならする。(まぁ2回再起動すればなんか元に戻るんだが)
  • ドキュメントとか
  • コネクションのタイムアウト
  • クライアントがソケットのバッファサイズ以上のものを出力させておいてそれを受け取らない…とかすると window manager が止まってしまう気がするので、 select で write もチェックした方が良いと言えば良い

ipc.c のいくつかの部分と (config_key.def を出力するとか)、いじろうというきっかけを下さった mitake さんに感謝。

まだもう少しはやる気が残ってそうなので希望とかあったら教えてくださるとすごく喜びます。

Continuation Fest

最初の方と最後の方に興味があったので、すが、まぁ順当に寝坊したので最後の方だけ聞きに行きました。

CbC の話は順当に面白かった…というか話者の方が面白くて順当以上に面白かったです。行って良かった。 C 言語って上から下までなんでも作れるっていうけど、プログラム言語作るにはどうもちょっともの足りないよね、という人は見てみるといいんじゃないかなぁと思いました。 GCC についてるってのは普通に良さそうだなぁ。 TODO: CbC をちゃんと見る。

ささださんはまぁ知ったような聞いたような話をしていたように思う。

でまぁ適当にアウェーのまんま呑み会とか行った。

なんか前に外人さんが座っててしょぼしょぼ英語とかで話を聞いた。なんかコンパイラの実装に continuation 使ってコンパイラをパーツにバラすってのが割とあるジャンルなんだぜとかなんとか。それ本当に実用的な速度で実用的な最適化つきで動くのかなーとか思ったけど、まぁ研究の話にそいうこと聞くのもヤボなのかなと思った。話としてはとても興味深いと思いました。

あとその外人さんの研究分野とか聞いたけどなんか話が大きくて面白かった。「言語をなー言語になー埋めるのなー」「ソレ DSL 、言ウコト、違ウ?」「DSL もなー含むけどなーもっとなー広いなー。日本語の中に英語あったりするだろー。ああいうのも範囲だなー。あと AI でほげほげでふがふが」みたいな。

HaskellMonad とかは正確な議論でなくていいからなんか適当に騙して説明してくれた方が初学者には優しいとかいう話。 Monad ってよくわかってないんだけどそんなに難しいものなのかが未だにわからないので、よくわかってないのだと思う。

なんていうか私の理解では、 Monad ってよくわからんけどリストで、 IO だったら IO の命令のリストで、 List はそのまんまリストで、あとモナドって何があったっけ、と全く理解してないじゃないかという。で Maybe モナドが何でモナドなんだと聞いたら Maybe の Nothing 側への operation はまた Nothing かえすとかいう話で、なるほどそういう意味でリストかーと始めて Maybe モナドがわかりました。いや明らかにわかってないだろう。

たぶん重要なのは、あーいうインターフェイスで定義される Monad っていうリストの作りかたしとけば、数学的にほげほげで証明された理由で色々嬉しいことがあったりする、って話なんだろうと思う。そういうのは物理とかでもよく見たことがあって、数学的に綺麗な形にしとくと色々嬉しい、っていうのは理屈はわかってないけど、なんとなくわからんでもない。

CbC の方に GCC 大変じゃないすかと聞いたら 4.x でだいぶ良くなったと教えていただいた。あと C++ を批判されたので全人格を否定されたように思えた。

帰りに akr さんが IA64 の register stack について質問されてたのを思い出して IA64 どうなんすかと聞いてみたら、特に感動するほど速くはないとのことでした。あとシングルステップ実行で VLIW の切れ目ごとに step できるとか。 cf.sourceforge.net の死が遺憾でならないというような話をしたら hp のなんかが色々使えてすごいと教えていただいたのでとても嬉しかった。

で帰って探してみたけど、うまく見つからんかったので ukai 先生に苦情を言ったらそれは test drive だよと教えて下さったのでハッピーです。でもなんか Get an account のところ行ったらフォームが途中で切れてて入力できなかったので hp に苦情メールを送ったら直してくれた。どうも。クレーマーはまじです。

はろーわーるど!

main:
        .prologue 14, 32
        .save ar.pfs, r33
        alloc r33 = ar.pfs, 0, 4, 1, 0
        .vframe r34
        mov r34 = r12
        mov r35 = r1
        .save rp, r32
        mov r32 = b0
        .body
        addl r36 = @ltoffx(.LC0), r1
        ;;
        ld8.mov r36 = [r36], .LC0
        br.call.sptk.many b0 = puts#
        mov r1 = r35
        ;;
        mov ar.pfs = r33
        mov b0 = r32
        .restore sp
        mov r12 = r34
        br.ret.sptk.many b0
        ;;
        .endp main#

読めません。 objdump の方が VLIW の切れ目がわかって読みやすい気がする。

40000000000005e0 <main>:
int main() {
40000000000005e0:       00 08 15 08 80 05       [MII]       alloc r33=ar.pfs,5,4
,0
40000000000005e6:       20 02 30 00 42 60                   mov r34=r12
40000000000005ec:       04 08 00 84                         mov r35=r1
40000000000005f0:       01 00 00 00 01 00       [MII]       nop.m 0x0
puts("Hello, world!");
40000000000005f6:       00 02 00 62 00 80                   mov r32=b0
40000000000005fc:       84 0c 00 90                         addl r36=72,r1;;
4000000000000600:       10 20 01 48 18 10       [MIB]       ld8 r36=[r36]
4000000000000606:       00 00 00 02 00 00                   nop.i 0x0
400000000000060c:       a8 fd ff 58                         br.call.sptk.many b0
=40000000000003a0 <_init+0x90>
4000000000000610:       0a 08 00 46 00 21       [MMI]       mov r1=r35;;
}
4000000000000616:       00 00 00 02 00 00                   nop.m 0x0
400000000000061c:       10 02 aa 00                         mov.i ar.pfs=r33
4000000000000620:       00 00 00 00 01 00       [MII]       nop.m 0x0
4000000000000626:       00 00 05 80 03 80                   mov b0=r32
400000000000062c:       01 10 01 84                         mov r12=r34
4000000000000630:       11 00 00 00 01 00       [MIB]       nop.m 0x0
4000000000000636:       00 00 00 02 00 80                   nop.i 0x0
400000000000063c:       08 00 84 00                         br.ret.sptk.many b0;;

わかったこと:

  • 逆アセの出力に ;; が残ってるということはきっとこれは何か意味がある。
  • nop は書かなくても勝手に入ってるぽい。
  • えーと先頭 4 bit がタグで最後の 1bit が次との関係で 41bit*3 が残りか。これ左の数字読むの至難の技ですね!
なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h