mirrorMan2.08

jquery-ui.jsを読み込むファイル名が間違っていて起動に失敗していたため修正。




mirrorMan2.07 xdoc2txt→DFでデグry

DFアイコンを2回クリックしてファイルを選択する場合の機能、バイナリファイルやUnicode、EUCのファイルをDF.exeでみるときにテキストダンプしてから表示するのがデグッていた。
拡張子を.txtに変えたファイル名をDFに渡していたのでDFからそんなもんありませんエラーだった。

また、拡張子名が取得できないファイル名もxdoc2txtは動作しないのではじくように変更した。
    var txtfnm = sfs.GetBaseName(fnm) +".txt";
if(ssh.NameSpace(lFol).ParseName(txtfnm))
if(6 != wsh.popup(txtfnm +
"\n\n拡張子がtxtのファイル名はxdoc2txtで使用します。"+
"上書きしてもよいですか?",0,title,36))
return title = fds.titleName;
if(! sfs.GetExtensionName(fnm)){
wsh.popup("拡張子が取得できないファイル名は実行できません。",0,title,64);
return title = fds.titleName;
}

また、削除はごみ箱へ移動なので、しまったと思ったらファイルは既に黄泉の彼方ということもなくなった。
    if(6 == wsh.popup(
"xdoc2txtのダンプファイル\n\n"+ txtfnm +"\n\nを削除しますか?",0,title,36)){
ssh.NameSpace(10).MoveHere(txtlPth, 64);
ssh.NameSpace(10).MoveHere(txtrPth, 64);
loadItms(1);
}

PowerShellを勉強するかJavaScript2を待つかどっちか迷っている。
一度に複数を勉強すると、応用的な面に触手を伸ばすエネルギーが落ちる。

ヨーロッパ向けWindows7は独禁対応としてIEのバンドルを外すというアナウンスがあったが、
Tridentエンジンはどうなるのだろうか。HTTPのダウンロードとか、はたまたMSHTAはどうなってしまうのか。





mirrorManに致命的バグ

右端のDFアイコンのボタンを2回押してバイナリファイルの比較をするとき、一度xdoc2txtでテキストファイルにダンプしてからDF.exeに渡しているのだが、xdoc2txtは元のファイル名の拡張子をtxtにして出力しているので、拡張子がtxtのファイルを選択した場合、無条件に上書きしてしまう。

DF.exeはEUCやUnicodeに対応していないので、これはありえる操作だ。

しかもご丁寧に「削除しますかポップアップ」を表示しているので、ほいほいと「はい」を押すとゴミ箱ではなく上書きしてしまったファイルを完全削除までしていた。これはもう地獄への後戻りできない道を舗装しているようなものである。

というわけでバージョンは2.06。ごめんなさい。





mirrorMan2.05+7用.zip

windows7rcでとりあえず動く用。7rcではshell.applicationのフォルダオブジェクト直下にぶらさがってたIsFileSystemとかIsFolderのプロパティがなくなって、.Self配下を参照しないといけなくなっている。それから、デスクトップは特殊フォルダだが、そのParentFolderもnullになっている。なんか結構変わっているみたいだ。

窓の杜 - 【REVIEW】フォルダを同期させるMS純正の高機能コマンド“robocopy”をGUIで「RichCopy」
robocopy、mirrorManでもGUIで使えるようにすると便利かな。

#最近自分のソースがダサく見えてしょうがない。




mirrorMan ver2.05

りそな銀行の国有化が日本が景気のコーナーを曲がる交差点になったと考えるのが現在では一般的だそうだ。サブプライム問題のきっかけは2007/8/6にアメリカン・ホーム・モーゲージ社が従業員の半分以上を一時休職処分にしたうえで倒産を申請したときだったと、ジョージ・ソロスは『ソロスは警告する』に書いている。歴史の当事者はそれが歴史に残るということが分からないし、何が歴史に記録されるかは後の議論によって共有されるものだから、新しい発見があればまた経済史も変わる。

HTMLとJavaScriptでローカルアプリケーションを作成するというのは、MSにとっては敵であるGoogleやAdobeに米を送るようなものなのかもしれない。HTAファイルをwindows 7で使うのに、もう指定席を設けることができなくなった。タスクバーは大きなアイコンが並ぶだけになり、それを右クリックして「タスクバーに表示しておく」を選択すればいつも表示させておくことができるが、HTAはそれができない。

MicrosoftはHTML5とJavaScript2に準拠する姿勢を示しているのではなかったか?ならば、IE嫌いのWeb業界の人間もHTAには興味を示すようになると思う。WindowsがAeroでリッチなアニメーションを誇るように、jQueryUIでセキュリティの制限に邪魔されずにOSの上を自由に飛べるはずなのだ。ガジェットは箱庭のようだし。

