2004年07月27日

RSSリーダーのOPML互換性問題

RSSリーダー開発者ならば大半の人は「OPML互換性問題」に悩んだことがあるのではないかと思います。
もしかしたらRSSリーダー利用者の方も悩んだことがあるかもしれません。

「OPML互換性問題」とは、こんな問題です。

こっちのRSSリーダーがOPMLエクスポート機能を備えている。
あっちのRSSリーダーがOPMLインポート機能を備えている。
じゃあ移行は簡単だ。
こっちのRSSリーダーでOPMLファイルをエクスポートしてあっちのRSSリーダーでインポート、と。
あれ、読み込みエラーだ・・・。

このような問題が発生する原因は、曖昧な言語OPMLを曖昧なままにして使ってしまったことにあります。
OPMLというのは、もともとRSS Feedをまとめるための言語ではありません。概要を構造化して記述するための言語です。
・・・。
概要を構造化ってなんだろ・・・。
いやまあ良く分かっておりません。自由度が高くて何でも出来る代わりに何にも使えそうに無いという言語だと考えておけば良いでしょう。

このような言語を使ってRSS Feedをまとめるようとすると、やはり曖昧なフォーマットになります。フォーマットは曖昧なのですが、現実にRSS FeedをまとめてOPMLファイルとして出力するRSSリーダーはいっぱいありますし、そのようなOPMLファイルを提供するサイトも一杯あります。

フォーマットが曖昧なのに、そのフォーマットを使ったデータが一杯ある。
こんな状況は何を生み出すでしょうか。
それはローカルフォーマットの山です。

そんなわけでRSS FeedをまとめたOPMLファイルについては、こっちで出力したものがあっちで読めない、ということが多く、結構悲惨な状況です。

この状況を改善の方向に進めるためには、以下のサイトの情報が参考になるのではないかと思います。
Moleskin Diary [XML]OPML(その2)
OPMLの入出力を行うソフトウェアがOPMLをどのように扱えば良いのか書いてあります。

RSSリーダー開発者の皆さん(がこの記事を読んでいるかどうかは分かりませんが)は是非この情報を参考にしてみて下さい。
Heimdallrもこの情報を元に改良してみたいと思います。

2004年07月24日

Heimdallrに自動学習機能追加を検討中(2/2)

前回の続きです。

Heimdallrに自動学習機能を搭載してみるにあたり、一つ割り切らないとならないことがあります。

それは性能です。
自動学習機能は、本当に真面目に作ると、それをネタに論文が書けるでしょう。
そこまで真面目に作るつもりはありません。というかできません。
よって多少いい加減な自動学習機能になるでしょう。

アルゴリズムの概要は次のようなものです。

  1. 利用者が閲覧した記事のタイトル文字列を解析して、固有名詞を抜き出します。
  2. それぞれの固有名詞の登場回数を記録していきます。
  3. 登場回数が一定回数を超えると、その固有名詞は利用者が興味を持つ固有名詞だと判定し、それ以降その固有名詞が含まれた記事を優先的に表示します。

ありきたりのアルゴリズムというか、まあそんな特別な工夫があるわけでもないです。

さてここで問題になるのが、タイトル文字列を解析して固有名詞を抜き出す方法です。
それ以外は、現状のキーワード設定機能と大きく変わるものでもないので、頑張ればなんとかなるでしょう。

文字列を解析して固有名詞を抜き出すためには、形態素解析ができれば良いようです。
形態素解析についてはウィキペディアに解説がありますが、要は文章を単語に分解して夫々の品詞を見分ける作業です。

形態素解析を行うためには、形態素解析ツールと、巨大な辞書が必要になりますが、
上記のウィキペディアにあるとおり、フリーの形態素解析ツールと辞書が存在するようです。
ありがたいことです。

これを使えば、Heimdallrでも形態素解析ができるようになりますので、自動学習機能もなんとか搭載できそうです。
使用する形態素解析ツールの有力候補はJumanです。
Windows用バイナリがあるので、これを使えばすぐ作れそうですし、ライセンスもBSDライセンスに似たものですので(なんと辞書までBSDライセンス!)、HeimdallrにJumanを組み込むこともできそうです。

と言っても、アルゴリズムの細かい点は結構課題が山積みなので、まだまだ先は長そうです。

2004年07月23日

Heimdallrに自動学習機能追加を検討中(1/2)

HeimdallrのGUIについて、様々な提案を頂いております。
提案内容は、主に「表示されていない記事を表示するGUI」に関するものです。

今のところ、なんらかの方法でスクロールできるようなGUIにして欲しい、という要望が一番多いです。
しかし、現在の記事抽出アルゴリズム(全ての記事の中から、表示するべき記事を選択するアルゴリズム)は、スクロールすることが考慮されていません。

