TechNote by 古賀信哉

技術情報のメモ書き(備忘録)

monitorとsemaphore

2005-04-29 18:31:56 | マルチスレッド
暫くぶりで、まとまった量のコードをJavaで書いたのですが、Javaの排他制御機構は、それほど悪くないなという感想が残りました。この点、以前とは、少し印象が変わったところです。

C/C++でマルチスレッドのコードを書くと、セマフォやロック(mutex)を使った排他制御が基本になって、Javaが基本とするmonitorを、いわばバラした形で使うわけですが、プログラミングのうえで「間違いをしづらくするための制約」という観点からすると、Javaのmonitorは、悪くない力を与えているなと思い直しました。

たとえば、producer/consumer型のマルチスレッドプログラミングを行う場合です。カウンティング・セマフォを使えば、consumerのキューが空になった時の待ち動作と、producerがキューへ処理対象を投入した際の通知動作が、セマフォだけで実現できてしまうわけなので、Javaのmonitorは、大げさ過ぎて邪魔に思えます。しかし、キューの実装によっては、キュー要素の取り出し(dequeue)と投入(enqueue)がthread safeではなく、それらに対する排他制御が必要になります。

さらに、producerとconsumerが、どちらも処理を終えた場合に全体動作を完了させる、といった仕組みを入れようとすると、特に、consumerに複数のスレッドを割り当てる場合には、それらに付随した共有情報を管理しなければいけません。

そういう場合には、Javaのmonitorを使う方が、融通が利かない分、却って詳細設計をやり易いなと感じました。つまり、java.lang.Object.notify[All]()は、それを呼び出した時点で、同じオブジェクトに対するjava.lang.Object.wait()を呼び出して待ち状態に入っているスレッドがないと、何の効果も生まないため、カウンティングセマフォの場合に比べると、待ち動作と通知の実現において、余分な情報を管理しなければいけません。同期のさせ方が単純な場合には、Javaのmonitorは、うざったいだけなのですが、多少なりとも込み入ってくると、むしろ、使い方をきちんと考えなければいけないぶん、Javaのmonitorの方が使い良い局面があるわけです。

Javaの言語仕様では、monitorを基本に据えた同期機構について、フレームワークという呼び方をしていますが、確かに、そうだなと思いました。

以前、マルチプラットフォーム用のスレッドライブラリを仕事で作った際、C++のライブラリAPIとして、java.lang.Threadに似たインタフェースを持つクラスと、入れ子ロックが可能なロックのクラス、および、pthreadsで言うconditional variableや、Win32 APIで言うeventのような待ち動作用のクラスを作ったのですが、今回の仕事を終えてみて、Javaのsynchronized節のような書き方のできる、monitorのフレームワークがあると、より良い局面があるなと思い直しました。そのライブラリを作った当時は、Javaのmonitorなんて、うざったいだけだと考えていたのです。

そういえば、AppleがXCodeに入れている版のObjective-Cだか、純正gccがサポートしているObjective-Cだかで、Javaのと似た構文で同期や例外処理を書ける糖衣構文(syntax sugar)が導入されたようですが、それもまた、悪いことではないなと思います。

Technorati API

2005-04-04 02:25:40 | Webサービス
Technorati JAPANのサイトでは、キーワードとURLによる単純なBlog検索のインタフェースしか提供されておらず、http://www.technorati.jp/search/search.htmlというCGIに、"query"というパラメータでキーワードかURLを指定することしかできません。

このCGIに渡す"query"パラメータは、それがキーワードの場合には、そのキーワードを含むBlogページの一覧を出してくれますし、URLの場合には、そのページにリンクを張っているBlogページの一覧を出してくれます。検索結果として出力されたBlogページの一覧には、「リンクを見る」という項目があり、そいつをクリックすると、そのBlogにリンクを張っている他のBlogの一覧を検索できます。HTMLのソースを見ると、「リンクを見る」を囲ったa要素のhref属性として、'search.html?query=<そのBlogのURL>'という指定をしています。

