DEVELOPMENTOR*LEARNING RESOURCE LAB.

ソフトウェア開発現場の視点からソフトウェアと開発者の価値を高める「ホットな何か」をお届けします。(休止)

BLOGRANGER Mindshare Calculator

2006年10月31日 | Web 2.0

 『Google Hacks 第2版―プロが使うテクニック&ツール100選』の「HACK #34 Googleマインドシェアの測定」を「BLOGRANGER 2.0」のBLOGRANGER APIに置き換えてAjax化してみました。↓こんな感じです。


View example

指定した「Query」の検索結果の中に登場する「Person」のマインドシェアを測定します。GoogleのインデックスでなくBLOGRANGERのインデックスを使うため、ブログ界に限定したマインドシェアが測定できます。

マインドシェアの計算方法は前著のHACKと同じです。はじめに「Query」をキーワードとしてブログ記事を検索してそのヒット件数(a)を求めます。次に「Query」と「Person」をAND条件のキーワードとしてブログ記事を検索してそのヒット件数(b)を求めます。最後に(a)に対する(b)の割り合いを求めます。この結果がマインドシェアです。

上の例では「perl」に対する「naoya」のマインドシェアを測定しています。結果は「naoya has a 1.3878743608473338% BLOGRANGER share of "perl"」となりました。この結果はどう受け取ればよいのだろうか・・・。う~む。


AOLVS Ajax APIで日本語が使えた!? サムネイルを表示してみる

2006年10月29日 | Web 2.0
AOL Video Search AJAX API Introductionを試す」の中で、次の課題がありました。

それ以前に「AOL video」自体が日本語のインデックスを持つのかどうかも調べないといけない。

そこで「AJAX API Introduction」のサンプルコードを改良し、検索ボックスを追加してみました。検索ボックスに日本語を入力してAOL Videoを検索できます。↓こちらからどうぞ。

View example

いくつか日本語キーワードでの検索を試しましたが、日本語のクエリも機能しますし、日本語の検索結果も表示できています。WEBページの文字コードを「UTF-8」と「EUC-JP」としてみましたが、いずれも期待どおり動作しています。

また今回は、次のようにサムネイルも表示してみました。サムネイルのサイズは「Video.thumbnailUrl」と「Video.thumbnailUrlLarge」の2通りがあります。ただ後者の「Video.thumbnailUrlLarge」だけ、サムネイルのURLがなく省略されることがありました。このとき「Video.thumbnailUrlLarge」はundefinedとなっています。

function update() {
  var html = '<ol>';
  for (var i=0; i<AOLVS.VideoSet.totalResultsReturned; i++) {
    var video = AOLVS.VideoSet.Video[i];
    html += '<li>';
    html += '<div>'+video.title+'</div>';
    html += '<div><img src="'+video.thumbnailUrl+'" /></div>';
    if (video.thumbnailUrlLarge)
      html += '<div><img src="'+video.thumbnailUrlLarge+'" /></div>';
    html += '</li>';
  }
  html += '</ol>';
  document.getElementById('results').innerHTML = html;
}

私にとって「AOL Video Search APIs」はまだまだ未知数です。海外のサイトでも実用例が乏しいようですので、時間を見つけていじくっていきます。


混雑がウワサのIKEA 港北を覗いてみました。

2006年10月29日 | 使えるグッズ

10月28日(土) 混雑しているというウワサの「IKEA 港北」を覗きにいってみました。

店舗に入ったのはちょうどお昼頃です。3階に渡って駐車場がありましたが、1つの階は満車でそれ以外の階は空車が目立ちました。その後、店舗を出たのは90分後くらい。空車はありますが、あとちょっとすれば埋まってしまうだろうなという印象です。土曜日や日曜日は午前中が無難かも。

店舗の感じや(有名かもしれませんが)取り扱い商品は、好みがわかれるところですので、実際に足を運んでみてください。

↑はなしネタにIKEAのショッピングバックを買っておきました。70円なり。外資系ということもあり実費です。

ブログ界での「IKEA」の話題はこちらから。いろいろあるみたいです。
http://ranger.labs.goo.ne.jp/rpc/partsview.php?key=1637