どこらへんが「考慮されていません」なのかと言いますと、
例えば、次のビューを見てみましょう。
Example1
このビューに表示されていない次の記事を何か一つ表示するとしたら、どのサイトの記事を表示するべきか、ちょっと考えてみて下さい。
深く考えれば分かるかもしれませんが、ちょっと考えただけだと分かりませんよね。
ちなみに私は深く考えても分かりません。

分かり難い、ということは、すなわち何を持って次の記事とするかアルゴリズムが明確になっていないということです。次の記事がどれであるか明確になってないと、スクロールするとき色々と都合が悪いですよね。ここらへんが「考慮されていません」と言う理由なのです。

だから、スクロールするようなGUIを考えるならば、まず記事抽出アルゴリズムから考えなければならないわけです。でも新しい記事抽出アルゴリズムを考える前に、今の記事抽出アルゴリズムについてもうちょっと考えてみましょう。

上に述べたように、現在の記事抽出アルゴリズムは、スクロールは考慮していませんでした。
では一体何を考慮していたのでしょうか?何も考慮していなかったのでしょうか?
いやいや一応考えはありました。自動学習機能を搭載することを考慮していたつもりです。自動学習機能を搭載すれば、このアルゴリズムにより、利用者が見たいと思う記事をより多く表示できるのではないかと考えていました。

でも今のHeimdallrには自動学習機能はありません。そのため、現在の記事抽出アルゴリズムはあまり有効に働いていません。よって、現在のGUIは本来の力を発揮できていないわけです。ホントか?まあ疑うと話が進みませんのでそういうことにしておきます。

そんなわけで、今まで提案して頂いた様々なGUIを形にする前に、まず今のGUIに本来の力を発揮させてみようじゃないか、そして、その後で、どんなGUIにするべきか考えてみようじゃないか、ということで、次のバージョンではHeimdallrに自動学習機能を搭載することを検討しています。

さて、自動学習機能についてなのですが・・・。
ううむ、ここからが本題なのですが、どうやら前置きが長すぎたようです。
本題についてはまた今度ということで・・・。

2004年07月22日

Inno Setupの使用例(3/3)

前回の続きです。
残るセクションの説明です。

[Tasks]

Taskセクションの説明です。

Name: "startupicon"; Description: "スタートアップにショートカットを作成"; GroupDescription: "スタートアップ"; Flags:

「スタートアップにショートカットを作成」という項目を追加しています。これは、インストール中に、利用者が「スタートアップにショートカットを作成」するかどうか選べるようになります。
但し、この一行を書いただけで本当にスタートアップにショートカットを作成できるわけではありません。利用者が「スタートアップにショートカットを作成」することを選んだときに実際にどのような処理を行うのかは、後述するIconセクションに記述されています。

[Files]

Filesセクションの説明です。インストールするファイルの設定が記述されています。

Source: "..\exe\Heimdallr.exe";   DestDir: "{app}";      Flags: ignoreversion
Source: "..\exe\Heimdallr.chm";   DestDir: "{app}";      Flags: ignoreversion
Source: "..\exe\init.xml";        DestDir: "{app}";      Flags: ignoreversion
Source: "..\exe\readme.txt";      DestDir: "{app}";      Flags: ignoreversion

ファイル名の前の「..\exe\」が付いているのは、 スクリプトファイルがあるフォルダからの相対パスを示しています。
フラグのignoreversionは、ファイルの日付やバージョン無視して上書きインストールすることを示しています。
デフォルトでは、exeファイルは、ファイルのバージョンを比較し、インストールするファイルの方がバージョンが高ければコピーするようです。
しかし、この動作は、テスト中などに、インストールしたけれどexeファイルが置き換わってなかったといったトラブルを招くことが多いので、余計なトラブルを招かないようにignoreversionフラグを付与しています。
exeファイル以外にignoreversionフラグが付与されているのも同じく「余計なトラブルを招かないように」必ず上書きインストールするようにするためです。

Source: "..\exe\UNLHA32.DLL";     DestDir: "{app}";
Source: "..\exe\UNLHA32.TXT";     DestDir: "{app}";

UNLHA関連のファイルは、私が作成したものではありません。よって、今後変更されたときは、ちゃんとバージョン番号も変更されているでしょう。
よって、バージョンが変化してなくても上書きしなければならない場合は無いだろう、ということで、ignoreversionフラグを付与していません。

Source: "..\exe\skin\*.xml";      DestDir: "{app}\skin"; Flags: ignoreversion
Source: "..\exe\skin\*.skn";      DestDir: "{app}\skin"; Flags: ignoreversion

skin関連のファイルは私が作成したものです。よって、「余計なトラブルを招かないように」必ず上書きインストールするようにしてます。

[Icons]

Iconセクションの説明です。スタートメニューに追加するショートカットの設定が記述されています。

Name: "{group}\Heimdallr"; Filename: "{app}\Heimdallr.exe";             WorkingDir: "{app}"
Name: "{group}\Heimdallrのアンインストール"; Filename: "{uninstallexe}"

