憂鬱な午後のひととき

1月30日_

Xbyakの細かい修正

機能追加依頼や実装し忘れの指摘がぽつぽつとある. SCISでも使っているという論文を初めて見てちょっとうれしい.

1月29日_

@ITのインタビュー記事

写真がちょっとなあ.

昼からDeNA TechConに参加. もとラボにいらっしゃった奥さんや山口さんのお顔を眺める. データを扱う規模が桁違いで驚くばかり.

1月27日_

サイボウズ・ラボユース

MOV-reductionやSSSA-attackの論文を読んでるという高校1年生. すごいね. C++での実装をいろいろ教えてる. 中央大学の岡本龍明先生の集中講義を紹介して一緒に行ってみる. 突然おじゃましたけど先生は気さくに対応してくださって本当にありがとうございました.

1月26日_

mcl

ちまちまと作ってる暗号用有限体ライブラリ. mieのやり直し的なもので今回はARMで動かすことも想定. mieとほぼ同様の使い方ができるし, JNIも作りやすくなってる.

産総研で開発されてるゲノムの秘匿検索(PBWT-sec)でも少しいじる程度で動くようになってきた. 入れ換えるだけで数倍は速くなるようだ.

SCIS2016 2A2-2で完全準同型暗号の方が速い例を出されていたけどmclを使えば逆転するかも(未確認).

なるべく早く, この上でそこそこ速くて汎用的なペアリングも構築したい(いや, やる).

1月24日_

休憩

疲れがたまっていたのでごろごろしてる.

1月22日_

SCIS 4日目

夜明け前, 今度は熊本城の周りをぐるっとランニング. 多分あのあたりに城があるのだろうなと思いつつ, でも暗いので何も見えない.

学会が終わって食事のため繁華街に行った後, 少し時間があったので熊本城に行ってみる. というわけでちゃんと城を見られた. 観光らしきことをするのは珍しい.

空港までのバスが混んでいて結構待つことになり焦る. まあ無事に乗れてよかった.

1月21日_

SCIS 3日目

昨晩1時頃まで資料の修正をしていたのにまた朝5時に目が覚めたので川沿いに軽くランニングする.

自分の発表(バックドア耐性のあるパスワード暗号化の提案)が終わった後Xagawaさんに類似研究がCRYPTO 2014であったよと教えていただいた(Security of Symmetric Encryption against Mass Surveillance). 残念だったり, (自分でサーベイできてなかったので)恥ずかしかったりするけどまあしかたない. 発表しなかったら教えていただける機会もないわけで, ありがたい.

課題としていた部分をもう少し自分で考えてから答え合わせ的に後でしっかり読んでみよう.

1月20日_

SCIS 2日目

朝5時に目が覚めたので川沿いに軽くランニングしながら北上してみる. 暗くてよく見えないけど京都の鴨川っぽい.

座長が終わって一安心. たどたどしくてすいません. セッションが多くてどれに参加するか迷う. 自動車に関するセッションだけで5個もある. そんなに流行ってるのだなあ.

1月19日_

SCIS2016参加

飛行機も通常どおりの運転で無事到着. 会場がまさかの無線LAN提供無し. 明日は座長をしないといけないので緊張する.

秋山仁の招待講演はなかなか面白かった. 3次元のいろいろなからくりおもちゃ(のようなもの)を作ってらっしゃるようだが, どうやってるのだろう.

1月18日_

niftyの@homepage終了

え, そんなの知らないぞ. メール通知とかなかったと思う.

在宅勤務

朝6時に外をみたら一面雪だったので在宅勤務にした. 電車は遅延や混雑がひどかったらしい. いかなくてよかった. 明日の飛行機は大丈夫かな.

1月17日_

std::moveをつけないとき

値を返す関数のreturnにstd::moveはつけない.

#include <utility>
#include <stdio.h>
struct A {
    A() { puts("cstr"); }
    A(const A&) { puts("copy cstr"); }
    A(A&&) { puts("move cstr"); }
    A& operator=(const A&) { puts("copy assign"); return *this; }
    A& operator=(A&&) { puts("move assign"); return *this; }
    ~A() { puts("dstr"); }
    void put() const { puts("puts"); }
};

A fff()
{
    A a;
    return a;
}

A ggg()
{
    A a;
    return std::move(a);
}

int main()
{
    {
        puts("----");
        A a = fff();
        a.put();
    }
    {
        puts("----");
        A b = ggg();
        b.put();
    }
}
----
cstr
puts
dstr
----
cstr
move cstr
dstr
puts
dstr

fff()の方は名前付き戻り値最適化NRVOが行われてcstr→puts→dstrだけど, std::moveを明示してしまうとmoveコンストラクタが強制されてしまうため余計な処理が走る.

returnでstd::moveしたいのはその変数が関数の引数で右辺値参照でやってきたときぐらいか.

