2005年03月29日

Bloglinesチャンネル 0.01リリース

Bloglinesチャンネル 0.01をリリースします。

Bloglinesチャンネル 0.01 ダウンロード

概要

Bloglinesチャンネルは、Bloglinesを閲覧するための、Heimdallrのプラグインです。

Bloglinesチャンネルを使うと、こんな感じのウィンドウをデスクトップに貼り付けておくことができます。
Bloglinesチャンネル
(スキンはポレポレ素材屋さん作の「紅葉を踏みしめる猫」です。)

表示されているのは、Bloglinesに登録されているFeedのうち、未読記事が存在するFeedです。クリックするとFeedを閲覧できます。閲覧すると、Bloglines上でも既読になります。

導入方法

Bloglinesチャンネルを動作させるためにはHeimdallr 1.08以降が必須です。Heimdallrをインストールしていない方は、まずHeimdallrをインストールしましょう。
Heimdallrのインストール後、インストールフォルダにあるpluginフォルダの中に、BloglinesChannnel.dllをコピーした後、Heimdallrを再起動すればインストール完了です。

Heimdallr起動後、タスクトレイのアイコンを右クリックしてビュー設定を選択し、チャンネル追加ボタンを押してBloglinesチャンネルを選んで下さい。あとはBloglinesで使っているメールアドレスとパスワードを入力すれば使えるようになります。

Heimdallrに最初から登録されているニュースサイトは、Bloglinesチャンネルを使うときは不要ですので全部削除してしまいましょう。
既読ボタンとサイトの短縮名も役に立たないので非表示にしておくと良いと思います。

既知の問題

Bloglinesに登録されているサイトによっては、Bloglinesチャンネルがまったく機能しないことがあります。これはBloglines側のバグです。一応報告はしておきましたが直る気配が無いですね。

例えば加藤ローサさんのBlogを登録している方はBloglinesチャンネルを使えません。

その他

このサイトのアクセス解析結果を見る限り、ここをBloglinesから見ている方は1~2人です。というわけでBloglinesユーザのそこのあなた(?)だけが頼りです。 Windows環境をお持ちでしたらちょっと使ってみて下さい。
導入が大変かもしれませんし、上記「既知の問題」に記した問題により動かないかもしれませんが、ぜひトライを。

2005年03月28日

Heimdallr 1.09で実装する機能

次のHeimdallrのバージョンである1.09で何を実装するのか明確にしてみます。

メインとなるのはプラグインの追加です。どのプラグインを追加するのかは検討中です。 実はまだこれぞ!というプラグインが無くて・・・。
あとは自動学習機能のアルゴリズムを強化したいですね。長いこと使ってそろそろ弱点が見えてきましたので何か手が打てそうです。

現状の要望リスト一覧

以下のリストのうち、上に書いてあるものから優先的に実装していきます(実際のところ、リストの下の方に書いてあるものは、書いてあるだけで実装されることは当面無いでしょう)。上からいくつか実装した時点でバージョン1.09としてリリースします。
実装する際の難易度を難、普、易の三段階で評価し、効果を大、中、小の三段階で評価します。

  • Bloglinesチャンネル追加。難易度は中、効果は小。 でもこのプラグインは標準添付しないかも。
  • mixiチャンネル追加。難易度は難。効果は中。 でもこのプラグインは開発しないかも。
  • ステータスコード301、302対応。難易度は普、効果は小。 少しでもお行儀の良いRSSリーダーになるために。
  • スキンを変えても一部の項目は変化しないようにする。難易度は普、効果は小。 今、スキン設定の・・・を表示する、という項目は、スキンを変えるたびにデフォルト設定に戻ります。これちょっとうっとおしいですね。
  • 自動学習機能強化。難易度は普、効果は小。 具体的にどう強化するのかはこれから考えます。
  • デフォルトサイトにチャンネルを追加できるようにする。難易度は中。効果は中。 これはユーザよりも開発者側にメリットがあります。
  • custom.xml強化。これも開発者側にメリットがあるお話です。
  • ツリー形式によるビュー&サイト設定画面。難易度は難、効果は大。 今の形式はやっぱ見難いですね。でもこれも単純にツリー形式にすれば良いとも限らず・・・。悩み中。
  • 一度閲覧した記事や、既読にした記事を再度閲覧できるようにする。難易度は普、効果は中。 さっき見た記事をまた見たいと思ったときや、既読ボタンで間違えて消してしまったときの救済用です。既読に限らず全部の記事を見ることができても良いかもしれませんね。
  • PC間のデータ移動対応。難易度は普、効果は小。 閲覧情報などを簡単に移動できるようにします。自宅と会社でUSBメモリを用いて閲覧情報を共有、ということができるようになります。
  • エラー管理を行う。難易度は難。効果は中。 エラーが発生したサイトが存在することをユーザに伝える仕組みが必要です。Bloglinesがこれをやっているのでなんか欲しくなりました。
  • RSS auto-discoveryに対応する。難易度は中、効果は小。 もうこの機能はどうでも良さそうな気がします。

そろそろ「効果が大」という機能がなくなってきましたね。一応1項目ありますけど大物なのでなかなか手が出せず。うーんこれからどうしましょうか。

2005年03月27日