先日mirrorManがいきなり動作しなくなって、iniファイルが空っぽの初期設定でしか保存されなくなった。理由は今も分からない。ソース上の原因箇所は以前から触ってないところだし、あらためて見てみれば、なぜそんな書き方をしていたのかも分からない。ともかく直したが、JavaScript2はJSON形式がバインドされるそうだから、ごっそりそれに代えようかと思う。







HTMLでコンボボックス風に マウス長押しで切替えてみる

HTMLのformタグにはコンボボックスがありません。codessさんのマウス長押しハンドリングのライブラリを使って、ちょい長押しでテキストボックスに切り替えてみた。IEでは動いているが、firefoxは長押しがきかず、chromeは切り替えがきかない。なんでだろう。

←サンプルデモ。マウスで長押しでトグル。

jQueryライブラリのmouse_action.jsは上記リンクにあるデモページからいただきました。

上のサンプルデモのソース
<span class="mouseaction">
<select id="downlist">
<option value="クルーグマンと">クルーグマンと</option>
<option value="池田信夫って">池田信夫って</option>
<option value="似てる?">似てる?</option>
</select>
<input type=text id="txtbox" value=""/>
</span>
長押しイベントをアイヤーさせたいタグにclass="mouseaction"します。
<script type="text/javascript">
$('.mouseaction').mousedown(MouseAction._down);
$('.mouseaction').mouseup(MouseAction._up);
$('.mouseaction').mouseover(MouseAction._over);
$('.mouseaction').mouseout(MouseAction._out);
$('.mouseaction').click(MouseAction._click);
$(txtbox).toggle();

MouseAction.click = function(){;}
MouseAction.press = function(){
  txtbox.value = downlist.options[downlist.options.selectedIndex].value;
  $(downlist).toggle();
  $(txtbox).toggle();
}
</script>
プルダウンリストで表示されている値を取ってテキストボックスの値にします。
このサンプルでは使ってませんが、イベント発生元のノードオブジェクト(e)はこちらからでもアクセスできます。

mirrorManにも入れたのでversionは2.04です。IE6環境ではうまく動きませんでしたが、もう知りません。
mirrorMan204.png





mirrorMan ver2.03

画面を複数個開けるようにしました。
(htaタグのsingleinstance属性をyesに変えるだけ)
iniファイルは共有なので、最後に閉じた設定が有効になります。

ファイルパスなんかのストリングは複数箇所にに記述すること自体がだめであり、
したがって変数化する必要もないなんて考えてましたが、
今さら一箇所にまとめました。
var fds = {
dfexe : "ap\\DF\\DF.exe",
xdoc2txtexe:"ap\\xdoc2txt\\xdoc2txt.exe",
chkoffImg : "./img/chkoff.png",
chkonImg : "./img/chkon.png",
handImg : "./img/Hand.png",
smkhandImg : "./img/smkHand.png",
refreshImg :"./img/refresh.png",
restartImg :"./img/Restart.png",
mMnIni : "mirrorMan.ini",
folImg : "./img/fol.bmp",
readMeTxt : "readMe.txt",
titleName : "mirrorMan"
}





ContextMenu.jsのonContextMenu

contextmenujs.png
jQueryプラグインのContextMenu pluginの下のほうにある Example3 より。

ファイルかフォルダをフォーカスしてないときは右クリックしてもメニューを表示しないように変更。
フォーカスといってもIEのそれではなくtextRangeですが。








<div class="contextMenu" id="conMenuLftItms">
<ul>
<li id="deleteItm" >削除 (D)</li>
  :
  :
<li id="verbPropty" >プロパティ</li>
</ul>
</div>
  $('#rhtClkLftItmsAra').contextMenu('conMenuLftItms',{
onContextMenu: function(){return (selItmObj ? true : false)},
menuStyle: { width:'95px' },
itemStyle: { fontFamily:'MS UI Gothic',fontSize:'9pt',border:'none',padding:'0px'},
itemHoverStyle: { border:'none'},
bindings:{
'deleteItm' : function(t){ delItm()},
    :
    :
'verbPropty' : function(t){ invokeVerbs('properties')},
}
});
selItmObjはマウスオーバーでファイル/フォルダオブジェクトを代入し、マウスアウトで削除している変数です。




右クリックメニュー追加とライブサーチ選択の設定追加

filterrhtClickMenu.png
ver2.02。

ファイル名フィルタとファイル内文字列フィルタのテキストボックス2つ、
マウスでも操作できるように右クリックメニューを追加。



090102mirIni.png
遅いマシンでは文字入力ごとの画面更新がストレスなので、エンターキー押下までフィルタしない設定を追加。

