ハングアップの日々

2006年 2月分

2006/02/28

統合アーカイバ

 統合アーカイバ・プロジェクト 開発系メーリングリスト / ARCDEV-Mailing List: には、メーリングリストの過去ログの見方が書いてあるが、そのままやっても見れない。
 http://ml.infoseek.co.jp/MLarchive/ で当該アドレスで検索すればよいようだ。(直リンク

2006/02/27

cm_rss.pl

 cm_rss.pl を修正。Description に HTML ソースが書かれている RSS に対応。

2006/02/23

Junction, ADS

 先日の内容にミスがあったのでちょっと修正しておいた。

 Junction に対して、副次ストリームをくっつけてみたところ、リンク先のファイルに付いた模様。

 SpringM で、ファイルの Junction をコピーしてみようとしたところ、「ディレクトリ名が無効です」と言われてコピーできない。SpringM のコピー機能は、SHFileOperation() か何かを呼び出して実現しているはずなので、Explorer でも同じようにエラーになるということだろうか。ファイルの Junction の移動は同一ドライブならば問題ないようだ。

2006/02/21

cm_rss.pl

 cm_rss.pl を修正。不正な RSS に対するエラー処理強化。

2006/02/19

COM

 C で COM を使う場合、例えばショートカットのリンク先を設定するには、

psl->lpVtbl->SetPath(psl, szTarget);

などと書く必要があり面倒くさい。一方、C++ なら、

psl->SetPath(szTarget);

で良い。ヘッダーファイルを眺めていたところ、COBJMACROS を define してから、ヘッダーファイルをインクルードすれば、C でも

IShellLinkA_SetPath(psl, szTarget);

と少しは簡単に書けることに気付いた。しかし、IShellLink の場合、IShellLinkA_SetPath() と IShellLinkW_SetPath() など、IShellLinkA 系と IShellLinkW 系が別々に定義されている。わざわざ分ける必要があるのだろうか。謎だ。

 COBJMACROS でググってみたが、あまり情報が見つからない。代わりに、COM の入門として良さそうなページが見つかったのでメモ。Dr. GUI、コンポーネント、COM、および ATL を使う

Yz2.dll, VS6

 Visual Studio 6.0 は、.dsw や .dsp の改行コードが CR+LF でなければ開けないようだ。Yz2.dll の最新のソースを取ってきて開こうとしたら、改行コードが LF になっていたせいで開けず、はまった。Yz2.dll のソースは、VS2003 のプロジェクトファイルも入っていたが、VC++ 7.1 でコンパイルしようとしたら、コンパイルエラーが出てコンパイルできなかった。一部のファイルは、#include の指定と、実際にファイルのある位置が違っていてそのままではコンパイルできなかった。かなりダメダメな雰囲気が漂っている。

2006/02/18

URL memo

 [mfc 30408] Re: ファイルプロパティのダイアログ表示 - 複数ファイルのプロパティを表示する方法
 [mfc 30473] Re:ファイルプロパティのダイアログ表示 - その実装例

URL memo 2

 Visual Studio ドキュメント フィードバック - MSDNフォーラム - MSDN の誤訳の報告はここで。

2006/02/17

cm_rss.pl

 cm_rss.pl を修正。〜 などの一部の記号が化けるのを修正した。

Java

 2ch の某所で Java でファイルコピーを行うにはどんな方法が高速か、議論されている。汎用性を求めるのなら、「Java プラットフォームパフォーマンス」に載っている、バッファを静的に確保する方法が良さそうだが、J2SDK 1.4 以降ならば、NIO の FileChannel.transferFrom() を使う方法がわずかに速いようだ。もっとも、この程度の速度差ならば、汎用性を捨ててまで NIO を使う必要はなさそうな気もする。Linux では、FileChannel.transferTo() がまともに使えないらしいという書き込みもあるのも気になるところ。

URL memo

 New IO -TECHSCORE- - java.nio の解説。