The Cipher Text Stealing

最近、DES、AES、Blowfishといった幾つかの暗号方式の実装を眺めているのですが、AESのサンプルコードに面白いコードが入っているのを見つけました。
AESのサンプルコードは、「AES暗号化ライブラリ」で紹介したものです。

DESもAESもBlowfishもブロック暗号です。ブロック暗号は、ブロック長単位で暗号化を行う方式です。
例えば、DESであればブロック長は8バイトです。
ということは、8バイトのデータを与えて暗号化すると、8バイトの暗号化データが得られるわけです。

こうした暗号方式の場合、データのバイト長がブロック長の整数倍の場合、ブロック長毎に暗号化すれば問題なさそうですが、ブロック長の整数倍ではない場合、どうやって暗号化すればいいんでしょうね???

という疑問に対する答えが、AESのサンプルコードに入っていた「面白いコード」です。
データの最後の2ブロックを上手い具合に入れ替えて、ブロック長の整数倍ではない場合でも暗号化しています。もちろん暗号化データが長くなることもありません。

これはどうやらThe Cipher Text Stealingという方式(以下CTS)のようです。
AESに限らず、ブロック暗号ならばなんでも適用できそうです。
詳細な方法についてはGoogleで検索して下さい。
いやーこんな方法があるとは。考えた人は頭が良いですね。

2005年03月26日

新しいHeimdallrのプラグイン

RSSリーダーHeimdallrについてですが、折角プラグインを追加できる仕組みを作ったので、幾つかプラグインを作ってみようと考えています。

今考えているのは以下の3つです。

Bloglinesチャンネル

サーバ型RSSリーダーBloglinesユーザのためのプラグインです。
Bloglinesの未読FeedをHeimdallrのビューに表示させることができます。

これは結構開発も進んでいるので、そろそろリリースできそうです。
しかし、このチャンネルをHeimdallrに標準で添付しても、嬉しい人はあまりいないと思います。リリース方法も考えないとなりませんね。

mixiチャンネル

以前は作る気でしたのでちょっとだけ開発を行ったのですが、今この開発を止めようかどうか迷っています。
その理由は以下の通り。

  • HTMLのパースが必要になるので、開発が結構難しい。
  • mixiが公式にRSSの配布を始めたら用無しになる。つまり寿命が短い。
  • 誰からも要望が無い。

さてどうしたものか・・・

ヤフオクチャンネル

これは、「ヤフオク Ticker」を見たときに思いつきました。まだアイデアだけで、何も形にはしていません。
Yahooオークションでは検索結果のRSS配信を行っていますので、こうしたものを作るのもさほど難しくはなさそうです。入札終了1時間前に再表示するような機能を付けるのもなんとかなるでしょう。

問題は、私がヤフオクを利用していないので、どんな情報をユーザに提示するべきなのか良く分からないことです。さてはて・・・。

天気予報チャンネル、地震速報チャンネル、(最近の流行を追いかける)トレンドチャンネルなどアイデアだけは色々。
皆様も何かアイデアありましたらコメント頂ければと思います。
チャンネル拡張プラグインのインターフェースの仕様は、「ChannelExtensionPluginAPI仕様」で(途中まで)公開されているので、開発できる方は作っちゃってもOKです。

2005年03月25日

aesライブラリ化

環境
Visual C++.NET 2003
ライブラリ
aes.zip

「AES暗号化ライブラリ」の続きです。

AESで暗号化/復号化を行うVisual C++.NET 2003用スタティックライブラリの作り方を説明します。 「libdesのライブラリ化」のAES版です。

まず、Brian Gladman氏のサイトで配布しているAESの暗号化/複号化を行えるCのコードをダウンロードします。ファイル名がaes.zipとなっているファイルです。

次に、以下のファイルをダウンロードします。

aes用プロジェクトファイル ダウンロード

そして、両方とも解凍し、aes.vcprojをaes.hと同じフォルダにコピーして、aes.vcprojをVisual C++.NET 2003で開きましょう。
あとはバッチビルドを行うだけです。

ところでこのライブラリって何か名前ないんですかね。何も付いていないので勝手にaesって呼んでいますが正式名称は不明です。

2005年03月24日

libdesのライブラリ化

環境
Visual C++.NET 2003
ライブラリ
libdes-l-4.04b

以前、「暗号化ライブラリlibdes」でlibdesを紹介しました。
今回は、Visual C++.NET 2003で使えるlibdesの静的ライブラリを作成する方法を紹介します。

「MFCにおけるzlibの使い方」と同様に、6種類のlibファイルを作成します。

まずは、libdes配布元からlibdes-l-4.04b.tar.gzをダウンロードしてきましょう。URLを見た限りではここが公式の配布ではなさそうです。公式な配布元をご存知の方は公式の配布元からダウンロードしてきて下さい。

次に、libdes-l-4.04b.tar.gzを解凍し、des.hが存在するフォルダに次のプロジェクトファイルを置きます。

libdes用プロジェクトファイル ダウンロード

開いた後、全構成のバッチビルドを行ってください。libというフォルダが作成され、その中に6つのライブラリファイルができているはずです。
あとは使う側の都合に合わせてお好きなライブラリファイルをご使用下さい。

2005年03月23日