iniファイルはCtrl+F1で開いてください。





←[livSch]の値を0に変更する。デフォルトは1。

あとフォルダはフィルタしないようにも変更。


jQuery.uiも1.6rc4にしといた。






mirrorMan - ファイル/フォルダの名前変更

ファイルやフォルダの名前を変更するにはNameプロパティの値を変更するが、
同じ名前のものがすでに存在したとき、
XPとVistaでのShell.Applicationの挙動の違いが大きい。

reNameDupName.png

ここでキャンセルを押すと、-2144927744で落ちてハンドリングできない。
XPだとエラーオブジェクトも拾えなかったので放置。
tryで逃がすことにした。
try{
ssh.NameSpace(ふぉるだ).ParseName(sfs.GetFileName(ふぁいる)).Name = なまえ;
}catch(e){
if(e.number == -2144927744) rollbackRenameItm();
return;
}






mirrorMan 2.00

デグレ修正のマイナーバージョンアップで1.99から2.00になってしまった。あいやー

ファイルかフォルダを移動したときにエラーが表示されていたのを修正。
ファイル名変更中にカーソルを移動して戻ったとき、最後にフォーカスした別のファイルを名前変更してしまっていたのを修正。






作り手の身勝手さ

ファイル内文字列検索で入力ごとにライブフィルタができるといいな
→そうだxdoc2txt使おう
→ActiveX版があった
→コマンドライン経由で起動してファイルI/Oしなくていいなら
→できた!
と、自己満足の高みに達したが、

→ファイルに出せばそのままDFに渡して使える
→なんだこっちのほうがよっぽど使いそう
→自動でインストールするスクリプト作る
→mirrorManで操作されたらそれを促す
→できた!あれ?

だったらEXE版でいい。

でも作ったものを削除すのはためらわれる。
ソースとにらめっこしていると作り手の身勝手な良心が決心の邪魔をする。
自分が得られたものと、使う人が得られるものを混同してしまっている。

あれこれ考え、使用頻度に沿って整理した結果は、作った順序とは逆になった。
DFで差分表示 →EXEも使用
右クリックでテキスト出力 →EXEも使用
ファイル内の文字列検索でのフィルタ表示 →OCXをレジストリ登録した場合のみテキストボックス表示





mirrorman - 画面上でocx登録 のソース抜粋

前回のソース抜粋。

おきまり3点セット
wsh = new ActiveXObject("WScript.Shell");
ssh = new ActiveXObject("Shell.Application");
sfs = new ActiveXObject("Scripting.FileSystemObject");

ドロップされたかを拾います
arg = WScript.Arguments;

ドロップされていればレジストリ削除
if(arg.length)
WScript.Quit(
ssh.ShellExecute("regsvr32.exe"," /u xdoc2txt.ocx","","runas"));
 Vistaの場合、
 regsvr32.exeは管理者権限で実行されないと0x80040200というエラーになるので、
 ShellExecuteで "runas" を付けておくと実行時にユーザ確認が行われます。

問い合わせ。「はい」のボタン以外は終了します。
if(6 != wsh.popup(
"xdoc2txtをレジストリに登録しますか?\n\n"+
"(レジストリから削除したい場合、"+ WScript.ScriptFullName +
"にxdoc2txt.ocxをドラッグドロップしてください)",0,WScript.ScriptName,36))
WScript.Quit();

システムフォルダと各ファイルを取得します。
sy32 = ssh.NameSpace(37);
xdoc = ssh.NameSpace(
sfs.GetParentFolderName(
WScript.ScriptFullName)).ParseName("xdoc2txt.ocx");
zlib = ssh.NameSpace(
sfs.GetParentFolderName(
WScript.ScriptFullName)).ParseName("zlib.dll");
if(!zlib) WScript.Quit(WScript.Echo("zlib.dllファイルがありません"));

コピーして、regsvr32.exeを実行します。
sy32.CopyHere(xdoc);
sy32.CopyHere(zlib);
wsh.CurrentDirectory = ssh.NameSpace(37).Self.Path;
ssh.ShellExecute("regsvr32.exe","xdoc2txt.ocx","","runas");

mirroManの画面ではRunメソッドでxdoc2txt登録.jsの終了を待ち合わせ、
wsh.Run(".\\ap\\d2txt130r2\\OCX\\xdoc2txt登録.js",10,true);
return reloadItmLst(1);
 その後reloadItmLst()で
return location.reload(true);
 しています。




mirrorman - 画面上でocx登録

mirrorManの画面からxdoc2txt.ocxのレジストリ登録ができるようにしました。
右クリックメニューの「テキスト出力」かDFでバイナリファイル選択がされた時、
ポップアップを表示します。



