憂鬱な午後のひととき


12月30日_

1/4まで帰省するためネットワークにつながりません. それではよいお年を.

12月28日_

『はじめての言語学』(黒田龍之介)

著者が大学の言語学入門で講義した内容をもとにしたもの. 初心者がはまらないようにと出来るだけ気をつかって書かれている. この先生の授業聴いてみたいな.

12月27日_

数論暗号勉強会参加

もう何度も行ってるIIJの会場なのに, 何故か今日はたどり着かない. バイク便の人に道を聞いた. 昨日は飯田橋にある会社に行くはずが何故か溜池山王で降りてしまった. 危ない.

今研究していることと今後の課題というテーマで複数の方による発表. こういう切り口の発表は面白そうなテーマを探す際にとてもありがたい. 発表者の方々に感謝.

未来の党, 政党交付金8億6千万(見込み)の大半を小沢氏側が引き取って分裂. 凄いな. 『「国民の生活が第一の党」が第一』の党だった.

12月26日_

『きみが選んだ死刑のスイッチ』(森達也)

民主主義の基本理念は多数決. しかし多数派が常に正しいとは限らない. 集団で行動することが得意な日本人は, 群れとして暴走する危険性と, いつも隣り合わせにいると考えてほいたほうがいい.

日本のメディアにおける無罪推定原則はかなりいい加減. 容疑者=犯人という扱いは世界的には一般的でないらしい. 容疑者の顔や名前が当たり前のように画面に出るのは韓国では考えられないそうな.
へぇ, そうなんだ.

そのメディアによって煽られる民意(世論)の影響力の強さ. 弁護士へのバッシング, みずからの良心以外の圧力や人間関係について一切気にしなくてよいはずの裁判官の判決への影響力.

犯した罪に対して, その場の気分ではなく予め決められたルールに従って罰を適用する罪刑法定主義. 現在非常に暴走しやすい「市民感覚」を法廷に導入する裁判員制度は, その大切な大原則を脅かす.

4章では様々な観点から死刑は間違っていると主張する. 私なんか「凶悪犯罪をしたのだから死刑になって当然だ」とつい思ってしまうが, そんな浅いレベルでなく死刑についてきちんと知った上で考えて欲しいという.

12月25日_

最近仕事でちまちまと書いてたコードに目処がついた. かなりレガシーで今更という分野, かつ大した技術は要らない, 加えて本当に役に立つかというところがあるのだが, まあ単純にゼロから作り上げていくのは面白かった.

ウルトラワーク(在宅勤務)と休日の自主的作業というのは境界があいまいになりやすい. 気をつけないと. 今日がクリスマスだったのか.

12月22日_
Office Home and Business 2010を購入. amazonだとダウンロー版よりパッケージ版の方が安いのはなぜだろう.
12月20日_

std::stringを返すprintfライクな関数

C99/C++11で導入されたvsnprintfは固定長の文字バッファに安全に書き込める関数です. バッファが足りなかったときは必要な文字の個数を返します. したがって領域が足りなければそのサイズだけ確保して再度関数を呼ぶ実装が考えられます.

std::string format(const char *format, ...)
{
    std::string str;
    str.resize(128);
    for (int i = 0; i < 2; i++) {
        va_list args;
        va_start(args, format);
        int ret = vsnprintf(&str[0], str.size(), format, args);
        va_end(args);
        if (ret < 0) throw std::runtime_error("err vsnprintf");
        if (static_cast<size_t>(ret) < str.size()) {
            str.resize(ret);
            return str;
        }
        str.resize(ret + 1);
    }
    throw std::runtime_error("unknown err vsnprintf");
}

しかしこの実装にはちょっと困った点があります.

一つはVisual Studioのvsnprintfに相当する_vsnprintf_sがバッファが足りないとき負の値を返すのでこの方法が使えないことです. 代わりにVCにはvscprintfなどの必要な文字列を返す関数があるのでそれを使う必要があります.