Blowfish暗号化ライブラリ

「AES暗号化ライブラリ」の続きです。
AES暗号化ライブラリが結構いい感じだったのでこれを使おうかと思いましたが、 最後にライセンスフリーで評判のBlowfishを試してみることにしました。
今更ですが、ライセンスフリーの暗号化方式と言えばBlowfishが有名でしたね。 すっかり忘れていました。

暗号化方式がライセンスフリーでも、実装(ライブラリ)の方がライセンスフリーであるとは限りません。というわけで実装を見てみることにします。
Bruce Schneier氏のサイトソースコードが配布されています。C/C++は4つありますね。全部試してみましょう。

C by Bruce Schneier
ライブラリというよりもサンプルコードのようです。ライブラリのように使うと言うわけには行かないですね。これをアプリケーションに組み込むためには一工夫必要です。
ライセンスは特に書いてないので良く分かりません。でもこのサンプルコードは、Blowfish暗号化方式はライセンスフリーと決めた考案者本人が作成したものなので、恐らく勝手に使用しても文句を言われることはないでしょう。
しかしBlowfishの実装って小さいコードですね。DESやAESよりもずっと小さいです。
C by Paul Kocher
インターフェースを見た限りではライブラリとして使えそうですが、なんとライセンスがLGPL。これは厳しい。
C (author unknown)
なんとたった1つのファイルから構成されています。サンプルコードのようですが、「C by Bruce Schneier」との違いは良く分かりませんでした。ライセンスも書いてないので分かりません。
C++ by Jim Conger
唯一のC++の実装です。「C by Bruce Schneier」をC++に直してライブラリとして使えるようにしたという感じです。
バイトオーダー周りのバグがあるようです。これだけ使っていれば問題ないとは思いますが、これで暗号化して他の実装で復号化したときに問題が発生するかもしれません。
ライセンスは書いてないので分かりません。

サンプルコードからライブラリを作るのは面倒ですので、最初からライブラリになっているものを使いたいと思います。
コードを見た限りで一番良いのは「C by Paul Kocher」ですが、ライセンスがLGPLというとても厳しいものになっています。
LGPLだと、静的リンクして実行形式のファイルを作ると、実行形式のファイルのソースコードを公開する必要があります。 しかし、私がいま作ろうと思っているもの(Bloglinesチャンネル)は、ソースコードの中に暗号化鍵が埋め込まれています。これを公開すると暗号化鍵がばれますので、公開できません。 ですので、残念ながら「C by Paul Kocher」は使えません。

残りの候補は、「C++ by Jim Conger」だけです。
バグがあることと、ライセンスが不明であることが気になるところですが、一応そのまま使えそうなのでこれを使おうと思います。

2005年03月22日

AES暗号化ライブラリ

暗号化ライブラリlibdesの続きです。

より使いやすいライセンスの暗号化ライブラリは無いかと探し回っていたところ、
Brian Gladman氏のサイトAESの暗号化/複号化を行えるCのコードを配布しているのを見つけました。

aes.zipというアーカイブをダウンロードしてちょっと使ってみましたがこれもVisual C++.NET 2003で問題なく使える模様です。Brian Gladmanさんに感謝!

ライセンスも、広告条項がないのでlibdesより使いやすくなっています。

あとBlowFishについて調べてみてそれとAESとでどちらを使うか決めようかと思っています。

2005年03月21日

暗号化ライブラリlibdes

Bloglinesチャンネル開発における課題の1つとして、パスワード保存方法があります。 これをなんとかするため、C++又はCの暗号化ライブラリを探していましたところ、libdesというDESの暗号化ライブラリを見つけました(libdesの公式サイトってどこだろう?)。
DESが暗号方式として強いのか弱いのかは良く分かりませんが、カジュアルクラッキング対策としては十分でしょう。

このライブラリの最終アップデートはなんと1998年1月8日。7年前です。こんな古くて大丈夫かと思いましたが、Visual C++.NET 2003で問題なくコンパイルできるようです。
ちょっと使ってみましたが、特に大きな問題はなく暗号化/復号化ができました。1998年にリリースしたソースコードが2003年にリリースされたコンパイラで問題なく使えるのですから、すごいことです。作者のEric Youngさんに感謝。

しかし問題が1つ。ライセンスです。
こんな条項があります。

3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by Eric Young (eay@cryptsoft.com)
これはいわゆるBSDライセンスの広告条項というやつですね。
良く考えると結構厳しい条項です。これに比べるとzlibのライセンスが神に見えます。と言っても代替になる暗号化ライブラリが見つからないので今のところはこれで行こうかと思っています。

2005年03月20日

C++ストリームの拡張方法について

iostreamの拡張について書かれたサイトを見つけました。
「iostreamの拡張」

私が以前の記事で作ったbasic_filterbufbasic_inflatebufと比べてみます。

basic_streambufの拡張方法に着目すると、
私はxputnをオーバーライドして自力でバッファ制御を行い、あちらはoverflowをオーバーライドしてsetpでバッファ制御を行っているようです。

どうもあちらの方が正しいようです。
私が行った拡張は、basic_ostreamのwriteだけ使う場合は問題がありませんが、
operator <<を使って文字列などを書き込むとボロが出ます。