スタートメニューのHeimdallrグループ(フォルダ)にHeimdallr起動用のアイコンとHeimdallrアンインストール用のアイコンを作成するようにしてます。

Name: "{userstartup}\Heimdallr"; Filename: "{app}\Heimdallr.exe";       WorkingDir: "{app}"; Tasks: startupicon

上記Taskセクションの「スタートアップにショートカットを作成」項目がチェックされている場合、スタートメニューのスタートアップにアイコンを作成するようにしてます。

[Languages]

Languagesセクションの説明です。言語に関する設定が記述されています。 何かしているように見えて、実は大したことをしていません。

Name: "jp"; MessagesFile: "compiler:Japanese.isl"
Name: "en"; MessagesFile: "compiler:Default.isl"

日本語環境では、Inno SetupのインストールフォルダにあるJapanese.islというファイルをメッセージファイルとして使用し、英語環境では、Default.islというファイルをメッセージファイルとして使用するようにしてます。
Japanese.islは、最初にインストールしたファイルです。ここで使われているわけです。
Languagesセクションでこのように設定しただけだと、インストーラー起動時に言語選択ダイアログが表示されます。しかし、Heimdallrでは、言語選択ダイアログはうっとおしいと思ったので、SetupセクションでShowLanguageDialog=noとすることにより言語選択ダイアログを表示しないようにしています。
ここまでの説明ですと、このスクリプトにより作成されるインストーラーは、英語環境で起動すると英語のガイダンスが表示されるように思われますが、実は英語ではない部分が残っています。上記「スタートアップにショートカットを作成」がそれです。他にもあります。
英語環境において英語のガイダンスが表示されるようにするには、より新しいバージョンのInno Setupが必要であるようです。しかし、Heimdallrでは、英語のガイダンスが本来は不要(Heimdallr自体が英語化されていない)であるため、ここでは英語のガイダンスについては割り切ることにしました。

[Registry]

Registryセクションの説明です。レジストリに対する操作の設定が記述されています。

Root: HKCU; Subkey: "Software\SutoSoft"; Flags: uninsdeletekeyifempty
Root: HKCU; Subkey: "Software\SutoSoft\Heimdallr"; Flags: uninsdeletekey

どちらも、アンインストール時にレジストリのキーを削除するための設定です。
アンインストール時には、まず、HKEY_CURRENT_USER\Software\SutoSoft\Heimdallrを削除します。
次に、その上位キーであるHKEY_CURRENT_USER\Software\SutoSoftが空になったかどうかを判定し、空になっていれば、HKEY_CURRENT_USER\Software\SutoSoftも削除します。

[Run]

Runセクションの説明です。

Filename: "{app}\readme.txt"; Description: "READMEを表示する"; Flags: postinstall shellexec skipifsilent unchecked

インストール完了時に、README.TXTを表示するための設定です。README表示に関しては、Filesセクションでreadmeフラグを使用しても実現できるのですが、 デフォルトでREADME表示のチェックボックスをOFFにするため、Runセクションで設定することにしました。

Filename: "{app}\Heimdallr.exe"; Description: "アプリケーションを起動する"; Flags: postinstall shellexec skipifsilent

インストール完了時に、Heimdallr本体を起動するための設定です。shellexecフラグがポイントです。このフラグが付いていないと、どうやらHeimdallrが終了するまで、インストーラーが終了しないようです。
ですので、インストーラーを起動してインストールを行い、最後にHeimdallrを起動し、さてインストーラーが不要になったので削除しようかと思い削除すると、インストーラーはまだ起動されたままですので、「削除できません」と無情なエラーメッセージが表示されます。
shellexecフラグを付けておくと、Heimdallrを起動した後インストーラーは終了しますので、このような問題はおきません。

長かったですが、Heimdallrのインストーラー作成用スクリプトの説明は以上です。

2004年07月21日

Heimdallr 1.05aリリース

Heimdallr 1.05aをリリースします。
安定版です。
Heimdallr 1.05a
Heimdallr 1.05aソースコード(Visual C++.NET 2003用)

Heimdallr 1.05からの変更点は以下の通りです。

  • 一部の読み込めないRSS Feedに対応しました。

  • 概要ウィンドウ表示時にビューのZ位置が変更されるバグを修正しました。

  • タイトルにキーワードが含まれていてもハイライトされないことがあるバグを修正しました。

  • 概要ウィンドウが表示される瞬間に強制終了することがあるバグを修正しました。


2004年07月20日

Heimdallr紹介記事が窓の杜に掲載されました

Heimdallr紹介記事
「RSS/ATOM対応サイトの更新内容を付箋表示する「Heimdallr」がスキン対応に 」
窓の杜に掲載されました。

これはHeimdallr普及に向けてのおおきな一歩となるでしょう。