ジャンクション、ハードリンク、ファイル属性

 これからファイラーを作るのであれば、NTFS のジャンクションやハードリンクに対応しておく必要があるだろうと思い、少し調査。ジャンクションを作ると、dir で見ると <JUNCTION> と表示される。API だと、GetFileAttributes() で FILE_ATTRIBUTE_REPARSE_POINT (0x00000400) が ON になることで確認できる。
 ハードリンクのあるファイルの属性を取得する場合は、GetFileAttributes() を使う場合と、FindFistFile() / FindNextFile() を使う場合で、取得される属性が異なる場合があるようだ。.\org\foo.txt というファイルに対して、.\foo.txt というハードリンクを作った後に、.\org\foo.txt の属性を変更してから、.\foo.txt の属性を確認すると、GetFileAttributes() では変更後の属性が取得され、FindFistFile() 系では変更前の属性が取得された。ここで、.\foo.txt を開いてから再度属性を確認すると、FindFistFile() 系でも変更後の属性が得られた。ジャンクションの場合は、ジャンクションそのものの属性とリンク先の属性は全く無関係のようだ。

 ちなみに Windows で扱われるファイルの属性の一覧はこのようになっている。

#define FILE_ATTRIBUTE_READONLY             0x00000001
#define FILE_ATTRIBUTE_HIDDEN               0x00000002
#define FILE_ATTRIBUTE_SYSTEM               0x00000004
#define FILE_ATTRIBUTE_DIRECTORY            0x00000010
#define FILE_ATTRIBUTE_ARCHIVE              0x00000020
#define FILE_ATTRIBUTE_DEVICE               0x00000040
#define FILE_ATTRIBUTE_NORMAL               0x00000080
#define FILE_ATTRIBUTE_TEMPORARY            0x00000100
#define FILE_ATTRIBUTE_SPARSE_FILE          0x00000200
#define FILE_ATTRIBUTE_REPARSE_POINT        0x00000400
#define FILE_ATTRIBUTE_COMPRESSED           0x00000800
#define FILE_ATTRIBUTE_OFFLINE              0x00001000
#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED  0x00002000
#define FILE_ATTRIBUTE_ENCRYPTED            0x00004000

0x00000008 が抜けているが、これはボリュームラベルを示す属性である。しかし、Win32 API からは、ボリュームラベルを示すディレクトリエントリは見えないために、この値は定義されていないようだ。DIRECTORY, DEVICE, SPARSE_FILE, REPARSE_POINT, COMPRESSED, ENCRYPTED の各属性は、SetFileAttributes() で変更することは出来ない。

 Windows において、ファイルへのジャンクションや、ハードリンクはどうも使い勝手が良くない。Windows 用のテキストエディタは、バックアップを作ってファイルを保存する際には、まず元のファイルをバックアップファイル (*.bak) にリネームして、それから元のファイルと同じ名前で新しいファイルを作って、その中に新しい内容を保存するという動作になっている物が多いように思われる。この仕様は、どうも都合が良くない。
 ここで、\dir1\foo.txt というファイルと、\dir2\foo.txt というファイルの内容を同一の物にしておくために、ハードリンクやジャンクションを使うことを考えてみる。

  1. \dir1\foo.txt というファイルに対して、\dir2\foo.txt というハードリンクを作って、\dir2\foo.txt を編集したとすると、\dir2\foo.txt を更新しても、\dir1\foo.txt は更新されず、\dir1\foo.txt と \dir2\foo.txt.bak (バックアップファイル)が同一のファイルになってしまう。
  2. 同じように \dir1\foo.txt というファイルに対して、\dir2\foo.txt というハードリンクを作って、今度は \dir1\foo.txt を編集したとすると、\dir1\foo.txt を更新しても、\dir2\foo.txt は更新されず、\dir2\foo.txt.bak と \dir2\foo.txt が同一のファイルになってしまう。
  3. \dir1\foo.txt というファイルに対して、\dir2\foo.txt というジャンクションを作って、\dir2\foo.txt を編集したとすると、\dir2\foo.txt を更新しても、\dir1\foo.txt は更新されず、\dir2\foo.txt.bak が \dir1\foo.txt を指すジャンクションになってしまう。
  4. 同じように \dir1\foo.txt というファイルに対して、\dir2\foo.txt というジャンクションを作って、今度は \dir1\foo.txt を編集したとすると、今度は \dir1\foo.txt の更新とともに \dir2\foo.txt の中身も更新される。