ソフトバンクからNTTドコモにMNPしてみました

2006年10月29日 | 使えるグッズ

10月24日からナンバーポータビリティ(MNP)がスタートしましたので、さっそくソフトバンクからNTTドコモにMNPしてみました。家族のキャリアを1本にまとめるのが目的です。ソフトバンクかNTTドコモかの選択は、家族での多数派を優先した結果です。

はじめにドコモポイント2,000円分(2,000ポイント)が貰える「携帯電話番号ポータビリティ事前予約キャンペーン」というキャンペーンを申し込みます。私はNTTドコモのWEBサイトから申込みをしました。申し込んでから1週間くらいで「携帯電話ポータビリティ事前予約キャンペーンエントリー受付のお知らせ」が封書で届きます。

次にソフトバンクにMNP予約を申し込みます。ソフトバンクのWEBサイトでは、ソフトバンクから他社へMNPするための手続きを案内していないようですので、NTTドコモのWEBサイトの「MNPの手続き方法が知りたい」にしたがって手続きしました。

ソフトバンクの携帯電話からMNP予約申込み窓口に電話をします。電話番号と暗証番号を入力すると、オペレータに繋がります。オペレータからMNPの注意点の説明を受けます。その注意点を了承した上でMNP予約をお願いします…と伝えるとその場で10桁のMNP予約番号が発行されます。またその数分後、携帯電話にMNP予約番号がメールでも届きます。この間の通話時間は11分3秒でした。オペレータの説明がほとんどです。

前述の「携帯電話ポータビリティ事前予約キャンペーンエントリー受付のお知らせ」と「MNP予約番号」をもって家電量販店の携帯電話売り場へ足を運びました。ソフトバンクからNTTドコモへMNPをお願いします…と伝えれば大丈夫でした。MNPだからといって店頭で特別な手続きはありませんでした。NTTドコモと新規契約するときとほぼ同じ手続の内容です。その後、1時間ほど待つとMNP手続きが終わり、同じ電話番号でNTTドコモで使えるようになりました。

これでMNP手続きはすべておしまいです。

あとで新聞で知ったのですが、私がMNP手続きした10月28日の夕方ごろからソフトバンク側の都合でNMP手続きが停止してしまったそうです。詳しくは「ソフトバンクモバイルとのMNP新規受付停止について」からどうぞ。あれまぁ。私は昼過ぎにMNP手続きをしたのでギリギリセーフだったってことです。トラブルも予想外ってわけにはいかんでしょう。


Google gadgetやフィードを購読するAdd to Googleボタンを設定してみる

2006年10月29日 | Web 2.0

Googleパーソナライズドホームに「Google gadget」やフィードを登録する↑のようなボタンをよく見かけます。そこで、このボタンをWEBページに設置する方法を探してみたところ、「Google Help  Add to Google button」というページを見つけました。このページの手順にしたがうと、とても簡単にボタンを設置できました。

まずこのブログのフィードを購読するボタンを設置してみました。↓こんな感じです。

Add to Google

 次に「GoogleパーソナライズドホームにBLOGRANGERパーツを表示してみる」で作ったBLOGRANGERパーツをGoogleパーソナライズドホームに追加するボタンを設置してみました。↓こんな感じです。


Add to Google


明治製菓:Chocolife ショコライフ 温州みかん

2006年10月26日 | プログラマのおやつ


明治製菓:Chocolife ショコライフ」の温州みかん。ちょっとした酸味があってハマリます。



さわやかな香りの「温州みかん」を贅沢に使用しました。
素材のおいしさが愉しめます。


 


ブログでも話題になっているみたいですね。ブログでの感想は次のとおり。「甘酸っぱい」は温州みかんのことだろうね。
http://ranger.labs.goo.ne.jp/rpc/partsview.php?key=1605


  • 美味しい
  • おいしい
  • 甘い
  • 好き
  • 高い
  • 良い
  • 多い
  • よい
  • 薄い
  • 無い
  • 濃い
  • 濃厚
  • 欲しい
  • 嬉しい
  • 楽しい
  • うまい
  • 大好き
  • 甘酸っぱい
  • うれしい
  • 苦い

Googleマップの吹き出しにBLOGRANGERパーツを表示する

