2005年07月28日

Subversionの使い心地

最近、私はソースコード管理ツールをVisualSourceSafeからSubversionに切り替えました。
切り替えて1週間程度経ちましたので、それだけ使っただけで分かった夫々のソースコード管理ツールの利点を書いておきます。

なお、切り替えたと言っても、既にVisualSourceSafeで管理しているソースコードをSubversionに移行したわけではなく、新しく作るものだけSubversionで管理するようにしているので、どうやって移行したか、というお話ではありません。

Subversionの利点

フリーである。フリーであることは大抵の場合で大きなメリットとなります。私の場合は、開発に誰かを引きずり込む場合に効果を発揮しそうです。
ソースコード管理にはSubversionを使ってますので、Subversionをインストールして下さい、とは言えますが、VisualSourceSafeを使っていますのでVisualSourceSafeを買ってください、とはとても言えませんから。VisualSourceSafeは数万円しますので。

インターネット経由でのアクセスが楽。VisualSourceSafeは、基本的にはリポジトリをファイル共有する必要があります。そのため、インターネット経由のアクセスはそれなりに大変です(できないわけではないですが)。
ところが、Subversionは、これが簡単にできます。試しに私のリポジトリにhttp://www.sutosoft.com/svn/helからアクセスできるようにしてみました。こんなことが簡単にできました。いや便利。CVS使っていた方にはこのありがたみはあまり分からないかもしれませんが、VisualSourceSafeを使っていた私にとってはとてもありがたいものです。

クライアントのGUIが使い易い。これはTortoiseSVNのお陰です。VisualSourceSafeエクスプローラーは、エクスプローラーライクなGUIですが、TortoiseSVNは、Windows Shell Extensionなので、エクスプローラーの中に直接組み込まれます。そのため、普通にエクスプローラーで他のファイルを見ているときに、Subversionにより管理されているファイルに辿りつくとそのままコミットしたりできますし、VisualSourceSafeエクスプローラーのように「右クリックして送るを選択」ができない、なんてこともありません。これはとても使い易いと思いました。

VisualSourceSafeの利点

ファイル単位の共有ができる。Subversionでは、svn:externals属性を使うことによりディレクトリ単位の共有はできますが、ファイル単位の共有はできません。VisualSourceSafeの方はやりたい放題共有できます。これが重要かどうかは良く分かりませんが、私はファイル単位の共有を良く行っているので、これができなくなると何か手を考えなければなりません。多少面倒ですね。

キーワード展開機能が強力。VisualSourceSafeは、$Log: $というようなキーワードをソースコードに記述しておくと、そこをなんらかの情報に置き換えてくれます。$Log: $だと更新時コメントの履歴になります。Subversionでも、svn:keywords属性により似たようなことはできますが、VisualSourceSafeの方がキーワードの種類が多いです。特に、私が良く使う$Log: $がSubversionに無いのが痛いですね。

まとめ

上記のSubversionの利点とVisualSourceSafeの利点を比べてみると分かりますが、Subversionの利点に比べるとVisualSourceSafeの利点は大したものではありません。
正直、これから先、新しく作るソフトウェアのソースコードをVisualSourceSafeで管理しようという気にならなくなりました。Subversionの方が遥かに洗練されていると思います。(後から出てきたためだと思いますが)。枯れていないので安定性が若干不安ですが、VisualSourceSafeの安定性も褒められたものではないので、VisualSourceSafe使いの方はあまり気にしなくても良いでしょう。
というわけで、一週間程使ってみた限りの結論は以下の通り。
明らかに、Subversion > VisualSourceSafe

2005年07月26日

カテゴリ毎のアーカイブを整理しました

本サイトのトップページの左のペインにあるカテゴリ毎のアーカイブを若干整理しました。
従来は、カテゴリ毎のアーカイブには、全部の記事の本文まで入っていて、読み難いものになっていました。
今はタイトルと要約だけの一覧になっていますので、若干読み易くなったと思います。

