憂鬱な午後のひととき


3月31日_

screenのマルチユーザモード

27日に対してscreenを使う手もあるよと教えていただいた. screenは常用してるけどそんな機能があるなんて知らなかった. scriptコマンドでも今のところ困ってないけど, 今度試してみる.

3月27日_

script

最近仕事でよくペアプロ(グラミング)をしている. それからウルトラワーク(在宅勤務)もよくするのだけど, そのときは一人作業のリファクタリングや別の作業にせざるをえない. 今日の在宅勤務では打ち合わせでskypeを使っていたのだが, やっぱり画面があったほうがいいよなあということでscriptコマンドを使ってみた.

これはある端末のコピーを再生する. 相手にscript -fでファイルを作ってもらったものをこちらでcatする(後で本社の方にtail -fを使うと伺った. なるほど)と相手の操作が手元で再現できる. 初めて使ったがこれはいい. ビデオだと細かい字が見えないけどこれはそんな問題は出ないし遅延や帯域も少ない. ただターミナルのサイズが先方とちょっと違うせいか時々画面がくずれたけど^Lしてもらえれば直る.

3月23日_

ラベル@@, @f, @bの処理

MASMなどで使われるローカルラベル@@, @f, @bの内部実装では通し番号をつけて内部的には別のラベルになるように処理していた. ただもう使われなくなったラベルを消していなかったので不要なものがたまるようになっていった.

  L("@@"); // A
    ...
    jmp("@b"); // Aにジャンプ
    ...
    Jmp("@f"); Bにジャンプ
    ...
  L("@@"); // B

ここで二つ目のL("@@")が定義された時点で一つ目のL("@@")を参照することはなくなるのでAの情報を消去できる. わざわざ消さなくても特に問題はなかったのだけど一度気になるともやもやしてしまって消すことにした.

単に一つ目の情報を保持していて削除すればよいが, 妙にこだわって状態繊維図を書いてみると見た目一時変数を保持しなくてもよいことがわかった. ただコードは分かりやすくない. よくはないけどきれいに決まった感があって入れとくことにした.

3月22日_

@miura1729さんのmruby

Xbyakのラベルの内部処理部分をいじっていて正しく動作してるかの確認のためにmrubyでテスト..., あれ落ちる→どこかな→自分のせいじゃない→gccのインラインアセンブラが意図通りに動いていない?

バグ報告してみたのだけど同じバージョンのgccでも@miura1729さんのところでは動いてるらしい. 何か書き方が悪いのかなあ. でもインラインアセンブラは近寄りたくないので深追いしない.

ところでasm出力を見る場合は-S出力するよりは生成されたobjファイルに対してobjdump -CSlw -M intelとかした方が読みやすい(私はdisにaliasしちゃってる).

3月20日_

第7回公開鍵暗号の安全な構成とその応用ワークショップ参加

論文読んでてわかりにくかった部分がいくつかわかるようになった. ありがたい.

3月19日_

頭痛

ここ何年かで一番痛い頭痛だった. 30分くらいお祈りみたいな格好でいた.

3月17日_

Re:Xbyakの新しいラベルクラス

@Constellationさんがさっそく使ってくださった(iv). 今のところは不具合は見当たらないらしい. よかった.

3月16日_

Xbyakの新しいラベルクラス

一通り実装してとりあえず動いてるようだ. ただバグはいろいろあるかもしれない. そのときはすんません.

Labelの扱いが結構迷った. 12日のlabel1はAで定義されるのでただの参照が妥当な気がする. そしてje(label1)はconst参照だろう. ところがlabel2ではje(label2)がただの参照(中で設定する)でL(label2)はconst参照がよいように思う.

すると後方参照と前方参照はそれぞれ別のクラスにした方が都合がよいとも思う. ところがクラスを分けると

  jmp(label);
  ..
L(label);
  ..
  jmp(label);

というような場合, 同じ場所に二つのラベルを置くことになる. 結局従来の文字列ラベルと同様に扱える方が慣れているという理由でラベルの情報はmutableにして全てconst参照にした.

後, ラベルの分岐のデフォルトが短い分岐命令(T_SHORT)なのをロングジャンプ(T_NEAR)にするか悩んだが, やっぱり従来の文字列と挙動を変えない方がよいかと思って同じにした.

3月12日_

Xbyakのラベル拡張案

文字列指定の部分をラベルクラスに変更する.

  Label label1;
L(label1); // A
    ...
    je(label1); // Aにジャンプ

  Label label2;

  je(label2); // Bにジャンプ
  ...
L(label2); // B

Bにジャンプする方は空のLabelを設定する代わりに

  Jump j = je();
  ...
L(j); // ここにジャンプ

という文法も考えられる. しかしこちらの場合ジャンプ命令のオーバーライドが更に増えるのでやめることにした. ラベルについては

 const Label label1 = L();

という書き方もできた方がいいのかなあ. でもlabel2に対してうっかりこう書くと意図しない挙動になって困るな. 止めとこうか. 実行時に分岐先が未定義という例外が飛ぶからいいか. まあとにかく, これで十分かと思ったのだけどlink機能もあるとうれしいらしい.

  Label label1;
  Label label2;