A hhh(A&& a)
{
    return a; // copyコンストラクタ発動
}

A iii(A&& a)
{
    return std::move(a);// moveコンストラクタ発動
}

詳しいことはEffective Modern C++ Item 25参照(emcjp資料).

1月16日_

構造体のコピーの最適化続き

@k_nitadoriさんがコピーコンストラクタの定義の位置でも変わったと書いてらしたので試してみる.

VC2013, FCC(Driver Version 1.2.1)で確認. どちらも自明なコピーコンストラクタAを書くと最適化される. ないと最適化されないやつ.
コピーコンストラクタを外だし(B).

struct IntPair {
  int i, j;
  IntPair(int i, int j) : i(i), j(j){}
//  IntPair(const IntPair& rhs) : i(rhs.i), j(rhs.j) {} // A
  IntPair(const IntPair& rhs);
};
IntPair::IntPair(const IntPair& rhs): i(rhs.i), j(rhs.j) {} // B

これは最適化された. inline無くてもよかった. なんか@k_nitadoriさんのと結果が違うようだ(version違い?). 試しにmemory.hをincludeして

IntPair::IntPair(const IntPair& rhs) {
    memcpy(this, &rhs, sizeof(rhs));
} // C

にしてもVC2013では最適化されて同一のコードになった.

VC2013にとってはBとCは同じにみなせる程度の最適化はするけど, それのあるなしは影響してしまうと. VC2015で直ってるのでまあ何か優先度が違った程度なのかな.

FCCpxだとmemcpyをcallするようになってしまった. ドキュメントを見る限りでは-Kfast -Klibにするとmemcpyの動作を認識して最適化を促進させるとあるように見えるのだけど.

まあ, あまり細かいこと気にしてもしかたないか.

1月15日_

情報幾何学の基礎 輪読会 #1

様子見で参加してみる. 想像以上にテキストを持ってきている人が多かった, と@shuyoさんに言ったら「当たり前じゃないですか」と言われた. すいません.

最初なので微積や線形代数を軽く流すのはいいとしても, ベクトル場のあたりはもう少し説明があるとよかったかな.

1月14日_

構造体のコピーの最適化

先月19日の話は, C++コンパイラ内部でのデフォルトコピーコンストラクタと構造体のコピーに関する最適化パスが違うからというのが正しそうだ(@aokomoriutaさん).

C++によるコード(intpair.cpp)

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;
}
IntPair addp(const IntPair& x, const IntPair& y) {
  return IntPair(x.i+y.i,x.j+y.j);
}
void funcp(int *x, int *y) {
  IntPair a(1,2), b(3,4);
  IntPair c = addp(a, b);
  *x = c.i;
  *y = c.j;
}

VC2015やgcc 4.8.4ならIntPairを値渡しするfuncとポインタで渡すfuncpは最適化されてどちらも同じコードになる. VC2013やFCCでは最適化結果が異なる. funcでは一時オブジェクトIntPairを除去しきれていない. C99によるコード(intpair.c)でも同じ結果になった.

typedef struct IntPair {
    int i, j;
} IntPair;
IntPair add(IntPair x, IntPair y) {
    return (IntPair){x.i + y.i, x.j + y.j};
}
IntPair addp(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;
}
void funcp(int *x, int *y) {
    IntPair a = {1, 2}, b = {3, 4};
    IntPair c = addp(&a, &b);
    *x = c.i;
    *y = c.j;
}

ところがC++のコードにコピーコンストラクタ

  IntPair(const IntPair& rhs) : i(rhs.i), j(rhs.j) {}

を追加するとVC2013やFCCでも最適化されて同一のコードになる. なるほど.

ところで以前も言ったけどC99の構造体初期化(compound-literal)とC++11の初期化リストの構文はやはり紛らわしい. というか現時点で互換性がないのは困ったもんだ.

(IntPair){2, 3}; // C99でOK, C++11/14でNG
IntPair{2, 3};   // C99でNG, C++11/14でOK
1月13日_

携帯電話

ショップで「予約状況を明日の昼までにお知らせします」と言われたのに2日経っても連絡が無い. もう一度ショップに行ってみたら「そんな話は伝わってない」と言われた. どういう情報伝達がされているのだろう. その場でもう一度確認してもらって無いことが分かったのでいったんキャンセル.

1月12日_

SaltとIVのメモ

1月11日_

md5.js

8年以上前に作ったMD5を計算するJavaScriptがSONYのPlayMemories Onlineで使われているようだ. 今どきのJavaScriptエンジンならループ展開しない方が速いだろうな. にしてもなぜMD5なんだろう.

1月10日_

static変数

普段C++をよく使っているので逆にクラスのインスタンスがローカル変数でstatic宣言できるのは非常に気持ち悪いというのは新鮮な感覚だ. 面白い.