「はい」を選択すると、xdoc2txt登録.jsを実行します。



Vistaでは管理者権限での実行確認ダイアログが出て、



mirrorManもリロードされます。






mirrorMan - XDOC2TXTとDFでバイナリファイルのテキスト差分表示 その2

前回のエントリ、右クリックで「テキスト出力」する操作がまんどかったので、
ボタンの押下回数で操作を分けりるれろ。

1回目の押下でのタイトルバー表示は、テキストファイルをクリックしてDFで表示。


2回目の押下でのタイトルバーでバイナリファイルをクリックしてDFで表示。
xdocdumpdelto.png

DFに出すと同時に次のポップアップ。
textdumpdelto.png

操作は3クリックだ。オス!




mirrorMan - XDOC2TXTとDFでバイナリファイルのテキスト差分表示

しまったこのExcelどっちがどうなってんだっけとか、
あの野郎どことどこを変更したんだ、余計なとこまで変えてないだろうかとか、
そんなとき、
ほぼ忘れてよしになっている記憶の引き出しから目で違いを探していくのは苦痛です。

nanasixls1.png

この二つのファイルの違いを探します。

xdoc2txtdf2.png

左右のファイルを右クリックメニューで「テキスト出力」を選択し、
拡張子が.txtになったテキストダンプファイルを出力させます。

xdoc2txtdf3.png

df.gif ボタンでDF起動モードにして、そのダンプテキストを選択すると下のように色分け表示。

nanasixls2.png
dflineview.png

オス!

※右クリックがまんどいので操作方法を追加しました。




mirrorMan - 縦スクロールバー消し

scrollyall.png


都度resizeTo()しているのに縦スクロールバーも出しっぱで放置でした…

横スクロールバーは勝手に消えるけど縦スクロールバーは元々overflowしなくても消えません。

html {overflow-y:auto}
とすると下の画像のように。bodyタグには指定なしで、htmlにautoを指定しておくと内容がoverflowしたときにはスクロールバーが出ます。


Hand.pngボタンでの画面のモニター位置スナップ、
window.なんちゃらイベントとscreen.availHeightやscreen.availWidthの足し算引き算でできそうなので、さっそくwindows7を真似してモニタ右下だけから上下左右に変更する予定。


続:拍手、すわ修正してv1.93






mirrorMan v1.91 Date型の演算子比較

windowsの日付と時刻の表示形式は自由に設定できるため、
ファイルの更新日時を < や > 演算子で比較するには、
世界協定時刻 (UTC) の 1970年1月1日0時0分0秒からの経過時間を表すミリ秒単位の数値である、
Date型のシリアル値(プリミティブ値)で行うと確実です。
が、この業界、あらかじめ桁を合わせておくのが作法みたいなところがあるせいか、
自分が困ることもなく今まで放置してました。

シリアル値を取得するにはvalueOf()メソッドを使います。

ファイルオブジェクトのプロパティ、DateLastModifiedやModifyDateプロパティはあらかじめDate型で格納されていますが、JScriptでは明示的にDateオブジェクトでnewしておく必要があるようです。

var a = new Date(f1.ModifyDate).valueOf();
var b = new Date(f2.ModifyDate).valueOf();
if(a < b) …


ついでユーザ操作によるpopupも追加しました。
ドラッグドロップやCtrl+矢印でコピーした時にコピー先の上書かれるファイルの更新日時のほうが新しかった場合、
notredfile.pngpopupを表示して問い合わせます。
notredfile1.png一括コピー時にもチェックして一括処理を中止します。








mirrorMan - xdoc2txt実装ソース抜粋

動作確認の続きです。

まず、
<object id="XDOC2TXT"
classid="clsid:4FD6BD6E-471A-48A6-8C52-5E8391ECBA9F" width=0 height=0></object>
<span id=xdoc2txtSpan></span>
objectタグでXDOC2TXTの参照を作成します。
span要素でテキストボックスを表示/非表示するポイントを作成します。