唯一まともに使えるのは 4. だけということになる。

Firefox

 Firefox 2.0 では、ブックマークと履歴が大幅に改変されて、Places というものになるそうだ。(参考:Another 朝顔日記 - 今日のナイトリーPlaces - wiki.mozilla.org) 履歴とブックマークは、NC 4.5 の頃から同じ UI に慣れきってしまっているので、正直あまり変えて欲しくない。(Enhanced History Manager を使っているのもこれが理由。) UI が変わっても、今までに比べて格段に使い勝手が向上するのならいいのだが・・・。スクリーンショットを見てみたいところ。

2006/02/16

URL memo

 FileSeekerが複数ファイルの右クリックメニューを出せない件
 IEnumIDList::NextとFindFirstFileの速度

@nifty 迷惑メールフォルダー

 先ほどメールをチェックすると、まともなメールが 7件、spam が 16件来ていたのだが、@nifty 迷惑メールフォルダーは、まともなメールの内 5件を spam と判定し、spam の内 5件を spam でないと判定してしまった。正しく判定されたのは、23件中たった 13件である。あきれるほどの馬鹿さ加減だ。

2006/02/12

Eclipse

 Eclipse でタブを表示できるようにしたかったので調べてみた。JStyle というものをインストールすればよいらしい。(JStyleプラグイン - EclipseWiki) インストールしたところ、無事タブが表示されるようになった。

URL memo

 Unicodeとセキュリティ
 第1回: Unicode から Shift_JIS への変換(その1) - Windows 上で Unicode を扱う場合に発生するセキュリティ上の問題点などについて
 第2回: Unicode から Shift_JIS への変換(その2)

2006/02/11

Java, Eclipse

 初めてまともに、Eclipse を使ってみた。括弧の自動挿入や、各種のコード補完機能は非常に便利だ。
 早速 Eclipse を使って、FastFile をいじってみた。Eclipse から、DLL のコンパイルコマンドをどのようにして呼び出せばいいのかよく分からないので、Makefile を使ったコマンドラインからのコンパイルと併用中。結構ややこしいことになっている。*.java のコンパイルは今まで fjavac から、fastjavac や jikes を呼び出して行っていたが、もはや Eclipse の内蔵コンパイラで十分だ。ただ、リリース用には、javac -g:none でデバッグ情報を削除して class ファイルのサイズを小さくしておきたいのだが、Eclipse からのやり方がよく分からなかったので、こちらも Makefile を使っている。

2006/02/10

URL memo

 フォームとアクセシビリティ -- ごく簡単なHTMLの説明 - label, fieldset, legend, optgroup の解説。

2006/02/09

SpringM

 引き続き、SpringM を改造。springm.dll に、dirtime.dll を統合してみた。さらに、unlha32.dll をスタティックリンクするのを止めて、全ての統合アーカイバ DLL は、springm.dll から呼び出されるように変更した。これにより、SpringM 実行中でも、unlha32.dll がバージョンアップできるようになった。代わりに、springm.dll をスタティックリンクするようにしておいた。

 Yz1.dll, Yz2.dll の動作が怪しい。特に Yz2.dll。どちらも、FindFirst() で WildName に、空文字を指定すると落ちてしまう。さらに Yz2.dll の方は Yz2() の出力バッファに NULL を指定して、バッファサイズに 0 を指定すると、NULL ポインタへの書き込みをしてしまう模様。lview から個別にファイルを解凍しようとすると、エラーが発生する。しかし、ダミーのバッファを割り当ててから呼び出しても落ちてしまうのが謎。undll.exe から呼び出した場合は動くようなのだが・・・。よく分からないので、Yz2 の対応は一旦諦めることにした。

 とりあえず現時点での対応拡張子は、lzh, tar (taz, tgz, gz, bz2), zip (xpi, jar), 7z, cab, rar, yz1, gca。ファイラから直接アーカイブの中を見れるのは、やはり便利だ。本当は、通常と同じ UI でアーカイブの中を見れるようになるともっと良いのだが、ソース無しでそこまでやるのはさすがに無理だ。なお、lview の中から lview を開ける拡張子は、springm.exe の中にハードコーディングされていて、上記の物より少し少なくなっている。これも何とかしたいところだが、動作がさっぱり分からない。

 SpringM のソースが欲しくなってきた。もらえないだろうか。