test eax, eaxも0という数値リテラルを命令に埋め込まずにすむ分(zeroレジスタ無いし), 命令長が小さくなる可能性があるからメモリが超貴重だった時代からすると妥当かな.

static変数初期化のスレッド安全性はC++11から入った. gccでは10年以上前(3.4.3の頃)からデフォルト有効になっている. gcc/clangで使いたくなければ-fno-threadsafe-staticsをつけるとよい.

Visual Studioでは2015から入った. オフにしたければ/Zc:threadSafeInit-.

cxa_guardの引数は対象オブジェクトのポインタを使ってる区別してるので8byteになるのは自然かな. ビットにしてないのは単にx64におけるAppleの実装がそうなっているというだけではないかと. ARM EABIだとビットのようですね(libstdc++-v3のguard.cc).

1月9日_

機種変更

流石に常時日付が狂っていては使い勝手が悪いので新しいのにすることにした.

スマートフォンにする気は全然無いので選択枝が極めて限られる. 同じSHARPの後期種にしようと思っていたが, 欲しいと思っていた唯一の機能が省略されたそうで候補から外れる. すると選択枝が無くなり自動的にPanasonicのCOLOR LIE5になった. 1~2週間で届くらしい.

要らないのに段々大きくなっていく.

1月8日_

半年かかったバグ調査の顛末は

他にもいろいろあるのでまた機会があれば紹介するかも.

1月7日_

加湿器

加湿器を買って約2年, フィルターなどの整備は小まめにしているけどファンやモーター周りの埃が目立ってきた. 掃除機で吸っても細かいところは取れないので思い切って分解してみた.

非常にややこしい構造でばらすのに一苦労した. 部品が一体成形ですごいのだけど掃除をしにくいことこの上ない. しかもどうみても埃が溜まりやすい仕組みになってる. それなのに簡単に掃除できない形状というのは設計ミスなんじゃないか.

フィルターが10年持つとか, その辺りのお手入れ簡単とあったが分解せずに使っていたら湿った埃をまき散らすものになってると思う. ひどい.

1月5日_

『死なないやつら』(長沼毅)

極限状態でも生きてる生物の紹介. 120度ぐらいでも死なない菌があるそうな. ただ130度なのはいないのではとのこと. 結構上限がはっきりしている.

重力に対しては強いのがいて40万Gでも耐えるものもいるとか. こちらは分散が大きい. ありなどのみの身近な生物がどれぐら耐えるのか例示されてると比較できてよかった.

チューブワームという消化器官を持たずに共生しているバクテリアからエネルギーをもらっている動物(?)が興味深い.

中盤、後半はまあ普通の進化論の話. エントロピー周りの解釈はそうなのかなあ(違うんじゃない?)と思うところも.

最終章, 生命の発生確率を宝くじの当選確率とからめながら説明していたが, 期待値というべきところを確率が大きいと言ってるところがあって気持ち悪い.

1月4日_

仕事始め

今年, 仕事で最初に書いたコードはPythonだった. 二つのdict a, bに対してaのkeyでbに含まれないもののみを作るには

dict([(k, a[k]) for k in a.viewkeys() - b.viewkeys()])

が一番簡潔? viewkeys()は去年末にdictのhelpを見いていて, そんなのがあるのかと知ったばかり(パフォーマンスは未測定).

>a = {'a':3, 'b':5, 'c':2}
>b = {'x':4, 'a':2, 'z':9}
> a.viewkeys() - b.viewkeys()
set(['c', 'b'])

少ししか取り除かないと分かっているなら

for k in a.viewkeys() & b.viewkeys():
  a.pop(k)

の方がよいのかな.

1月3日_

畝傍山

まだ夜明け間に登ったことは無かったなと行ってみたら少し道に迷った.

こんな低い山(確か海抜100mで標高199m)でもライトがないと駄目なんだな. 甘く見すぎた. まあ, 迷っても少し待てば夜が明けるのでいいけど.

1月2日_

新聞の書評欄

年末にあったのをいくつか流し読み. 80冊以上紹介されいて科学系のものは皆無. 歴史や哲学はどうみても専門家向けのものでも紹介するのだから, 自然科学でそういうのがあってもよいと思う. というか選者がいわゆる文系(というか理科系が嫌いな人)に偏りすぎなのはどうかといつも思う.

「筆者のような式が出てきたら頭が痛くなる人でも…」という出だしはうんざりだ.

1月1日_

新年

今年もよろしくお願いいたします.

実家に戻って朝6時頃石舞台のあたりをランニング. 気持ち良い.

使ってる携帯電話が2016年に非対応でどうなるかと思っていたら日付や時刻が全て--:--みたいになった. 時計ぐらいは使えるかと思っていたのだが.

しばらくしたら2015/1/1の日にちが表示されるようになった. 2016年に変更しようとしてもできない. しょぼすぎる.


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