肝心のカテゴリの分け方ですが、それは今後の課題です。
技術雑談と技術メモのカテゴリは一緒にしても良さそうですし、
Inno Setupやソースコード管理など、アプリケーション毎のカテゴリを新設するのも良さそうです。
Heimdallr応用というカテゴリを追加しても良いかもしれません。
暇があったら適当に整理してみたいと思います。

でもたぶんカテゴリ毎のアーカイブって誰も見ないでしょうね。
誰も見ないところに力入れても意味ないかも?

2005年07月23日

我が家のシステムキッチン

我が家(借家)にはそこそこまっとうなシステムキッチンがあります。

しかし、残念ながら今はこんなありさま。

我が家のシステムキッチン

うーむ。自炊できるのはいつになることやら。

2005年07月20日

CppUnitライブラリ化

環境
Visual C++.NET 2003
ライブラリ
CppUnit 1.10.2
CppUnit 1.10.2をビルドするためのVisual C++.NET 2003用プロジェクトファイルを作成しましたので、公開します。

CppUnitライブラリ プロジェクトファイル ダウンロード

使い方

使い方は以下の通り。

  1. CppUnitのサイトからCppUnit 1.10.2をダウンロードし、解凍します。
    解凍するとcppunit-1.10.2というフォルダができます。以下、このフォルダをベースに説明します。
  2. cppunit-1.10.2\src\cppunitにcppunit.vcprojを置いて下さい。
  3. cppunit.vcprojをVisual C++.NET 2003で開いて下さい。
  4. バッチビルドにより全ての構成をビルドして下さい。
  5. cppunit-1.10.2\libにライブラリが6つ出来ています。
    ご使用のC++ランタイムライブラリに合わせてご利用下さい。

2005年07月17日

ソースコード管理システムSubversionを使ってみました

最近、Subversionというバージョン管理システムを使ってみました。
Subversionはフリーなオープンソースのシステムであり、CVSの後継とも言われる将来有望なシステムです。

完成度も結構高く、サーバとクライアントのOSがWindows XPで、統合開発環境がVisual Studio.NET 2003という環境で、いくつかのツールをインストールすることにより、GUIだけでお手軽にソースコードを管理することができるようになりました。

ここまでお手軽に管理できると、もうVSSいらないんじゃないかという気になります。
これでフリーなんていかさまですね。

以下、Subversion及び関連ツールのインストール手順を説明します。

事前勉強

最初に、Subversionについて勉強しておきましょう。
「Subversion によるバージョン管理」にまとまった情報がありますので、ざっと目を通しておきましょう。

サーバの準備

「subversion.tigris.org」からSubversionをダウンロードしてインストールします。
私は、svn-1.2.0-setup.exeをダウンロードしました。
そのまま実行するだけでインストールできます。楽ですね。


次に、「tortoisesvn.tigris.org」からTortoiseSVNをダウンロードしてインストールします。
これにより、ExplorerにSubversionへのアクセス機能が追加されます。これがやたらと便利です。
私はTortoiseSVN-1.2.1.3895-svn-1.2.1.msiとLanguagePack_1.2.1_ja.exeをダウンロードしました。
前者はセットアップファイル、後者は日本語パッチ(言語パック)です。どちらも実行するだけでインストールできます。また、前者はインストール後再起動が必要です。

再起動したら、Explorerを開き、TortoiseSVN→Settingを選んで言語を日本語に変えておきます。

ここまで準備できたら、レポジトリ作成やチェックアウト&コミットなどの基本的な操作ができるかどうか確認しておきましょう。

次は、サーバアプリケーションを起動します。
やり方は、「svnserveでのリポジトリ公開」を参考にしましょう。

なお、私は、sexeというツールを使ってsvnserveをWindowsのサービスとして登録しました。

以上でサーバの準備は完了です。
次はクライアントの準備を行います。

クライアントの準備