ううむ作り直しですねぇ・・・。
でももう公開してしまっているんですよねぇ・・・。恥ずかしいなぁ・・・。
まあいいか。良くあることです。

2005年03月19日

Bloglinesチャンネル開発の課題

Bloglinesをしばらく使うことにより、Bloglinesチャンネル(Heimdallrのプラグイン)を作る上での課題が見えて来ました。

表示単位の違い

Heimdallrは表示の最小単位は記事(item)ですが、Bloglinesでは(使い方にも依りますが)Feedです。この違いを上手く処理する必要があります。

既読管理

Heimdallrは記事単位の既読管理を行っていますが、BloglinesではFeed単位です。 うまく合わせる必要があります。

マルチビューの有効活用

Heimdallrはビューを複数表示できるので、これを上手く生かす必要があります。 しかしこれは難しい。ううむ・・・。

パスワード保存方法

BloglinesにアクセスするためにはBloglinesのパスワードが必要です。 設定ダイアログを表示してユーザにパスワードを入力してもらうつもりではいるんですが、そうなるとパスワードの保存方法が課題となります。 パスワードはsite.xmlというファイルに記録されることになります。 あまり強固な暗号を施す必要は無いと思いますが、暗号化しないで格納するのはまずいですよね。 さてどうしましょうか・・・。

2005年03月18日

チャンネル拡張プラグインを作った理由

なぜHeimdallrのチャンネル拡張プラグインを作ったのか。
使う人にとってはどうでもいいことだと思いますけれど書きたいので書きます。

主な理由は実はこれなんです。

そろそろ新しいソフトを作りたい。

私は時々作りたい病にかかるんです。
Heimdallrを開発していて色々なサービスに触れ、あれとこれとそれを組み合わせればこんなことがそんなことができるのになーと思ったことが発端でした。

結構色々なネタを思い付きました(ネタの一部はこのサイトで公開したこともあります)。
しかし、どのネタも、データ処理の方法についてのネタであり、ユーザインターフェースに関するものではなかったのです。

しかし、ネタを具現化してソフトとして世に送り出すのでしたら、ユーザインターフェースは必須です。
では、どうしようか?新しいのを考えようか?どんなユーザインターフェースが良いのだろう?っていうかHeimdallrのGUIで行けるんでは?ううむ行けそうだ。これで行こう。
というわけで、Heimdallrのユーザインターフェースを利用できるデータ処理部だけのソフトを世に送り出すことにしました。

こうしてチャンネル拡張プラグインは生まれました。

2005年03月16日

Internet Explorer

Internet Explorerというアプリケーションがあります。
最新版はバージョン6 SP2です。
Microsoftという会社が配布しているフリーソフトです。
本日はこの便利なアプリケーションを紹介したいと思います。

このアプリケーションの主な機能は、XMLデータのエラーチェックです。
XMLデータに含まれているエラーを確実に見つけ、分かりやすく表示してくれます。
HeimdallrのようなXMLデータ(RSS FeedはXMLデータです)を扱うアプリケーションを作っている人にとっては実に便利な機能だと思います。

例えば、Heimdallrで読み込めないRSS Feedを見つけたとき、
私は、原因を探るためにまずInternet ExplorerでそのRSS Feedを見ています。
Internet Explorerがエラーを検出したら、RSS Feed配信側の問題とすぐ分かります。この機能には何度もお世話になりました。

FirefoxというアプリケーションもXMLデータを表示できますが、エラーチェック機能はInternet Explorerに比べて劣っていると思います。
Internet Explorerが検出できる数々のXML仕様違反に、Firefoxは気付きません。
私はHeimdallrを開発していて、XML仕様に準拠しているデータに対してInternet Explorerがエラーを検出したこと(誤検出)と、XML仕様に準拠していないデータに対してInternet Explorerがエラーを検出しなかったこと(見逃し)は一度も記憶にありません。開発者のお供として心強いツールです。

そんなわけでXMLデータを扱う開発者の方にはお勧めです。
まだ使っていない方は是非お試しを!

2005年03月15日

Bloglinesを使った感想

何日かブラウザ型RSSリーダーのBloglinesを使ってみましたので、感想を書いてみようと思います。
といっても私はRSSリーダーHeimdallrの開発者なので、Heimdallrと比べてどうか、という視点で書きます。

普通に使っている限りでは、Heimdallrは記事のタイトル一覧を見てから記事を読む、という感じがするのに対し、Bloglinesはサイトのタイトル一覧を見てからそのサイトのRSS Feedを読む、という感じがしました。
Heimdallrよりも、生にRSS Feedを読んでいる感じです。まさしくFeedリーダーですね。これに比べればHeimdallrは記事リーダーという感じです。

既読管理もFeed単位で行うことが推奨されているような感じです。
記事単位の既読管理も(Keep Newで)できなくはないようですが使い難いです。

Feed単位の既読管理だと、Heimdallrのように記事タイトルの一覧を表示させておいて気になった記事だけ見る、ということができないので、登録されているFeedの数が多くなって全部読みきれなくなると不便だと思うのですが、どうなんでしょうか。私がまだBloglinesを使い切れていないからそう感じるだけなんですかね。