透明スキンの要望を出して頂いた皆様感謝。
猫の絵を提供して頂いたまさみ様、ビスケ様感謝。
スキン説明ページを提供して頂いた瞳子様感謝。
バグ報告、動作確認報告をして頂いた皆様感謝。
窓の杜の記事を書いて頂いた川原様感謝。
他にも感謝しなければならない方々が大勢いらっしゃると思いますが申し訳ありません把握しきれていません。

大きな感謝を捧げると共に、今後もよろしくお願い致したいと思います。

2004年07月17日

Inno Setupの使用例(2/3)

前回の続きです。

Inno Setupはスクリプトファイルを元にインストーラーを作成するツールです。
よってスクリプトファイルの記述内容が全てです。

Inno Setupにはサンプルスクリプトファイルが付属していますので、 基本的な使い方ならばサンプルスクリプトファイルをしばらく弄れば理解できるでしょう。

ここで説明するのは、基本的な使い方ではなく、 Heimdallr用スクリプトファイルで使っている色々な小技についてです。

まずは全体をみてしまいましょう。Heimdallr用スクリプトファイルは 以下のようになっています。

; -- heimdallr.iss --
; heimdallrセットアップファイル作成用スクリプト

[Setup]
AppName=Heimdallr
AppId=http://www.sutosoft.com/applictions/heimdallr/appid/1
AppMutex=http://www.sutosoft.com/applications/heimdallr
AppPublisher=SutoSoft
AppPublisherURL=http://www.sutosoft.com/room/
AppVersion=1.05
AppVerName=Heimdallr 1.05
DefaultDirName={pf}\Heimdallr
DefaultGroupName=Heimdallr
UninstallDisplayIcon={app}\Heimdallr.exe
OutputBaseFilename=heim105
OutputDir=".."
ShowLanguageDialog=no

[Tasks]
Name: "startupicon"; Description: "スタートアップにショートカットを作成"; GroupDescription: "スタートアップ"; Flags:

[Files]
Source: "..\exe\Heimdallr.exe";   DestDir: "{app}";      Flags: ignoreversion
Source: "..\exe\Heimdallr.chm";   DestDir: "{app}";      Flags: ignoreversion
Source: "..\exe\init.xml";        DestDir: "{app}";      Flags: ignoreversion
Source: "..\exe\readme.txt";      DestDir: "{app}";      Flags: ignoreversion
Source: "..\exe\UNLHA32.DLL";     DestDir: "{app}";
Source: "..\exe\UNLHA32.TXT";     DestDir: "{app}";
Source: "..\exe\skin\*.xml";      DestDir: "{app}\skin"; Flags: ignoreversion
Source: "..\exe\skin\*.skn";      DestDir: "{app}\skin"; Flags: ignoreversion

[Icons]
Name: "{group}\Heimdallr"; Filename: "{app}\Heimdallr.exe";             WorkingDir: "{app}"
Name: "{group}\Heimdallrのアンインストール"; Filename: "{uninstallexe}"
Name: "{userstartup}\Heimdallr"; Filename: "{app}\Heimdallr.exe";       WorkingDir: "{app}"; Tasks: startupicon

[Languages]
Name: "jp"; MessagesFile: "compiler:Japanese.isl"
Name: "en"; MessagesFile: "compiler:Default.isl"

[Registry]
Root: HKCU; Subkey: "Software\SutoSoft"; Flags: uninsdeletekeyifempty
Root: HKCU; Subkey: "Software\SutoSoft\Heimdallr"; Flags: uninsdeletekey

[Run]
Filename: "{app}\readme.txt"; Description: "READMEを表示する"; Flags: postinstall shellexec skipifsilent unchecked
Filename: "{app}\Heimdallr.exe"; Description: "アプリケーションを起動する"; Flags: postinstall shellexec skipifsilent

全体を見たところで、先頭から少しずつ解説していきます。

[Setup]

Setupセクションの説明です。

AppName=Heimdallr

アプリケーション名です。

AppId=http://www.sutosoft.com/applictions/heimdallr/appid/1

これは、アプリケーションを識別するためのIDです。 Heimdallrは、商標登録してあるわけでもないので、他の人がHeimdallrという名前の アプリケーションを作ることも考えられます。
IDをHeimdallrとしてしまうと、そういう他のアプリケーションのIDと一致してしまうかもしれません。
そこで、URIを使うことにより他のアプリケーションのIDと一致してしまうことを防いでいます。

AppMutex=http://www.sutosoft.com/applications/heimdallr

この指定により、Heimdallr起動中にインストールできないようにしています。
Heimdallrでは、複数起動防止のため、「http://www.sutosoft.com/applications/heimdallr」という名前のMutexを確保してます。これをインストーラーでもチェックすることにより、 Heimdallr起動中のインストールを防いでいるわけです。

AppPublisher=SutoSoft
AppPublisherURL=http://www.sutosoft.com/room/
AppVersion=1.05
AppVerName=Heimdallr 1.05