ボタンクリックかCtrl+Fで呼ばれるモジュールは、
function toggleCmdBtn(i){
if(document.all.filteFnmInBox){
if((!XDOC2TXT.object)||(document.all.xdoc2txtInBox)){
filterFileSpan.innerHTML ="";
xdoc2txtSpan.innerHTML ="";
setTimeout('loadItms(1)',0);
}else
xdoc2txtSpan.innerHTML = "<input type=text id=xdoc2txtInBox size=5 value=xdoc2txt>";
}else
filterFileSpan.innerHTML = "<input type=text id=filteFnmInBox size=5>";
ファイル名のフィルタのテキストボックスのidはfilteFnmInBoxで、xdoc2txtの入力ボックスと合わせ、同じイベントで2段階でのテキストボックスをサイクル表示/非表示させます。function名ですがもうトグルじゃないです。

XDOC2TXTを参照するobject要素のobject属性値がnullかどうかをチェックすことで、ActiveX版のXDOC2TXTがインストールされているかどうかを確認します。または、すでにxdoc2txtのテキストボックスが表示されているかという条件文です。
これがtrueだった場合、両方のテキストボックスを消去します。
falseだった場合、それぞれのテキストボックスのinput要素を作成します。

テキストボックスに入力されたキーのonkeydownイベントで次の処理を行います。
if(document.all.xdoc2txtInBox){
rhtStatsbar.innerText ="";
try{var regx = xdoc2txtInBox.value ? new RegExp(xdoc2txtInBox.value,'mgi') : /./}
catch(e){
xdoc2txtInBox.style.backgroundColor='#d8efff';
return rhtStatsbar.innerText = " "+e.description
}
xdoc2txtInBox.style.backgroundColor="";
}
rhtStatsbarは正規表現句のエラーを表示する領域です。
入力値でRegExpオブジェクトをnewします。エラーの場合、テキストボックスの背景色も薄いブルーにしていますが、XPではエンターキーを押さないと色が変わらず、よくわかりません。

続いて、フォルダオブジェクトのコレクションでそれぞれのファイルをループするときに、
XDOC2TXTのConvertメソッドの登場です。そうです。ファイル毎に呼び出してます。
for(var fc=new Enumerator(erfo.Items()); !fc.atEnd(); fc.moveNext()){
if(regx){ if(!regx.test(XDOC2TXT.Convert(fc.item().Path))) continue}
・・・
なのに速いですね。RegExpのオプションは複数行でデータ全体で大文字小文字区別なし
にしていますが、外す必要もない位速いです。EXE版でファイルI/Oは絶対にしたくありません!
のちのちは、正規表現のマッチ結果を格納して、マウスカーソルを合わせたら検索結果がツールチップに表示されると面白そうです。





mirrorMan v1.90

xdoc2txtの作者氏の素早い返信で許可をいただいた!ので同梱して右のSkyDriveに上げました。

ほとんどあてにならないと思っていた、エクスプローラでのExcelファイルのテキストボックスやコメント、全角文字に対する文字列検索はいつのまにかできるようになっていたんですね。ただしファイルは閉じている必要があって、閉じるとエクスプローラ画面がフラッシュしているので、なにやらリフレッシュしているようす。

Vistaだと、F3で検索画面を開いて、「ファイル コンテンツの検索」をクリックしてやるみたいですが、
これはもうXPのUIのほうが使いやすいですね。ライブサーチではあるけど、サブディレクトリオフにしても検索してなんかいっぱいヒットしてくるし。mirrorManならCtrl+F,Fしてなんか入れてそのままフォルダ移動して、て自画自賛になっていきそうでもうやめ。vectorのDLは毎回数十人、使う人がいてなんぼやがな!


ともかく、ファイル内文字列検索でフィルタを有効にしたままフォルダを移動していけるのが、
エクスプローラに対するメリットでしょうか。
あと検索入力句が正規表現でライブサーチっぽいとこか。

今版ではあと拡張子なし対応と、その他細かい修正。

放置してたreadme.txtも更新。






mirrorMan - xdoc2txt動作確認

mMn081103.png
testExcelxdoc2txt.jpg

朝っぱらから健康的だが、とりあえず動作。
左の「te」でファイル名のフィルタ、
右の「て」でその入力文字を含むファイルがさらにフィルタ。
test.xlsxの「てす」というセルがマッチしています。

家のCore2の2GメモリのVistaマシンだと、キー入力にガシガシついてこれます。

ひょっとすると、xdoc2txtもこのままライブサーチ動作でいけるかも!
これでマウスをそのファイルにもっていった時に、マッチした内容をどう表示するです。
そこまでできれば、
「えーとあれが書いてあったファイルどこだっけ」
といってエクスプローラを彷徨うときに、
キーを打ちながらリアルタイムに探し出せる!
これは仕事がはかどりそうだ!


ちなみに、xdoc2txt.ocxをレジストリに登録するコマンド
regsvr32 /s xdoc2txt.ocx
ですが、Vistaではあらかじめコマンドプロンプトを右クリックして管理者権限で実行しないとスカりました。/sを外すと0x80040200エラーが出て分かるのですが。

あと、ActiveX版とはいえ、JScriptやVBScriptでは、new ActiveXObject("XDOC2TXT.xdoc2txtCtrl.1")ないしCreateObject("XDOC2TXT.xdoc2txtCtrl.1")しても「致命的なエラー」でメソッドやプロパティを操作できませんでした。
のでサンプルhtaのとおりOBJECTタグを使っています
<OBJECT id="XDOC2TXT"
CLASSID="clsid:4FD6BD6E-471A-48A6-8C52-5E8391ECBA9F"
width=0 height=0></OBJECT>






xdoc2txt中

BSMで服をかついで洗濯に出たら、背中に当たる日光がぽかぽかして気持ちよかった。
今年はいい気候の週末が送れるのももう数えるほどだろうか。
出掛ければよかったかなと後悔しつつ、

mMan081102.png

検索ボタンかCtrl+Fでファイルを絞り込み、もう一度検索ボタンかCtrl+Fをすれば右側のテキストボックスが表示され、文字入力後にエンターで文字列が含まれるファイルがさらに絞り込まれて表示という使い方で考えている。
getElementsByTagName('PRE')で取ったファイルのコレクションからそれぞれxdoc2txtに渡して、
見つかったらファイル名をどこかに格納して、LoadItm時にチェックという方法。

xdoc2txtはテキストファイルどころか、Office系のファイル以外のバイナリ混じりファイルでも結構ダンプ出力されるようだから、エクスプローラの文字列検索に近い形で使えそうだ。

ただ今週はだらだら過ごしてスイッチが入らない。明日中には終わりそうにないかも。




xdoc2txt入れよう

Officeファイルの中のテキストを抽出できるxdoc2txtのActiveX版が8月に出ていた。

エクスプローラから文字列検索しても、半角文字しかだめだったりテキストボックスの文字がだめだったりでほとんど使えなかったけど、これを使えばさらに強力(正規表現で)に検索できる。

System32にocxファイルを入れてレジストリに登録する必要があるが、
new ActiveXObject("XDOC2TXT.xdoc2txtCtrl.1")すれば
Convert(path)、Load(path)のメソッドが使えてEXE版よりはるかに便利だ。
しかし、レジストリに登録となるとセキュリティ管理された端末では引っ掛かってしまうかもしれず、悩ましい。

しかし、やる気はガゼンでてきた。
検索テキストボックスをもう一つ作って、入力した文字が含まれているOfficeファイルを一覧表示する。
ファイル名のフィルタと組み合わせてand検索でやって、ファイルをフォーカスしたらツールチップ的に前後の文字列を出したりとかもうやばいし、ライブサーチできれば最高だが数万行の検索をキー入力に合わせて表示は無理w

ライブサーチという名前は、むかしラブサーチといういい出会い系サイトがあってどうもかぶっていかん。





mirrorMan - 拡張子なし対応で開き直る

前回からもぞもぞして決めた。

拡張子表示なし設定がされていても拡張子を表示してしまえ。

というわけで、
selItmObjext.png
フルパスのPathプロパティをFileSystemObject.GetFileName()して、
ファイル名を取り出しちくる。



あとファイル名の変更にはひとくせ。
拡張子なし設定だとファイル名変更で拡張子を変えることができない。
つまりfileオブジェクトのNameプロパティを変更しても、強制的に元の拡張子が補完されてしまう。
これはエクスプローラも同様で、やるにはプロパティを開いて関連付けの変更ボタンからするしかない。

もう処理を分けちる。

拡張子なし設定:ファイル名変更時には拡張子を消し、件の自動補完にまかせる。
拡張子あり設定:従来どおり入力された名前の拡張子に依存。

設定がどちらかはレジストリを検索したりしなくてもよくて、
FileSystemObjectのGetExtensionName()で空文字かで判別可。

しかしそもそも、
バージョンアップ時に毎回40~50程度のVectorのダウンロード数が増えるのか疑問。





mirrorMan - 拡張子なし表示対応してみた

folderOption.png
Macの漢字TALKからWindowsに移ったときは、ファイル名の拡張子というものに幻滅したものだった。アイコン画像もMacに比べれば小学生の落書きみたいなものだったし、OSが把握しておくべきファイルの種類をファイル名にくっつけて見にくくしてと、納得できる点なんか何一つなかった。

仕事を始めると、どのPCも押し並べて拡張子を表示し、エクスプローラはもっぱら詳細表示で使っているのを目にし、自分もそれになじんでいった。Macの方が優れているとそれでも思っていたけれど、いつのまにかファイル名を見るのと同時に拡張子も見るようになり、そのころにはアイコンなんて、なんとなく緑色ばっかりならエクセルファイルが並んでるんだな、くらいでしかなくなっていった。Windowsがいつから拡張子を表示しない設定をデフォルトにしたのか覚えてないが、それ以来、拡張子が表示されていないと脊髄反応で設定を切り替えるようになっていた。

いったんUNIX環境を旅して名前を変えられてWindowsに戻ってきたファイルはもう、UI上では何の種類のファイルか判別不可能だ。実際問題として、ファイルシステム上でファイルフォーマット管理がされて、グラフィカルなアイコンイメージのUIでユーザに示すことができていれば、拡張子は無用である。

nafudan.jpg
拡張子はまるで、小学校でみんなが胸に安全ピンでつけている名札のようなものだ。海外旅行でもして日本に戻ってくれば、それがローカルな文化にすぎないことがみえるが、その中の小学生にとってはあって当たり前になっていて、ないときにはその人が誰か分からないからでなく、ないことでその人でなくなっているような気になるようなものである。

とはいえ、ファイルを表形式に並べて管理するなら、アイコンイメージに許されるサイズはその目的には小さすぎる。拡張子がないよりはアイコンがないほうがまだましである。それにUNIXのシェル環境と日常的に行き来するなら拡張子はなくてはならない。

なんといっても、スクリプトからファイルにアクセスするには、GetFile()だろうがParseName()だろうが、拡張子がなければアクセスできない。エクスプローラを拡張子なしに設定しておくと、Shell.Application.NameSpace()で取得したItem().Nameプロパティは、
拡張子なしのファイル名を返すくせに!

そうはいったところで、拡張子が違う同じ名前のファイルをひとつのフォルダに置けるのだから、しょうがない。マイクロソフトは以前、拡張子を6ケタにしたいなどといっていたことがあったから、このダブルスタンダードはマイクロソフトが市場を支配している限り続きそうである。

noExtName1.png
というわけで、mirrorManは拡張子を表示しない設定でも動作するようにしてみた。
これまでは、一覧を表示したあとは、マウスやキーボードのフォーカス動作があって初めてフォルダやファイルのオブジェクトを取得しにいっていた。FFFTPと同様にファイルシステムと同期しているわけではないし、誰かが更新したりしているかもしれない動的な状態を保持したくなかったからである。
しかし、拡張子なしのファイル名ではそのオブジェクトにアクセスできない以上、一覧表示のタイミングでそれぞれのファイルやフォルダのオブジェクトへの参照を保持しておくしかない。

mirrorManで表示し、そのファイルをエクスプローラで削除した後でも、そのファイルを右クリック-プロパティで属性を確認できてしまう。ダブルクリックして初めてそのファイルがないことを知らされる。まるで亡霊のようで気味が悪い。ソースコードを書き換えるのも、ぱっとみシンプルにはなるものの非情で非常なストレス。おちょこ2杯開けて続ける。酒飲むとコーディングがはかどるの、知ってますか?実際の手の動きが速いわけではないけど、口でしゃべって書いてるみたいですよあはは↓。根っこがアイコンと拡張子のダブルスタンダードにあるせいか、どうすればいいのかわからない。






mirrorMan v1.83

遅いPCやサーバでファイル数の多いフォルダを開いたりする場合のレスポンスを少し改善する設定ができるように変更しました。
同じ名前のファイルの更新日時を比較する処理を両側から行わないようにする設定をINIファイルに追加しています。
Ctrl+F1キーでTEMPフォルダのINIファイルを開き、
[bthClr]	1
から
[bthClr]	0
に変更しておくと、
左右ディレクトリのシンクロ移動ボタンchkon.pngがオフ→chkoff.pngのときに、
フォルダを開くのが少し速くなります。
そのかわり、もう一方のペイン側のファイルの色は更新されません。


しくみはIniDataクラスの
var IniData = function(p,x,c,t,b){
this.edtPth = p;
this.extNam = x;
this.cpyOpt = c;
this.pstTxt = t;
this.bthClr = b;
}
オブジェクトを初期化しておいて
var ini = new IniData("未設定",["txt","ini","log","js","css"],parseInt(80),1,1);
起動時のINIファイル読み込みでini.bthClrプロパティに格納します。
while(!f.AtEndOfStream){
ars = f.ReadLine().split(/\t/);
switch(ars[0]){
case"[bthClr]": if(ars[1]) ini.bthClr = parseInt(ars[1]);
}
}
パラメータのflgは0:左、2:右、1:左右ですが、ini.bthClrプロパティが0ならflgを1に上書きせず、左か右のどちらかのみ処理するようになります。
function loadItms(flg){
if(ini.bthClr) flg = 1;
if(flg < 2){左ペイン処理...}
if(flg > 0){右ペイン処理...}
}






mirrorMan 正規表現ライブサーチ2

その2は前回のソースです。
with(document.body) onkeydown = handleKeydown;
textboxに入力された値をonkeydownで取得すると、htaではその入力が取れませんでした。
onkeyupだと取れそうですが、onkeyupは押しっぱなしだとダメなので、ワンテンポ遅れたりします。
setTimeout('textbox.valueを参照する処理()',0)すればonkeydownでも大丈夫ですね。

onkeyupイベントは、mirrorManではshiftキーを押していると更新ボタンのアイコンが変わり、location.reload(true)で再起動、押していないと画面更新処理で、マウスクリックでもF5キーでも大丈夫なのですが、shitkeyを離したときに拾う処理で使っています。
で、
function handleKeydown(){
setTimeout('loadItms()',0);
}
そのsetTimeout、待ちを0秒でsetTimeoutするのはなぜかといと、たとえば画面に「loading中...」と表示させてから次の処理をsetTimeoutし、処理の順序を明示的に最後尾に指定することで、htaで非同期処理的に画面を更新されているように見せることができます。
そうでないと、画面に「loading中...」を表示させる処理が次の処理が終わるまでコミットされず、実際には表示されていないように見えしまうことになります。onkeydownで入力されたkeyを確実に拾いたいのも同じ意図だったり。unixではflushで明示的にやったりも。JSエンジン内の詳細な動きを説明することは私にはできないのですが、htaではこういう使い方もできます。

function loadItms(){
createItmsHtML();
}
function createItmsHtML(){
if(document.all.filterLstBox){
rhtStatsbar.innerText ="";
try{
var re = filterLstBox.value ? new RegExp(filterLstBox.value,'i') : /./
}catch(e){
filterLstBox.style.backgroundColor='#d8efff';
return rhtStatsbar.innerText = " "+e.description
}
filterLstBox.style.backgroundColor="";
for(var fc=new Enumerator(erfo.Items()); !fc.atEnd(); fc.moveNext()){
if(re) if(!re.test(itm)) continue;
...
}
}
}
検索入力textboxのfilterLstBoxが表示されていたら、その値をnew RegExp()してreに入れています。その後、ファイルやフォルダのコレクションでhtmlを組み立てるループの中でre.test()しています。

ライブサーチ、マシンパワーにものを言わせる機能です。
Vistaのスタートメニュー内のテキストボックスにも実装されていますが、いつもHDをカリカリさせてインデックスを作成しているのを許す気分になれますか?








mirrorMan v1.81

v1.80はポップアップ表示が使い勝手悪杉で修正。

ver181.png

正規表現句としてエラーの場合、
テキストボックスの背景が水色になり、ステイタスバーにerr.description表示。

テキストボックスからフォーカスは外れないので、
続けて入力しながら確認できます。


*入力句がエラーのままフォルダ移動しようとすると動作しない・・・




mirrorMan v1.80 正規表現ライブサーチ

正規表現は入力一文字ごとに検索条件が確定するわけではありません。
いきなり「*」を入力しても、繰り返し対象の前の一文字がないのでだめです。
また、デフォルトで強欲マッチだったり、前方参照や後方参照があったり。

でも、そんな細かいことより、
リアルタイムで検索されるほうがおもしろす。

マッチするのか調べたい文字列を、ファイル名にしちゃって実験するのもよす。

1文字入力されるたびにテキストボックスの値をnew RegExp(値,"i")するので、
「正規表現が不正です」とかいうポップアップは無視して、ばしばし入力!


テキストボックスの表示/非表示を切り替えるのは、filter.pngこのボタン↓か、Ctrl+F

regfilter0.png

何か入力したりBSキーで消したりする度に、一覧が絞り込み表示されます。
入力したままフォルダをクリックすると、絞り込みながらあっちこち移動することも。

regfilter1.png

われながらおもしろくて自分に1拍手w






mirrorMan.hta ver1.76

フォルダを削除したとき、アドレスバーのプルダウンリスト項目もそのパスがあれば削除していたが、
その後の動作の不具合に対処した。
var dic = LR ? dicLstRht : dicLstLft;
var sLR = LR ? "Rht" : "Lft";
var arr = new VBArray(dic.Keys()).toArray();
for(var i in arr) if(dic(arr[i]) == pth) var j= i;
if(!j) for(var j=0;j<100;j++)
if(!dic.Exists(sLR+"Lst"+j)){ dic.Add(sLR+"Lst"+j, pth);break}
削除すると空いてるKeyが歯抜けになるので、Countプロパティ+1ではなく探して取得。


jQuery UIが安定版として1.6rc2になったので同梱を更新した。


2chのHTAスレより。
<meta http-equiv="MSThemeCompatible" content="yes">
XP以降でデスクトップのテーマを設定している場合、フォーム部品のデザインがそれに。




while(aho.atEndofStream)

笹部 政宏
笹部 政宏
mail




フリーソフツ
Category
はてブ
Monthly Archive
New Entry
New Comment
New Trackback
RSS
Copyright © Kittens flewby me All Rights Reserved.