Bloglinesのフロントエンド(Bloglinesチャンネル)を作るためには、
普通のBloglinesユーザが、全部で何件位Feedを登録し、そして毎日何件のFeedを読んでいるのか、そこらへんを知る必要がありそうですね。Feed登録数が10件の場合と100件の場合では、適切な表示方法は異なるものになるでしょうし。

あ、こんなときこそキーワードチャンネルの出番です。
デスクトップに常駐しているHeimdallrのビューを右クリックしてビュー設定→チャンネル追加→キーワードチャンネル→キーワードに「Bloglines」と入力→OK
とりあえず一回「最新の情報に更新」
おお色々出てきました。これで新たな情報が得られそうです。とさり気なくキーワードチャンネルの使い方を紹介したり。

2005年03月14日

キーワードチャンネル ソースコードリリース

Heimdallrのチャンネル拡張プラグインの1つであるキーワードチャンネルのソースコードをリリースします。

キーワードチャンネル 0.03 ソースコード(Visual C++.NET 2003用) ダウンロード

このソースコードは、著作権は放棄しませんがご自由にお使い下さい。もしソースコードのライセンスを明確にしたいという方がおりましたらご相談下さい。そのときに考えます。

Heimdallrとチャンネル拡張プラグインの間のインターフェースは、ChannelExtensionPluginAPIという名前が一応ついています。仕様の一部は以下のページで公開されています。
「ChannelExtensionPluginAPI仕様」
このページはWikiにより誰でも編集できるようになっています。 私が更新するペースはとても遅いと思いますので、 適当にソースコードを解析してさくさく書き足していって下さい。

キーワードチャンネルのソースコードは、Heimdallr本体よりもずっとビルドが容易になっています。 但しboostライブラリは必須です。 boostライブラリのヘッダファイルがあるフォルダをインクルードファイルのパスに含めてからビルドして下さい。
なお、変な場所にDLLファイルを出力するのでちょっと気を配っておいて下さい。
また、Visual C++.NETのStandard Editionを使う場合は、MFCの静的リンクができなかったと思うのでそこら辺も変更する必要があるかもしれません。

以下はどうでもよい話です。
一応キーワードチャンネルにバージョン番号が付いています。0.03です。 このバージョン番号はかなり適当につけました。
Heimdallr 1.08(安定版)をリリースするときまでに作りこんだので1.00を名乗っても良いんですよね。でももう1.08をリリースしちゃったので今更変えるのも面倒なのでとりあえずはこのままということで。

2005年03月13日

Heimdallr 1.08リリース

Heimdallr 1.08をリリースします。
安定版です。

フル版 Heimdallr 1.08 ダウンロード

軽量版 Heimdallr 1.08 ダウンロード

Heimdallr 1.08ソースコード(Visual C++.NET 2003用) ダウンロード

バージョン1.07のリリースが去年の12/3でしたので、おおよそ3ヶ月ぶりの安定版リリースとなります。
1.08のポイントは、チャンネル拡張プラグインを追加できる仕組みを作り、キーワードチャンネルとトピックチャンネルの2つのプラグインを追加したことです。
キーワードチャンネルは、キーワードを設定するだけでそのキーワードが含まれている記事をインターネットから集めてきます。従来から、登録されているRSS Feedの中からキーワードが含まれた記事を抽出する機能はありましたが、このキーワードチャンネルは、RSS検索サイトを使って記事を集めてくるため、登録されていないRSS Feedから記事を集めてくることができます。
トピックチャンネルは、「社会」「政治」「経済」などのトピックを選択することにより、それに関連した記事を集めてきます。
これもキーワードチャンネルと同様に登録されていないRSS Feedから記事を集めてきます。
どちらのプラグインも、すぐに結果が得られないかも知れません。ちょっと気長にお使い下さい。

1.07→1.08の変更点詳細

  • チャンネル拡張プラグインを追加できるようにしました。
  • キーワードチャンネル(チャンネル拡張プラグイン)を追加しました。
  • 複数のユーザがHeimdallrを起動できるようにしました。
  • 設定ファイルの形式を変更しました。
  • 記事タイトルと重ならない位置に概要ウィンドウを表示するオプションを追加しました。
  • トピックチャンネル(チャンネル拡張プラグイン)を追加しました。
  • ビュー表示内容(短縮名、日付、タイトル)をカスタマイズできるようにしました。
  • お気に入り優先度を変更できるようにしました。
  • 記事があるのとき最上位になるはずのビューが、普通のビューになるバグを修正しました。
  • Accept-Encoding(gzip)に対応しました。
  • 枠の無い透明スキンを追加しました。

1.07beta1→1.08の変更点詳細

  • 1.08で追加された機能の説明をドキュメントに追加しました。

2005年03月12日

basic_inflatebufクラス

前に作成したbasic_filterbufクラスを使って、Inflateを行うクラスを作ってみました。
InflateについてはRFC1950を参照して下さい。Deflateにより圧縮されたデータを展開する方式です。
zlibを使っていますので、前に説明した方法を使ってzlib.libをリンクしておく必要があります。
また、basic_filterbufクラスを定義したヘッダファイルをfilterbuf.hというファイル名で用意しておく必要があります。