ここは特に説明の必要は無いと思います。見たまんまです。

DefaultDirName={pf}\Heimdallr

デフォルトのインストール先がProgram File\Heimdallrになるようにしてます。 {pf}というのはProgram Filesフォルダを意味しています。

DefaultGroupName=Heimdallr

スタートメニューにHeimdallrというグループ(フォルダ)を作るようにしてます。

UninstallDisplayIcon={app}\Heimdallr.exe

コントロールパネルのアプリケーションの追加と削除の所に表示するアイコンを指定します。ここでは、Heimdallr.exeという実行ファイルを指定しているので、この実行ファイルのアイコンがそのまま使われます。

OutputBaseFilename=heim105

インストーラーのファイル名です。この指定により、「heim105.exe」というインストーラーが 作成できます。

OutputDir=".."

インストーラーの出力先フォルダ。諸般の事情から一つ上のフォルダにheim105.exeを出力するようにしてます。

ShowLanguageDialog=no

この指定により、言語選択ダイアログが表示されなくなります。
詳しくはLanguageセクションの説明のところに書きます。

Setupセクションだけでだいぶ長くなってしまったので、 続きは次回にします。

2004年07月16日

Inno Setupの使用例(1/3)

Heimdallrのインストーラーは、Inno Setupを使って作っています。
Inno Setupは、Windows用のインストーラー作成ソフトで、商用利用も可能なフリーソフトです。
Inno Setupを開発したのは海外の方ですが、日本の方々の協力もあり、 日本語のインストーラーを作成することができます。
インストールするファイルを一つのexeファイルにまとめることもできますし、 アンインストーラーを生成することもできます。
結構強力なインストーラー作成ソフトなのではないかと思います。

しかし、海外の方が開発しただけあって、Inno Setupの日本語の解説はあまり多くないです。
そこで、ここで私がInno Setupをどのように使っているのか、詳細を書いて、 Inno Setupの使用例を一つ増やしたいと思います。

まずはInno Setupのインストールから。
おっとっと最新版をダウンロードしてインストールするのはちょっと待ってください。
Inno Setupの最新版は、日本語の言語ファイルのバージョンが追いついていない可能性があります。

まずは、日本語用の言語ファイルを入手する必要があります。
Inno Setup TranslationsからJapaneseの言語ファイルをダウンロードして下さい。
現時点で4.1.4というバージョンの言語ファイルがあります。とりあえずこれをダウンロードしておきましょう。

ここで、バージョン4.1.4の言語ファイルをサポートしているのはInno Setupのどのバージョンか、ということに注意する必要があります。
上記Inno Setup Translationsの先頭あたりを見てみると書いてありますね。4.1.7までのバージョンでしかサポートしていません。
よって、Version 4.xダウンロードページに移動して4.1.7をダウンロードしましょう。

さて、ここではJapanese言語ファイル4.1.4とInno Setup4.1.7をダウンロードしました。
今後新しいバージョンが公開されれば上記のバージョン番号は読み替えて下さい。

必要なファイルはダウンロードできたので、次はインストールです。
まず、Inno Setup 4.1.7をインストールしましょう。これはInno Setupインストーラーの指示に従えば簡単です。
次に、言語ファイルをインストールします。

言語ファイルをJapanese.islというファイル名に変更し、Inno Setupをインストールしたフォルダにコピーします。
さらに、Japanese.islを編集します。
Japanese.islの先頭のほうにある以下のセクションを、

[LangOptions]
LanguageName=Japanese
LanguageID=$0411
; If the language you are translating to requires special font faces or
; sizes, uncomment any of the following entries and change them accordingly.
;DialogFontName=MS Pゴシック
;DialogFontSize=9
;TitleFontName=MS Pゴシック
;TitleFontSize=29
;WelcomeFontName=MS Pゴシック
;WelcomeFontSize=12
;CopyrightFontName=MS Pゴシック
;CopyrightFontSize=8

以下のように変更します。

[LangOptions]
LanguageName=Japanese
LanguageID=$0411
; If the language you are translating to requires special font faces or
; sizes, uncomment any of the following entries and change them accordingly.
DialogFontName=MS Pゴシック
DialogFontSize=9
TitleFontName=MS Pゴシック
TitleFontSize=29
WelcomeFontName=MS Pゴシック
WelcomeFontSize=12
CopyrightFontName=MS Pゴシック
CopyrightFontSize=8

フォント関係の設定のコメントアウトを解除しただけです。
これを行わないと、Inno Setupで作成したインストーラーがWin98において文字化けします。

これでInno Setupのインストールは完了しました。
インストール作業だけで結構長文になってしまったので、使い方についてはまた次回、ということで。

サーバに依存した無料サービスの怖さ

