つぶやき - Web 2.0 の世界とデジタル・デバイド

Web 2.0 で重要とされる考え方は色々あって(yohei-y:weblog: REST -> AtomPP -> blog -> Permalink -> RSS/Atom -> Remixing (Ajax/Microformats/Folksonomy)で図式化されて説明されているのでその辺も参照)、そのいくつかはすでに具体的に実現されているものがある。REST的な考え方、Permalink、フィードによるメタデータの syndication、Webservices APItagging による Folksonomymicroformats、user script (GreasemonkeyTrixieTurnabout etc..) による Content Remixing... などなど。

つらつらと眺めてみると、そのうちの幾つかをのぞき、いまのところ実現されている手段はテクノロジ色の濃いい物が多い。Web 2.0 という世界について語りはじめられたのがついこの頃だから、まだその辺りに関心があるのはイノベーターやアーリーアダプターな人たちなので至極当然な話。(ソーシャルブックマークのエントリーに偏りがあるというのはこの辺とモロに関係している。) API の開放、user script、taggingなんかはその代表格で、それらがもたらす世界というのを把握しながら使いこなせている人というのは、インターネットの世界全体から見たらほんの一部の人たちだけ。

現時点ではそれで十分だし、まだしばらくそういう流れなんだとは思う。その一方で PermalinkRSS フィードは、blog がうまくそれらの下地になってくれたおかげで、その効果や利点などを意識せずとも、インターネット上に浸透していっているように見える。

Remix や Folksonomy という考え方はすばらしいのだけど、それらを実現する手段としてよりシームレスなものっていうのは一体何なんだろう。使い手がそれらを意識することなしに、その恩恵を得られるもの。自分の両親が blog を使いはじめて整えられたアーキテクチャでウェブサイトを構築し、RSSAtom でシンジケーションするということはもしかしたらありえるかもしれないけど、Greasemonkey で Remix して tagging で情報をうまく整理するなんてことはどう考えてもあり得ない。

と、考えると、これらの世界が実現していくためには今とは違った手段が必要になってくるだろうし、そういった手段が出てこなかった概念はいずれ廃れる、あるいはいわゆるデジタル・デバイド(なんか死語っぽいけど)の象徴になるのかもしれない、なんて風にも思う。手段自体がメジャーシーンに拡大しなくても、API によって開発された成果物を使う人、Folksonomy で分類された後の結果だけを見てその恩恵を授かるフォロワーがいたりする、ということもあるので、かならずしも手段のコモディティ化が必須というわけではないのだろうけど。

なんてことを最近考えている。

Google Maps 日本語対応

Google Maps が ZENRIN の地図を買って日本の Street Map にも対応したみたいですね。しかし Maps Hacker の間で話題になっているように、なぜか日本の位置情報を送るには TOKYO 測地系に変換することが必要。。

ということで Google Maps がサテライトだけじゃなくマップ版も日本語に対応した模様。APIで引っ張ってくると特に何もしなくてもマップ版も付いてくる、ということではてなマップでもマップが使えます。

map_jp.gif

が、上記にもあるように測地計のずれでちょっといやーんなことになってて、現在 Hack するかどうか検討しています。

それで、どうやらマップに対応しただけじゃなく、検索の方も日本語に対応してるみたいです。住所とか郵便番号で検索できる。こんな感じ

フォームに入力された文字列は、日本の住所DBを辞書代わりに使ってわかち書きされて検索クエリとして利用されるらしく、適当なマンション名とかでもある程度検索できます。お店の紹介文に入っている文章なんかにもヒットしてくる。まだすこし精度があいまいではありますが。

Google Maps API はあくまで地図だけの API で、検索や住所から緯度経度への変換といったところまではサポートしていません。そこは自分たちでやる必要がアリ。はてな的にははてなキーワードとの組み合わせで、略称、造語っぽいものも緯度経度があれば検索できるとか、そっち側で長所を盛り込んでいきたいところ。

Google ローカルも動いてる

先日から Google Local の日本語版のインタフェースが見られるようになっていたのですが、検索しても結果は出てこず、対応はまだかな、と思ったら今日の maps の対応と同時にこちらも稼動し始めたようです。こんな感じ

Google Maps との連携機能もサポートしています。これで Google も日本のローカルサーチサービスに参入ですね。

JSAN - JavaScript Archive Network

JavaScript版の CPAN であるところの JSANがぼちぼち動き始めている様子。宮川さんはミラーを作ったりしている。

PAUSEならぬJAUSEはいまいちまだ整備されてなくて、よくわかんない。とりあえずアップロードしてみておいた。(略) JSANにのった! 仕事はえー。

アップロードし始めている人も。トップページ見ているとぼちぼちいくつか出てきていますね。PAUSE ってのは CPAN のアカウント管理システムのこと、いずれ JAUSE みたいなのが必要になってくるでしょうね。

Google loc: 渋谷

Google マップの検索クエリに「Google loc: 渋谷」とするとローカル検索が走ってグーグル本社のデータが出てくる。

単にマップで「グーグル」と検索してもうまく出てこないのだけど、loc: で地名を補ってやるとうまくいくようになってます。こんな感じでローカルと連携しているようです。

はてなマップのRSS

Google Maps の日本対応が始まったこともあるし、サービス開始から一週間で大きな update もないわけにはいかないだろう、ということで今日はエンジニアチーム一丸となってはてなマップの機能強化を行いました。僕はトラックバックの機能を作っていました。アップデートの主な内容ははてなマップ日記をご覧ください。

このアップデートの中で、マップのRSSフィード配信なんてものもあります。

本日、はてなマップにおいて、表示中の地図上に含まれる各種拠点情報を含んだRSSの配信を開始しました。