コードは以下のようになります。 ちょっと長いですがご勘弁を。
機能としては、このクラスを使ってDeflateにより圧縮されたデータの書き込みを行うと、それが展開されて出力先に出力される、という機能を持っていることになります。
普通、この手のクラスは書き込みで圧縮され、読み込みで展開されます。それとは逆なので注意してください。
また、このクラスは読み込みについては未実装です。そのため、展開専門です。圧縮されたデータが事前に存在しないとまったく役に立ちません。
ところでこのクラスは読み込み時に何をするべきなんでしょうね。書き込みで展開されるということは読み込みで圧縮するべきなのかな? しかし関数名がbasic_inflatebufなので、読み込みでも展開するという考えもありですね。

(注意)本コードは正しく動作しません。詳細は「C++ストリームの拡張方法について」を参照して下さい。

#include "filterbuf.h"
#include <vector>
#include <zlib.h>

template <class Elem, class Tr = std::char_traits<Elem> >
class basic_inflatebuf : public basic_filterbuf<Elem, Tr>
{
public:
  explicit basic_inflatebuf(std::basic_streambuf<Elem, Tr>* _Buffer, bool _Delete = false)
     : basic_filterbuf<Elem, Tr>(_Buffer, _Delete), _read_phase(init_phase), _write_phase(init_phase)
  {
  }
  virtual ~basic_inflatebuf(void)
  {
    switch (_write_phase) {
    case data_phase:
      write_end_init();
      break;
    }
  }
protected:
  virtual std::basic_streambuf<Elem, Tr>* setbuf(char_type* _Buffer, std::streamsize _Count)
  {
    // 未実装
    return this;
  }
  virtual pos_type seekoff(off_type _Off, std::ios_base::seekdir _Way, std::ios_base::openmode _Which = std::ios_base::in | std::ios_base::out)
  {
    return traits_type::eof();
  }
  virtual pos_type seekpos(pos_type _Sp, std::ios_base::openmode _Which = std::ios_base::in | std::ios_base::out)
  {
    return traits_type::eof();
  }
  virtual int sync()
  {
    switch (_write_phase) {
    case data_phase:
      if (!flush_write()) {
        return traits_type::eof();
      }
      break;
    }
    // 出力/入力先もsyncする。
    return basic_filterbuf<Elem, Tr>::sync();
  }
  virtual std::streamsize xsgetn(char_type* _Ptr, std::streamsize _Count)
  {
    // 未実装
    return 0;
  }
  virtual std::streamsize xsputn(const char_type* _Ptr, std::streamsize _Count)
  {
    std::streamsize _Result = 0;
    switch (_write_phase) {
    case init_phase:
      if (!write_init()) {
        return 0;
      }
      _write_phase = data_phase;
    case data_phase:
      _Result = write_data(_Ptr, _Count);
      if (_Result == _Count) {
        return _Result;
      }
      if (!write_end_init()) {
        return 0;
      }
      _write_phase = end_phase;
    case end_phase:
    default:
      return _Result;
    }
  }
private:
  bool write_init(void)
  {
    _write_zstream.zalloc = Z_NULL;
    _write_zstream.zfree = Z_NULL;
    _write_zstream.opaque = Z_NULL;
    _write_zstream.next_in  = NULL;
    _write_zstream.avail_in = 0;
    _write_zstream.next_out = NULL;
    _write_zstream.avail_out = 0;
    // -MAX_WBITSの意味が不明。しかしこうしないと動かない。
    if (inflateInit2(&_write_zstream, -MAX_WBITS) != Z_OK) {
      return false;
    }
    _write_buffer.resize(default_buffer_size);
    _write_zstream.next_out = reinterpret_cast<Bytef*>(&_write_buffer[0]);
    _write_zstream.avail_out = static_cast<uInt>(_write_buffer.size() * sizeof(buffer_type::value_type) / sizeof(Bytef));
    return true;
  }
  std::streamsize write_data(const char_type* _Ptr, std::streamsize _Count)
  {
    _write_zstream.next_in = const_cast<Bytef*>(reinterpret_cast<const Bytef*>(_Ptr));
    _write_zstream.avail_in = static_cast<uInt>(_Count * sizeof(char_type) / sizeof(Bytef));
    do {
      int iResult = inflate(&_write_zstream, Z_SYNC_FLUSH);
      switch (iResult) {
      case Z_OK:
        if (_write_zstream.avail_out == 0) {
          if (!flush_write()) {
            return 0;
          }
        }
        break;
      case Z_STREAM_END:
        if (!flush_write()) {
          return 0;
        }
        return _Count - static_cast<std::streamsize>(_write_zstream.avail_in * sizeof(Bytef) / sizeof(char_type));
      default:
        return 0;
      }
    }while (_write_zstream.avail_in != 0);
        return _Count;
  }
  bool write_end_init(void)
  {
    int iResult = inflateEnd(&_write_zstream);
    if (iResult == Z_OK) {
      return true;
    }
    return false;
  }
  bool flush_write(void)
  {
    std::streamsize _Count = static_cast<std::streamsize>(_write_buffer.size() - _write_zstream.avail_out * sizeof(Bytef) / sizeof(char_type));
    std::streamsize _Result = basic_filterbuf<Elem, Tr>::xsputn(&_write_buffer[0], _Count);
    if (_Count != _Result) {
      return false;
    }
    _write_zstream.next_out = reinterpret_cast<Bytef*>(&_write_buffer[0]);
    _write_zstream.avail_out = static_cast<uInt>(_write_buffer.size() * sizeof(char_type) / sizeof(Bytef));
    return true;
  }
  z_stream _write_zstream;
  enum phase_type {
    init_phase,
    data_phase,
    end_phase,
  };
  enum {
    default_buffer_size = 2048,
  };
  phase_type _read_phase;
  phase_type _write_phase;
  typedef std::vector<char_type> buffer_type;
  buffer_type _write_buffer;
};

