憂鬱な午後のひととき
今年一年
- Developers Summit2015講演
- 100人ほどの人前でしゃべるのは初めてなのでとても緊張した.
- HITCON 2015
- 海外で竹迫さんにはぐれないようにと緊張した.
- CODE BLUE2015講演
- 参加者がとても多いのと1時間も話すのは初めてなのでもっと緊張した.
- @IT連載
- 間違ったこと書いて炎上したらどうしようとめっちゃ緊張した.
- Effective Modern C++勉強会主催
- 間違ったことを言うとマサカリ飛び交うところなので緊張した.
- 『クラウドを支えるこれからの暗号技術』
- 間違ったこと(略
なんか緊張しっぱなしの一年だった.
来年もよろしくお願いいたします.
『一番電車が走った』(NHK)
夏に録画していたのを少しずつ見ていてようやく見終わった.
広島に原爆が落とされた前後の話. その3日後に市内で電車が走り出したという.
ものすごい復興への執念.
あまりに人手不足で, 本来勉強してないといけない女子中学生に運転をさせていた事実.
子育て支援などの社会保障の財源を選挙目的で別のことに使いつつ, 一億総活躍と言ってる今にダブってしかたない.
『チームのことだけ、考えた。』(青野慶久)
会社で配られていたので読んでみた. 想像していたよりずっと面白かった.
サイボウズの歴史を初めて知った. まあそれはともかく今の制度がどういう経緯や理念のもとに決められていったのかがよく伝わった.
「女性のために」ではなく「いろいろな人のために」多様な制度を用意した,
ただし正しい目的にしたがって使われなければ廃止する, それが正しく使われる風土もセットで考えるというのがよいと思う.
今のところそれは成功しているように感じる.
よい制度でも空気を読んで使われなければ意味がない.
ただ, そういう状態をいつまで続けられるか. これからが正念場だな.
がんばろう.
仕事納め
なんだけど在宅勤務にしたのでしまりがない.
25日の納会も途中で抜けたのでそのときちゃんと挨拶できたのは事務の人だけだった.
来年はもうちょっと考慮しよう.
数値の大小比較
template<class T>
int compare(const T *x, const T *y, size_t n)
{
for (size_t i = 0; i < n; i++) {
T a = x[n - 1 - i];
T b = y[n - 1 - i];
if (a < b) return -1;
if (a > b) return 1;
}
return 0;
}
こういうのを使って
if (compare(x, y, n) < 0) ...
と書いていたらaとbの比較は1回のコードが出るかなあと期待したら微妙だった.
VC2015では
cmp edx, ecx
jb Lless
ja Lgreater
...
LESS:
or eax, -1
test eax, eax
sets al
ret
LESSの部分はmov al, 1でよいのに何を血迷ったか. gcc-4.8.4はmov eax, 1だった.
clang 3.6はもっとややこしいコードだった.
そもそもcompareで比較命令が2回生成されるのがいまいち.
いくつか試してみて
template<class T>
int compareArray(const T* x, const T* y, size_t n)
{
for (size_t i = n - 1; i != size_t(-1); i--) {
T a = x[i];
T b = y[i];
if (a != b) return a < b ? -1 : 1;
}
return 0;
}
こうするのが一番理想に近かった.
まずaとbが等しいか確認してから再度大きさをチェックする.
ループも逆順にした方がよかった. こういうのはどんなコード書いてもコンパイラの最適化で同じところに落ちていくと思っていたので意外.
JavaScriptのWeb Cryptography APIによるAES
近頃のJavaScriptはAESを自作しなくてもよいらしい. というわけで試してみた[demo].
function encAES(obj, setter, key, iv, msg) {
crypto.subtle.encrypt({name: "AES-CBC", iv: iv}, key,
StrToU8Array(msg)).then(
function(e) {
var encMsg = new Uint8Array(e)
var encHex = U8ArrayToHex(encMsg)
setter(obj, encHex)
}
)
}
こんな程度でできるのだなあ. 便利だ.
# StrToU8Array, U8ArrayToHexはcrypto.jsに適当に書いた.
Web Cryptography自体はIEも対応しているようなのだけど非同期実行でthenを使っているのでFirefox, Chromeでのみ動作確認.
納会
本当は28日のはずだけど休む人が多いので25日になったらしい.
大掃除もあったが夏の引っ越しでものを捨てたばかりなのであまりすることがない.
クリスマス
もうちっと先かと思っていたら今日だった.
どうりでお店でケーキを買っている人が多いのだった.
第7回 暗号及び情報セキュリティと数学の相関ワークショップ参加
「秘匿ゲノム検索」:
暗号じゃない文字列検索のBWT, FM-indexを使ったコードは書いたことがあったけどPBWTは知らなかった.
後で調べてみる. 実装について謝辞に名前を入れてくださっていたのでうれしい.
富士通のコンパイラ
渡辺宙志さんの日記
struct IntPair {
int i, j;
IntPair(int _i, int _j) : i(_i), j(_j) {};
};
IntPair add(IntPair x, IntPair y) {
return IntPair(x.i + y.i, x.j + y.j);
}
void func(int &x, int &y) {
IntPair a(1, 2), b(3, 4);
IntPair c = add(a, b);
x = c.i;
y = c.j;
}
もとのコードでも最適化してほしいというのには同意するけどこれはRVOは直接は関係ないんじゃないかなあ.
手元のコンパイラ(Driver Version 1.2.1)は生成コードが違ったので以下の話が同じか分からないけど
元のコードを値渡しではなくconst参照
IntPair add(const IntPair& x, const IntPair& y) {
return IntPair(x.i + y.i, x.j + y.j);
}
にすれば
>FCCpx -S -Kfast t.cpp
func2:
mov 4,%g1
mov 6,%g2
stw %g1,[%o0]
stw %g2,[%o1]
retl
と即値にまで最適化された.
16日のコードも同様.
CharPair add(const CharPair x, const CharPair y)
だと関数内でx, yを変更できないというだけでコード生成には全く影響しないのに注意.
add(CharPair x, CharPair y)と同じ.
CharPair add(const CharPair& x, const CharPair& y)
にしないといけない.
あと, 関数定義の{}の終わりにセミコロンは不要. あるとちょっとかっこ悪いかな.
CharPair(char _i, char _j) : i(_i), j(_j){}; // ← これ
社内発表会
いろいろ議論できてよかった. 来年につなげられるといいな.
CELLOSシンポジウム2015参加
久しぶりに飯田橋. ずっと通っていたのに駅の反対側はいつも迷う.
「代数学と計算」研究集会参加
谷口哲也さんの"円分体の相対類数の計算について"と篠原直行さんの"小標数の有限体上の離散対数問題の解法"が面白かった.
特に前者は2次元FFTをつけばよいというアイデアがコロンブスのたまごみたいだ.
Pythonの__iadd__はselfを返すべきか新しいインスタンスを返すべき
これもまたPythonの初歩だろうけど今まできちんと考えたことがなかった.
たとえばpで割ったあまりのクラスを作る場合, +=の戻り値はselfにすべきか.
class Fp:
def __iadd__(self, rhs):
self.x = (self.x + rhs.x) % self.p
return self
C++的にはそうだけど, a = b, b += 1としたときにaの値は元のbのままでいてほしい.
Pythonのintはそうだよね, でも参照のはずなのに不思議だなと思ったら+=では
新しいインスタンスを返しているのだった.
a = 3
b = a
print id(a), id(b), a, b # 30772472 30772472 3 3 ; 同じid
a += 1
print id(a), id(b), a, b # 30772448 30772472 4 3 ; 異なるid
=では同じインスタンスを指すけど値を変更するときにcopy on write的にインスタンスを作ればあたかも値のように振る舞えるのか.
そうか. これも意識してなかった.
Pythonの初歩(デフォルト引数)ではまった
整数を持つクラスAとAのインスタンスを持つクラスBがあるケース.
class A:
def __init__(self):
self.a = 0
def __str__(self):
return str(self.a)
class B:
def __init__(self, a=A()):
self.a = a
def __str__(self):
return str(self.a)
b1 = B()
b1.a.a = 1
print 'b1', b1 # 'b1, 1'と表示
b2 = B()
b2.a.a = 2
print 'b2', b2 # 'b2 ,2'と表示
print 'b1', b1 # 'b1, 2'と表示
最後のb1がb2と同じになってしまう.
デフォルト引数の評価は構文解析時に一度だけして終わってしまうのでb1.aとb2.aは同じidになってしまってる.
class Aが別の人が書いたとても深いところにいたので何が悪いのかなかなか気がつかなかった.
class B:
def __init__(self, a=None):
if a is None:
a = A()
self.a = a
としないといけなかった.
ここでNoneとの比較をif a == Noneとしていると, たとえばclass Aの比較を
def __eq__(self, rhs):
return self.a == rhs.a
def __ne__(self, rhs):
return not(self == rhs)
としていたらNoneに.aは無いので例外が出てしまう.
class AのインスタンスはNoneと比較可能にすべきか?
型が違うのだが比較しようとしたら例外をだす, 比較したい場合は自分でクラスが同じか確認するというスタンスでよいのではと思った.
でもNone == aは(aがNoneでなければ)自動的にFalseになるんだなあ.
対称性からは定義すべきか?
Asia MVP/RD Meetup
マイクロソフトのMVPカンファレンスで品川に行ってみる.
ちょっとしんどくてパーティには参加せずに帰る.
Visual Studio Codeは今度試してみよう.
『大栗先生の超弦理論入門』(大栗博司)
これはすばらしい入門書. 弦理論で空間が25次元に限定される, 超弦理論で9次元に限定される根拠に1 + 2 + ... + = -1/12が使われていたんだな.
超弦理論の第1次革命, 第2次革命の歴史もいろんな理論の関係が説明されていてわかりやすい.
私が学部でゲージ理論の勉強をし始めたときに丁度ウィッテンがとんでもない発表をしたんだった.
セミナーを担当していた先生が, それを聞いてやる気をなくされていたような.
C ++ Extensions for Ranges
std::vector<int> v;のsortをstd::sort(v);と書きたくてrangesという概念を導入する.
非常にわかりやすい動機なのに, conceptを用いたiteratorの再定義, weak iteratorの導入, STL利用中その場で値を変更するためのprojectionなど盛り込む.
そのため変更点が200ページを越えていて笑える. サーベイするのが大変だった.
『破獄』(吉村昭)
過去に4度も脱獄した実在の人物をもとにした小説. 『父、断章』の一部はそれをモチーフにしたものらしい.
脱獄する執念深さもすごいけど, むしろ敗戦前後の食料難, 人材難の描写が読みごたえある.
そんな状況で, 耐えろ, なとかしろという政府は今も変わってない.
マシン不調
締め切りの近い文書を書いていたらマシンがハングアップした.
再起動しても画面が表示されない. ケーブルを差し直すとしましま.
ビデオカードがやばいのかもしれない. 電源切って掃除したら復活した.
後2週間耐えてほしい.
昔
御意見は光成滋生<herumi@nifty.com>までお願いします