憂鬱な午後のひととき


7月26日_

opensslのHMACコマンドではまった話

opensslで暗号化や復号をするときはたとえばこんなふうに使う(実際は1行).

openssl aes-128-cbc -e -in a.txt -out a.enc \
  -K 87654321876543218765432187654321 \
  -iv 12345678123456781234567812345678

鍵やivを16進数表記したものを与える. ところが同じようにHMAC-SHA1を使ってみたら結果が合わない.

openssl dgst -sha1 \
  -hmac ab345678123456781234567812345678 a.txt

こちらで指定するのは値そのもののようだ. 同じツールの中では同じフォーマットにしてくれないと混乱しやすい.

ところで, 出力には-hexオプションはあるのに入力にそれっぽいものが見当たらない. コマンドヘルプには

-hmac arg       set the HMAC key to arg
-hmac key       create hashed MAC with key

と-hmacの項目が二つもあって, 最初片方が16進数入力かと思ったけどよく見ると重複してるだけだった(苦笑.

結局, keyのバイナリの値をファイルに保存して

openssl dgst -sha1 -hmac `cat key` a.txt

とすると動いた. ところがまた別の時には値が一致しない. いろいろ悩んだがどうやらkeyの中の途中に\0が入ってるとそこで切られてしまうようだ. コマンドライン引数で渡してるのだからそりゃそうか.

そんなあ, というわけでコマンドを使うのを諦めた. 正しい方法をご存じの方教えてください.

ちなみにPythonだと

import sha
import hmac

key = '\x00\x11\x22...'
data = open('a.txt', 'rb').read()
hashed = hmac.new(key, data, sha)
print hashed.digest().encode('hex_codec')

でkeyの途中に'\0'が入ってる場合でも正しくできた. opensslも

#include <openssl/hmac.h>
std::string hmap(const std::string& key, const std::string& msg)
{
    std::string out(21, 0);
    unsigned int outLen = 0;
    if (HMAC(EVP_sha1(), key.c_str(), key.size()
      , (const uint8_t*)m.c_str(), m.size()
      , (uint8_t*)&out[0], &outLen)) {
        out.resize(outLen);
        return out;
    }
    return ""; // error
}

とするとうまくできた.

7月20日_
しばらく前に新マシンにしたときにサーバをubuntu 12.04にした.
今まではもともとはplamo Linuxだったものをえんえんと(10年ぐらい)使い続けていたのだけど, いじってるうちに完全にオレオレLinuxになってしまい, 流石にtar.gzから展開してうんぬんが面倒になってきていたのだった.
心機一転なので, その際端末の漢字コードもeuc-jpからUTF-8にした(本当に今更!). ところがどうも画面がくずれる. euc-jpに戻すと大丈夫なので何かが悪いらしい.
いろいろ試したところどうやらscreenが悪いらしい. screen-4.0.2-patch-cjkwidth-cvs-2006052001で検索するといろいろ出てくる(たとえばscreen install memo).
6年前から何も状況が変わってないのか. がっかり感が高い. tmuxはどうなのかな.
wget ftp://ftp.uni-erlangen.de/pub/utilities/screen/screen-4.0.3.tar.gz
wget http://www.dekaino.net/screen/screen-4.0.2-deadlock-patch
wget http://www.dekaino.net/screen/screen-4.0.2-hankanacopy-patch
wget http://www.dekaino.net/screen/screen-4.0.2-patch-cjkwidth-cvs-2006052001
tar xvf screen-4.0.3.tar.gz
cd screen-4.0.3/
patch < ../screen-4.0.2-deadlock-patch
patch < ../screen-4.0.2-hankanacopy-patch
patch < ../screen-4.0.2-patch-cjkwidth-cvs-2006052001
sudo apt-get install libncurses5-dev
./configure --prefix=$HOME/local --enable-colors256
make -j
make install
7月16日_

Windows上でディスクのバックアップなどをして不明なアカウントの権限がついてしまって変更できなくなったとき, いつもどうしてたか覚えてないのでメモ

プロパティ→セキュリティ→詳細設定→アクセス許可の変更→「このオブジェクトの親からの継承可能なアクセス許可を含める」のチェックを外して追加
その状態で対象のアカウントを選択して削除,「このオブジェクトの親からの継承可能なアクセス許可を含める」にチェックを入れて適用.

式変形

分子分母に√(1+x) + 1をかければ分子は(√(1+x) - 1)(√(1+x) + 1) = (1+x) - 1 = x. 分母は√(1+x)(√(1+x) + 1) = 1+x+√(1+x). 中学生なら得意?

7月15日_
IDE/SATA-USB変換ケーブルが届いた. 無事使えたけどケーブルが入り乱れていて常時バックアップ用ディスクのために使うにはちょっと不格好.
古いMac miniとノートパソコンの買い取りをしてもらった. 一つ100円で計200円. ちょっと悲しい.
7月14日_
新しいパソコンを買った機会に古いパソコンの処分をしようと昔のHDDのデータをまとめようとした. けど, SATAと昔のIDEの2.5, 3.5インチが混ざっていてコネクタの数も種類も足りないのでどうコピーしていけばよいのか試行錯誤してて無駄な時間を食ってしまった.
古いのはデータのコピーに時間もかかるので辛い. なんとかならんかとwebで探したらIDE/SATA-USB変換ケーブルというのがあったので注文した. 届いたら残りの作業をする.
7月12日_

ペアリングフォーラム参加

今回の実装担当の方からの詳しい解説. ほとんど一人で実装されたそうな. 大変だったけど楽しかったとのこと.

こういうプロジェクトチームに楽観的な人がいるとメンタリティーにも結構よい方向に影響がありそうだ.

記者会見で「○○桁使えばあと10年は安全」と締めくくっていても, たとえば読売新聞のような見出しになってしまうんだなあと思うとそういうときの解説っていかに難しいことか.

7月10日_

PRMLアンチョコが瞬間風速でジュンク堂池袋のコンピュータベストセラーの1位になったそうな. ありがたいことだ. というか夢みたいだ.
欲を言えば, もっと売れないと中の人が大変なことになる(=印刷代で赤字)らしいのでこの調子でがんばって欲しい.

数日前, 本社の社長が相手に伝えるためにはとりあえず目立たないといけないと仰ってたけど, こういうのを見るとそうだなあと納得する. プロデューサーtakesakoさんは偉大だ.

しかし, 一応"著者"なんだけれども出版に関わる一切については蚊帳の外で, こういうのもCC By 3.0のなせる技か. 面白い実験だ.

7月4日_

『パターン認識と機械学習の学習 ベイズ理論に挫折しないための数学』が出た.

今日竹迫さんに献本してもらった(一応「著者」ってなってるのに献本って変な気もするが本当だ).

一応勘違いして買っちゃわないように注意しておくと@shuyoさんがPRMLのアンチョコ公式サイトで書いて下さってるように, 最終的にはEMアルゴリズムの導出などのごつい計算を自力でやりたい人をサポートするためのテキスト.

# 数式の裏にある考え方の解説ではないです.
## それはそれであって欲しいですけどね. 社内勉強会でもいろいろ議論や解説があったし.

これだけ読んでPRMLが分かるわけでもないし, 寝ころがってさくっと読めるわけでもない. 大量の計算用紙と鉛筆を用意して立ち向かう覚悟は別途必要なのであしからず.

とは言え, たとえばPRMLには載ってない混合ガウス分布の変分下界の計算式の導出もやってるので検算にはお役に立てるかもしれません.
もし間違いを見つけたら是非つっこみを!

あと, もともと複数の文章を一つに束ねたので文章のつながりや式番号でいくつかおかしなところがあるようです. すいません.

7月3日_
大塚製薬が結核のための新しい薬を開発していて, 大詰めに来てるという新聞のコラムが数日前にあった.
大塚製薬のページを見ると多剤耐性結核に対する抗結核薬「デラマニド」の試験結果のことなんだろうか. 結核って昔の印象があったけどそういうわけじゃないらしい[結核-古くて新しい病気-].
難しくてよく分からないのだけど, そのコラムで感動したのは大塚製薬は30年前に新しい結核の薬を開発するという目標を立てて開発してきたということ. そんな長期的な視点で開発を継続する企業ってもの凄い. ただただ尊敬する.
7月2日_

簡潔データ構造のrankの高速化

rank()で遊ぶの続きの続き[rank.hppベンチマークコード]. テーブルとして元のデータ512bitあたり128bit使うバージョン(tbl512)と1024bitあたり128bit使うバージョン(tbl1Ki)を用意した. 比較対象のmaropuさんのは256bitあたり192bit.

extra memory rate
追加メモリ tbl1Kiに対する相対値
maropu 192/256 6
tbl512 128/512 2
tbl1Ki 128/1024 1

たとえば1Gbitのテーブルなら順に96MiB, 32MiB, 16MiBのワーク領域が必要となる.

テーブルのサイズを変えながらrank1()の処理にかかるクロックを測定した. tbl1Kiはrank()で遊ぶで書いたようにgccの生成コードが遅いのでasmで書いた. tbl512もasmで書いたがこちらはインライン化される分gccの方が若干速かったのでCバージョンを使うことにした. コンパイラはどちらもgcc 4.6.3. 1e7個のランダムなidx(-l 10000000)のとき.

rank clkclk @Core i7-2600[L3 8MiB] 3.4GHz
1e6 5e6 1e7 5e7 1e8 5e8 1e9
maropu 15.78 18.84 22.85 70.11 83.82 101.82 110.48
tbl512 13.20 16.30 17.00 47.59 66.62 84.01 96.09
tbl1Ki 20.39 24.12 25.11 53.38 89.02 113.30 125.10

こちらはキャッシュが多少大きいCPUでの結果.

rank clk @Xeon X5650[L3 12MiB] 2.67GHz
1e6 5e6 1e7 5e7 1e8 5e8 1e9
maropu 16.34 19.99 21.70 39.53 57.83 72.94 73.37
tbl512 13.39 19.04 20.61 26.58 47.76 68.21 72.69
tbl1Ki 20.49 25.86 27.03 32.38 56.52 88.40 92.96

tbl1Kiが意外に苦戦. オリジナルデータの連続する16byte(8byte x 2)を読む必要があるが, キャッシュラインに載せているわけじゃないので2回読むことが多いんだな.

点の数1e4のときの結果. こちらだとtbl1Kiも善戦.

rank clk @Xeon X5650[L3 12MiB] 2.67GHz
1e6 5e6 1e7 5e7 1e8 5e8 1e9
maropu 28.93 35.01 37.14 25.36 28.97 49.52 55.41
tbl512 25.17 33.31 34.91 24.14 26.42 43.41 51.74
tbl1Ki 38.38 48.25 51.10 31.35 33.01 45.19 52.74

tbl512は少ないメモリで高速なのでよい感じ. 巨大なデータの中でパターンが偏ってるときはtbl1Kiも遅くない. 面白い.

ランダムなデータを取ってくる操作自体のメモリキャッシュの影響を除外したベンチマークも欲しいな.

7月1日_
昨日, 急に食べたくなって和菓子の水無月をとらやで買う. 京都や奈良だとあちこちで売ってるけどこちらはなかなか見かけない. 食べてみて微妙になんか違う. よく見たら吉野葛が入ってないなあ. なんだか残念.

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