憂鬱な午後のひととき


12月30日_

・ちょっとランニングでいつもと違う道を走ったらやっぱり迷子になった. 方向音痴の克服は無理だな.
・去年1年間の収支を計算したら想像以上に支出が多かった. 何に使ってるのだろう. レシートなどは全部ノートに書いてるのだけどジャンル別じゃないのでよく分からん(意味がない). 結構ショック.
・1月4日まで帰省のためネットワークにつながりません. それではよいお年を.

12月29日_

VCのバージョン

Visual Studio 2012のバージョンは11.0(環境変数VisualStudioVersionがそうなってる)で, コンパイラcl.exeのバージョンは17.00.xxでマクロ_MSC_VERは1700.
Visual Studio 2013のバージョンは12.0で_MSC_VERは1800.
Visual Studio 2013をVS13と書いたりVC12と書いたりする(人によって略し方が違う)ので今更だけどちょっと混乱した.

12月28日_

VS2013コンパイラの内部エラーの対処方法

将来のバージョンで直すけど, とりあえずfriendと__forceinlineの順序を入れ換えると動くという回答をもらった. 本当だ, 動く.

12月27日_

Re:VS2013コンパイラの内部エラー

元のコードを最小化できた.

template<class T>
struct addable {
  template<class S>
  __forceinline friend void operator+(const T&, const S&) { }
};

struct Fp : public addable<Fp> { };

int main()
{
  Fp x;
  x + x;
}

__forceinlineとCRTPによるfriend関数のコンボでおかしくなるようだ. Microsoft Connectに報告してみた.

12月26日_

VS2013コンパイラの内部エラー

ちまちまと作ってるfp_test.cppをVC2013でコンパイルしたら

fp_test.cpp(265) : fatal error C1001: コンパイラで内部エラーが発生しました。
(コンパイラ ファイル 'msc1.cpp'、行 1325)
 この問題を回避するには、上記の場所付近のプログラムを単純化するか変更してください。

というエラーが出てしまった. 単純化せよと言われても. VC2012やgcc, clangでは何も問題ないのだが. そこそこ大きいコードなので再現する最小プログラムにするのが大変そうだなあ.

12月25日_

IPv6

自分では全然必要が無かったので今まで避けていたのだが, ぼちぼちXpから完全おさらばするために勉強する. ちょっとしたサンプルプログラムでWin, LinuxにIPv4, IPv6両対応しようとしていろいろはまった.

12月20日_

『読書について』(ショーペンハウアー 鈴木芳子訳)

「自分の頭で考える」「著述と文体について」「読書について」の3編. 一言でいうと, つまらない読書をするな, 自分で考えろ, という本.

読書をするなという主張を読書によって受けるのは自己撞着だが, 自分も反省しないと.

2編目は, よくある日本語の乱れのドイツ語版. 文法の詳細は分からないのだけども怒ってることはよく伝わってくる. どこの国でも, いつの時代でも同じなんだなあと思うとおかしい.

解説によると, 当時無名だった著者が初めて大学の講師となり講義をすることなったエピソードが面白い. そのときに無謀にも, 名声の高かったヘーゲル同じ時間帯に講義時間をぶつける. 講義初回には8名しか来ず, 敗北を喫す(ショーペンハウアーが勝手に思っただけなのだけど). 非常に負けず嫌いな人だったようだ.

以後講義をしなかったのだが, 大学は律儀にも10年間, 講義予告は出し続けたらしい. 契約破棄とかじゃないのか. 凄いな.

12月19日_

『ラストニュース』(猪瀬直樹作 弘兼憲史画)

ずっと昔に読んだマンガ. 熱いジャーナリストの話で, とても面白くてよかったのを覚えてる. この原作者って(元)都知事の人だったのか. 言われるまで全然気がつかなかった.

辞任のせいで, 大阪高裁の参院選の違憲判決のニュースが埋もれてる. そんなんでいいのかなあ.

12月17日_

Project Euler 356

久しぶりに解いた. 一見, 無理数を987654321乗もした値の整数部分なんて, どれだけ多倍長精度で求めないとあかんのかと思う. それでもn = 1のときに相当するfloor(((1+√5)/2)987654321)の下8桁は大分前に求めていた. ただn > 1のときがどうしてよいのかずっとわからなかった. 出来てみれば高校数学の範囲内で個人的には結構面白かった. Haskellのインタプリタ上でもほぼ一瞬.