そんな規格に準拠してないコンパイラなんて知るかよ, 準拠していれば問題ないと思われるかもしれません.

しかし準拠していても期待通りに動作しないことがあります. それは病的ではありますが, vsnprintfの結果はlocaleに依存する可能性があるということです. たとえば(int)1000000の出力が"1000000"だったり"1,000,000"だったりすることがありえます.

したがってもしループの1回目と2回目のvsnprintfの間にlocaleが変更されて出力バッファサイズが変わりエラーになる可能性があります.

これを防ぐには1回で長さと結果を得る方がよいでしょう. gccではそのための関数vasprintfが用意されています. これを使うとformat関数はこんな風に実装できます.

std::string format(const char *format, ...)
{
    char *p;
    va_list args;
    va_start(args, format);
    int ret = vasprintf(&p, format, args);
    va_end(args);
    if (ret < 0) throw std::runtime_error("vasnprintf failed.");
    try {
        std::string str(p, ret);
        free(p);
        return str;
    } catch (...) {
        free(p);
        throw std::bad_alloc();
    }
}

なお, VCではそういった隠れたlocaleの問題に対処するため, かなりの標準関数に対してlocaleを引数にとる関数群が用意されています(ロケール). 先程紹介したvscprintfもlocaleつきバージョンがあるのでそれを使うとよいでしょう.

std::string format(const char *format, ...)
{
    _locale_t curLoc = _get_current_locale();
    va_list args;
    va_start(args, format);
    int size = _vscprintf_l(format, curLoc, args);
    va_end(args);
    if (size < 0 || size >= INT_MAX) throw std::runtime_error("_vscprintf_l failed.");

    std::string str;
    str.resize(size + 1);

    va_start(args, format);
    int ret = _vsprintf_s_l(&str[0], size + 1, format, curLoc, args);
    va_end(args);
    if (ret < 0) throw std::runtime_error("_vsprintf_s_l failed.");
    str.resize(size);
    return str;
}

localeなんて変えないから気にしなくていいよ, と思ったりするのですが3rd partyのライブラリが勝手に変えてしまうこともないわけではないので 慎重な実装をするときは考慮する必要があるでしょう.
# 昔MySQLのライブラリを呼んだら勝手に変更されて困ったことがある. 今はどうかしらない.

12月16日_

『ちはやと覚える百人一首』(末次由紀 あんの秀子)

なんとなしに本屋で見かけで表紙買いしてしまった. 百人一首のまんが「ちはやふる」の原作は知らないけどアニメは見てて気に入ってたので.

まず歌の順序が1番からじゃなくてジャンル別になってるのに驚き. それから大胆な意訳や作者の時代背景など読んでて楽しい. イラストも豊富ですばらしいと思う.

12月15日_

『僕らの憲法学』(田村理)

改憲か護憲かの前にまずは憲法のことを知ろうという本. 初版は2008年1月. 憲法改正を重要課題に掲げていた安倍晋三が首相を辞任して改正議論が一段落した頃らしい.

日本の憲法は立憲主義に基づいてつくられている. 立憲主義とは巨大で特殊な力を持つ公権力に余計なことをさせずに必要なことをだけをさせる考え方とのこと.

公権力は秩序などの公益の実現のために国民を制限しようと攻撃する, 国民は人権の侵害にならないように防御する. 著者はそういう緊迫した攻防が大切と主張する. 安倍さんの掲げる「新憲法」は国家あっての個人の自由という発想であり, それは明治憲法の発想とそっくりであって全然新しくないとのこと.

ええと, 繰り返すがこれが書かれたのは今じゃなくて5年前.

また著者自身は憲法九条を改正すべきではないと考えているが, 改憲して立憲主義に基づき保有できる戦力を明記する選択はありえるとする. 当時の(今もかな)朝日新聞が主張していた現実主義的な, 九条は変えないけどなあなあですますやり方は立憲主義をないがしろにするものであり認められないという. 厳しいな. このあたりは様々な意見があるのでリスクとコストを考えて一人一人でどんな選択をすべきか考えよとのこと.

