2008年11月13日木曜日

CalDAVクライアントの実装2

CalDAVのプロトコルの解析をする前に、基本的なところをRFCを見ておさえておく。

CalDAVは、WebDAV上に実装さえているので、WebDAVの機能を含んでいる必要があるらしい。また、WebDAVは、HTTP上に実装されるべきものなので、当然それも含む。

というころなので、CalDAVは、HTTPの機能がわかっていれば、大体実装できそうである。RFCによると、CalDAVで使用するコマンドは、大体次のようになる。


  OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, COPY, MOVE
 PROPFIND, PROPPATCH, LOCK, UNLOCK, REPORT, ACL

この中で、今回実装しようと思っている、スケジュールの参照、登録、修正、削除に関するものは、REPORT(参照)、PUT(登録、編集)、DELETE(削除)ということがわかった。


他の命令は、サーバーが決まっていないと色々やることがあるが、今回のCalDAVサーバーは、Chandlerということにするとこれで十分だろう。あとは、個人認証とHTTPの基本的な動作とXMLのパージング、iCalendar形式の対応部分をを実装すればよいことになる。
さて次に、CalDAVクライアントを実装する言語なのだが、GUIの実装は面倒なので、ブラウザを利用することにする。ちょうど以前グループウェアを実装したものがあるので、ほとんどは、これを流用する。
てなわけで、PHPで実装することに決定。

PHPは、サーバーでCGI風に使うことがほとんどだが、今回は、CalDAVクライアントつまりHTTPクライアントとして実装する。PHPには、cURLやHTTPの拡張モジュールがあるので、これらを利用することにした。

また、XMLのパージングなのだが、PHPのDOMを使うほうがよい気がするが、とりあえずフリーで公開されているxml2array.phpというライブラリを使わせていただく。

とりあえずツールの準備はできたので、実装開始。
まずは、個人認証。

個人認証は、大したことはない。http_request関数の option変数で


option["httpauth"] = $username.":".$password
option["httpauthtype"] = HTTP_AUTH_BASIC または HTTP_AUTH_DIGEST


ChandlerServer のときはBASIC認証なので、HTTP_AUTH_BASIC で大丈夫。
次に、CalDAVにおける基本的なリクエストは、option変数のheaderで、

 "Content-Type" => "text/xml"
"User-Agent" => "エージェント名"
"Accept" => "text/xml"
"Connection" => "keep-alive"
"Depth" => "1"
"Keep-Alive" => "300"


を設定する。さらに、新規のイベント作成時は、

"Content-Type" => "text/calendar
"If-None-Match" => "*"

イベントの編集、削除時は、

  "Content-Type" => "text/calendar
"If-Match" => 編集、削除するイベントのEtag

とすればよい。
あとは、それぞれのアクションに応じて、XML 形式のデータを一緒に送ってあげれば、サーバーから、それに応じて XML形式のレスポンスがあるので、解析して、出力にまわせば完成です。

参考までに、期間を指定して、イベントを取得する場合には、下記のようにすればよい。


function RequestEvent($start=null, $end=null){
$this->body =<<<_XML
<?xml version="1.0" encoding="UTF-8">
<calendar-query xmlns="urn:ietf:params:xml:ns:caldav" d="DAV:">
<D:prop>
<D:getetag/>
</d:prop>
<filter>
<comp-filter name="VCALENDAR">
<comp-filter name="VEVENT">
_XML;
if($start){
if($end){
$this->body .= "<time-range end=\"".$end."\" start=\"".$start."\">";
}else{
$this->body .= "<time-range end=\"".$end."\" start=\"".$start."\">";
}
}
$this->body .=<<<_XML
</COMP-FILTER>
</filter>
</CALENDAR-QUERY>
_XML;
}

これからもわかるように、のタグのところに条件を書けは、それに応じた結果(結果もどの情報が必要かを書けば、選択的に取得できるが、面倒なので全部返すようにしている。あとは、iCalendar形式のデータを解析すればよいので。)を取得できるようになっている。

2008年11月10日月曜日

CalDAVクライアントの実装1

カレンダーサーバーは、とりあえずChandlerServerに決定。
クライアントを実装するには、まずはCalDAVについて調査するべきだろう。CalDAVとは、WebDAVを拡張してiCal形式に対応したもの。プロトコルの詳細は、RFC4791に書かれているということ。早速、Google先生で調べて、ダウンロードしたのだが、WebDAVの知識も必要そうだった。
すべて読んで実装するには、かなりの時間が必要そうだ。ここで、ふと思ったのだが、私が実装したいのは、サーバーでなくてクライアントの方。サーバーだと誰が接続してくるのかわからないので仕様書のほとんどを実装すべきだろうが、必要最低限でとりあえず自分の望むものは十分そうだった。

そこで、次のような方針で実装する。

1.実装するのは、スケジュールのみとする。
2.毎日、毎週、毎月などの繰り返しスケジュールは、必要なし。
3.実装する機能は、スケジュールの参照、登録、修正、削除で十分。
4.クライアントからのリクエストコマンドは、数あるクライアントのひとつを参考にする。

上記の4つのことを前提とすると実装するのは、非常に少なくなる。参考にするクライアントは、フリーで手に入るということで、Sunbird/Lightning にする。

早速、Lightningをダウンロードして、スケジュールの参照から試す。
プロトコルは、EtherSharkでみればOK.
詳細な解析は、次回。

2008年11月7日金曜日

カレンダー

