MA5 Mashup Caravanに参加しました

26日は、MA5 Mashup Caravanに参加してきました。

昨年のMashup Awards 4で優秀賞をいただいたNewsgraphyの紹介を中心に、プレゼンを行いました。

懇親会では、いろいろな方とお話することができました。たつをさんからは、NativeCheckerYahoo!検索APIの事例として各所で紹介していただいていると伺い、感激しました。

スタッフの皆様、参加者の皆様、ありがとうございました。

楽天テクノロジーカンファレンス2009に参加しました

24日、楽天テクノロジーカンファレンス2009に参加してきました。BlogopolisをLTとブースで紹介したんですが、特にブース出展が楽しかったです。他の参加者の方と直接対面して、機能を説明したり質問を受けたりすることができ、貴重な経験になりました。

何と、まつもとさんもブースにいらっしゃったので、BlogopolisRuby地区とRails地区の勃興について説明したりしました。

ブース別に投票数を競う企画もあって、Blogopolisは2位を獲得してしまいました。賞品として、以下の本4冊セット(サイン付き!)をいただきました。

ブースでは人の流れがなかなか途切れず、会場全体にも熱気が溢れていて、とても素晴らしいイベントだったと思います。ありがとうございました。

ボロノイ図いろいろ

Webエンジニアバトルロワイヤルでは、平面分割手法としてボロノイ図と「疑似築道法」というものをデモしたんですが、そのとき説明に使った4種類の2次元ボロノイ図を以下に載せます。

通常のボロノイ図

「どの母点が最も近くにあるか」にもとづいて平面を分割します。ボロノイ辺は母点の垂直二等分線になります。

マンハッタン距離にもとづくボロノイ図

ユークリッド距離の代わりにマンハッタン距離を使うと、見た目ががらっと変わって、路線図や天気予報のときの都道府県図っぽくなります。

加法的重み付きボロノイ図 (Additively Weighted Voronoi Diagram)

母点にそれぞれ重みを設定して、ユークリッド距離に重みを加算したものを距離関数としてボロノイ図を作ると、ボロノイ領域を膨らませたり縮ませたりできます。ボロノイ辺は双曲線になります。

加法的重み付きべき乗ボロノイ図 (Additively Weighted Power Voronoi Diagram)

上と似ていますが、ユークリッド距離の二乗に重みを加算したものを距離関数にすると、ボロノイ辺は直線になります。Blogopolisで使っているのがこれです。

重み付きボロノイ図の場合、ボロノイ領域の中に母点が含まれる保証はありません。また、領域が消えてしまうこともあります(どの位置からも最短距離では到達できない母点が出てくる)。

第1回 Webエンジニアバトルロワイヤル:LTスペシャル

9日、クックパッドの素敵すぎるオフィスで『第1回 Webエンジニアバトルロワイヤル:LTスペシャル』に参加してきました。8組(+飛び入り1組)の発表者が実際に作ったものを題材にLTするという形式でした。

個人的には、井上さん(ミクシィ)の『Open Your Libido』とnegipoさん(クックパッド)の『音によるUIの構築と破壊』が特に印象に残りました。井上さんの圧倒的なプレゼン力は本当に衝撃でした。普段、どうやって喋りを練習されてるんでしょうか。negipoさんのタイトルは「構築」はともかく「破壊」って何だろうと思ったら、スライドが文字通り崩壊を始めて面白かったです。

僕は『Blogopolisの平面分割手法』というタイトルで、計算幾何アルゴリズムについて発表しました。ペース配分が甘くて制限時間をかなりオーバーしてしまったんですが、2位の技術評論社賞をいただくことができ、嬉しかったです。

スタッフの皆様、とても楽しいイベントをありがとうございました!!

Flexでマウスキャプチャ

GUIツールキットには普通、マウスキャプチャの概念があることが多いと思います。コンポーネント上でマウスボタンを押してから離すまでの間、マウスがコンポーネント領域外に出たとしても、同一のコンポーネントに対してマウスイベントが発生し続けるような挙動です。

Flexでこれを実現する方法が分からなかったので、Flexのソースを読んでみたところ、以下のようにsystemManager.getSandboxRoot()を使えば良いみたいです。

private function handleMouseDown(e:MouseEvent):void {
    var root:DisplayObject = systemManager.getSandboxRoot();
    root.addEventListener(MouseEvent.MOUSE_MOVE, handleRootMouseMove);
    root.addEventListener(MouseEvent.MOUSE_UP, handleRootMouseUp);
}

private function handleRootMouseMove(e:MouseEvent):void {
    var p:Point = this.globalToLocal(new Point(e.stageX, e.stageY));
    // ...
}

private function handleRootMouseUp(e:MouseEvent):void {
    var root:DisplayObject = systemManager.getSandboxRoot();
    root.removeEventListener(MouseEvent.MOUSE_MOVE, handleRootMouseMove);
    root.removeEventListener(MouseEvent.MOUSE_UP, handleRootMouseUp);
}

技術評論社・クックパッド主催の『Webエンジニアバトルロワイヤル』に出ます

10月9日に開催される『第1回 Webエンジニアバトルロワイヤル:LTスペシャル』に、Blogopolisの発表で参加させていただくことになりました。

第1回 Webエンジニアバトルロワイヤル:LTスペシャル … 技術評論社

タイトルの時点ですでに熱いですが、実際、参加者には全員LTが課されるそうで、かなり濃いイベントになりそうです。

テーマは「技術」と「実装」の2つということなので、前回の発表とはまた違う何らかの要素を絡めて、踏み込んだ話ができれば良いなと思います。ついでにBlogopolis本体にも、当日までに何か新機能を追加したいところです。

はてブの被ブックマーク合計数取得APIに不具合?

追記: 9/29夜に再確認したところ、下記現象は発生しなくなっていました。

最近(詳細不明。ここ1ヶ月以上?)、はてなブックマークの被ブックマーク合計数取得API(単独ページのブックマーク数ではなく、指定したURL以下のブックマーク数総計を取得するAPI)の様子がおかしいように思えます。

はてなブックマーク件数取得APIとは - はてなキーワード

具体的には、ブックマークが1件も付いていないURLに対してこのAPIを呼び出すと、以下のエラーになります。

Server returned HTTP response code: 503 for URL: http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd

以下のコードで再現できます。

public static void main(String[] args) throws Exception {
    String url = "http://non.existent.domain.com/";

    XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
    config.setServerURL(new URL("http://b.hatena.ne.jp/xmlrpc"));

    XmlRpcClient client = new XmlRpcClient();
    client.setConfig(config);
    client.setTransportFactory(new XmlRpcCommonsTransportFactory(client));
    Object[] params = new Object[] { url };
    Object result = client.execute("bookmark.getTotalCount", params);

    System.out.println(result);
}