「subversion.tigris.org」からSubversion、
「tortoisesvn.tigris.org」からTortoiseSVNをダウンロードしてインストールします。やり方はサーバと同様です。
インストールが完了したら、TortoiseSVNを使ってサーバに接続してみましょう。

次に、ankhsvn.tigris.orgからVisual Studio.NET 2003のためのアドインをダウンロードしてインストールします(Visual Studio.NET 2002でも使えるようです)。
私は、 AnkhSetup-0.5.5.1653.msiをダウンロードしました。
これもそのまま実行するだけでインストールできますが、Visual Studio.NET 2003で使うためには、Visual Studio.NET 2003の設定が若干必要です。「FaqStepByStepSetup」に設定手順が書いてありますので、この通り設定しましょう。

これでクライアントの準備は完了です。
あとは思う存分ソースコード管理をして下さい。

2005年07月16日

蝉の命

昨晩、コンビニに飲み物を買いに行く途中、蝉の幼虫がのたのたと歩道を歩いているのを見つけました。
珍しいなぁと思い、しばらく様子を見ていると、そのまま車道に歩いていきそうな感じでした。
何年も土の中で頑張った挙句に車に轢かれて死ぬのはあんまりだろうと思ったので、捕まえて街路樹の幹に移動させておきました。
翌朝、様子を見に行って見ると、地面に茶色い物体が・・・。

途中で転がり落ちてしまったのではないかと心配しましたが、
良く見てみるとこんな感じ。

蝉の抜け殻
背中がぱっくり割れていて中身は空っぽです。

近くに蝉の死体も転がってなかったので、どうやら無事羽化できたようです。良かった良かった。
無事に嫁さん(か旦那さん)を見つけられるといいですね。

2005年07月15日

Heimdallr 1.09リリース

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

Heimdallr 1.09 ダウンロード

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

ようやく安定版になりました。
1.09のポイントはマウスジェスチャです。 マウスオペレーション主体のHeimdallrとマウスジェスチャ機能は相性が良かったと思います。上手く使うと今までよりもだいぶ操作が楽になります。

1.08→1.09の変更点詳細

  • スキン設定ファイルのパラメータにuserが使えるようにしました。
  • init.xmlを強化し、チャンネル拡張プラグインが設定できるようにしました。
  • 初期状態で登録されているサイトの数を増やしました。
  • マウスジェスチャを使えるようにしました。
  • 自動学習機能を改良しました。
  • スキンのファイル形式にTAR32.DLLで解凍可能な形式が利用可能になりました。
  • 記事の詳細を表示できるようにしました。
  • custom.xmlを強化しました。
  • 記事既読化の際に、サイトの順番が入れ替わることがあるバグを修正しました。
  • チャンネル拡張プラグインを見失っても、データだけは保持しておくようにしました。
  • マルチモニタ環境において概要ウィンドウの表示が位置ずれるバグを修正しました。
  • キーワードチャンネルを強化しました。
    • キーワード中のスペースを正しく処理できるようにしました。
  • トピックチャンネルを強化しました。
    • 「健康」トピックを強化しました。

1.09beta5→1.09の変更点詳細

  • ヘルプファイルに説明を追加しました。

2005年07月12日

暗復号ストリームライブラリ

以前作成したC++の暗復号ストリームライブラリを公開します。

暗号化ストリームライブラリ ダウンロード

以下、このライブラリの概要と、構成、コンパイルするために必要なものと、注意点について説明します。

概要

本ライブラリは、「libdesのライブラリ化」で紹介したDESライブラリや、 「aesライブラリ化」で紹介したAESライブラリを用いて暗号化及び復号化を行うことができるC++のストリームクラスを提供します。

本ライブラリにより、以下のようなコードで暗号化が実現できます。

unsigned char Key[16] = {16バイトの適当なデータ};
unsigned char Iv[16] = {16バイトの適当なデータ};
oaes_encryptstream stmEncrypt(&std::cout, false, 
  block_encryptbuf::cbc_mode | block_encryptbuf::iv_mode | block_encryptbuf::cts_mode, 
  Key, Iv);
