Hatena::Groupsubtech

sexさんのブログ RSSフィード

2007-11-18

Digest::SHA1をOO的に使うときの罠 04:09  Digest::SHA1をOO的に使うときの罠 - sexさんのブログ を含むブックマーク はてなブックマーク -  Digest::SHA1をOO的に使うときの罠 - sexさんのブログ  Digest::SHA1をOO的に使うときの罠 - sexさんのブログ のブックマークコメント

livedoor Authの認証の時にHMACのsigunatureを生成するんだけど、その時に使うDigest::HMAC_SHA1をいじってたら、hexdigest()で1回目と2回目以降で値が違うことがわかった。

% /usr/local/bin/perl -MDigest::HMAC_SHA1 -e '$a = Digest::HMAC_SHA1->new("foo"); $a->add("bar"); warn $a->hexdigest; warn $a->hexdigest; warn $a->hexdigest; warn $a->hexdigest;'
46b4ec586117154dacd49d664e5d63fdc88efb51 at -e line 1.
a8705f3f1f3557cef3c0a2788fb1c79a20db1c01 at -e line 1.
a8705f3f1f3557cef3c0a2788fb1c79a20db1c01 at -e line 1.
a8705f3f1f3557cef3c0a2788fb1c79a20db1c01 at -e line 1.

1回目の値でlivedoor Authの認証は通るけど2回目以降の値だと通らない。

HMACってそういう仕様なのかな…?

でも、以下のようにreset()を呼ぶと同じ値になる。

% /usr/local/bin/perl -MDigest::HMAC_SHA1 -e '$a = Digest::HMAC_SHA1->new("foo"); $a->add("bar"); warn $a->hexdigest; $a->reset; $a->add("bar"); warn $a->hexdigest;'
46b4ec586117154dacd49d664e5d63fdc88efb51 at -e line 1.
46b4ec586117154dacd49d664e5d63fdc88efb51 at -e line 1.

ということで2回目になると何かが変わるんじゃないかという予想の元で、Digest::HMAC_SHA1の内部で呼ばれているDigest::SHA1のperldocを眺めていたら、digest()の説明のところで

           Note that the "digest" operation is effectively a destructive,
           read-once operation. Once it has been performed, the "Digest::SHA1"
           object is automatically "reset" and can be used to calculate
           another digest value.  Call $sha1->clone->digest if you want to
           calculate the digest without reseting the digest state.

という記述を見つけた。

なるほど、Digest::SHA1のdigest()は破壊的なもので1回呼ぶ用なのね。

1回でも呼ぶと自動でreset処理されるっぽい。

もしそれをしたくなければ、以下のようにclone()を呼んでインスタンスを別に保存しておいてねってことみたい。

% /usr/local/bin/perl -MDigest::SHA1 -e '$a = Digest::SHA1->new; $a->add("barbar"); $b = $a->clone; warn $a->hexdigest; warn $b->hexdigest;'
0f6c5d02114253073f6b80c7bbcbba27548715e8 at -e line 1.
0f6c5d02114253073f6b80c7bbcbba27548715e8 at -e line 1.

これを知らないでDigest::SHA1のインスタンスを使い回してたりするとえらいめにあいそうな予感がするね。

いつもOO的に使わないでdigest_sha1()を使ってたからこんなの気付かなかったよ。