2006年10月25日 | Web 2.0

GoogleマップとBLOGRANGERパーツでレジャースポット案内を作る」で作ったレジャースポット案内は、「Googleマップ」と「BLOGRANGERパーツ」が連携しているといいつつも、GoogleマップとBLOGRANGERパーツを左右に並べたレイアウトのためマッシュアップ感が低いといわざるをえません。

そこでGoogleマップとBLOGRANGERパーツが統合して見えるように、Googleマップの吹き出し(情報ウィンドウともいう)にBLOGRANGERパーツを表示するように改良してみました。またついでにレジャースポットを10ヶ所ほど追加(合計15ヶ所)してにぎやかにしてみました。

↓こんな感じです。前作に比べてマッシュアップ感が向上したと思いますがいかがでしょうか。


View example

改造したポイントをお伝えしておきます。

次のとおり、まとめてレジャースポットを定義するようにしました。レジャースポットの緯度、経度、そしてBLOGRANGERパーツのブックマークURLを指定します。今後、新しいレジャースポットを追加するときは、末尾に1行を追加するだけでOKです。

var spots = [
  // {lat: 緯度, lng: 経度, url: ブックマークURL}
  {lat: 35.660347, lng: 139.729121, url: 'http://ranger.labs.goo.ne.jp/rpc/partsview.php?key=1510'}, // 六本木ヒルズ
  {lat: 35.665246, lng: 139.712319, url: 'http://ranger.labs.goo.ne.jp/rpc/partsview.php?key=1556'}, // 表参道ヒルズ
    …
  {lat: 35.676368, lng: 139.699359, url: 'http://ranger.labs.goo.ne.jp/rpc/partsview.php?key=1590'}  // 明治神宮
];

マーカーをクリックしたとき、吹き出しの中にBLOGRANGERパーツを表示(GMarker.openInfoWindowHtml)するようにしました。BLOGRANGERパーツはiframeを使って表示します。iframeのsrcにはBLOGRANGERパーツのブックマークURLを指定します。

function createMarker(spot) {
  var marker = new GMarker(new GLatLng(spot.lat, spot.lng));
  GEvent.addListener(marker, 'click', function() {
    marker.openInfoWindowHtml('<iframe '
      + 'src="'+spot.url+'" '
      + 'width="320" height="200" frameborder="0" '
      + 'marginwidth="2" marginheight="2" '
      + '></iframe>'
    );
  });
  return marker;
}

レジャースポットの定義に基づいて繰返しマーカーを追加します。

  for (var i=0; i<spots.length; i++)
    map.addOverlay(createMarker(spots[i]));

最後におまけです。地図の右下にズームアウトした小さな地図を表示するようにしました。この小さな地図を使うと、広域の視点から地図を操作できます。

  map.addControl(new GOverviewMapControl());

GoogleマップとBLOGRANGERパーツでレジャースポット案内を作る

2006年10月23日 | Web 2.0

「googleマップ」と「BLOGRANGER 2.0」のBLOGRANGERパーツを使って、東京近郊のレジャースポット案内を作ってみました。↓こんな感じです。


View example

googleマップにレジャースポットのマーカーを配置しています。そのマーカーをクリックすると、レジャースポットの周辺地図を噴出しに表示します。さらにBLOGRANGERパーツを使って、ブログ界でのレジャースポットへの感想を右側に表示します。

GoogleマップとBLOGRANGERパーツでレジャースポット案内を作る手順は次のとおりです。

はじめにBLOGRANGER 2.0でBLOGRANGERパーツを作ります。ここでは「感想を選ぶ」を使って「六本木ヒルズ」「表参道ヒルズ」「東京ディズニーランド」のレジャースポットのパーツを作りました。

 次にレジャースポットのBLOGRANGERパーツを次のようにWEBページに貼り付けます。パーツはdiv要素のidで識別できるようにしておきます。またパーツを意味するclassを付与し、はじめはstyleで非表示としておきます。