Heimdallrは、昔、利用者の好みを学習する機能を搭載しようと考えていたことがあります。そのときはこれはとても難しそうだということで断念したのですが、最近また考えはじめています。
そこでRSSリーダーの自動学習機能って実際の所どうなんだろう?というあたりを知るために、
自動学習機能を備えたRSSニュースリーダーReadOneを使ってみました。

ところが、使い始めた当初は、「最新のニュースはありません」と無情なメッセージが表示され、ニュースを閲覧することがまったくできませんでした(今は閲覧できます)。
どうやらサーバが不調だったようです。

その状況を知って真っ先に感じたのが、サーバに依存した無料サービスって怖いな、ということでした。

より正確に言うと、
「開発者が管理するサーバが必須で収益の出ないサービス」が怖い、ということです。
誰にとっての恐怖かというと、開発者にとっての恐怖です。

まず、サーバに依存したサービスは、サーバが落ちたら利用者は全員サービスを受けられなくなるのです。よって、サーバは常時稼動させておく必要があります。
開発者が頑張ってサービスの質を向上させ、利用者の数が増えると、サーバへのアクセスが増え、増えたアクセスに対してサーバを常時稼動させるために、回線の増強や記録容量の拡大など色々な投資が必要になります。
しかし、そのサービス自体から収益を得られないわけですから、開発者は別途なんらかの仕事を行う必要があります。飯を食べないと生きていけないですからね。
サービスの利用者が増えれば増えるほど、サービスを維持するために開発者は仕事を増やさなければならないわけです。さらにサービスのメンテナンス時間も増えるため、結果的に自由時間がずばずば削られていきます。

人気が出れば出るほど加速度的に自由時間が削られていく。
これが開発者にとっての「開発者が管理するサーバが必須で収益の出ないサービス」の怖さです。

このblog「MASATOの開発日記」も自宅のサーバから提供しているので、
私も例えばHeimdallrとサーバで連携して何かステキなサービスをする、
ということができないわけではないのですが、
こういう怖い現実を知ってしまうと、ちょっとこの手のサービスには手を出す気にはなりません。

なんか呪われた武器って感じがしますね。強力だけれど反動が怖い・・・。

2004年07月15日

Heimdallr 1.05リリース

Heimdallr 1.05をリリースします。
安定版です。
Heimdallr 1.05
Heimdallr 1.05ソースコード(Visual C++.NET 2003用)

Heimdallr 1.04からの変更点は以下の通りです。

  • 設定ファイルの形式を変更しました。

  • ビューの背景が透明になる透明スキンを追加しました。

  • ビュー設定を開いていてもビュー右クリックメニューから選択できてしまう問題を解消しました。

  • ビュー設定中に記事を閲覧してもすぐに既読にならない問題を解消しました。

  • OPMLを正しく更新できない問題を解消しました。

  • ビューを削除した際に強制終了することがある問題を解消しました。

  • 「URLをコピーする」コマンドを追加しました。

  • バージョン情報ダイアログから配布サイトを閲覧できるようにしました。

  • スキン設定ダイアログにスキンの情報を表示するようにしました。

  • ビュー右クリックメニューに「スキン設定」コマンドを追加しました。

  • スキン設定ダイアログに適用ボタンを追加しました。

  • スキンを変更したときにフォントが変更されないようにしました。

  • 猫スキンを追加しました。

  • タスクトレイのアイコンが時々消えるバグを修正しました。

  • ビューの移動とサイズ変更を禁止していても、ALTを押しながらならばできるようにしました。

Heimdallr 1.05に追加された主な機能は透明スキンと猫スキンです。
以前から弱いと指摘されていたデザインが多少は強化できたのではないかと思います。

スキンを作ってみたい方へ
スキンの仕様や作り方についての解説はノルンの使徒のスキン解説ページに書いてあります。ご参照下さい。

まだ書いていないことも多いですが今後どんどん書き足して行きたいと思います。
足りないところがあったらどんどん質問をお願いします。

2004年07月13日

Heimdallr 1.05beta2リリース

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

安定版はHeimdallr 1.04です。

変更点は以下の通りです。どれも小さな変更です。

  • ウィンドウの位置が「普通のウィンドウ」となっているビューの移動とサイズ変更を禁止していると、余白を左クリックしても前面に表示されないバグを修正しました。

  • タスクトレイアイコンが稀に消えるバグを修正しました。

  • タスクトレイアイコンにマウスカーソルを合わせると表示されるワンポイントを数点追加しました。


2004年07月09日

Heimdallrのおまけ機能

マイナーRSSリーダーHeimdallrの、マイナーな機能の紹介です。

マニュアルにも詳しく書いてないので誰も存在することさえ知らないような機能だと思いますが、
一応実装するのに結構手間かかってますので誰にも使われないと悲しいです。
というわけでこんな場所で紹介してみたいと思います。

