Archive for the ‘Windows’ tag
Dropboxでdotfilesを同期するメモ
最近VirtualBox上でUbuntuを使うようになったので、Dropboxを使ってWindows 7とUbuntuでdotfilesを同期するようにしてみました。
以下にVimの設定を例とした手順のメモをまとめておきます。
完成形のイメージ
- 「My Dropbox/dotfiles」(Linux側では「~/Dropbox/dotfiles」)以下にdotfilesの実体が配置される。
- シンボリックリンクを利用してホームディレクトリ直下にdotfilesへのリンクを作成する。
Dropboxアカウントの作成
アカウント作成ページからアカウントを作成し、WindowsとUbuntuにそれぞれクライアントをインストールしておきます。
Windows側の設定
Windows Vista以降ではシンボリックリンクを作成するコマンドmklinkが存在するため、これを利用します。
コマンドプロンプトをコンテキストメニューから管理者として実行し、以下のように入力すると、シンボリックリンクが作成されます。
なお、環境変数HOMEにホームディレクトリが入っていることを前提とします。
mklink "%HOME%\_vimrc" "%HOME\Documents\My Dropbox\dotfiles\.vimrc" mklink "%HOME%\_gvimrc" "%HOME\Documents\My Dropbox\dotfiles\.gvimrc" mklink /D "%HOME%\vimfiles" "%HOME\Documents\My Dropbox\dotfiles\.vim"
Ubuntu側の設定
Linuxではリンクを作成するコマンドlnに-sオプションを指定してシンボリックリンクを作成します。
ターミナル上で以下のように入力すると、シンボリックリンクが作成されます。
なお、引数の順番がWindowsと逆なので注意が必要です。
ln -s ~/Dropbox/dotfiles/.vimrc ~/.vimrc ln -s ~/Dropbox/dotfiles/.gvimrc ~/.gvimrc ln -s ~/Dropbox/dotfiles/.vim ~/.vim
Windows上のVimでの注意点
Windows上のVim(Kaoriyaで公開されているバージョン)では、シンボリックリンクを開いて保存すると通常のファイルに置き換えられてしまう問題が存在します。
そのため、Windows上でdotfilesを編集する場合にはMy Dropbox\dotfiles以下にある実体を開く必要があります。
Windows 7のエクスプローラーに絶望した
以前軽く調べてコメントしたことがありましたが、やはりWindows 7のエクスプローラー(←名前が変わってます)はこれまでのエクスプローラとは違います。
Vista以前は見た目こそ変化を重ねていたものの、メインとなるビューはSysListView32で一貫していました。
ところが7からはDirectUIHWNDという謎のウィンドウに置き換えられ、全く手出しできない状況です。
というわけで、ExUtilVの7向けを開発する見通しは今のところ立っていません。
同ジャンルでより高性能なExplorer ConstructionもWindows 7への対応は限定的なので、対処方法はそもそも存在しないのかもしれません。
なお、開発環境をVistaから7にアップグレードしたので、勝手ですがExUtilVの開発は終了させていただきます。
64bit対応なフックを使ったアプリの作り方
拙作ExUtilVのように、32bitと64bitのどちらの環境でも動作するフックを使ったアプリケーションの作り方を説明したいと思います。
まず、大前提としてWindowsでは32bitアプリは64bitアプリにフックをインストールできませんし、64bitアプリは32bitアプリにフックをインストールできません。
そのため、32bitアプリと64bitアプリの両方にフックをインストールしたい場合、同じ動作をする32bitのバイナリと64bitのバイナリを用意して両方を実行する必要があります。
幸い、普段からポインタや型の大きさを意識してコードを記述していれば32bit、64bitの両方でまったく同じコードを利用できるので、64bit対応は意外と簡単に実現可能なのです。
しかし、利用者に2つアプリを起動してもらうというのはなんだか格好悪いですよね。
そこで、ExUtilVでは32bit版のプログラムに64bit版を自動的に起動する処理やユーザインターフェイスを内蔵し、64bit版のプログラムはフックを行うだけという構造をとっています。
このようにすることで、32bit版Windows上では32bit版のプログラム単体で完結し、64bit版Windows上では2つのプロセスで動作するようにできます。
タスクマネージャを見るとプロセスが2つあってやっぱり微妙なのですが、利用者が不便を被るようなことはなくせます。
ここからは実現方法を追ってみます。
まず、64bit版Windowsかどうかを判定するコードを記述します。
素直にOSのバージョンを調べればいいのでしょうが、ここでは自分がWOW64環境で動作しているプロセスであるかどうかで判定しています。
先述の通り32bit、64bitのどちらのOSを利用していても、始めに利用者が起動するのは32bit版のプログラムですので、WOW64環境である==64bit版Windowsを利用していると判断できます。
実際のコードは以下の通りです。
bool IsWow64() {
typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
LPFN_ISWOW64PROCESS fnIsWow64Process;
// IsWow64Process関数が存在するかどうか調べる
fnIsWow64Process = reinterpret_cast<LPFN_ISWOW64PROCESS>(
GetProcAddress(GetModuleHandle(_T("kernel32")), "IsWow64Process"));
if(fnIsWow64Process) {
// 存在する場合、呼び出して確認
BOOL isWow64 = FALSE;
return !!(fnIsWow64Process(GetCurrentProcess(), &isWow64) && isWow64);
}
// 存在しない場合は確実に非WOW64環境
return false;
}
そして、この関数を呼び出した結果がtrueだった場合には64bit版のプログラムを起動します。
#ifndef WIN64
if(IsWow64()) {
STARTUPINFO lpStartupInfo;
GetStartupInfo(&lpStartupInfo);
PROCESS_INFORMATION lpProcessInformation;
CreateProcess(_T("64bit版プログラム"),
0, 0, 0, TRUE, NORMAL_PRIORITY_CLASS, 0, 0,
&lpStartupInfo, &lpProcessInformation);
}
#endif
最後に、利用者がプログラムを終了しようとした場合には何らかの手段で64bit版のプロセスにもそのことを通知しましょう。
これにはいろいろな方法があると思いますが、ExUtilVでは非表示のウィンドウにWM_CLOSEを送信しています。
長々と書いてみましたが、要するに64bitのアプリが少なくて不便なのでみんなもいっぱい作ってね、ということです。
# ただし、このような構造になるのは次回公開するバージョンからの予定です。
# 現在公開している0.0.10のソースを読んでもこのようにはなっていないので、あしからず。
ExUtilV version 0.0.10
ExUtilVを更新しました。
今回はShiftキーを押しながらコンテキストメニューを開いたときに表示される便利なコマンドを、常時表示する機能を追加しました。
ぜひお試しください。
Explorer Constructionがすごそう
Explorer Constructionというソフトがなかなかすごそうです。
窓の杜 – 【NEWS】Vista専用エクスプローラカスタマイズソフト「Explorer Construction」最新版公開
ExUtilVの一行選択解除に加えて、MigemizeExplorerのような検索機能、ツリービューのカスタマイズ機能を備えているようです。
もはやExUtilVが誇れるのは、メモリ消費の少なさくらいでしょうか。
しかし、メモリ2GB以上が当たり前の時代に、数MBを気にしても意味がないでしょうね。
64bit環境で動作しないのが残念ですが、32bit版のVistaをご利用の方は、拙作ExUtilVからの乗り換えを検討してみてはいかがでしょうか。
ExUtilV version 0.0.9
ExUtilVを更新しました。
今回から32ビット版と64ビット版のパッケージを一本化しています。これにより、64ビットOS上の32ビットアプリケーション内のファイル選択ダイアログでもExUtilVが利用可能になります。
SmartWheel version 0.0.1
SmartWheelを公開しました。
マウスホイールの回転操作をカーソルがある位置のウィンドウにリダイレクトして操作性を改善するソフトはよくありますが、64bit OSに対応しているものが少ないようなので作ってみました。
Windows Vista SP1 x64およびWindows 7 RC x86で動作確認しています。
他にもいくつかほしいソフトに64bit非対応のものがあるので、それも作成する予定です。
なお、今回のプログラム名がSmartWheelになっているように、1つのソフトウェアに機能を詰め込むのではなく、目的ごとにそれぞれ単機能のプログラムにする方針です。
これはPCのリソースが増えていて多少贅沢な使い方をしても問題なくなりつつあること、機能の有効、無効を切り替えるユーザインターフェイスを用意する手間を省くことが主な理由です。
64bit OSでは32bit版と64bit版の両方が同時に動作することになってかなり気持ち悪いですが、たぶん仕様なのでご了承ください。
ExUtilV version 0.0.8
ExUtilVを更新しました。
ダウンロード (32ビット) / (64ビット) / 詳細
今回の変更点は64ビットOSに対応したことです。
ただ、私の手元には64ビット環境がないので、32ビット版以上にまともなサポートは期待しないでください。
なお、32ビット版は内部の書き換えのみで機能追加、修正などはありませんので、すでに0.0.7をご利用いただいている方はバージョンアップする必要はありません。
ExUtilV version 0.0.7
ExUtilVを更新しました。
主な変更点は、一行選択の解除とリネーム補助がファイル選択ダイアログでも機能するようになった点です。
ファイルを開いたり保存するときに、操作性の違いでイライラすることがなくなるのではないでしょうか。
また、通知領域にアイコンを表示することもできるようになりました。
表示されるだけで特にできることはありませんが、見えないソフトが起動していると不安に感じるという方はご利用ください。
なお、Windows 7では通知領域に勝手にアイコンを表示してはいけないらしいのと、個人的に邪魔だと思うのでデフォルトでは非表示です。
ExUtilV version 0.0.6
ExUtilVを更新しました。今回からきちんとした説明ページも公開しています。
主な変更点は、キーボードから検索バーを利用するときの操作性を向上させたことです。ファイル名を部分一致でインクリメンタルサーチし、そのまま開くことができるようになります。
なお、この機能をより快適に利用するためには、エクスプローラの設定を変更する必要があります。詳しくはreadme.htmlをご覧ください。
検索を終了して先頭の項目を開く機能が\(円マークおよびバックスラッシュ)キーに割り当てられていますが、これはEnterキーだとうまく動作しなかったため、ファイル名として使われることのない\に仕方なく割り当てたというだけです。この状態が理想であるとは考えていませんので、今後も改善方法を調べていきたいと思います。
今のところは、キーボードの割り当てを変更するソフトウェアのご利用をおすすめします。
以下は窓使いの憂鬱(のどか)での設定例です。
window SearchControlEdit /:WorkerW:ReBarWindow32:UniversalSearchBand:Search Control:Edit:Edit$/ : Global key Enter = Yen window Explorer /:SHELLDLL_DefView:SysListView32$/ : Global key Backspace = M-Up