<div id="roppongihills" class="blogranger" style="display: none;">
<script type="text/javascript" src="http://ranger.labs.goo.ne.jp/rpc/api.php"></script>
<script type="text/javascript" src="http://ranger.labs.goo.ne.jp/rpc/parts.php?key=1510"></script>
<noscript>
<a title="by BLOGRANGER" href="http://ranger.labs.goo.ne.jp/" target="_blank">
<img style="border: 0;" alt="by BLOGRANGER" 
  src="http://ranger.labs.goo.ne.jp/rpc/image/promote.gif" /></a>
</noscript>
</div>

<div id="omotesandohills" class="blogranger" style="display: none;">
  …
</div>

<div id="tokyodisneyresort" class="blogranger" style="display: none;">
  …
</div>

googleマップにマーカーを配置します。

  map.addOverlay(createMarker(new GLatLng(35.660347, 139.729121), 'roppongihills'));
  map.addOverlay(createMarker(new GLatLng(35.665246, 139.712319), 'omotesandohills'));
  map.addOverlay(createMarker(new GLatLng(35.634017, 139.878595), 'tokyodisneyresort'));

googleマップのマーカーを作成し、clickイベントの関数を登録しています。マーカーをクリックすると、BLOGRANGERパーツをすべて非表示(Element.hide)にした後、該当するBLOGRANGERパーツを表示(Element.show)します。つまり、マーカーをクリックするごとにBLOGRANGERパーツが切り替わります。続けてマーカー周辺の拡大地図を噴出しに表示(GMarker.showMapBlowup)します。

function createMarker(point, element) {
  var marker = new GMarker(point);
  GEvent.addListener(marker, 'click', function() {
    var elements = document.getElementsByClassName('blogranger');
    elements.each(function(element) {
      Element.hide(element);
    });
    Element.show(element);
    marker.showMapBlowup(15);
  });
  return marker;
}

これで完了です。

レジャースポットを増やしていくのは簡単ですね。BLOGRANGERパーツを作ってgoogleマップにマーカーを配置していきます。ただBLOGRANGERパーツをたくさん貼り付けると、だんだんWEBページが表示されるまで時間がかかるようになります。その時間が気になるようなら別の仕組みを考えないといけませんね。


THERMOS ECB-1000の補足写真

2006年10月22日 | 使えるグッズ

THERMOS 真空断熱ポットコーヒーメーカー ECB-1000」の公式サイトはありますが、掲載した情報が少なくネット通販だけで買うには判断しにくく困りました。ですので、購入前の参考になるように公式サイトにはない写真を補足しておきます。

本体上部のフタを開けた写真です。中央にペーパーフィルターをセットします。右が給水タンクの給水口です。本体とフタは分離できそうもありません。

 

ペーパーフィルターをセットするフィルターは分離できます。写真ではわかりにくいですが、バケツのように取ってが付いていて扱いやすくなっています。このフィルター以外、分離できる部分はありません。

 

ブログ界での「THERMOS 真空断熱ポットコーヒーメーカー ECB-1000」の評判を検索してみました。次のリンクをたどると結果がみれます。ただ、この商品を話題にしているブログは少ないので参考にならないかな。

http://ranger.labs.goo.ne.jp/rpc/partsview.php?key=1558


GoogleパーソナライズドホームにBLOGRANGERパーツを表示してみる

2006年10月19日 | Webデザイン

BLOGRANGER 2.0」で作った「BLOGRANGERパーツ」を「googleパーソナライズドホーム」に表示してみました。↓こんな感じです。「よく読むブログの反響をBLOGRANGERに聞いてみる」で作ったパーツを表示しています。

BLOGRANGERパーツをgoogleパーソナライズドホームに表示するまでの手順は次のとおりです。

はじめにBLOGRANGER 2.0でBLOGRANGERパーツを作ります。パーツをカスタマイズするときサイズを「自動」とするのがポイントです。それ以外は好みにカスタマイズすればよいでしょう。

次に「googleガジェット(モジュール)」の定義ファイルを作って、そのファイルを自分のサイトにアップロードして公開します。ここではそのファイルを「http://example.com/googlegadgets.xml」というアドレスで公開したと仮定します。

googleガジェットの定義ファイルは次のとおりです。ContentのhrefにBLOGRANGERパーツのブックマークURLを指定します。ModulePrefsのheightにパーツの高さを指定します。見やすい高さをpx単位で指定します。またscrollingを有効としてスクロールバーを表示します。titleに好みのタイトルを指定してもよいでしょう。