12月14日_

C++14規格レビュー勉強会#2

濃い内容を長時間お疲れさまでした. 資料は随時公開されると思います. 上記リンク先からもリンクするようにします. あるいは私にメールアドレスを教えていただければ, サイボウズLive上の勉強会用グループにご招待します.

12月13日_

Microsoft Office 2007ファイルに対するパスワード攻撃の実装実験

会社のblog記事を書いてみた. SHA-1のループをHaswellでどこまで実行できるのか. 4コア並列とAVX2の8並列を組み合わせて20byteのSHA-1の計算が約2億回/秒. 素直なintrinsicで生成コードも見ていないので手書きすればもうちょっといくかも.

でもこういう単純処理はさすがにGPUの方がはるかに得意なようだ. 手頃な題材なのでGPUの勉強しつつ移植してみようと思う.

・明日はC++14規格レビュー勉強会#2です. 私の資料はstring_viewです. みなさんよろしくお願いします. 会場は前回と違って16階ですのでご注意ください.

12月9日_

気化式加湿器

一番消費電力が少ないということでPanasonicの加湿器FE-KFJ05を買ってみたのだけど, いろいろ不満がある.

扇風機を買いに行ったときもそうだが, タッチキーでLED表示なのがうっとうしい.

しかも押すたびにピーピーなるのがうるさい. ご丁寧にも消音ボタンもついてるけど, 音が鳴るモードがデフォルトなので移動して電源を入れ直すたびに消音ボタンを押さないといけない. なら最初から鳴らさないで欲しい(押したかどうか分かるようにしたいのなら機械式スイッチにすればいい).

