憂鬱な午後のひととき


6月30日_

こじつけの解釈でごり押ししてなんのメリットがあるのだろう. 周りに諭す人がいないのも情けない. こんな人たちに日本が70年かけて培ってきたポジションを壊してほしくない.

6月27日_

C++WG小委員会参加

昼御飯を食べ損ねたので夜は多めに食べる.

crit-bitの勉強のため写経でcritbit.hppをいじって遊ぶ. std::set<std::string>とstd::unordered_set<std::string>の中間ぐらいの速度のようだ. sizeに上限を入れてNodeはもっとコンパクトにしたいな.

6月25日_

qhasm

ペアリングの実装で海外の人がしばしば使ってるqhasmって作者がdjbだったことに今頃気づく. そうだったのかー.

6月23日_

PKC2014を勉強する会に参加.

いろいろ勉強になった. ありがとうございます. いつも快適な会場を提供してくださってるIIJは月末から飯田橋に引っ越しするらしい.

6月22日_

『流星の絆』(東野圭吾)

かなり昔ドラマで見て最終回のどんでん返しに驚いた印象が強い. 今更だけど, ようやく原作を読んでみた. 流石にうまいなあ. ラストはどうなんだろう. 彼らの性格からすると自首しそうな気もするが.

6月18日_

VC14 CTPの1iってなんだ

C++14で入った複素数リテラル. 試しに

#include <iostream>
#include <complex>

int main()
{
    using namespace std::literals::complex_literals;
    std::complex<double> z = 1i;
    std::cout << "z * z = " << z * z << std::endl;
}

ってやったら(1,0)って表示された. 駄目じゃん. 1iが1になってしまってる. include/complrexではoperator""(long long)でオーバーライドされてるのに呼ばれてないようだ. というか

int main() { return 1i; }

がコンパイルできてしまうのはおかしいなあ. iって何か整数を表すサフィックスだっけ. 1Iもコンパイルが通る.

6月17日_

『動的平衡2』(福岡伸一)

正直, つまらなかった. 渦巻きがどうとか音楽がどうこうとか観念的な話は, 別にそれ自体は構わないけど科学でもなんでもない. そもそも液体の流れだけででなく、その境界を作ってる固体(=体そのもの)が常に再構成されながら全体の形は保ってるというのが動的平衡と主張してるものじゃなかったのかな.

6月16日_

VCでvzeroupperを入れ忘れる最適化のバグ

VC14CTPではまだ直ってなかった「とってもややこしい発現条件だったVisual Studio 2013の/arch:AVXでコンパイルすると数学関数が遅くなることがある現象」はこの夏のVCで直されるそうな. cf. an AVX optimizer does not generate vzeroupper after dealing with ymm registers

6月13日_

宣言の無いtypedef

VC14 CTPをちょっと触ってみる. 1~2時間触っただけでもいくつか不具合を見つけた. 後で報告しておこう.

void f(int *p, size_t n)
{
    p += n;
    for (size_t i = -n; i != 0; i++) {
        p[i] = 0;
    }
}

が/O2でinternal errorなのはどうか. えらいregressionだな.
# 符号なしはラップラウンドするのが正しいのでこれは規格上ありなはず. まあ自分ではこんなコード書かないけど.

今まで警告じゃなかったのも警告になってる部分がいくつか. 変数のhidingをいちいち指摘されるのが結構うっとうしい. あと

typedef enum{};

って規格上ありなんだねぇ. 知らなかった. VC14がWindows SDKのヘッダの中にそういうのがあって警告を出していた. 明らかに規格上のミスだろうと思う. Omitted typedef declaratorではそんな宣言を許す理由が無いとある. 15年ほどopenな状態なのか.

6月12日_

gdbが落ちるプログラム

いろいろ調べて開発中のコードを最小化したもの(コード自体に意味はない):

#include <utility>
#include <stdio.h>

struct BaseHolder { };

template<class Func>
struct Holder : public BaseHolder {
    Func func;
    explicit Holder(Func&& func)
        : func(std::forward<Func>(func))
    {
    }
};

struct Runner {
    BaseHolder *holder_;
    template<class Func>
    explicit Runner(Func && func)
        : holder_(new Holder<Func>(func)) { }
    ~Runner() { delete holder_; }
};

template<class T>
void f(T &)
{
    auto g =[&](){ };
    Runner{g};
}

int main()
{
    int a = 0;
    f(a);
}
g++ crash-gdb.cpp -std=c++11 && gdb ./a.out