stmEncrypt << お好きなデータ;

構成

本ライブラリは、以下のファイルから構成されています。

ライブラリユーザ向けクラスが記述されたファイル

oaes_encryptstream.h
AESによる暗号化を行った後、任意のストリームに対して出力を行うストリームクラス
iaes_decryptstream.h
任意のストリームから入力を受けてAESにより復号化を行うストリームクラス
odes_encryptstream.h
DESによる暗号化を行った後、任意のストリームに対して出力を行うストリームクラス
ides_decryptstream.h
任意のストリームから入力を受けてDESにより復号化を行うストリームクラス

サンプルコード

EncryptStream.cpp
上記クラスを使用して簡単な暗復号を行うサンプルコード

上記クラスが内部で使用するクラスが記述されたファイル

base64_encodebuf.h
BASE64によるエンコード/デコード用streambufクラス
des_encryptbuf.h
「libdesのライブラリ化」で紹介したDESライブラリを用いてDESによる暗号化/復号化を行うstreambufクラス
aes_encryptbuf.h
「aesライブラリ化」で紹介したAESライブラリを用いてAESによる暗号化/復号化を行うstreambufクラス
block_encryptbuf.h
任意のブロック暗号により暗復号を行うstreambufクラス
filterbuf.h
ストリームに対して入出力を行うstreambufクラス
ifilterstream.h
任意のストリームから入力を受けて処理を行うストリームクラス
ofilterstream.h
処理を行った後、任意のストリームに出力するストリームクラス

コンパイルするために必要なもの

  • Visual Studio.NET 2003
    他の環境でも頑張ればなんとかなるかもしれません
  • 「libdesのライブラリ化」で紹介したDESライブラリ
    インクルードパスにはdes.hが存在するパスを指定し、ライブラリパスにはlibファイルが存在するパスを指定すること。
  • 「aesライブラリ化」で紹介したAESライブラリ
    インクルードパスにはaes.hが存在するパスを指定し、ライブラリパスにはlibファイルが存在するパスを指定すること。

ライブラリを使用する際の注意点

  • このライブラリに実戦経験はあまりありません。 Heimdallrのいくつかのプラグインで数バイトのパスワードを暗号化するために使われた程度です。
  • ドキュメントは無いに等しいものです。
  • 各クラスは、template <class Elem> class basic_xxxstreambuf と、まるでElemを自由に指定できるように思われますが、 Elem=char以外はまったくテストしていないのでElem=charとしておくのが無難です。

利用条件

以下の条件を守る限り、使用、改変、転載、再配布は自由に行ってよいものとします。
  • ソースコード中の著作権表記「(C) SutoSoft」を消さないこと。
  • 本ライブラリにより何らかの損害を受けても、作者であるMASATOの責任を問わないこと。

あとこの記事にコメントも頂けたら幸いです。これは必須ではないですが。

反省

一応説明は上記でお終いですが、最後に本ライブラリを開発した上での反省点を書いておきます。

実のところ、本ライブラリは、2点、大きな設計ミスがあったと思います。

1点目は、各クラスに多くの継承関係を持たせてしまったことです。 例えば、basic_des_encryptbufクラスは、basic_block_encryptbufクラスから派生し、 basic_block_encryptbufクラスは、basic_filterbufクラスから派生し、 basic_filterbufクラスは、std::basic_streambufクラスから派生しています。
こうして継承で繋げるのではなく、templateにより繋げるべきでした。 そうしていれば、拡張性、パフォーマンスにより優れたものになったと思います。(複雑にもなりますが) こういったクラス群をtemplateで繋げて拡張性やパフォーマンスを確保できるのは C++の大きな利点です。生かさないと損ですね。

2点目は、出力先/入力先をストリームにしてしまったことです。 出力先/入力先はiteratorにするべきでした。 ストリームよりもiteratorの方が汎用的ですね。反省です。