masnhtpfozmasnhtpfoz2011/03/23 07:37pb07C5 <a href="http://axxackimhsbn.com/">axxackimhsbn</a>, [url=http://eqvzvtgnvzgx.com/]eqvzvtgnvzgx[/url], [link=http://husdnkewcytn.com/]husdnkewcytn[/link], http://egldctphmlhd.com/

トラックバック - http://subtech.g.hatena.ne.jp/clouder/20071118

2007-11-15

imlib2を使ってる 16:18  imlib2を使ってる - sexさんのブログ を含むブックマーク はてなブックマーク -  imlib2を使ってる - sexさんのブログ  imlib2を使ってる - sexさんのブログ のブックマークコメント

imlib2をPerlからじゃなく、じかにCのライブラリとして使ってるのだが生のデータを取り出す関数がないようだ…。なんでやねん。

gd2は微妙(?) 16:22  gd2は微妙(?) - sexさんのブログ を含むブックマーク はてなブックマーク -  gd2は微妙(?) - sexさんのブログ  gd2は微妙(?) - sexさんのブログ のブックマークコメント

imlib2を使う前にgdの2系を使ってみようと思っていじってたんだけど、gd2はだめだね。

なんでだめかって、gd2になってからgifを取り扱わない方針みたいなんですよね。

たぶん例のライセンスとかの問題だと思うけど。

一応、使えるようにするパッチはあるのでそれを適用すりゃいいんだけど若干手間かかるし。

で、gifを扱いたければ、2系じゃなくて1系のgdであればいいらしい。

で、1系のgdを使おうと思ったんだけど、そこでimbli2ってあったなというのを思い出し、

↑で書いたimlib2を使い始めたという次第です。

追記

gd2がgifをサポートしていないのは間違いでした。現在のgd2はサポートしている模様。

ちなみにimlib2を選んだ理由はもう1つあって、gdは画像の形式毎に読み込む関数が別で、imlib2だと1つの関数でそれができるという利点がありimlib2を使ってみようと思いました。

Cでmkdirを再帰的にしたいとき 19:47  Cでmkdirを再帰的にしたいとき - sexさんのブログ を含むブックマーク はてなブックマーク -  Cでmkdirを再帰的にしたいとき - sexさんのブログ  Cでmkdirを再帰的にしたいとき - sexさんのブログ のブックマークコメント

static void recursive_mkdir(char *d)
{
    char *tok, *path;
    int len;
    struct stat sb;

    len = strlen(d) + 1;
    path = malloc(len + 1);

    tok = strtok(d, "/");
    snprintf(path, len, "/%s", tok);
    while(1) {
        if(stat(path, &sb) < 0) {
            // The path element didn't exist
            mkdir(path, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
        }

        if(!S_ISDIR(sb.st_mode)) {
            printf("Path element not a directory\n");
            exit(3);
        }

        tok = strtok(NULL, "/");
        if(!tok)
            exit(0);
        strncat(path, "/", len);
        strncat(path, tok, len);
    }
    return;
}
トラックバック - http://subtech.g.hatena.ne.jp/clouder/20071115

2007-11-13

simple-hatena-modeの設定 19:57  simple-hatena-modeの設定 - sexさんのブログ を含むブックマーク はてなブックマーク -  simple-hatena-modeの設定 - sexさんのブログ  simple-hatena-modeの設定 - sexさんのブログ のブックマークコメント

xcezxさんが公開してたので、自分も公開してみる。

今のところ、.emacs には下記しか書いてない。

;; simple-hatena-mode
(require 'simple-hatena-mode)
(setq simple-hatena-bin "/home/clouder/local/bin/hw.pl")
(setq simple-hatena-default-id "clouder")

で$HOME/.hatenaの中は、

.hatena
   |-clouder
   |---diary
   |---group
   |-----mobilehacker
   |-----monsterhunter
   |-----subtech

これだけです。

g:subtech:id:clouder:20071112:1194845312を採用してもらったため、今のところこれだけで不便はない状態です。

欲を言えば、今チケットにある「simple-hatena-setupの実装」と「はてダとの同期」もあったらいいなーと思います。

余裕があったら実装したいと思います。

トラックバック - http://subtech.g.hatena.ne.jp/clouder/20071113

2007-11-12simple-hatena-modeを使い始めた

投稿テスト。 14:33  投稿テスト。 - sexさんのブログ を含むブックマーク はてなブックマーク -  投稿テスト。 - sexさんのブログ  投稿テスト。 - sexさんのブログ のブックマークコメント

グループに投稿しているのに 14:33  グループに投稿しているのに - sexさんのブログ を含むブックマーク はてなブックマーク -  グループに投稿しているのに - sexさんのブログ  グループに投稿しているのに - sexさんのブログ のブックマークコメント

はてダの方に投稿されてしまう…なぜだ。

-gが使われてないからかな? 14:34  -gが使われてないからかな? - sexさんのブログ を含むブックマーク はてなブックマーク -  -gが使われてないからかな? - sexさんのブログ  -gが使われてないからかな? - sexさんのブログ のブックマークコメント

ちょっと修正して、投稿してみる。

お、直った 14:28  お、直った - sexさんのブログ を含むブックマーク はてなブックマーク -  お、直った - sexさんのブログ  お、直った - sexさんのブログ のブックマークコメント

下記のパッチをあてると、グループの日記に投稿できるようになる。

--- simple-hatena-mode.el.orig  2007-11-12 14:27:23.000000000 +0900
+++ simple-hatena-mode.el       2007-11-12 14:35:57.000000000 +0900
@@ -510,6 +510,7 @@
   (let ((opts nil))
     (dolist (pair
              `(("-u" . ,simple-hatena-local-current-buffer-id)
+               ("-g" . ,simple-hatena-local-current-buffer-group)
                ("-a" . ,simple-hatena-option-useragent)
                ("-T" . ,simple-hatena-option-timeout))
              opts)

こりゃ便利だね 14:34  こりゃ便利だね - sexさんのブログ を含むブックマーク はてなブックマーク -  こりゃ便利だね - sexさんのブログ  こりゃ便利だね - sexさんのブログ のブックマークコメント

日記書く頻度が上りそう!

antipopantipop2007/11/12 21:37config.txtにグループ名を書くとグループでもいけますよー。と思いきや、-gオプションなんてあったんですね……。ドキュメントのコマンドラインオプションのところに書いてなかったから、ないものだとばかり……。とゆわけで、修正しました。どもです><ノ

clouderclouder2007/11/13 00:13お、どもーっす。
ちなみに今のところconfig.txtを書いてないで使っております…。

antipopantipop2007/11/13 16:34-gオプション追加のおかげで、それが推奨される使用法になりました!

clouderclouder2007/11/13 20:08おぉ、採用して頂きありがとうございます!

トラックバック - http://subtech.g.hatena.ne.jp/clouder/20071112