OPML巡回機能
Heimdallrは、OPMLファイルのインポート/エクスポートができますが、
それだけではなく、RSS Feedと同じようにOPMLを扱うことができます。
実際に試してみましょう。
例えばInfo Maker様のダウンロードページのHeadline-Reader OPMLリストへのリンクをそのままHeimdallrのビューにドラッグ&ドロップしてみてください。
OPMLに記述されているRSS Feedを巡回して全ての記事を取得して表示するのが分かるかと思われます。

この機能とキーワード設定を組み合わせると結構便利のような気がしますが、
巡回するのに結構時間がかかりますし、未来検索livedoorのようなBlog検索サイトを使えばそれで大概事足りるので、
作ったっきり宣伝もしてない隠れ機能となっております。

ワンポイント表示機能
タスクトレイのアイコンの上にマウスカーソルを移動させると・・・なんとHeimdallrに関するトピックが紹介されます。
アイコンを右クリックするごとに異なるトピックが表示されます。
いやーこれもまたどうでも良い機能ですねー。

というわけでマイナー機能の紹介でした。
良かったらちょこっとくらい使ってやって下さい。

2004年07月05日

本サイトへのリンクについて

本サイト「MASATOの開発日記」へのリンクはどうすれば良いのですか?
というようなことを聞かれましたので、公式見解などを書いておきます。

サイトのトップページ
本サイトのトップページのURLは、
http://www.sutosoft.com/room/
です。
実は http://www.sutosoft.com/mt/devdiary/ でも同じところが表示されたりするのですが、一応公式には前者がトップページのURLということでお願いします。

リンクに対する私の考えた方
本サイトのあらゆるページ、画像、アーカイブファイル等(以下コンテンツ)へ、いかなる種類のリンクを張って頂いても構わない、と考えております。
しかし、一応著作権は私にありますので、私が作成したコンテンツが、私以外の人が作ったように見えるようにはしないで欲しい、と考えております。

それだけです。

2004年07月04日

背景が透明なウィンドウの作り方(2/2)

環境
Visual C++.NET 2003
ライブラリ
MFC 7.1
OS
Win2000以降

以下のような背景が透明なウィンドウの作り方の続きです。前回はこちら

20040613_transparent.png

このウィンドウは、2枚のウィンドウを重ねて使います。 1枚目は、マウスメッセージを受信して処理する透明なウィンドウで、 2枚目は、文字などを表示する描画用のウィンドウです。

ウィンドウの設定より先に、Win2000以降でしか使えないAPIを使うことになるので、 定数を適切な値に設定しておきます。

どこかに以下のような定数定義がありましたら、

#define _WIN32_WINNT 0x0400

以下のように変更しておきましょう。

#define _WIN32_WINNT 0x0500

さて、肝心のウィンドウの設定ですが、 1枚目のウィンドウCXxxFrame(CFrameWnd派生クラス)のPreCreateWindowはこんな感じです。

BOOL CXxxFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CFrameWnd::PreCreateWindow(cs) )
		return FALSE;

	cs.x = 100;
	cs.y = 100;
	cs.cx = 200;
	cs.cy = 200;
	cs.style = WS_VISIBLE | WS_POPUP;
	cs.lpszClass = AfxRegisterWndClass(0);
	cs.dwExStyle = WS_EX_LAYERED;
	cs.hMenu = NULL;
	return TRUE;
}

サイズなど細かい点はおいておきまして、注目するのはウィンドウスタイルです。 拡張スタイルとしてWS_EX_LAYEREDを指定しています。

1枚目のウィンドウのOnCreateはこんな感じです。

int CXxxFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	SetLayeredWindowAttributes(0,1,LWA_ALPHA);
	m_pFrame = static_cast(RUNTIME_CLASS(CYyyFrame)->CreateObject());
	CRect rectWindow;
	GetWindowRect(&rectWindow);
	m_pFrame->CreateEx(0, NULL, "YYY", 0, rectWindow, this, 0);
	return 0;
}

ポイントは2点。SetLayeredWindowAttributesでウィンドウのα値を1にしているところと、 CYyyFrameを生成しているところです。 なお、m_pFrameというのはCFrameWnd*型のメンバ変数です。

ウィンドウのα値を1にすると、ウィンドウはほとんど透明になります。 α値を0にすると完全に透明になりますが、残念ながら完全に透明にしてしまうと ウィンドウを操作できなくなってしまいます。そのためここではα値を1に留めておきます。

CYyyFrameというのは、文字などを表示する描画用のウィンドウです。 ちょうどCXxxFrameと同じ場所に表示することで、1つのウィンドウのように見せているわけです。

CYyyFrameのウィンドウスタイルは、CYyyFrameのPreCreateWindowで指定します。

BOOL CYyyFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if (!CFrameWnd::PreCreateWindow(cs)) {
		return FALSE;
	}
	cs.style = WS_VISIBLE | WS_POPUP;
	cs.dwExStyle = WS_EX_LAYERED | WS_EX_TRANSPARENT;
	cs.lpszClass = AfxRegisterWndClass(0);

	return TRUE;
}