それからLEDの光を弱めるボタンもある. こちらもデフォルトでは明るい. なら最初から(略.

なんでそんな加湿に関係の無い無駄な機能をつけるかなあ.

また現在の湿度がLEDで表示される. 70%を越えると赤くなる. そんなことするぐらいなら70%を越えると自動的に加湿を止める機能ぐらいつければいいのに.

あと, そもそもだけど気化式というのは寒いということに気がつかなかった. 枕元に置くと寒い寒い.

考えてみれば水の気化熱は2500kJ/kg. つまり400ml/hで3時間使うと1.2lの水が蒸発するわけで3000kJの熱が奪われる.

今まで使ってたスチーム式のやつは260Wなので3時間使うと260W * 3600 * 3 = 2800kJ.
# 基本的な計算だけど, こういうのは久しぶりだ. 計算あってる?
冷える分だけ温めていたと考えることもできる. 加湿器自体が少電力でも意味ないのかもしれない. うかつだったな.

12月6日_

byte swap

書いていたコードでbig endianデータの読み書きのところに意外とコストがかかっていることがわかった.

何かなあと思ったらナイーブに

uint16_t swap16(uint16_t x)
{
    return (x << 8) | (x >> 8);
}

uint32_t swap32(uint32_t x)
{
  return (swap16(x) << 16) | swap16(x >> 16);
}

のように書いていたのがいけなかった. 最適化されてbswapが使われるだろうと思っていたのだけどそうではなかった.

gcc 4.8.2ではswap16は

    mov eax, edi
    sal edi, 8
    sar eax, 8
    or  eax, edi

というコードを生成していた. VCやclang 3.4はrolで8bit回転させるコードにはなっていた(これは期待通り). でもswap32はbswapは使われてない.

というわけでbyte swapに関しては今のところそれぞれの組み込み関数を使うのがよいようだ. gcc系は_builtin_bswap{16,32,64}, VCは_byteswap_{ushort,ulong,uint64}を持っている.

ところで一つ注意しないといけないのがgcc 4.7では__builtin_bswap16がリンクエラーを起こしてしまう! まさかそんな基本的な関数がバグってるとは思わなかったので最初かなり悩んだ. gcc 4.8.0で直ったらしい(Bug 52624 - missing __builtin_bswap16).

#ifdef _MSC_VER
inline uint16_t byteSwap(uint16_t x) { return _byteswap_ushort(x); }
inline uint32_t byteSwap(uint32_t x) { return _byteswap_ulong(x); }
inline uint64_t byteSwap(uint64_t x) { return _byteswap_uint64(x); }
#else
#if (((__GNUC__) << 16) + (__GNUC_MINOR__)) >= ((4 << 16) + 8)
inline uint16_t byteSwap(uint16_t x) { return __builtin_bswap16(x); }
#else
inline uint16_t byteSwap(uint16_t x) { return (x >> 8) | (x << 8); }
#endif
inline uint32_t byteSwap(uint32_t x) { return __builtin_bswap32(x); }
inline uint64_t byteSwap(uint64_t x) { return __builtin_bswap64(x); }
#endif
12月5日_

『社会を変えるには』(小熊英二)

「自分がないがしろにされている」と感じるとき, われわれの社会を変えるにはどうすればよいかを提案する. 政治家に頼んで法案を通す, そのための選挙だ, 投票だ, デモは無意味だという考えは古く狭いと主張する.

前半の戦後日本の学生の運動や共闘などの話は, 小説ではキーワード的によく見かけるけど, 何がどう違うのか知らなかった. 当時の背景から始まり, 社会運動の遷移が解説されていて, いろいろ腑に落ちる. ただ, 説明が多すぎて逆に分かりにくいところもある.

最終章では社会運動の理論の紹介がされる. 社会運動を成功させるための戦略や, してはいけないことが具体的にあげられている. 「学問」や「理論」と言われると高尚に見えるが, そういう例を見ると, まあそうだろうなという当たり障りのないものになってしまう印象. 結局, 社会を変えたければ自分が変わらないとという結論で終わる. 身も蓋もない.

著者は実際に原発反対運動のデモに参加し, 考えたり研究されたことがもとになっているそうだ. 本が出版されたのは2012年8月. まだ民主党で脱原発の流れが強く, このままそれが主流になるだろうと考えられていたのかもしれない.

現実は, そのあと自民党の圧勝で, その戦略は反故になり, 著者が「行き詰まる」と言っていた「経済成長だ」, 「ジャパン・アズ・ナンバーワン」を取り戻せというかのような政策がとられている. 著者が考えていたのと逆向きに進んでいるようだ. これは皮肉にもデモなんかしても変わらないということを示してるようにも見える.

チェルノブイリ事故ではソ連の無責任, 隠蔽などの悪弊があらわになり, 体制改革と情報公開を進め, ソ連が無くなった.

ちょうど秘密保護法案が参院特別委員会で可決されたというニュースが流れているが, さて日本はどう進むのだろう.

12月4日_

callしたほうが速い

Intel i7 loop performance anomaly

グローバル変数に値を足し続ける小さなループの中で何もしない関数をcallしたほうが速い. 手元でも再現した[call-nocall.cpp]. 面白い.

 void gen(bool doCall)
 {
    mov(rax, N);
    mov(rcx, (size_t)&counter);
L("@@");
    if (doCall) call("f");
#if 0 // read-modify-write is faster
    add(ptr [rcx], rax);
#else
    mov(rdx, ptr [rcx]);
    add(rdx, rax);
    mov(ptr [rcx], rdx);
#endif
//        dec(rax);
    sub(rax, 1);
    jnz("@b");
    ret();
    if (doCall) {
        align(16);
L("f");
        ret();
    }
}

元の状況がどれぐらい安定性があるのか見るためにcallの場所を別のところにしたり, ループの終了条件を変えたりしても傾向は変わらなかった.

ただ, mov-add-movの部分をread-modify-writeで1命令にするとHaswellではcallしてもしなくても同じ速度になった. ivyやsandy brdigeではそれでも速くなる傾向が見られた.

12月3日_

adc vs. setc

carryの結果を1にしたい場合, xを0クリアしてからadc x, 0するのとsetc + movzxで拡張するのと両方が考えられる.

命令のタイミングとしては後者の方が速いように見えるのだけど試すと前者の方がよいように見える. 誤差の範囲なのか, 別の要因で違って見えるのか. 正直よくわからん.

12月2日_

『神様のカルテ3』(夏川草介)

地方の基幹医療を担う総合病院に勤める中堅の医者の話. 軽いタッチのものかと思ったら, 予想と違ってきっちりしていた. 面白い. タイトルの意味はまだよくわからないが.

過酷な労働環境の中でどうやって自分が壊れないようにしつつ患者を診るか. あせらずに牛のようにずうずうしく進む主人公.

その生き方も凄いが, それを「舐めてんじゃない」と一喝するベテランの医者の真摯な生き方も強烈.

医者を技術者に置き換えると, 身が引き締まる. 「無知は悪.」

12月1日_

また最近ひたすら眠くて仕方がない.

寝てるつもりだけど眠りが浅いのかな.


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