プログラム

Base64DecodeGetRequiredLength

VC++Base64エンコードされた文字列をbyte列にデコードする際にどのくらいbyteの配列を確保すればよいか取得する際に、ATLのライブラリでBase64DecodeGetRequiredLengthという関数がある。
この関数の役割は、

指定した長さの base64 エンコードされた文字列からデコードされたデータを格納できるバッファのサイズを、バイト単位で取得します。
(MSDNライブラリ ATL Server ライブラリ リファレンスより)

なのであるが、この関数をVC++上から「定義を参照」で遡ると中身(atlenc.hでの定義)を確認できる。
中身を見るとこう書いてある。

Base64DecodeGetRequiredLength(int nSrcLen){
return nSrcLen;
}

ま、base64エンコードされると4/3倍程度になると記憶してるので、デコードしてそれより大きくなることはないので間違いではないけど。
そのまんますぎて笑ってしまった。

Nabaztagと戯れる その2

そういえばNabaztagは通信をどの様に行っているのだろうかと気になったのでパケットキャプチャしてみた。
簡単にみたところプロトコルはJabber(Extensible Messaging and Presence Protocol)みたい。
f:id:hideack:20090628141707p:image
確かにnabaztagの性格上あってるかもしれない。

Nabaztagと戯れる(その1)

まず、これから。
これは、あるAPIPHPでラップしたクラスをコールしたもの。

<?php
require_once('Nabaztag.php');
$alfons = new Nabaztag();
$alfons->serial = "xxxxxxxxxxxx";
$alfons->token  = "**********";
$alfons->say("テスト");
?>

これを実行すると、こうなる。