このライブラリは、Javaのjava.ioパッケージを真似て設計したのですが、 それがあまり良くなかったのではないかと思います。
C++を使うんですからC++らしく設計するべきでした。 そのうち、時間が取れたらこれらの欠点を取り除いたライブラリを 作ってみようと思います。

しかし、設計ミスといっても、暗号化機能や復号化機能そのものに問題があるわけではありません。 様々な拡張を施そうと考えたり、パフォーマンスを追及しようとしたりしなければ、 このライブラリは立派に活躍できると思います。適当にご活用下さい。

2005年07月08日

自動学習機能の評価

RSSリーダーHeimdallrに搭載されている自動学習機能は、ユーザの興味対象を学習し、興味のありそうな記事を優先的に表示するという機能です。
この機能は、Heimdallrの特徴的な機能なのですが、上手く動いているかどうか評価することが難しく、開発者としてはなかなか扱い難い機能です。
そこで、自動学習機能の評価として、ユーザによる自動評価ができないかと考えています。

評価が難しいのは、ユーザの興味対象を適切に学習できているのか、といったことが数値化できないからです。
数値化できないと、例えばアルゴリズムを改良したとき、本当に良くなったかどうか分かりません。
こうした評価が難しい自動学習機能を、どうやって評価するかというのは、Heimdallrの大きな課題なのです。

何か参考なるかと思い、日本語の文書からキーワードを抽出する技術についての論文などを読んでみると、
人間が主観で正解を決め、それにどれくらい近づけたかというのを数値化しているようです。
人数が多ければ客観的な正解になると思うので、なかなか良いやり方だと思います。
たぶん研究室の仲間に手伝って貰っているのでしょう。

しかし、私は、もう学生ではないので研究室の仲間は居ません。
けれども、ユーザの皆様に手伝って貰うという手があります。
具体的にはこんな方法です。
自動学習機能をバージョンアップしたら、前より良くなったか、それとも悪くなったのか、皆様からコメントを貰うのです。アンケートでも良いですね。
1000件位集めて、半分以上良くなったと感じる人が居たら、バージョンアップは成功。そんな方法です。

しかし、このサイトのコメント数を見る限り、どう考えても1000件もコメントを貰えそうに無いです。
そして、コメントが少ないと、ユーザの嗜好が偏ると思いますので、あまり参考になる結果が得られるとは思えません。

そこで、もっとお手軽に、ユーザによる自動評価ができないか、と思っています。
例えば、Heimdallr起動後にユーザが一番最初にクリックした記事が、自動学習機能により「ユーザが興味あり」と判定されていたら得点+1、「ユーザが興味なし」と判定されていたら得点-1、こんな感じで、得点を計算し、定期的に私に送って貰うようにするのです。
自動学習機能に変更を加えれば、その結果が数値として得られるはずなので、改善と改悪のどちらになったのかはっきりします。

そうして集めた情報、個人情報にならないかという懸念はあります。しかし、ユーザ環境で0.5とか0.9とか数値化された上で私に送られるので、問題ないと思います。(もちろん本当にやるときは、ちゃんとユーザの許可を取ってからやりますが)

これでしたら、お手軽に登録できるので、1000人位集まるのではないかと期待できます(無理かな^^;)
1000人集めることができれば、自動学習機能が上手く働いているかどうか判断するための客観的(に近い)数値が得られるのではないかと思います。

というわけで、このユーザによる自動評価という評価のやり方は、自動学習機能をお手軽に、そして客観的に評価できる良いやり方だと思います。
研究室の仲間を呼び集めてやるよりも、良いやり方かもしれません。ちょっと作ってみたくなりました。
しかし、私の専門は自然言語処理ではありませんし、今後も自然言語処理を専門にしようとはあまり思っていないので、深入りしたくないなぁという想いもあります。
というわけで、これについては「気が向いたら」試してみようと思います。

2005年07月03日

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

