Explorer++ patch for TortoiseSVN

Windows環境をx64に移行したら、TortoiseSVNのオーバーレイアイコンに対応したファイラーが見当たらず、やや不便。
幸いExplorer++というソースが公開されているものがあったので、アイコンを更新するようにしてみた。

diff -Naur org/Explorer++/ShellBrowser/DirectoryModificationHandler.cpp new/Explorer++/ShellBrowser/DirectoryModificationHandler.cpp
--- org/Explorer++/ShellBrowser/DirectoryModificationHandler.cpp	2011-04-23 07:43:20 +0900
+++ new/Explorer++/ShellBrowser/DirectoryModificationHandler.cpp	2011-08-27 02:41:54 +0900
@@ -448,6 +452,10 @@
 			}
 
 			FindClose(hFirstFile);
+
+			if (!bFolder) {
+				RenameItem(iItemInternal, FileName);
+			}
 		}
 		else
 		{


ついでに、ドラッグアンドドロップを禁止してみた。フォルダをクリックしようとして移動してしまうことがあるので。(というかそれを防ぐためにファイラーを使っている)

diff -Naur org/Explorer++/Explorer++/ListViewHandler.cpp new/Explorer++/Explorer++/ListViewHandler.cpp
--- org/Explorer++/Explorer++/ListViewHandler.cpp	2011-08-15 00:19:54 +0900
+++ new/Explorer++/Explorer++/ListViewHandler.cpp	2011-08-27 01:20:05 +0900
@@ -1384,6 +1384,9 @@
 
 HRESULT Explorerplusplus::OnListViewBeginDrag(LPARAM lParam,DragTypes_t DragType)
 {
+#if 1
+	HRESULT hr = DRAGDROP_S_CANCEL;
+#else
 	IDropSource			*pDropSource = NULL;
 	IDragSourceHelper	*pDragSourceHelper = NULL;
 	NMLISTVIEW			*pnmlv = NULL;
@@ -1491,6 +1494,7 @@
 	}
 
 	CoTaskMemFree(pidlDirectory);
+#endif
 
 	return hr;
 }
diff -Naur org/Explorer++/Explorer++/TreeViewHandler.cpp new/Explorer++/Explorer++/TreeViewHandler.cpp
--- org/Explorer++/Explorer++/TreeViewHandler.cpp	2011-04-26 11:51:32 +0900
+++ new/Explorer++/Explorer++/TreeViewHandler.cpp	2011-08-27 01:21:19 +0900
@@ -635,10 +635,12 @@
 		return OnTreeViewKeyDown(lParam);
 		break;
 
+#if 0
 	case TVN_BEGINDRAG:
 		/* Forward the message to the treeview for it to handle. */
 		SendMessage(m_hTreeView,WM_NOTIFY,0,lParam);
 		break;
+#endif
 
 	case TVN_GETDISPINFO:
 		SendMessage(m_hTreeView,WM_NOTIFY,0,lParam);

ThinkPad T420購入

Sandy Bridgeに期待して購入。スペック

  • Core i5 2540M 2.6GHz
  • video 1600x900 Intel HD Graphics 3000
  • memory 8GB (追加)
  • SSD Intel SSDSA2CW300G3 300GB (置換)

エクスペリエンス インデックスは 7.1/7.4/5.9/6.3/7.7

なんかキー入力がひっかかるなあと思っていたら、特定のキーが入力されたりしなかったりするという初期不良だった。サポートに電話したら、代わりのキーボード(部品)を送ってくれて翌日届いた。不良はさておき、部品単位で送ってくれるのは大変ありがたい。
元々の部品はChiconyの45N2172だったが、届いたのはNMBだった。ブログとか見ると評価は ALPS>NMB>Chicony の順らしい。正直違いはわからないが、とりあえずNMBThinkPadらしい打ち心地で、良い。
唯一の問題は、上段のキー配列が変わってしまったので、F2を打とうとするとF1が入ってしまうこと。あとEscキーが無駄にでかい。