http://example.com/googlegadgets.xml
<?xml version="1.0" encoding="UTF-8" ?>
<Module>
<ModulePrefs title="BLOGRANGERパーツ" height="400" scrolling="true" />
<Content type="url" href="http://ranger.labs.goo.ne.jp/rpc/partsview.php?key=1301" />
</Module>

次にgoogleパーソナライズドホームを表示します。ページ左上の「他にもこのページに追加」をクリックします。

多彩なコンテンツがリストアップされ興味を惹かれますが、ここはグッと我慢して「URLを指定して追加」をクリックします。

先ほど公開した定義ファイルのURLを「URLを指定して追加」に入力して追加ボタンをクリックします。

続けて次のようなメッセージボックスが表示されます。このメッセージはとても重要な指摘ですので、その意味をよく理解し、各自の責任でで続行するしないを決定してください。私はいかなる責任も負いません。

OKボタンをクリックした後、ページ左上の「ホームページに戻る」をクリックするとgoogleパーソナライズドホームにBLOGRANGERパーツが表示されます。これで完了です。

BLOGRANGERパーツはgoogleパーソナライズドホームにインラインフレーム(iframe)として表示されます。また、定義ファイルにBLOGRANGERパーツを貼り付けるHTMLソースを指定する方法もあります。このときはgoogleがWebページをホストし、そのWebページをインラインフレームで表示します。後述の方法に比べれば安全な方法ですね。

インラインフレームを使わずにgoogleパーソナライズドホームのページ自体にインライン表示する方法もありますが試していません。悪意があったり、バグがあるコードをインライン展開するのはセキュリティ上のリスクを伴いますので注意が必要です。もちろんですがBLOGRANGER 2.0は前者に該当するはずはありません。後者はどんなサービスでも該当する可能性がありますので信頼が大きな尺度ですね。


ExplorerCanvas Internet Explorerでcanvasを使う

2006年10月18日 | Webデザイン

Internet ExplorerとFirefoxでベクタグラフィックスをどう統一的に扱うか悩んでいたところ、なんと!Google Codeに 「ExplorerCanvas」というプロジェクトがあることを発見しました。

ExplorerCanvas
Firefox, Safari and Opera 9 support the canvas tag to allow 2D command-based drawing. ExplorerCanvas brings the same functionality to Internet Explorer. To use, web developers only need to include a single script tag in their existing web pages.

ExplorerCanvasはFirefoxやSafari、Opera 9で使えるcanvasをInternet Explorerでも使えるようにするものです。ExplorerCanvas(excanvas.js)のソースコードを見ると、VML(Vector Markup Language)をcanvasのインタフェースでラップしたものとわかります。ソースコードにはTODOが散見されるので制約は多々あると推測できます。

ベクタグラフィックスを使う目的はGoogle MapsのGPolyLineのようにWebページ上に線を描画したいだけなので、ExplorerCanvasでその目的は果たせそうです。いくつか少し古いブラウザをサポートできませんが、企業内システムなど使用条件を限定できるなら環境なら調整できる範囲でしょう。

参考としてExplorerCanvasのサンプルコードを私のWEBサイトに設置しておきました。こちらからどうぞ。
http://developmentor.lrlab.to/explorercanvas/examples/example1.html
http://developmentor.lrlab.to/explorercanvas/examples/example2.html
http://developmentor.lrlab.to/explorercanvas/examples/example3.html

ExplorerCanvasを知るまではHTML/CSS(positoin:absolute)で実現するか、自前でVMLをcanvasにラップしようと考えていました。自前で実装する利点も多いのですが、実現したいことを素早く実現するということが最重要なので…と悩んでいたところの発見でした。こういうときは"よくよく"探してみるものですね。

 


AOL Video Search AJAX API Introductionを試す

2006年10月18日 | Web 2.0

AOL Video Search APIs」という動画検索のAPIがあります。「AOL Video Search APIs」はREST APIとAJAX APIの2つのインタフェースがあります。RESTはXMLベースです。AJAX APIはJSONPベースじゃないかと推測できますが、その実装はAPIで隠蔽されています。