xsputnをオーバーライドしてそこで主な処理を行っています。
xsputnをオーバーライドする以外にもbasic_streambufを拡張するやり方は色々あるので、これは1つのやり方だと思っておいて下さい。

2005年03月11日

逐条点検 日本国憲法

東京新聞の「逐条点検 日本国憲法」という記事で、日本国憲法が1条ずつ解説されています。

いやー勉強になりました。知らないことだらけ。
こんな記事を無料で読ませてもらい、東京新聞には感謝しております。

憲法論争に興味がない方(私もないですが)でも、現状の憲法がどんなものか位は知って置いても良いのではないか思います。
一応国の中では頂点に位置する決まりごとですし。

もちろんこの解説は東京新聞が書いたので東京新聞の主観が入っています。
これだけ読んで知ったつもりになるのは少し危険でしょう。
他の主観を基にした解説記事も読んでみたいですね。
他の会社もこうした記事を書いてくれないかなぁ・・・

2005年03月10日

Bloglines使用中

「続・Bloglinesのススメ」というBloglinesの解説記事を見つけました。
Bloglines素人の私にとっては大変ありがたい記事です。

この記事を見ながら色々な機能を使ってみましたが、RecommendationsとRelated Feedsが面白い機能だと思いました。
どんなアルゴリズムを使っているのかは分かりませんが、なんか面白いBlog無いかな~というニーズを見事に満たしてくれる、ような気がします。
まだあまり使っていないのでいつもそうなのかは良く分かりませんが。

2005年03月09日

Bloglinesを使い始めました

BloglinesというRSSリーダーを使い始めました。これは有名なRSSリーダーだと思いますので説明は省略。
このサイトのRSS FeedをBloglinesで見ている人が何人いるか知りたかったので登録だけはだいぶ前にしていたのですが、最近、普通のBlogのRSS Feedを何件か登録してRSSリーダーとして活用し始めました。

活用し始めた理由は、Bloglines閲覧用のHeimdallrのプラグインを作れないかと思ったからです。こんな理由でBloglinesを使い始めた人は私だけだろうな・・・。

Bloglines APIを見たときからこのアイデアだけはありまして、Heimdallr側のプラグインを受け入れる部分の実装がもうじき完成(1.08安定版リリース=完成)する予定なので、そろそろこのBloglines閲覧用プラグインも形にしてみようかと思います。

名称は「Bloglinesチャンネル」になる予定です。そのまんまですが。

さて、この「Bloglinesチャンネル」は、既存のBloglinesユーザにとって役に立つものに仕上げなければなりません。そんなわけで、まず私がBloglinesユーザになってその気持ちを知ろう、ということで活用し始めたわけです。

しばらくBloglinesを活用してみたら感想等を書いてみたいと思います。

2005年03月08日

Heimdallr 1.08beta1リリース

Heimdallr 1.08beta1をリリースします。
安定版ではありません。

フル版 Heimdallr 1.08beta1 ダウンロード

軽量版 Heimdallr 1.08beta1 ダウンロード

安定版はHeimdallr 1.07です。

ようやくbeta版になりました。一週間位使って問題が無いことを確認した上、ドキュメントを1.08に合わせて修正したら安定版としてリリースします。

今回から軽量版も一緒にリリースしてみることにしました。
軽量版とは、Heimdallrから全てのプラグインを除いたバージョンです。 フル版と軽量版の違いは以下の通りです。

名称 インストール
パッケージサイズ
動作時の
使用メモリ
備考
フル版 3.5MByte 18MByte 従来と同じもの(全機能使用可能)
軽量版 1.5MByte 12MByte 自動学習機能、キーワードチャンネル、トピックチャンネル使用不能

動作時の使用メモリは、WindowsXP Proで、Heimdallrをデフォルト設定で起動し、一つ記事を閲覧した後測定した値です。
軽いRSSリーダーがお好みの方は軽量版をお使い下さい。 ちょっと重たくても構わない方はフル版をお使い下さい。

軽量版の方は、しばらくしても反響が無ければ必要が無いものと判断してリリースを止める予定です。

軽量版の説明が長くなりましたが、今回の主な変更はトピックチャンネルとキーワードチャンネルの強化です。トピックチャンネルの方に「国際」「健康」の2つのトピックを追加しました。さらに若干ですが両方のチャンネルのダウンロード時間が短くなっています。