T420sではなくT420にしたのは

  • 2.5kgくらいまでなら許容範囲
  • 薄型はファンがうるさいのでは

という理由。T420は常にファンは回ってはいるが、低負荷では無音といっていいレベル。
ここ http://www.lenovo.com/psref/pdf/tabook.pdf 見るとT420はT410より軽いとなっているが、誤記かも。

ホイールスクロールすると少しノイズが出る。グラフィック由来と思われるのでたぶん回避策はないが、ブラウザとかでは出ないので、普段は気づかない。

タスクマネージャーで見たらSynTPEnh.exeとかいうのが150MBくらいメモリを消費していたので、削除してTrackPointのドライバに差し替えてみた。なんかメモリリークで修正済みたいだが、タッチパッドを使うことはないので古きよきt4p*.exeで十分だ。

その他

  • ThinkPadらしさはまだある。
  • 液晶は青いがT400よりはましだと思う。
  • 手持ちのデスクトップマシンよりVMwareが速い。
  • Windows7でも特に問題なかった。

PHPのunserializeとjson_decodeの速度を比較してみた

serialize後の文字列には長さが格納されている。一方、jsonは終端文字の検出が必要である。
そのため文字列が入っていた場合はunserializeの方が速いはず、という予想を立てて比較してみた。

数値の場合

配列に数値を格納。
10/100は10個の配列に100までの数を格納。

関数 10/100 100/10000 1000/1000000
serialize 0.002965 ms 0.026016 ms 0.175710 ms
unserialize 0.002285 ms 0.019043 ms 0.139641 ms
json_encode 0.001065 ms 0.008745 ms 0.045797 ms
json_decode 0.002701 ms 0.018625 ms 0.192634 ms

文字列の場合

連想配列に文字列を格納。
10/10は10個の配列に長さ10の文字列を格納。

関数 10/10 100/100 1000/100 100/1000
serialize 0.002051 ms 0.023947 ms 0.221336 ms 0.078479 ms
unserialize 0.002071 ms 0.022763 ms 0.335602 ms 0.038826 ms
json_encode 0.003094 ms 0.112962 ms 1.140379 ms 0.961482 ms
json_decode 0.004587 ms 0.136636 ms 1.447683 ms 1.014543 ms

環境はPHP 5.3.3-7+squeeze1 / core2duo E8600

予想通り、文字列の長さが長くなるほど、json_decodeよりunserializeの方が速かった。
ソース: https://github.com/firewood/test/blob/master/serialize_bench.php

WinDiffを少しだけ改良してみた

WinDiffは10年くらい使っていて慣れているのだが

  • UTF-8の文字が化ける
  • 行末がUTF-8文字だと改行を認識しないことがあり、行数もずれる

という問題があった。

WinMerge使えばよいという話ではあるのだが、

  • 何文字目から変化しているのか、ぱっと見わかりづらい
  • 左右分割なので、diffっぽくない&桁数が減る
  • 常に外部エディタで編集したい(右クリックメニューが遠い)

とかいう理由で、WinDiffを改造したほうが、慣れたインターフェースにできそうだったのでチャレンジ。

古いWinDiffはVisual C++ 6.0に付属していたような気がするが、これはバグっていて、右クリックメニューもない。
新しいものがPlatform SDKのサンプルに、SDKDiffという名前で付属していたので、これを使うことにした。
ちなみに最新版ではない(Vista用のものにはもっと細かいメニューがある)が、個人的には困っていない。
ライセンスについては、MSDNに「サンプルコードのうち、特記のないものはMICROSOFT LIMITED PUBLIC LICENSEに従う」という記述があったので、公開しても良いと判断した。
著作権表記と、プログラム名はそのままにする必要があるという認識です。