ポイントは1点。ウィンドウの拡張スタイルをWS_EX_LAYERED | WS_EX_TRANSPARENTとしているところです。
この拡張スタイルの組み合わせの意味は、Microsoftのレイヤードウィンドウ解説ページに書いてあります。

レイヤード ウィンドウが WS_EX_TRANSPARENT 拡張ウィンドウ スタイルを持つ場合、レイヤード ウィンドウの形状は無視され、マウス イベントはレイヤード ウィンドウの下の他のウィンドウに渡されます。
というわけで、このウィンドウに対するマウスイベントは、このウィンドウの下にあるウィンドウ、すなわちCXxxFrameに渡されます。このため、CYyyFrameは描画だけに専念できるわけです。
でもこれキーボードイベントはどうなるんでしょうね。 キーボードイベントは試してないので分かりません。
しかし不可思議なのはWS_EX_TRANSPARENTスタイル。このスタイルは、マウスイベントを無視することを意味するウィンドウスタイルではありません。でもレイヤードウィンドウのときだけ特殊な効果を発揮するようです。うーん不思議。

不可思議な点は残りましたが、とりあえずこれで透明ウィンドウを実現することができました。ひとまずめでたしめでたしと言う事で。

2004年07月03日

もしもHeimdallrがRSSリーダーの枠を越えたら

Heimdallrは、「壁紙のようにデスクトップに貼り付けられるRSSリーダー」です。
それは今後も変わりません。

今後も変わりませんが、このHeimdallrのUIは他に何か使えないかなーと妄想してみるのはタダなので、
ちょっと考えてみたいと思います。

あくまで妄想です。

メーラーと連携
メールが到着したことをHeimdallrのビューに表示し、それをクリックするとメーラーが起動してメールの本文を読んだり返事を書いたりできるようになったらどうでしょう。
Heimdallrのビューを最前面に表示させておくと便利かもしれません。

メッセンジャーと連携
Windows Messenger、IP Messengerなどと連携して、メッセージが届いたらHeimdallrのビューにメッセージを表示してみたらどうでしょう。

スケジューラと連携
10分後の会議の予定や明日のデートの予定をHeimdallrのビューに表示してみたらどうでしょう。クリックしたらスケジューラのウィンドウが開いて予定の詳細を確認できたりとか・・・。

天気予報を表示
これはRSSでもできるかも。自分が住んでいる地域の天気予報を表示してくれたら便利そうですね。

SSTPサーバーになる(笑)
SSTPというのはこちらのことです。
既存のSSTPクライアントと連携して色々楽しいことができる、かもしれません。

結構話のネタはありそうですねー。
まあでもこれは妄想です。

2004年07月02日

Heimdallr 1.05beta1リリース

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

安定版はHeimdallr 1.04です。

変更点は以下の通りです。

  • スキン機能が強化されました。透過PNGが扱えるようになりました。但しGIF、JPEGは扱えなくなりました。現時点でサポートされている画像フォーマットはPNGとBMPだけです。

  • スキン「花にゃんこ」を追加しました。

  • ビューの移動とサイズ変更を禁止していても、ALTを押しながらならば移動とサイズ変更ができるようになりました。

  • 猫スキンのIDを変更しました。1.05alpha3で猫スキンを使っていた人は、一旦デフォルトスキンに戻ってしまいますごめんなさい。もう一度スキン設定ダイアログから猫スキンを選択すれば元に戻ります。

デバッグ協力のお願い
WindowsXPにおいて、タスクバーの通知エリア(通称タスクトレイ)からアイコンが稀に消失する現象が確認されています。Microsoftの技術情報を頼りに対策は打ちましたが、そもそも稀にしか発生しませんので本当に対策が上手くいったのか良く分かりません。
そこで、Heimdallr 1.05beta1を実行している最中に、以下のメッセージが書かれたダイアログが表示されたら、そのことを私に教えて下さい。

  • TaskbarCreatedメッセージを受信しました。全てのアイコンを再作成します。

  • ShellNotifyIconの登録失敗。エラーコード=ERROR_TIMEOUT。リトライします。


そのとき、以下の事柄も一緒に教えて下さい。
  1. 表示されたメッセージ

  2. 使用しているOS

  3. 1.05beta1より前のバージョンで、タスクトレイからアイコンが消えたことがあったかどうか

  4. メッセージが表示されたときに行っていたこと。
    (いつの間にかメッセージが表示されていたら「いつの間にか」と教えて下さい。)

  5. メッセージが書かれたダイアログのOKボタンを押した後、Heimdallrのアイコンが正しくタスクトレイに表示されているかどうか

バージョン1.05で追加する予定の機能は全て追加しました。
しばらくテストを行った後、安定版としてリリースする予定です。