そういえば4Gbps

ひさしぶりにポストするのは宣伝エントリー
既に各所で告知されてますが、弊社エンジニアの共著で本を書きました。
Webサービスの概念的な部分から、Webアプリ、モバイル、ミドルウェア、ネットワークと幅広いレイヤーについて書いてあるのが弊社っぽいかなと思います。

よろしくどうぞー

4Gbpsを超えるWebサービス構築術
4Gbpsを超えるWebサービス構築術
クチコミを見る

okyuu.com さんに取材してもらいました。

そういえば、カカクコムさんがやってるエンジニア向けサイトの okyuu.com の特集記事で取材してもらいました。
http://okyuu.com/ja/special/%E7%89%B9%E9%9B%86_No_okyuu_No_Life_%E7%AC%AC1%E5%9B%9E

こういう取材で技術寄りでは無くエンジニアのマネージメントという視点で話したのは初めてな気がします。
今後はブログでもそのあたりの事書けるといいなと。

いいとも形式で続いていくそうなので、次回は牧さんにお願いしました。

Eye-Fi から S3 にアップロード

ブログネタ
Webアプリケーション に参加中!

昨年末に発売された Eye-Fi Share の日本語版ですが、これまで個人的なバックアップ用途に利用していた Amazon S3 が使えないようだったので Gallery の Protocol を受けとって S3 にアップロードする Proxy 的なアプリを書いて対応してみました。

ソースは CodeRepos に入れておきました。Catalyst 使ってます。
Catalyst 以外に Catalyst::Plugin::Session 系がいくつかと Net::Amazon::S3 あたりが必要だと思います。

設定項目として画像をアップロードするバケット名を指定します。
mod_perl や FastCGI 等で Catalyst アプリを立ちあげたあとは、Eye-Fi の設定画面から Gallery2 を選択します。
以下は mod_perl2 の場合の設定例です。

<Perl>
use lib qw(/home/www/apps/GR2S3/lib);
</Perl>
PerlModule GR2S3
<Location /gr2>
    SetHandler perl-script
    PerlResponseHandler GR2S3
</Location>

URL に アプリケーションの URL、 ユーザー名に S3 の API KEY、 パスワードに シークレットを設定します。
Eye-Fi 側が Gallery2 を想定してるので /gr2/main.php のような パスにアクセスがあるのがちょっと気持ちわるいですが、気にしないでおきましょう。
画像は日付でプレフィックスがつけられて 2009-01-02/PICT001.JPG のようなキーで保存されます。

Gallery のリモートプロトコルは以下に仕様があります。全然綺麗とは言い難いのですが、簡単なので再実装は容易です。
Eye-Fi に対応するためには login, fetch-albums-prune, add-item, new-album のみを実装しておけば大丈夫なようです。

http://codex.gallery2.org/Gallery_Remote:Protocol

OpenID の Attribute Exchange

弊社の OpenID 拡張の参考に。。色々調べてるところです。
mixi の OpenID が AX と SREG に対応してるとの事なので試してみた。

SREG は使った事あるので、今回は AX を実装。以下のような感じでちゃんとニックネーム取れた。
AXだと独自で拡張した野良フィールド足して返してもいいのかなぁ。

やはり、さらりと使いたい人用の SREG と色々追加の属性が取れる AX の両方を実装しておいた方がいいのだろうか。
# だいぶ適当
sub login : Local {
    my( $self, $c ) = @_;
    my $csr = Net::OpenID::Consumer->new(
        ua => LWP::UserAgent->new,
        args => $c->req->parameters,
        consumer_secret => 'xxx',
        required_root => 'http://localhost:3000',
    );
    my $identity = $c->req->param('identity');
    if ($c->req->param('openid-check')) {
        if (my $vident = $csr->verified_identity) {
            my $ax = $vident->signed_extension_fields(
                'http://openid.net/srv/ax/1.0',
            );
            # ニックネームとれた!
            return $c->res->body( join ':', $vident->url, $ax->{'value.nickname'} );
        }
    }
    elsif (my $claimed = $csr->claimed_identity($identity)) {
        $claimed->set_extension_args('http://openid.net/srv/ax/1.0', {
            mode => 'fetch_request',
            'type.nickname' => 'http://axschema.org/namePerson/friendly',
            required => 'nickname',
        });
        my $check_url = $claimed->check_url(
            delayed_return => 1,
            return_to => 'http://localhost:3000/login?openid-check=1',
            trust_root => 'http://localhost:3000',
        );
        return $c->res->redirect( $check_url );
    }
}

社内で使った Apache モジュールの資料

社内の技術MTGで Apache モジュール入門なプレゼンをしたので、資料公開します。
非常に基礎的な内容ですが。

実際の Web サービスでの Apache モジュールの使いどころとしては、translate_name フェーズでゴニョる事が多いですね。
ユーザーへみせる URL と実体の場所との関係が複雑化してきた際には Rewrite でがんばるよりモジュール書いちゃった方がスッキリします。続きを読む
Profile
  • ライブドアブログ