変更点は以下のとおり。処理はてきとーそのものです。

  • 1行を読み込むとき、文字コードを考慮せず、LFのみを検出
  • 1行の中で、Shift-JISのスコアとUTF-8のスコアを出して、UTF-8のスコアが高ければDBCSに変換

これ(ソース)
https://github.com/firewood/sdkdiff

バイナリ
https://github.com/firewood/sdkdiff/downloads

福島第一原発の水素爆発についてのメモ

原子力安全・保安院の会見を見てもよくわからなかったので、以下を見て理解した気になってみた。

続きを読む

mingw版Groongaのビルド

Groongaをmingwでビルドしてみた。非公式ビルドが32bitだったので、64bit版にチャレンジ。※ Groongaは32bit OSをサポートしていません。
以下手順

MSys/MinGWインストール

  1. MinGWインストーラをダウンロード
    http://sourceforge.net/projects/mingw/files/ から mingw-get-inst-yyyymmdd.exe を取得する。
  2. インストーラを実行。オプションでMSysを追加しておく。
  3. http://sourceforge.net/projects/mingw-w64/files/ から Toolchains targetting Win64 / Personal Builds / sezero_20101003 を選択
  4. zipアーカイブをダウンロードして展開する。
    ホストOSが32bitなら mingw-w64-bin_i686-mingw_20101003_sezero.zip
    ホストOSが64bitなら mingw-w64-bin_x86_64-mingw_20101003_sezero.zip
    ※ 64bit版はネイティブコンパイラ(クロスコンパイラではない)なので、アーカイブ中のmingw64ディレクトリ以下をMinGWのルートディレクトリ(例えばC:\MinGW)に展開してもよい。
  5. MinGWのルートディレクトリに展開しなかった場合、mingw-w64-binを展開したフォルダをMSysのPATHに追加する。(下記参照)

MSysのPATHの追加方法

MSysのホームディレクトリに .profile というファイルを作成し、以下を記述。
アーカイブのmingw64ディレクトリを、MinGWのルートディレクトリに展開した場合

export PATH=/mingw/mingw64/bin:$PATH

Groongaビルド手順

  1. Groonga 1.1.0のpthread依存除去版 http://pub.cozmixng.org/~kou/archives/groonga-1.1.0.tar.gz を取得する。
    ※ 本来は http://groonga.org/download/ からダウンロードできます。次の肉の日(2011/3/29)以降。
  2. 64bitの場合、ltmain.shにパッチを当てる。(下記参照)
  3. MSysのコマンドプロンプトを開く。
  4. tar xf groonga-1.*.*.tar.gz によりGroongaを展開する。
  5. cd groonga-1.*.* で展開したディレクトリに移動する。
  6. 64bit OSの場合、引数なしで ./configure
  7. 32bit OSの場合、./configure --host=x86_64-w64-mingw32
  8. make
  9. make install

ltmain.shのパッチ

libtool 2.2に含まれるltmain.shはx86_64に未対応のため、2.4のものをバックポートする。

--- ltmain.sh.orig	2011-01-29 21:21:29 +0900
+++ ltmain.sh	2011-03-01 22:47:52 +0900
@@ -2560,7 +2560,7 @@
     ;;
   *ar\ archive*) # could be an import, or static
     if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
-       $EGREP 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then
+       $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
       win32_nmres=`eval $NM -f posix -A $1 |
 	$SED -n -e '
 	    1,100{

動作確認

残念ながら、64bit版は正常動作していないようです。まだ調べられていません。

参考情報

キーを入れ替える7つの方法

ちょっと前になりますがWindows Internals勉強会というので発表してきました。

これ → http://www.slideshare.net/firewood/lr-5346579

以前「Vista/Windows 7におけるキーボードカスタマイズ問題」というのを読んで、これにフィルタドライバのネタを加えてみました。
で、発表時にid:NyaRuRuさんがMSKLCの紹介&デモをしてくれたので、その部分を加筆しました。(こういうのがすぐ出てくるのがさすがだなあと思いました)