1.08alpha5→1.08beta1の変更点詳細

  • 枠の無い透明スキンを追加しました。
  • キーワードチャンネルを強化しました。
    • タイムアウト時間を設定できるようにしました。何度更新しても結果が得られないときは長めの時間を設定してみて下さい。
    • If-Modified-Sinceを設定するようにしました。しかしほとんどのRSS検索サイトの方が対応してないため効果の程は疑問です。
    • 未来検索livedoorにアクセスするのを止めました。タイムアウトばっかりでほとんど結果を返さないためです。
    • gooブログのブログ検索にアクセスするようにしました。検索結果の幅が多少広がるはずです。
  • トピックチャンネルを強化しました。
    • 「国際」「健康」の2つのトピックを追加しました。健康の方はRSSナビのREST APIを使っています。
    • タイムアウト時間を設定できるようにしました。
    • If-Modified-Sinceを設定するようにしました。
    • 記事数を最大30に制限しました。前から制限していたつもりだったのですがバグのため制限されていなかったようです。

2005年03月07日

gooブログのブログ検索サービス

goo RSSリーダーの検索機能がどんなものか知りたかったので、ちょっと使ってみました。

どうやらgooブログが提供しているブログ検索サービスを使っているようです。
gooブログってこんなサービスを提供しているんですね。知りませんでした・・・。

gooブログだけに限らず、他のブログも検索してくれているみたいですし、検索結果のRSSを出力してくれるので、FeedbackBulkfeedsと同じように扱えます。

ちょっと使ってみましたが、普通にまともな結果を出しますね。良い感じです。
そして応答速度が非常に速いようです。
200ミリ秒~500ミリ秒で結果を返してくれます(これは凄い!)。
しばらく様子を見て特に結果に偏りなどを感じなければHeimdallrのキーワードチャンネルのアクセス先にしようと思います。
でも、Heimdallrもそろそろ1.08のbeta版を出したいし、beta版の時点で機能的にはFixさせておきたいのでしばらく様子を見ないで導入してしまうかもしれません。

ついでに、未来検索 livedoorが最近やたらと重い(20秒くらい待っても結果を返してくれない)のでこれをキーワードチャンネルのアクセス先から外そうと思います。

2005年03月06日

2月のカウンタートラックバック

2月中にHeimdallrを紹介して頂いた方々に対し、トラックバックを送ると共にお礼を込めてコメントなどを書かせて頂きたいと思います。

(2/4)RSSリーダー

透明スキン+マルチビューを使ったスクリーンショットは結構圧巻。
こういうスクリーンショットは、どのような使い方をしているのか一目で分かるので開発者にとって参考になります。

(2/13)ステキソフト。

Vectorサイトの方へのリンクだったので危うく見逃すところでした。
お手軽にニュースのチェックができる様子が良く分かります。

(2/13)RSSリーダ

恐らくHeimdallrのインターフェースはシンプルだろう・・・と思っているのですが、実のところシンプルというのはあまり定量的な単語ではないので、自分で「シンプル」と言うのは難しいものがありますね。
そんなわけでVectorのHeimdallr紹介文の「特徴」も、こうした主観的な言葉はできる限り排除して説明していたりします。
でもこうした主観的な言葉を用いた方が魅力的な宣伝文句になるんですよね。悩ましいところです。

2005年03月03日

RSSナビのREST API

RSSナビがRSSフィード検索、最新ヘッドライン検索の結果を受け取るためのRSET APIを公開しました。
RSSナビ REST API

Heimdallrでの活用方法を考えてみますと・・・

とりあえずヘッドライン検索の方がFeedbackのようなRSS検索サイトと同じように使えるみたいですのでキーワードチャンネルのアクセス先として使えますね。
でもdescriptionが無いため使い物になるかどうかは微妙なところ。
あとタイトルに付く(個)や(企)がちょっとうっとおしい。
さらにHeimdallrで検索すると検索結果0件なのがちょっと(これはどうでも良いのですが)
しばらく使ってみて良さそうな検索結果が得られるならばキーワードチャンネルのアクセス先に追加してみます。

あと実はトピックチャンネルの方にも活用できたりします。
RSSナビ REST APIの下の方にカテゴリIDの一覧がありますが、この一覧にあるものならなんでもトピックチャンネルのトピックにできます。さてどうしましょうかね。

でも一番のメリットはHeimdallrをRSSナビで紹介してもらえることのような気がします(笑)。

※ご利用になりましたらご連絡ください。RSSナビの中で紹介させていただきます。
って書いてありますし。
おすすめRSSリーダーの中にHeimdallrありませんしね。

2005年03月01日

Heimdallr 1.08alpha5リリース

Heimdallr 1.08alpha5をリリースします。
安定版ではありません。

Heimdallr 1.08alpha5 ダウンロード

安定版はHeimdallr 1.07です。

今回の主な変更はトピックチャンネルの強化です。一回あたりのダウンロード時間がだいぶ短くなりました。さらに、「経済」「社会」の2つのトピックを追加しました。

もう1.08で追加する機能はほとんど無いので、次はalpha版ではなくbeta版をリリースする予定です。

1.08alpha4→1.08alpha5の変更点詳細

  • トピックチャンネルの強化。ダウンロード時間を短縮化し、結果の安定性を向上させました。さらに、「経済」「社会」の2つのトピックを追加しました。
  • エクスポートの際の一覧にチャンネルを表示しないようにしました。
  • Accept-Encoding(gzip)に対応しました。