地図にRSS、と聞いただけだと何だか不思議な感じでイメージし辛いのですが、使ってみるとすぐにお分かりいただけるかと思います。そのときマップを表示している範囲内の新着情報を、RSS で受け取れる、というものです。例えばはてなオフィス周辺の情報はこんな具合で syndicate されてます。

RSS の中には RDF/XMLgeoボキャブラリ を使って、

<geo:lat>35.6511</geo:lat> 
<geo:long>139.6982</geo:long> 

とこんな感じで各 item の longitude と latitude も表現してあります。どんな Hack にこれが使えるかは使い方次第ですが、宮川さんの Hack のようなものと連携してほげほげ、というあたりがとりあえず思いつきます。

実は僕はあんまり地図萌えじゃないので Map Hack 系はうといのですが、その他のはてなプログラマは地図萌え & API 萌えな感じでかなり楽しそうに Hack してる様子。僕は淡々とブックマークを update していこうかなと..。先日 AtomPP が動かなくなるバグを混入させてしまったので、みんなが地図 Hack してる横でブックマークの AtomPP のテストを Test::More で自動化したりしていました。

Greasemonkey でセキュアな RSS Syndication を実現する Remix

What we're talking about is giving Bloglines a quick upgrade and doing it ourselves. That means we're talking Greasemonkey, a Firefox extension that allows you to write scripts that modify the pages you visit. In this case, the modification is going to be decryption. We'll write a Greasemonkey script, securesyndication.user.js that looks for encrypted content and, using the private key we provide, will decrypt the content when we view it.

XML.com で、RSS をセキュアに配信する Hack のエントリーが挙がっていました。(これも宮川さんの del.icio.us から。彼のブックマークは非常に重要な情報源だったりする。)

RSS の description 内で、暗号化したい箇所を一部だけ Blowfish アルゴリズム (秘密鍵を使った可逆なアルゴリズム) で暗号化し、Bloglines などのウェブ型のリーダーに食わせて、表示時に鍵を埋め込んだ Greasemonkey で decrypt してやるというもの。なるほどこの手がありますか。

このエントリーでは、単に Greasemonkey を使ってプライベートな情報をセキュアに syndicate することに成功したよ、という以外にもいろいろ重要な点について言及されていると思います。

一つは、パスワード制限をかけただけの RSS sydication は脆弱であるという話。これは以前に hail2u.net で kyo さんが論じていた話で、ご存知のかたも多いはず。暗号化されていないパスワードがネット上を流れる、というだけでなく aggregator 側にパスワードを知られてしまうとか、フィード内にクレジットカード番号とかが入ってたらそれもネットに流れるし aggregator の DB に格納されてしまうとか色々。

もう一つは、XML Encryption Syntax & Processing という方法により Atom フィードではエントリーの暗号化が実現されるであろうという話。でもこれはまだ実現していないと。

そして、パスワード制限は脆弱で、Atom フィードによる暗号化が実現されていない今、でもセキュアな syndication 手段は必要だ、さてそこでどうするか、User script で Remix だ! という Web 2.0 的な考え方。

それから、エントリーの全体を暗号化するのではなく、class="encrypted blowfish" で指定したブロックのみを暗号化するという microformat 的な解決手段など。

加えて、JavaScript で Blowfish を復号化するための実際のコード。かなり密度の高いエントリーです。この辺の話題に興味のある方は必見かも。

Crypt::CBC による Blowfish 暗号化

This module is a Perl-only implementation of the cryptographic cipher block chaining mode (CBC). In combination with a block cipher such as DES or IDEA, you can encrypt and decrypt messages of arbitrarily long length. The encrypted messages are compatible with the encryption format used by SSLeay, and can be made compatible with the newer OpenSSL package by specifying the -salt argument.

先の XML.com の記事で Blowfish アルゴリズムによる暗号化という話が出てきます。で、その中でC言語による実装の具体的なコードも出てきます。

では、Blowfish を Perl で利用するにはどうしたらいいか、ということになるのですがそこはやはり CPAN の力を借りるのが手っ取り早い。Crypt::Blowfish を使うのが一つの手で、さらに一歩進めてブロック暗号の一つである CBC (Cipher Block Chaining) により暗号化を行う Crypt::CBC を使うと良いようです。随分前にちょっとだけ調べたときのメモが出てきたので、覚書代わりにエントリーしておきます。

Crypt::CBC で Blowfish 暗号化を行うには、

#!/usr/local/bin/perl
use strict;
use Crypt::CBC;
  
my $strings = "ほげほげほげ"
my $cbc = Crypt::CBC->new({
    key => 'naoya',
    cipher => 'Blowfish',
    padding =>'null'
});
my $crypted = $cbc->encrypt_hex($strings);

print $crypted, "\n";

とこんなコードになります。コンストラクタの cipher で CBC で使える暗号アルゴリズムを選択する。Crypt::FooBar になっているモジュールであればここに指定可能のようです。Blowfish で Crypt::Blowfish が内部で利用されます。Blowfish_PP にすると Crypt::Blowfish_PP という Pure Perl な Blowfish 実装が使われます。key には復号化に必要になる秘密鍵を指定します。

逆に復号化するときは、

#!/usr/local/bin/perl
use strict;
use Crypt::CBC;
  
my $strings = '(暗号化した文字列)'
my $cbc = Crypt::CBC->new({
    key => 'naoya',
    cipher => 'Blowfish',
    padding => 'null'
});
my $decrypted = $cbc->decrypt_hex($strings);
  
print $decrypted, "\n";

となります。中の実装を詳しく知らなくても、その恩恵を得ることができるのがお分かりかと思います。

ブロック暗号やCBC、より詳しい Crypt::CBC の使い方なんかは Cepheidさんのところにあるドキュメントが参考になります。

暗号化関連はさすがに難しいです。