2章では『それでもボクはやってない』(周防正行)という痴漢冤罪事件の映画を題材に公権力の危険性について書かれている. 否認してるといつまでも勾留して自白を迫る, 推定無罪の原則なはずなのに, 逆に無罪を証明しないといけないようになっている. 自分がもしその立場になったらと想像するのが本当に恐ろしい.

4章, 大震災にあい, ボロボロになった故郷のなかでも自分の力で立ち上がり, せいいっぱい生きていこうとする「人の強さ」を例に, 憲法が想定する「余計なことをするな」と自由と人権を主張する国民像について述べられる.

題材にあげられている『救命病棟24時』の第3シリーズは本当に緊迫した作品だった. 自分の役目を果たすために人命救助を放棄した消防官のエピソードは胸を打つ. それと逆の弱さとしては(直接は関係ないけど), 4月にあったドラマ『リーガル・ハイ』で, 主人公の弁護士が, 工場公害にあった原告たちの甘ったれた心の持ちようをこき下ろすシーンを思い出す. 私も怒られたように思えて耳が痛い.

12月13日_

リーダブルコードを読んだ後 via ときどきの雑記帖

> なぜコミットメール? ペアプロより スケールする

昔, 新人を含む経験の浅い人が主体のプロジェクトで差分コミットメールをばんばん流していたことがある.

「この人のは多少注意が必要」とか「この人のコードは安心だな」とか感覚的につかめた. 怪しそうなコードというのは, ある程度パターン化されるもんで, ざっと眺めてるだけでもわかる. 慣れるとそれほど時間もかからない.

疑問をもてば「ここはどういう意味?」って聞きにいけばよい. 各自の進捗状況やどこをやってるかも把握できるし, わざわざ日報なんて書かなくても(実装に関しては)それで十分.

もちろん見る側がボトルネックになるとしゃあないのだが, 明示的にコードレビューとかしなくても20人ぐらいまでならわりとうまくまわってた気がする.

12月12日_

今朝の冷え込みはきつかった. 朝6時前に短パンでランニングしたら, 走ってるときは気がつかなかったのに部屋に戻ったら, 思いっきり凍えてる自分に気がついた. 明日からちゃんと着よう.

12月10日_

『笑う警官』(佐々木譲)

警察組織の不祥事をもみ消そうとする動きに対抗する警部補. 派手さは無いがしっかりとした作りで引き込まれる. ただラストはもう少し派手な攻防があるかと期待した.

先日読んだ『不正進入』(笹本稜平)も同系統の話. こちらはもっと過激でテンポもよい. ただ悪者側の警察がやくざより酷くてちょっとそれはないだろと思ったが.

12月9日_

憲法は誰がまもるのか. 何からまもるのか.

悪いことをしたら法律によって裁かれるのであって憲法によってじゃない. 国民は憲法を直接には守る必要はない. 遵守し擁護する義務があるのは国会議員などの公務員だ.

過去の経験から, 国に権力を持たせるとろくなことがなかった. ほっといたら国民の基本的な人権がどんどん制限された.

少し前も冤罪で逮捕されたり自白を強要された事件があったが, 制限されているとニュースにすらならないかもしれない.

だからまず国民の基本的人権を第一にしようという考えがあり, 国家による権力の介在を制限するための武器が憲法だ. 道徳規範となるようなものではない. そんなのはどうしようと個人の自由だし押しつけられるものでもない.

その意味では憲法が腑抜けにならないよう, 持ち腐れにならないような努力が国民に必要だろう. おかしな法律ができてないか監視しないといけない. お偉い様がやってるから大丈夫だろうなんて思ってたら酷いことになる.

勇ましいことを言ってる人たちは, もしそのときがきた時に前線にたつのはそこらのだれかであって, 自分や自分の家族や仲間だとは思いもしてないだろう.