毎月恒例のカウンタートラックバックです。
6月中にHeimdallrを紹介して頂いた方々に対し、トラックバックを送ると共にお礼を込めてコメントなどを書かせて頂きたいと思います。

(6/3)Heimdallrへの要望

まず、キーワードチャンネルが取得したデータに特定キーワードが含まれていたら既読にする、という機能についてです。
キーワードチャンネルのノイズに対しては何らかの対策を打つ予定です。
その対策として「特定キーワードが含まれていたら既読にする」機能も考えましたが、ここはメールのスパムフィルタに使われている技術を応用して設定を多少自動化しようかと思っています。

いくつかの記事を手動でノイズだと認定することにより、それに含まれている単語を勝手に学習し、ノイズを自動判定して表示しないようにする方法です。 メールに通用するものがRSSで通用するかどうかは不明(RSSの方が文字数が少なくて判定が難しい)ですが、・・・

(6/4) BLOGについての覚書。

コメントまで読むと、どうやらヘルプまで読み込んでいそうな雰囲気です。
すみませんヘルプは結構適当なところが多いです。 でもちゃんと読んでくれる方が居るからにはちゃんと書かないとなりません。 今の所は「簡単な使い方」しかないので、「ちょっと高度な使い方」とかもあると良いのかもしれませんね。

(6/7)「今日のこと★☆(53835)」

広がるHeimdallrの輪。こうして紹介記事が連鎖的に広がって行かないかと密かに期待しております。

(6/14)Heimdallr

Heimdallrのシンプルさは、機能を削って生まれたものではなく、機能を特化して生まれたものです。 今後も、シンプルであると言われ続けるようにバランス良く機能を追加して行きたいと思います。難しいんですよねこれ。

(6/16)似て非なるもの 【ビジネスアイデア】

Heimdallrは、とりあえずBASIC認証に対応しています。URLにユーザ名とパスワードを以下のように含めますと、
http://user:pass@www.example.com/index.rdf
認証を行います。但しこの書き方は、Heimdallrの設定ファイルを見るとパスワードがばればれなので、そこらへんに気をつけて下さい。

また、Heimdallrは、Internet ExplorerとCookieを共有していますので、Cookieを使ったタイプの認証も一部対応しています。 Internet Explorerで一度認証をしておけば、CookieがExpireされるまではHeimdallrでアクセスできると思います。 但しCookieを使った認証方式はいろいろあるので、ものによっては上手く行かないかもしれません。

これ以外の認証方式に対応するのは結構苦労すると思いますが、「パスワード認証ができるRSSリーダー」は どこまでパスワード認証できるんでしょうか。多少気になります。

2005年07月02日

引越し完了

「引越しにつき短期間閉鎖予定」で述べていた
引越しは無事完了しました。インターネットに繋げるようになったのでサーバも復活し、とりあえず一息つけました。

しかし引越しは大変ですね。私にとっては、初めての一人暮らしということで特に大変でした。
例えば引越し翌日はこんな感じでした。
近所に挨拶に行って電話会社と水道会社とガス会社に電話してNTTの工事に立ち会って30分歩いて市役所に異動届けを出して10分歩いて警察署に行って免許書き換えて40分歩いて戻ってきてガス会社の工事に立ち会ってガスが使えるようになったのでシャワー浴びて15分歩いて10分電車でダイエーに行って自転車買って10分自転車乗って電器屋さんに行ってエアコン選んで30分自転車乗って帰ってきたところで扇風機が欲しくなって15分歩いて近所のデパートに行ったら閉まっていてまた電車に10分乗ってダイエーまで行って扇風機を買って帰ってきた。
一日ってこんなに長かったんだ・・・という感じです。

まだパソコン用の机や本棚、洗濯機、冷蔵庫、掃除機などは買っていないのでこれらも何とかしないとなりません。
これからも大変そうです。

こんなことがあると、世界が大きく変わった気がするのですが、仕事に行けばいつも通りですし、Webを巡ってみてもいつも通り。
世界は変わらんものですね。