ウサギがしゃべるんだな。
これはフランス発のウサギ型ロボット「Nabaztag(ナバズタグ)」(http://www.nabaztag.com/)。
先週末、April氏*1と新宿に出た際に思わず衝動買い。
おかしいな、掃除機か洗濯機を買い替えるつもりだったのに...。
紹介は、ASCIIの記事とか、impressの記事を参照。

基本的には、Nabaztagを購入するとhttp://my.violet.net/ というサイトのアカウントの開設ができて、そこへNabaztagの固有ID等を登録するとRSSフィードの読み上げやポッドキャストを行う事ができる様になっている。
RSSフィードの読み上げ等々はサイト上にアプリケーションとして登録されていて、その一部になるのだけどこれ以外にも目覚まし時計や天気予報といったアプリケーションもある。基本的にアプリケーションはすべてこのviolet.net上に登録されていて、普通に利用する場合はこのサイトから利用するものを自分が所有するNabaztagに登録してあげるという形になる。
一応日本語も読み上げ対応。少しロボットボイスで「もやもやさまぁ〜ず2」のナレーションみたいですが…。

で、個人的には既に興味があるのは、制御用のAPIだった訳でありまして...。
仕様は公開されているので、簡単にプログラム可能。
なので、まず今朝このAPIをラップするクラスを作成。*2

PHPでラップしたので、サーバ上において定点監視させたり、イベントが起きたときに自分のナバズタグを制御できる。
例えば、このblogを誰かが開いたときに自分のnabaztagを動かす様にすると以下の動画の様になる。
*3
以前作ったカウンターをトリガーにして動く様になっていて、blogの右側のフレームの一番下にある"f"の画像を読むと別のサーバにリクエストが飛んでいるので、そこから更にnabaztagAPIにリクエストを投げているという話。

他にも直接音声ファイルを指定してnabaztagに再生させることもできる。
たとえば、TBSラジオの某番組のpodcastを再生させる場合は、今回作ったラップクラスを利用すると、

<?php
require_once('Nabaztag.php');
$alfons = new Nabaztag();
$alfons->serial = "xxxxxxxxxxxx";
$alfons->token  = "**********";
$alfons->playMp3("http://podcast.tbsradio.jp/nichiten/files/20090621.mp3");
?>

とすればよい。すると、nabaztagはネットワーク上のmp3ファイルをダウンロードして再生してくれる。

もう少しこのラップクラスに機能を足して、既存のAPIで設定できるウサギの耳のアクション等もラップクラスから設定できる様にするつもり。一通り落ち着いたら公開するかなぁ。多少車輪の再発明な感もなきにしもあらずだけど好きでやってるから。
がっつり書いて作ったのは、まずサーバ監視だったりするところがナニな感じですが、まぁ、いいか。
土曜の午前中の正しい使い方ができた。そして、午後からは仕事です。なんだか...。

*1:はてなIDを持たないのにID名の様な形で頻出の友達

*2:元々のものがシンプルなので、ほとんど必要ない気もする

*3:一日のPVがたかがしれてるのでできるデモである...

Yahoo!の日本語形態素解析API

Yahoo!の日本語形態素解析APIを使ってみる。
利用にはあらかじめアプリケーションIDの登録が必要。利用の条件は、

  • 日本語形態素解析Web APIは、24時間以内で1つのアプリケーションIDにつき50000件のリクエストが上限
  • また、1リクエストの最大サイズを100KBに制限しています。

等々。詳しくは、このページあたり参照。
で、アプリケーションIDを取得した後、早速PHPで使ってみる。

<?php
/**
 * Yahoo!形態素解析APIサンプル
 */
require_once 'HTTP/Request.php';
$yahooappid = "foobar..."; // ここにYahooから取得したアプリケーションIDを記載。
// --- 形態素解析対象の文章と文字コード変更
$sentence = "PHPは、HTML埋め込み型のサーバサイド・スクリプト言語として分類される。この言語処理系自体は、C言語で記述されている。";
// --- API呼び出し
$url = 'http://jlp.yahooapis.jp/MAService/V1/parse';  // APIのコール先
$request = new HTTP_Request($url);
$request->addQueryString('appid', $yahooappid);
$request->addQueryString('sentence', $sentence);
$request->addQueryString('results', 'uniq');
$request->addQueryString('filter', '9');    // 名詞でフィルタ
if (PEAR::isError($request->sendRequest())) {
die('request failed');
}
$resp = $request->getResponseBody();
$wordscun = array();
$xml = new SimpleXMLElement($resp);
foreach ($xml->uniq_result->word_list->word as $wd) {
printf("%s (count:%d)\n", $wd->surface, $wd->count);
}
?>

こんな形で良いのではないだろうか。
出力結果は次の様になる。

/Users/hideack/pj/feeddown2/ex% php yahooapi.php
言語 (count:3)
HTML (count:1)
PHP (count:1)
サーバ (count:1)
スクリプト (count:1)
処理 (count:1)
分類 (count:1)
埋め込み (count:1)
自体 (count:1)
記述 (count:1)

サンプル中の文書が解析されて名詞のみが抽出されている。
処理対象文書が少ない場合、あるいは、レンタルサーバ等々の事情でchasen等々が導入できない場合は便利なのではないだろうか。

Apacheのmod_rewriteに関するメモ

どうしてもApacheのmod_rewriteにお世話にならなければならない事情が生じてしまったのでいくつか調査。
googleで検索すればかなりの資料とかメモが出るので苦労はしなかったけど、簡単にまとめてあるものがないかな。ということで見つけたのがこのチートシート

The mod_rewrite cheat sheet is a one-page reference sheet, listing flags for the RewriteRule and RewriteCond directives, list of server variables, a regular expression guide and several examples of common rules.
mod_rewrite Cheat Sheet (V2)

便利だと思い、すぐにはてなブックマークでブックマークしたら、この日本語版も見つかった。
はてブ恐るべし。

非常に良質のチートシートを作られているAddedBytes.comさんのところから、mod_rewrite Cheat Sheet (V2)を日本語化しました。
mod_rewrite Cheat Sheet 日本語版

これがあれば、いざ取りかかるときにすぐにやりやすい。これでなんとかなるに違いない。

Page Speed

googleが公開したサイト高速化支援技術の"Page Speed"に関する記事*1が取り上げられているので試してみた。
Firebugと連携してFirefoxで表示中のページを解析して、表示スピードの問題となっている箇所をレポートしてくれるツールになる。
導入は非常に簡単でFirefoxFirebugが導入されていれば、"Page Speed"をここからダウンロードすればFirefoxのアドオンとしてインストールが行われる。
解析を行いたいページを開いた後、Firebugを開くと"Page Speed"というタブが追加されているので開くと解析開始のボタンが置かれているのでこれをクリックする。
f:id:hideack:20090606085442p:image
ボタンをクリック後、解析が開始されてしばらく待つと解析結果が下の様な形で表示される。おおよそ一目瞭然。
必要度の高いものから上に表示されている。
f:id:hideack:20090606085443p:image
それぞれの項目について展開すると詳しい説明が表示される。
Google CodeのPage Speedのページへリンクするボタンもある。
f:id:hideack:20090606085444p:image
いろいろページ表示高速化のためのアドバイスが表示される様ですが、例えば"Minify JavaScript"という項目であれば、圧縮可能なJavaScriptの一覧が表示される。このとき、圧縮したらどのくらい転送サイズを小さくできるかという数値も併せて表示され、更に圧縮バージョンのJavaScriptも表示される。
f:id:hideack:20090606085445p:image

便利そうなので仕事場のPCにも導入決定。

*1:http://www.itmedia.co.jp/enterprise/articles/0906/05/news066.html

Ethnaのフォームヘルパが出力するHTMLのINPUT要素に読み込み専用属性

HTMLのINPUTタグで読み込み専用属性を与えるときは、

<input type="text" name="example" value="foo" readonly>

とすることでよいのだけど、今日多少悩んだのは、Ethnaで作成しているアプリケーションのテンプレート中でフォームヘルパの機能を使って自動的にフォームを出力させる様にしているケースで...

{form ethna_action="registration"}
{form_input name="example"}<br>
{form_submit value="送信"}
{/form}

などとやっていたときに、{form_input...}で出力させるフォームに対して"readonly"プロパティを設定するにはどうすればよいのだろう?かと。そのまま
しばらく悩んだ後、次の様に書いたら解決した。

{form_input name="example" readonly="readonly"}

結果、フォームヘルパはINPUT要素のreadonlyプロパティを

<input type="text" name="example" value="foo" readonly="readonly">

と設定していることになるのだけど、作法としては良いのだろうか?
ブラウザ上では意図通り動いている様に見えるのだけど。

Amazon S3(Amazon Simple Storage Service)を使ってみる – PHPから操作

S3の契約からFirefoxでの簡単な操作も試みたので次はPHPから操作してみる。
今回利用したのは、google codeで公開されている"amazon-s3-php-class"(Standalone Amazon S3 REST implementation for PHP 5)を使った。
他にもいくつかライブラリを見つけたので試したのだけど、これが一番使いやすかった。

以下、簡単な例をふまえて...。

例えば、S3上に"hideack.s3trial"というバケットを作ってそこにローカルにあるファイル "yasu.jpg" をアップロードする。
加えてアップロードしたファイルを特に権限設定無く誰でもダウンロードできる様にしてみる。

<?php
require_once 'S3.php';  // 今回入手したamazon-s3-php-class 
$accesskey = '***';   // S3のaccesskeyを設定
$secretkey = '***';   // S3のsecretkeyを設定
try{
$s3 = new S3($accesskey, $secretkey);
$s3->putBucket('hideack.s3trial', S3::ACL_PUBLIC_READ);
$s3->putObjectFile('/Users/hideack/tmp2/yasu.jpg', 'hideack.s3trial', 'yasu.jpg', S3::ACL_PUBLIC_READ);
}
catch(Exception $e){
print_r($e);
}
?>

アップロードはこれだけ。
実際にアップロードできたかブラウザから確認してみる。
前の記事で記載した様に、S3にアップロードしたファイルはパブリックアクセスできる設定さえしてあれば、ブラウザからでも簡単にアクセスできる。
f:id:hideack:20090425231937p:image
なお、サンプルは深く気にしない様に。

かなり簡単に使えてかなり感動した。
現状、S3のホストがアメリカ本国(テキサス?) or ヨーロッパになるので多少ディレイが激しいのだけど、レスポンス速度が大きく要求されない要素なら十分利用できるのではないだろうか。

過去の記事は以下参照。
Amazon S3(Amazon Simple Storage Service)を使ってみる - Firefoxプラグインで操作
Amazon S3(Amazon Simple Storage Service)を使ってみる - アカウント開設編

Amazon S3(Amazon Simple Storage Service)を使ってみる – Firefoxプラグインで操作

Amaozon S3のアカウント開設が済んだので、実際にファイルをアップロードしてみる。
Amazon S3のAPIを見ると分かる通り、HTTPのPUTやGETでS3に命令を出す事ができる訳ですが、インターフェースの備えたツールがあるとオペレーションしやすいということで、S3用のクライアントを探してみた。
いくつかあったので、その中で使ってみたのはFirefoxのプラグイン "Amazon S3 Firefox Organizer(S3Fox)"

このプラグインを入れると、Firefoxのツールメニューに追加される。
f:id:hideack:20090425231930p:image
メニューの中の"S3 Organizer"をクリック。
開くと2ペインの画面が表示される。左側がローカル、右側がS3の情報になる。
f:id:hideack:20090425231939p:image
まず、S3上に"バケット"と呼ばれるものを作る必要がある。
これは、ディレクトリというより単独のドライブのイメージに近いもの。バケットは、S3で唯一の名前になっていなければならない。
S3にアップロードしたファイルは外部からアクセスする場合、下記の様なURLでアクセスできる。

http://(バケット名).s3.amazonaws.com/(ディレクトリ名)/(ファイル名)

インターフェースがそのまんまなので、使いやすい。

参照したのは...
セカイ系ウェブツール考 (10)「Amazon S3」を最大限活用するために - マイコムジャーナル 他多数。

Amazon S3(Amazon Simple Storage Service)を使ってみる – アカウント開設編

相変わらず1周、2周遅れているが、Amazon S3を使ってみた。
Amazon S3はAmazonが提供しているシンプルなストレージサービス。Twitterのプロフィール画像の保管とか大規模なサービスでもストレージとして使われているサービス。
あちこちのサイトで紹介もされていますが、自分用メモとしてアカウント開設からのメモを残しておきます。
もっと前から使ってみたかったのだけど、気づいたらAmazon S3のサービス提供から3年が過ぎようとしていたり...。

では、以下、アカウント開設の話。

  • アカウントの開設

利用にはamazon web service (AWS)のアカウントが必要なので、まずアカウントを開設を行う。
Amazon web serviceのトップページは、http://aws.amazon.com/
この右上部にアカウント開設のリンクがあるのでここから手続きを行う。
f:id:hideack:20090425231918j:image
メールアドレスの入力を求められるので入力。
もちろん "I am a new user."を選択。
f:id:hideack:20090425231919p:image
次にパスワードとメールアドレスの設定。
f:id:hideack:20090425231920p:image
更に詳細な情報の入力。アカウント開設ユーザの住所等々設定。
f:id:hideack:20090425231921p:image
問題が無ければ次に契約するサービスを選択する。
"Amazon Simple Storage Service"をクリック。
f:id:hideack:20090425231922p:image
Amazon S3のページに移動するので、右側にある"Sign up for Amazon S3"を選択。
f:id:hideack:20090425231923p:image
まだ未契約だとサービスの概要(料金)が表示されるので料金体系を確認しつつ、ページ末尾までスクロール。
f:id:hideack:20090425231924p:image
ページの末尾にクレジットカード情報を入力するフォームがあるので必要事項を入力。
f:id:hideack:20090425231925p:image
入力すると契約するユーザの住所情報が表示される。
デフォルトは先に行ったAWSのアカウント開設の際に設定している住所が表示されるので"Use this address"をクリック。
f:id:hideack:20090425231926p:image
これで設定完了。
Amazon S3が利用できる状態になった。
f:id:hideack:20090425231927p:image
で、実際に利用する際には、Access Key IDとSecret Access Keyと呼ばれるものが必要なので、これをメモする必要がありますが...。
このキーは、AWSのページの上部にあるリンク"Your Account"から、"Access Identifiers"を選択することで見ることができます。
f:id:hideack:20090425231928p:image
リンク先のページ中に2つのキーの表示が行われているのでメモしておきましょう。