で落ちる. 落ちるgdbのバージョンは7.7や7.7.1. 7.4では落ちなかった. 実行前のシンボル読み込み中に落ちるのでそのあたりをBugzillaで探すとBug 16845が見つかった. レポジトリの最新版で試すと落ちなくなっていた. 扱ってるコードを変更するわけにもいかないのでgdbをupdateするか.

6月11日_

valgrindで動かないプログラム

別に凝ったことはしてないのにvalgrindで動かない現象に遭遇していろいろ調べてやっと原因がわかった. プログラム自体の情報を得るために"/proc/self/exe"を使っていたのだけど, その中身がvalgrind経由で実行するとvalgrindの本体(?)になってしまう. readlinkした先は正しくもとのプログラムを指しているのでそちらを使えばよい.

#include <stdio.h>
#include <cybozu/file.hpp>
#include <string>

int main()
{
    const char *self = "/proc/self/exe";
    printf("self size=%d\n", (int)cybozu::GetFileSize(self));
    std::string path;
    path.resize(4096);
    int ret = readlink(self, &path[0], path.size() - 2);
    if (ret < 0) {
        perror("readlink");
        return 1;
    }
    path.resize(ret);
    printf("path=%s\n", path.c_str());
    printf("path size=%d\n", (int)cybozu::GetFileSize(path));
}
% ls -l ./a.out
-rwxr-xr-x 1 shigeo shigeo 26527 Jun 11 21:37 ./a.out
// そのまま実行
% ./a.out
self size=26527
path=/home/shigeo/a.out
path size=26527

// valgrindで実行
self size=3800080 // 違うバイナリになってる
path=/home/shigeo/a.out
path size=26527

まあそらそうかという気もするけど悩んだ.

そして今度はgdb経由で起動するとsegvするプログラム. これも別にたいしたことはしてないのになぜだろう. どきどき.

6月9日_

構造体の区別

struct A {
    int a;
#ifdef DEBUG_MODE
    int info;
#endif
};

みたいなクラスがあってDEBUG_MODEのときはメンバーが増えていたのだけど, うっかりDEBUG_MODEありのobjファイルとなしのobjファイルをリンクして実行時に意味不明なエラーで落ちてしまった.

わかってしまえばしょうもないことなんだけど, 4~5年に一度ぐらい遭遇してる気がする. こういうのはどうするのがいいのだろう.

#ifdef DEBUG_MODE
    #define A A_DEBUG
#endif
struct A {
    int a;
#ifdef DEBUG_MODE
    int info;
#endif
};

みたいに構造体の名前を変えてしまうのが一番安全かなあ. Aのポインタを持つCリンケージなグローバル関数はアウトだけど, 今回はC++の範囲だけだし.

DEBUG_MODEでビルドされたモジュール内のf()がthrow A_DEBUGしてたら, DEBUG_MODEされてないビルドでcatch (A&)すると受け損ねるな. まあ例外クラスの場合はstd::exception継承してそれでcatchしとけばいいか. うーん, あんまり安全とは言えない.

6月7日_

『カノン』(篠田節子)

20年前の学生時代の知人の死を機会に, 音楽教師の身の回りでおかしなことが起こりだす.

読んでて途中でオカルトっぽくなってきたので, なんだか面倒になって最後の方まですっとばす. そしたらまあまあ面白かったので元に戻って読み直す.

ホラーのジャンルだったらしいが, そこは別に怖くもなんともなくて, むしろラストの彼女の今後の生き方の決断の方が怖い.

6月6日_

CCS Injection脆弱性(CVE-2014-0224)発見の経緯についての紹介

菊池ですと書かれてると最初気がつかなかったが菊地さんだった.

6月2日_

『動的平衡』(福岡伸一)

まあまあ面白い. ただところどころ感性に訴えるだけで論理が飛躍してるような気が. 最終章はなんだかよくわからなかった.

6月1日_

NHKの技研公開2014

見に行ってきた. 8K一色. 蝶の鱗粉の色とかの再現性も凄い. うちのテレビは24インチでFull HDですらないんだが.

パネル展示をつらつらと見てたらパネルに「属性ベース暗号」が入ってるのを見かけておお?と思った. 放送通信連係サービスのためのプライバシー保護技術というやつだった. 産総研とやってるのかあ.

帰りは都立大学駅行きのバスを使う. 初めて乗ったけど電車の乗り換えを何度もしなくていいので便利だな.


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