まずは体験ということで「AJAX API Introduction」のサンプルコードを抜粋して、私のWEBサイトに設置してみました。こちらからどうぞ。

http://developmentor.lrlab.to/aolvideosearch/intoro.html

「AOL Video Search APIs」を使うには「My API Account」の登録が必要です。登録は無料ですが「AOL Video Search APIs」を使うWEBサイトを申告する必要があります。「My API Account」を登録すると「appid」が発行されますので、その「appid」をソースコードに埋め込みます。

今のところサンプルコードは動作しています。ただし「Daily Query Limit  10000」とあるので、1日に1万回までしか検索できないようです。1万回を超えるとどうなるのだろう。それ以前に「AOL video」自体が日本語のインデックスを持つのかどうかも調べないといけない。


Array.uniq 配列の重複した要素を取り除く

2006年10月17日 | prototype cast

Array.uniqは配列の重複した要素を取り除くメソッドです。Array.uniwメソッドはprototype.js v1.4.0を前提としています。

配列の中を走査しながら重複した要素を取り除き、その結果を新しい配列として返します。要素の重複はprototype.jsのEnumerable.includeを使って判断しています。

Object.extend(Array.prototype, {
  uniq: function() {
    return this.inject([], function(dest, value) {
      if (!dest.include(value))
        dest.push(value);
      return dest;
    });
  }
});

var foo = [30, 20, 50, 30, 10, 10, 40, 50];
alert(foo.uniq()); //=> [30, 20, 50, 10, 40]

var bar = ['/tmp', '/home', '/etc', '/tmp'];
alert(bar.uniq()); //=> ['/tmp', '/home', '/etc']

なおArray.uniqメソッドはprototype.js v1.5.0から追加されるようです。


Array.assoc 配列の配列を検索する

2006年10月17日 | prototype cast

Array.assocは配列の配列を検索するメソッドです。Array.assocメソッドはprototype.js v1.4.0を前提としています。

配列の中の配列を検索して0番目の値がobjectと等しい要素を返します。2つ以上が該当するときは1つ目の要素を返します。該当する要素がないときはundefinedを返します。

Object.extend(Array.prototype, {
  assoc: function(object) {
    return this.find(function(value) {
      return (value 
        && value.constructor==Array
        && value.length>0
        && value[0]==object);
    });
  }
});

var foo = [['tokyo', 100], ['kanagawa', 200], ['saitama', 300]];
alert(foo.assoc('tokyo')); //=> ['tokyo', 100]
alert(foo.assoc('saitama')); //=> ['saitama', 300]

食物繊維たっぷり粉かんてん

2006年10月16日 | プログラマの健康

ぽっこりおなかの解消に役立つという噂の「粉かんてん」です。40g+軽量スプーンで399円のものを近所のスーパーで手にいれました。

パッケージには「お茶に入れて」「コーヒーに入れて」とありますが、この方法はあまりオススメしません。粉といっても寒天ですのでよくかき混ぜても完全に溶けません。どうしてもドロドロざらざら感が残ってしまい気になります。気になるひとは料理に混ぜて使うといいかもしれません。

で、どのように摂取して、どのような効果があるのかというと…。食物繊維が非常に多いということなのですが、また聞きなので私はよく知らないのです。

こういうときは「BLOGRANGER」に聞いてみよう。ここでは「リンク先を選ぶ」というBLOGRANGERパーツを使いました。「発掘!あるある大事典II」の関連ブログが豊富ですね。これを取っ掛かりに調べてみればいいのですね。

HTMLソース

<script type="text/javascript" src="http://ranger.labs.goo.ne.jp/rpc/api.php"></script><script type="text/javascript" src="http://ranger.labs.goo.ne.jp/rpc/parts.php?key=1440"></script><noscript><a title="by BLOGRANGER" href="http://ranger.labs.goo.ne.jp/" target="_blank"><img style="border: 0;" alt="by BLOGRANGER" src="http://ranger.labs.goo.ne.jp/rpc/image/promote.gif" /></a></noscript>

 ブックマークURL

http://ranger.labs.goo.ne.jp/rpc/partsview.php?key=1440