12月8日_

東京国立近代美術館の60周年記念特別展『美術にぶるっ! ベストセレクション 日本近代美術の100年』に行ってみた.

有名でみたことあるやつから, 巨大な屏風や絵で迫力があるもの, 気持ち悪いもの, さっぱり意味がわからないものなどバラエティに富んでいた. 初期の『暮らしの手帖』もあった. それから土門拳の「ヒロシマ」に不意をつかれて衝撃を受ける.

12月7日_

クラステンプレートのstatic変数の初期化順序は不定

クラスのstatic変数を扱いたいが, ヘッダのみのライブラリにしたくて無理やりtemplateクラスにしているあなた(=自分).

#include <stdio.h>

struct A {
  int aaa;
    A() : aaa(123) { puts("A cstr"); }
    void put() const { printf("aaa=%d\n", aaa); }
};

template<int dummy = 0>
struct XT {
    static A sss;
};

template<int dummy>
A XT<dummy>::sss;

typedef XT<0> X;

static struct Init {
    Init()
    {
        puts("Init");
        X::sss.put();
    }
} s_init;


int main()
{
    puts("main");
    X::sss.put();
}

というコードはVC/clangでInit()の中のX::sss.put();がsssのコンストラクタが呼ばれる前に実行されてしまった(gccだとコンストラクタが呼ばれてから).

複数ファイルのstatic変数の初期化順序は不定だとは理解していたが, これは単一ファイルなので意図通りに動くだろうと思ったのは間違いだった. @k_satodaさんに教えていただいたがこんなケースも駄目だった(規格書の3.6.2/2. ありがとうございます).

というわけで気を付けましょう.

12月5日_

小学生団体のエスカレータの乗り方

通勤時, 時々電車で小学生の団体と乗り合わせることがる. 大抵神妙にしているのが愛らしい. たまに羽目を外してる子もいるが, 自分が小さいときを思い出せば目くじらを立てることも無い.

さて, たいてい移動時には2列に並んでいるが, エスカレータでは1列に並び直している(そうでないのを見たことがない). あれはとても無駄だと思う.

エスカレータの前で2列から1列へ, エスカレータを降りたら1列から2列へ並び直すので時間もかかるし場所もとる. 引率の先生の視界から離れる子もいる. 素直に2列のまま乗るのが効率もよくて安全だろう.

「通りたい人のためにエスカレータでは右(左)を開けよ」というマナーは一般的だが絶対守るべきものでもない. むしろ, エスカレータでは歩くな危険と言われてるぐらいだから悪習じゃなかろうか. これは別に小学生の団体に限った話ではなくて1列に並ぶために混雑してる(そして片側はがらすき)のを見るたびそう思う.

もちろんクレームなどの余計なトラブルを避けるために2列に並ばせないというものわかる.

けれどももし「通らせろ」と文句を言う人がいたら, まわりから少し我慢したらどうでしょうと声がかかる程度の許容できる社会になったらいいのに.

#ちなみに片側だけに乗っていたら重心が歪んで機械に負担が掛かるとか思わなくもないが, ちゃんと重みを分散させる仕組みになってるので問題ないらしい. というわけで, そういう理由で2列にせよと主張する必要はない.

12月3日_

Windows 7にしてから時々何かのタイミングで日本語を入力できなくなっていた.

しばらく触ってると日本語が入力できるように戻ったりするのだが, どういうタイミングで何をしたらできなくなるのか, できるようになるのかがさっぱり分からなかった.

yamy + Japanistというマニアックの環境のせいかと思っていたが, [テキストサービスと入力言語]→[詳細なキー設定]の[入力言語を切り替える]をなしにするとそんな現象が起こらなくなった. そういやXpのときもそういう設定をしていたような気がする.

何はともあれ, 結構いらいらしてたのでそれが解消されてありがたい.


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