L(label1); // A
  ...
  je(label2);
  ...
linkLabel(label2, label1); // label2の行き先をlabel1に設定することでAにジャンプさせる

Aに相当する部分が複数あって命令を生成してからどこにジャンプするかを決めたいケース, なのかな.

linkLabelはlabel2が空のときしかサポートしないことにする. そうしないと既に確定した全ての分岐先を後で変更できることになりかなりめんどい. これぐらいの制約はまあいいだろう.

さてAutoGrowとそうでないときとでこれらの命令が持つべき情報を整理しよう. で, 考えてるのだけど最近ペアプロとリファクタリング続きで結構頭が疲れてなかなか進まない. とりあえず関数ポインタが渡されることはないので絶対アドレス処理用の分岐は除外できる.

3月5日_

XbyakのBMI2命令判別ミス

暗号で使うための固定多倍長演算クラス(mont_fp.hpp) は実機やVMware上で開発していて, もちろん問題なく動作する. ところがVirtualBox上のLinuxで動かすと落ちるという現象に遭遇した.

なんだろうなあと思いながら見ているとSandyBridge上で動かしてるのにHaswellでサポートされたmulxを使おうとしていて落ちてる.

mulxが所属するBMI2命令が搭載されているかの判別ミスか, でも手元のCore 2 Duo以降の何種類かのマシンで正しく判別できてるのに不思議だ.

cat /proc/cpuinfoを見ると同じUbuntuでもVMware上で動かしたときに比べてVirtualBox上で動かすと大分少ない.

// VMware上
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca
  cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp
  lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable
  nonstop_tsc aperfmperf eagerfpu pni pclmulqdq ssse3 cx16 sse4_1
  sse4_2 popcnt aes xsave avx hypervisor lahf_lm ida arat epb
  xsaveopt pln pts dtherm

// VirtualBox上
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca
  cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx rdtscp
  lm constant_tsc rep_good nopl pni ssse3 lahf_lm

BMI2の判別はeax = 7, ecx = 0でcpuidを呼び出して調べる. ところがIntelのマニュアルを読み直すとまずその判別機能が使えるかを調べないといけなかった. このeaxに指定できる数値は「eax = 0で呼び出したcpuidの結果のeax」を超えてはいけない.

eax = 7を指定できるのはCore Duo以降だけどVirtualBoxは初代Pentium 4相当の5までしか対応していないようだ. それでゴミデータが返ってmulxが使えると思ってしまったというわけだ. CPU判別ややこしい.

ちなみに上記/proc/cpuinfoを眺めてるとrep_goodはVMware上には無くてVirtualBoxにはある. この命令って多分Enhanced Rep MovSBのことじゃないかと想像するのだけど, だとするとこれはIvy以降なのでSandyBridgeには載ってないはず. ということはLinuxの/proc/cpuinfoもVirtualBox上では誤判定してサポートしてると出してしまってるんじゃないかなあ. どうだろう.

3月4日_

Progammable Label

Xbyakのジャンプに関わる拡張の提案をもらった(issue/10, issue/11).

もともと自分がXbyakを作るときの設計基準はできるだけNASMと似た感じに書けるというものだった. C++で自然にdword [eax + ecx * 2 + 5]みたいにできるようにしたのもその基本コンセプトを実現したかったからだが, そのためにジャンプ周りも単純な文字列ラベルしかサポートしてない. 自分の使い方ではその程度の機能で十分だった.

でも, ありがたいことに@Constellationさんや@miura1729さんがJavaScriptやmrubyのJITに使っていただいてるといろいろ機能が欲しくなってくるようだ.

ラベル周りはちょっとずつ機能が増えていて内部が結構大変な(=酷い)ことになってきてる. うまくすっきりさせながらこの機能を取り入れたい. どうやって実装するかを考えるのは面白いところ.

3月3日_

体調が悪い

寒く感じるから熱を計ったら35度しかない. 普段は36度7分ぐらいはあったような気がする. ご飯を食べても熱が上がらん.

暗号の実装系論文なんかだと, 著名な論文誌に載っててもtypoや数式のミスはざらにあるし書いてある通りに実装できることなんてそうそうない. 特許や戦略の都合で細かいノウハウは隠しておくのもあるだろう. 「こんなけ速くなった」ってベンチマーク出しててもソースコードが公開されな(略.

多分それは分野が異なっても同じ. むしろ大きなお金が動くジャンルだとそういう傾向は強いんじゃなかろうか. というわけでSTAP細胞が再現できないとか, まだ1カ月そこそこで素人の外野がとやかく言うことじゃないと思う.

3月1日_

TeXとSumatraPDFと秀丸の連携

長らく止まっていたTeX環境の知識を少しずつ更新. SyncTeXを使うとpdfをクリックすると対応するTeXファイルに移動できるそうな. 設定方法はTeX Wikiなどにあるのだけど何か微妙に自分のやりたい環境だとはまったのでメモ. SyncTeX自体は簡易インストーラなどを使ってると何もしなくても入ってるようだ.

これでpdfをクリックしたら該当するTeXファイルに飛ぶようになった. これは便利だ.


御意見は光成滋生<herumi@nifty.com>までお願いします