JAPANのサイトでは、α版ということで、お手軽インタフェースしか提供されていないようですが、USのサイトでは、"API"として、CGI呼び出しのインタフェースが細分化されています。上のキーワード/URL検索の場合だと、それぞれは、"Search query"、"Cosmos query"という二つのCGIに分割され、googleの検索APIのように、検索結果が大量にある場合に、それらを分割して指定して取得することも可能になっています。また、JAPANのサイトでは検索結果がブラウザ表示用のHTMLテキストとして返されますが、USのサイトで提供されているAPIでは、CGIが返す検索結果は、より軽量なXML文書です。

ただし、そのサービスを使うには、googleの場合と同じように、ユーザ登録してAPIキーを取得し、そいつをCGIパラメータの一つとして渡さなければいけません。C++の擬似コードで書くと、次のようになります。なお、以下の擬似コードにある、"HttpFetch"というのは、指定したURLに対してHTTP GETし、HTTP responseで得たデータをstd::stringに格納して返すGet()というメソッドを持つクラスです。

HttpFetch httpClient;
std::string result;

httpClient.Get(
"http://api.technorati.com/cosmos?" // "Cosmos query"のURL
"key=<APIキー>" // APIキーを指定
""&url=http://www.kuniritsu.com", // 検索キー(URL)を指定
&result);

USのサイトには、開発者向けのエリアがあり、そこでは、APIが返すXML文書のDTDなど、技術情報が公開されています。上記のAPI呼び出しと、APIが返すXML文書を解析してBlogページ属性の一覧にアクセスするコードも、それら開発者が登録したものが公開されており、JavaやC#、PHPで書かれたものがありますので、それを組み込んでアプリケーションを作ることが可能です。

さて、APIが返すXML文書のエンコーディングがUTF-8ですので、Javaで書くのが楽は楽なんですが、HTTPアクセスやXMLのパーザなど、下位のライブラリを整備するためのターゲットとして、C/C++で書いてみようかと思っています。とはいえ、単にライブラリだけ書いても面白くないので、TechnoratiのAPIをうまく使ったアプリケーションを考えなければいけません。

昔、MagicCapTeleScriptの資料を見ていた時に、「検索エージェントがネットワークへ出掛けて検索結果をかき集めてくる際に、他のエージェントと情報交換して、同じような検索を実行しているエージェントがいたら、検索から戻って来た時に、そのエージェントの使い手とコンタクトするヒントを教えてくれる。」というのを考えていたのですが、そういうものに繋げられたら面白いんじゃないかと思います。

ところで、いまMagicCapについて検索してみたら、こいつを開発していたGeneralMagic社は、2002年に廃業してしまっているのを知りました。一時は、TeleScriptで実現していたエージェント機構の実装をJavaに置き換えるなどして生き残りを図っていたのですが、うまくいかなかったようですね。

開設初日

2005-04-03 16:16:18 | Weblog
会社のWebに「社員日記」のページを設けることにしたのですが、自分の番が回ってきた時のために、公開型の日記サイトか、国内のBlogサイトを使おうと思い、無料Blogサービスの比較が載ったページでここを見つけ、使ってみることにしました。

とりあず、ping先にTechnorati JAPAN(http://rpc.technorati.jp/rpc/ping)を指定してみました。Technorati JAPAN(テクノラティ)のBlog検索サービスは、まだα版なのですが、自分のページが検索でヒットするかどうか、試してみます。
(2005-04-03-16:32時点では、ヒットしません。一日待って、再度試す予定。)

・2005-04-04-12:14時点でも、まだヒットしません。検索でヒットするページを見ると、10時間前のやつもありますから、pingサーバ内のDB更新が間に合っていないというわけでは、なさそうです。XML-RPCのURLも再確認しましたが間違っていませんので、どうやら、登録されるための何らかの閾値があるのでしょう。他のpingサーバと比較するために、ココログのやつを更新先に追加してみました。もう一日待って、再度試します。

・2005-04-07-15:56現在、"TechNote"でヒットするようになっていることに気づきました。昨日は忙しくて試せなかったので、いつヒットするようになったのか、正確なところは不明です。なお、"古賀信哉"で検索しようとすると、「システムエラー」が出てしまいますX-(

テクノラティ:
http://www.technorati.jp/home.html