久しぶりの更新。今日は、カレンダーについて、少し書いてみる。
最近のグループウェアで必ずといっていいほど入っているカレンダー機能。これが、個人で使う分には
Googleをはじめいろんなサービスがあるのであまり困らない。
しかし、あるグループでスケジュールを共有しようとすると、非常にこまったことが起こってくる。
それは、すでにみんなが違ったカレンダーを使っているということ。
みんなが、ほぼPC+常時接続という環境であれば、迷わずWebカレンダーのサイボズやGoogleカレンダーになると思うが、私の周りでは、そうはいかない。
共有したい人が、iCalやアリエル、Googleカレンダー、サイボウズなどをすでに利用しているからだ。
ある人は、キャッシュをしたいといったり、WM6の携帯電話やiPhoneと同期を取りたいなどと。。。。

すべてを満足する解は、なかなかないので、汎用のカレンダーサーバーと自作ソフトで行うことにした。
これを思い立ったのが、今年の5月くらいだった。
そのときに選択した、カレンダーサーバーは、CalDAVをサポートした、ChandlerServerというもの。
当時、バージョンが0.4だったのに、今日見たらなんと1.1にまであがっているではないか。
いざ、新バージョンに更新と思ったのだが、データベースの構造が変わっているらしく、そのままでは
移行できなさそう。

すでにみんなが使っているので、移行用のソフトを作ろうか。


ちなみに、現在は、ChandlerServerをカレンダーサーバーにすることで、クライアントをiCal, Lightning,
自作のWebカレンダーで運用中。

自作Webカレンダーは、数年前にPHP+SQLiteで作ったものを改造して、ChandlerServer、Googleカレンダーを同時に表示できるので、結構便利。
また、私のEMONTER用に ChandlerServerとの同期ソフトも自作したので、安定して運用中。
次回から、それぞれのソフトについて書いていこうかな。

2008年10月9日木曜日

Bluetoothヘッドセットで音声認識

フリーの音声認識ソフトウェアであるjuliusをbluetoothヘッドセットを使って動かそうといろいろ試していた。
bluetoothのドライバであるbluez(http://www.bluez.org)は、ALSAに対応していると言うことなので簡単に
動くかと思えば、最初はうまくいかなかった。

起動すると、音声入力のスレッドがすぐに終わっていた。結局、ソースコードをみることにした。
ALSAの入力のところで、EAGAINの処理を書いていないのが原因のようだ。
ALSAの1.0以降は、snd_pcm_readi の返り値で、本来読み込みエラーで、EAGAINは、入力の準備が整っていないだけなので、0を返すのが正しい処理のようだ。
特にBluetoothのヘッドセットは、SCOなので読み込みに多少の時間がかかる。 
juliusの alsa対応の入力では、NONBLOCKINGなのに、EAGAINの処理をしていなかった。

ここにちょっと条件分岐をいれて、再コンパイルすれば出来上がり。
ヘッドセットは、8kHzの入力しかできないので、音響モデルを8kHzのものにする必要があるが何とかなりそう。

ちなみに、telephonyの音響モデルを使っても、大語彙音声認識では、ぼろぼろだった。
10回に1回くらいは、正解だったのだが。。。。

2008年10月1日水曜日

EeePCのSSD

今日、バッファローから、EeePC用のSSDを発売するとの発表があった。
今までは、MLCだったが、今度は高速タイプのSLC。
セカンドロットの私のEeePCの強化には、最適。10月中旬に発売だが、3万円弱とは、ちょっと高いかな?

Blurtoothハンドセットで音声認識

前回は、LinuxでBluetoothハンドセットが使えるようになった。
これを使って、音声認識をやってみた。音声認識ソフトは、フリーで提供されているJulius。
Juliusは、気がつけばすでに4.0にメジャーバージョンがあがっていた。

早速、公式HPからダウンロードして、動作を確認しようとする。ここでJuliusは、音声の入力は、16Bit 16KHzであると
書いてある。Bluetoothのハンドセットは、マイク互換デバイスではないし、8KHzでしか入力できないので、少し困った。
結局、arecord で音声をファイルにおとし、オフラインで認識をやってみる。
やっぱり、音声タイプライタとしては、使えるれべるでない。それに、オンラインでできないし。

まずは、adinnet でできるように、arecordの改良を行おう。その後音響モデルの対応をやることにする。

2008年9月30日火曜日

LinuxでBluetoothヘッドセット

今まで、LinuxでBluetoothデバイスを使うなどと考えたこともなかったが、仕事上必要になった。
Linuxは、最近よく使っているUbuntu。これでUSBのBluetoothアダプタを使って、ヘッドセット
を使えるようにしてみた。

USBアダプタは、プラネックスのBT-MiniEDRWというやつとプリンストンのPTM-UBT3Sというやつ。
USBポートにさすと、2つともあっさり認識している。。。。

これにPLANTRONICSのVOYAGER 510 とDiscovery 925を接続してみる。

http://wiki.bluez.org/wiki/HOWTO/AudioDevices を参考に、ペアリングから、

$ hcitool scan
でデバイスをサーチして、BT_ADDRESS を取得。その後

$hcitool cc BT_ADDRESS

でPINコードの入力を要求されるので、0000を入力。どうやら、ペアリングは成功のようである。
また、ALSAで音の入力・出力を行うために、 .asoundrc を記述して、snd-bt-sco のドライバモジュールをmodprobeでカーネルにドライバを組み込む。

あとは、

 arecord -D bluetooth -f S16_LE fname

でレコーディング

aplay -D bluetooth -f S16_LE fname

で再生ができた。
簡単になったもんですね。