2006/02/08

SpringM

 SpringM の lview 機能強化を行った。tar32.dll を呼び出している部分を、自作の springm.dll を呼び出すように変更。springm.dll でファイルの拡張子を見て、各種の統合アーカイバ DLL を呼び出すようにした。
 何か動作が不安定だと思ったら、メモリ確保時のサイズ指定を間違っていた。サイズを正しく指定することでようやく安定動作するようになった。
 あとは、springm.dll に dirtime.dll の機能を統合したいところ。

コンテキストメニュー

 SpringM のコンテキストメニューは、Delphian World にある、TContextMenuEx を使って作られているらしい。以前から、コマンドラインから指定したファイルのコンテキストメニューを開くようなプログラムを作りたいと思っていたのだが、これは参考になりそうだ。

URL memo

 Windows 64-bit Edition まとめ Wiki

2006/02/06

SpringM

 SpringM でディレクトリを tview(テキストビューワー)で開こうとしたときのバグを修正してみた。オリジナル版では、ディレクトリを tview で開こうとすると、「ディレクトリは表示できません。」というメッセージが出た後、1つ前に開いていたファイルが表示されてしまう。ディレクトリの時は、tview を開かないようにしてみた。
 なお、存在しないファイルを開こうとした場合も、「ディレクトリは表示できません。」というメッセージが出るのは以前から少々気になっているが、動作には関係ない上に、修正は大変そうなので修正はしない。

 ファイラァハンタァ - 何か紹介されてますな(汗

2006/02/05

cm_rss.pl

 改造版 cm_rss.pl で 〜 が文字化けすることに気付いた。さてどうしてくれよう。

参考:Jcode.pmをWindows 2000でコンパイルする

2006/02/04

URL memo

 Windows Vistaにはシンボリックリンクがいっぱい

2006/02/03

TeX, UTF

 TeX で UTF パッケージを使って、dvipdfmx で PDF を生成しようとしたら、

** ERROR ** Could not find encoding file "UniJIS-UTF16-H".

というエラーが出てしまった。TeX をバージョンアップする前までは使えていたはずなので、ちょっと調べてみた。
 C:\usr\local\share\texmf\fonts\cmap に、UniJIS-UTF16-H, UniJIS-UTF16-V がなかった。とりあえず、バージョンアップ前のシステムからこの2つのファイルをコピーしてきたところ無事に UTF パッケージが使えるようになった。

2006/02/02

@nifty 迷惑メールフォルダー

 相変わらず、@nifty 迷惑メールフォルダーが馬鹿で困る。

From: 阿部<a_a_a_be2com@mail.goo.ne.jp>

な spam メールが何件も来ているのだが、何回学習させても spam として振り分けられない。代わりに、別のニュースメールが spam に振り分けられてしまっている。学習結果を一度消去してやり直した方が良いだろうか?

2006/02/01

spam

 先月の spam メールの集計結果。着信拒否にならなかった spam が 2340通。そのうち、@nifty の迷惑メールフォルダーでも Spam Mail Killer でも spam として認識できなかったものが 12通(0.51%)。

メール受信状況 2006/01

SeaMonkey

 タブグループをブックマークできるのは、SeaMonkey の新機能ではなく、かなり前からだった。Mozilla 1.7 でも Firefox 1.5 でも同等の機能はあった。なぜ今まで気付かなかったのだろう。

 コンテキストメニューから、選択した文字を Web 検索したときに、新しいウィンドウではなく、新しいタブを開くようにしてみようと思い、調査。SeaMonkey のコンテキストメニューは、content\communicator\contentAreaContextOverlay.xul にあった。この中の、id="context-searchselect" となっている menuitem が OpenSearch() を呼び出している。OpenSearch() を乗っ取って、新しいタブで表示するような拡張を作ってみた。
 Mozilla Suite と SeaMonkey では、OpenSearch() の引数が違っていて、ちょっとはまった。とりあえず今回は SeaMonkey 専用で作ってみた。

 swtab (Search Web in a new tab) として後日公開予定。


Copyright (C) 2006 K.Takata