msdnに記載されている通り、GetObject関数はIE9(標準モード)以降ではサポートされていません。 → MSDN:GetObject関数
HTML5を利用するためにHTAでレンダリングモードを変更するとGetObjectが使えなくなり、WMIからデータを取得したりすることができません。
HTML5を利用しつつGetObjectを使うためのサンプルを作成しました。
2017年4月22日土曜日
2017年4月21日金曜日
循環参照や参照の重複に対応したJSON化関数
先日公開したJSON化関数では、循環参照を含むオブジェクトを与えられると無限ループにはまってしまう問題がありました。また、複数のプロパティから単一のオブジェクトを参照しているケースではプロパティごとに異なるオブジェクトとして扱ってしまう問題がありました。
上記の問題を解消する方法を思いつき、サンプルを作成したので公開します。
上記の問題を解消する方法を思いつき、サンプルを作成したので公開します。
ラベル:
JavaScript,
JSONもどき
2017年4月20日木曜日
排他アクセス対象ファイルのひな形
先日公開した関数を使えば任意のファイルに対して排他的書き込みなどができます。
ただし、データそのものはただのテキストファイルですし関数も同じルールに従う関数同士でのみ仕組みが成り立つ内容になっています。
数年前に作成したプログラムで扱っているファイルに対して新たにプログラムを作成することになったのですが、排他的書き込みをコントロールしているプログラムファイルの所在が分からず(でもどこかで使われてはいる)、どういうルールだったか失念してしまい対応に苦慮しました。
そんな事が再発しないように、テキストファイル自体に書き込み用関数を入れて、いつどんなプログラムからでもその関数を使って書き込めば排他的書き込みが成立する、という雛形を作成しました。
ただし、データそのものはただのテキストファイルですし関数も同じルールに従う関数同士でのみ仕組みが成り立つ内容になっています。
数年前に作成したプログラムで扱っているファイルに対して新たにプログラムを作成することになったのですが、排他的書き込みをコントロールしているプログラムファイルの所在が分からず(でもどこかで使われてはいる)、どういうルールだったか失念してしまい対応に苦慮しました。
そんな事が再発しないように、テキストファイル自体に書き込み用関数を入れて、いつどんなプログラムからでもその関数を使って書き込めば排他的書き込みが成立する、という雛形を作成しました。
2017年4月19日水曜日
リロードじゃなければウィンドウサイズを変更する
F5キーを押すとHTAのウィンドウを閉じることなく再起動させることができます。
便利です。
resizeToという関数を使うとウィンドウのサイズを変更できます。
HTAは何も指定しなければモニタサイズに応じて大きく表示されますので、この関数を使わないとムダに大きく表示されてしまい不便なことがしばしばあります。
resizeToも便利です。
しかしresizeToを行うHTAでF5キーを使うと、リロード前に調整していたサイズから強制的にウィンドウサイズが変更されてしまい、わりと不便です。
できればresizeToを実行するのはHTA起動時のみにして、リロード時はリロード前のウィンドウサイズを保って欲しい…と思ったのでそれを叶える関数を作成しました。
便利です。
resizeToという関数を使うとウィンドウのサイズを変更できます。
HTAは何も指定しなければモニタサイズに応じて大きく表示されますので、この関数を使わないとムダに大きく表示されてしまい不便なことがしばしばあります。
resizeToも便利です。
しかしresizeToを行うHTAでF5キーを使うと、リロード前に調整していたサイズから強制的にウィンドウサイズが変更されてしまい、わりと不便です。
できればresizeToを実行するのはHTA起動時のみにして、リロード時はリロード前のウィンドウサイズを保って欲しい…と思ったのでそれを叶える関数を作成しました。
2017年4月18日火曜日
HDDやSSD、SDカード等のデータを完全に消去するプログラム
先日埋め尽くす.htaというプログラムを公開しましたが、そのプログラムの中から「ストレージの中身を完全に消去するための処理」だけ抽出して、処理完了までの残り時間を計算する機能を追加したプログラムを作成しました。
2017年4月17日月曜日
HTML5の機能で画像ファイルを埋め込みイメージタグに変換するサンプル
base64エンコードという処理をするとHTMLファイルに画像ファイルなどを埋め込むことが可能になります。
そのbase64エンコードをやってくれるwebサービスなどもありますが、ブラウザでHTML5の機能だけでやることも可能です。
その変換用サンプルを作成しました。
そのbase64エンコードをやってくれるwebサービスなどもありますが、ブラウザでHTML5の機能だけでやることも可能です。
その変換用サンプルを作成しました。
2017年4月16日日曜日
エラー事例:タグ名間違い要因のエラーメッセージが「未知の実行時エラー」
タグ名を間違えているエレメントのinnerTextプロパティを変更しようとしたら「未知の実行時エラー」が発生しました。
分かってしまえばどうということは無い内容ですが、初めて遭遇した時は問題のある箇所が全く見当たらず困惑しました。
時間が経つと忘れて同じ失敗を繰り返してしまうかもしれないので備忘録としてエラー事例を記録します。
分かってしまえばどうということは無い内容ですが、初めて遭遇した時は問題のある箇所が全く見当たらず困惑しました。
時間が経つと忘れて同じ失敗を繰り返してしまうかもしれないので備忘録としてエラー事例を記録します。
ラベル:
JavaScript,
エラー,
サンプル
2017年4月15日土曜日
2017年4月13日木曜日
2017年4月12日水曜日
2017年4月11日火曜日
JSON形式テキスト作成用関数
用途・目的
JSON形式テキストを作成する関数は先日作成済みでしたが、変数名などがゴチャゴチャしているのが気になっていました。
イチから書き直して関数や変数の名前と流れを整理して少しだけ短くシンプルに出来ました。
イチから書き直して関数や変数の名前と流れを整理して少しだけ短くシンプルに出来ました。
ラベル:
JavaScript,
JSONもどき
2017年4月10日月曜日
テキストエリア内のカーソル位置に追従して水平線を移動する
4Kモニタのように、高解像度で精密な映像を表示するモニタを使っている時はテキストエディタ画面上で点滅しているテキストカーソルも小さめに表示されるため、たまに見失うことがあります。
カーソルがどこにあるのか分かり易くするために、カーソルに水平線を追従させるサンプルを作成してみました。
カーソルがどこにあるのか分かり易くするために、カーソルに水平線を追従させるサンプルを作成してみました。
2017年4月9日日曜日
lineHeightが未定義のテキストエリアからlineHeightを取得するサンプル
1行あたりの高さを表すのがlineHeightプロパティですが「<textarea></textarea>」のようにlineHeightが定義されていないエレメントだと「lh = elem.lineHeight」のようにしても変数に入るのは長さ0のカラ文字列です。offsetWidthのような感じのプロパティはlineHeightにはありません。
それでもlineHeightが必要な場合があるので、取得するためのサンプルを作成しました。
それでもlineHeightが必要な場合があるので、取得するためのサンプルを作成しました。
ラベル:
HTA,
JavaScript,
サンプル,
テキストエリア
2017年4月8日土曜日
RGB値に対応する表示色を確認しながら調整するHTA
赤・緑・青の3要素の値を0~255の範囲で変えて任意の色を表現することができます……と言っても具体的にどういうことなのかイメージできない人も居ますし、できる人でも数値から実際の色を想起できる人は少数派のような気がしますので、値を変えつつ実際の色を確認しながらカラーコードを出力するサンプルを作成しました。
2017年4月7日金曜日
任意の文字列を含む名前のファイルやフォルダのリストを取得する
コマンドラインを使いこなせる方なら「dir /B C:\folder\*abc*.* > c:\temp\1.txt」のように入力するだけで良いのですが、使いこなせる人ばかりでもないのでインターフェースを作成しました。
2017年4月6日木曜日
時間の長さに応じた単位をつけた文字列を返す関数(詳細表示版)
用途・目的
ミリ秒単位の数値を、値の大きさに合わせて「1.5分」とか「2.1時間」などのように表示する関数を先日記事にしましたが、「○ヵ月○日○時間○分○秒」のような表示が欲しいケースもあるので、それに対応する関数を作成しました。
2017年4月5日水曜日
時間帯を色分けするhtaを改良
前verからの変更内容は以下の通りです。
・カウント中に積算時間が表示されるようにした。
・設定・記録内容を保存・読み込みできるようにした。
・指定した日時に終了・開始の記録を追加できるようにした。
・画面内レイアウト変更
などなど。
・カウント中に積算時間が表示されるようにした。
・設定・記録内容を保存・読み込みできるようにした。
・指定した日時に終了・開始の記録を追加できるようにした。
・画面内レイアウト変更
などなど。
2017年4月4日火曜日
改行コードが「LF」のみのテキストの表示を整える
2017年4月3日月曜日
時間帯を色分けするhta
毎日の活動内容をざっくり分類して、各活動の種類ごとに色を設定して、活動内容が変わるタイミングで対応する色を選択していき、最終的に各色ごとの合算時間を表示するHTAプログラムを作成しました。
2017年4月2日日曜日
時間の長さに適した単位をつけた文字列を返す関数
用途・目的
Dateオブジェクトを扱う際は単位がミリ秒の数値を扱うことが多いですが、ユーザーに見せる内容はミリ秒単位だと値が大きすぎてスケールが把握しづらいです。
分単位なのか、時間単位なのか、もっと大きな単位の数字なのかが分かり易い文字列を返す関数を作成しました。
分単位なのか、時間単位なのか、もっと大きな単位の数字なのかが分かり易い文字列を返す関数を作成しました。
2017年4月1日土曜日
一時画像フォルダ
資料作成のために一時的に画像ファイルをいくつか作成して、用が済んだら削除したい時があります。
今までは以下のやり方をしていました。
以下の方法で複数の画像を保存し、用が済んだらウィンドウを閉じるだけで勝手に削除されるようにするプログラムを作成しました。
今までは以下のやり方をしていました。
プリントスクリーン→ペイント起動→Ctrl + V→Ctrl + S→名前を入力して保存わりと面倒です。名前が重複しないように気を付けることとか、ペイントを他の用途で使って保存先フォルダの表示が変わると保存後のファイルを使う時や後始末する時に面倒だと感じます。
以下の方法で複数の画像を保存し、用が済んだらウィンドウを閉じるだけで勝手に削除されるようにするプログラムを作成しました。
一時フォルダを開く→「+」ボタンを押してpngファイルを追加→pngファイルを右クリック→Eキーでペイント編集開始→Ctrl + V→Ctrl + S
2017年3月31日金曜日
ウィンドウを閉じると自動で削除されるフォルダ
一時的なファイルの置き場所(用が済んだら削除したい)が欲しい時があります。
ウィンドウを開くと自動で専用のテンポラリフォルダが作成され、閉じると削除前の確認メッセージを経て削除される、というプログラムを作成しました。
ウィンドウを開くと自動で専用のテンポラリフォルダが作成され、閉じると削除前の確認メッセージを経て削除される、というプログラムを作成しました。
2017年3月30日木曜日
2017年3月29日水曜日
テキストエリア内でのタブキー操作
先日「textareaでタブスペースを入力できるようにする」という記事を作成しました。
その後、そのサンプルを使っていたら「選択範囲末尾の改行がうまく制御できていない!」ということに気が付きました。
末尾の改行にも対応するサンプルを作成しました。
その後、そのサンプルを使っていたら「選択範囲末尾の改行がうまく制御できていない!」ということに気が付きました。
末尾の改行にも対応するサンプルを作成しました。
2017年3月28日火曜日
テキストエリア内のカーソル行、列を取得・設定する
テキストエリア内でカーソルが何行目の何列目にあるのかを取得したり設定するためのサンプルを作成しました。
2017年3月27日月曜日
2017年3月26日日曜日
日時の省略表記を解釈してDateオブジェクトを返す関数
例えば「1110」は「2017/03/26 11:10」と解釈します。
「11/10」の場合は「2017/11/10 00:00」と解釈します。
解釈に失敗した場合でもDateオブジェクトを返しますが、その場合は年月日時分秒のすべてが「NaN」になります。

「11/10」の場合は「2017/11/10 00:00」と解釈します。
解釈に失敗した場合でもDateオブジェクトを返しますが、その場合は年月日時分秒のすべてが「NaN」になります。

ラベル:
HTA,
JavaScript,
サンプル
2017年3月25日土曜日
日時を指定フォーマットの文字列に変換する
用途・目的
Dateオブジェクトを「str = dat+''」のように文字列化すると「Fri Mar 3 11:05:46 UTC+0900 2017」のような形式の文字列になります。
「2017/03/03 11:05」のような形式で取得したいときは「obj.getStr('Y/MM/DD hh:mm')」で取得できるようにするための関数を作成しました。
「2017/03/03 11:05」のような形式で取得したいときは「obj.getStr('Y/MM/DD hh:mm')」で取得できるようにするための関数を作成しました。
2017年3月24日金曜日
getChildsを修正
「<button>開始</button>」を「obj.btn開始」のように参照できるようにするための、getChildsを先日公開しましたが、以下の問題がありました。
1.「obj.btn開始.removeNode(true)」のようにするとbtn開始のエレメントはリムーブされますが、エレメントへの参照用プロパティ「obj.btn開始」は残ってしまい、参照が残っているのでエレメントもメモリ上に居座り続けてしまう。
2.「tableメイン」のようなエレメントをリムーブした場合、そのエレメントに含まれる子孫エレメントへの参照も残ってしまう。
上記の問題を解消するためのメソッドを追加しました。
1.「obj.btn開始.removeNode(true)」のようにするとbtn開始のエレメントはリムーブされますが、エレメントへの参照用プロパティ「obj.btn開始」は残ってしまい、参照が残っているのでエレメントもメモリ上に居座り続けてしまう。
2.「tableメイン」のようなエレメントをリムーブした場合、そのエレメントに含まれる子孫エレメントへの参照も残ってしまう。
上記の問題を解消するためのメソッドを追加しました。
2017年3月23日木曜日
参照渡しでも数が多ければそれなりにメモリを使用する
情報のコピーは値渡しよりも参照渡しの方がメモリ使用量が少ない、というのはイメージできますが、実際に参照用プロパティを増やしまくるとどれくらい使用量が増すのか確認しました。
参照用プロパティを10000個作成する前後のメモリ使用量の差の平均が982KBでした。
1個あたり0.1KBくらいのようです。
2017年3月22日水曜日
「innerText = ''」にしても元の中身を参照している変数があるとメモリ解放されない
エレメントに限りませんが、メモリ上に展開しているデータはどこからも参照できない状態になると始末されてメモリの空き容量が増えます。
document.body以下のDOMエレメントは「document.body.innerText = ''」とすることで画面上からは消え去りますが、innerTextを変更する前に「var elem=document.body.firstChild」などを実行していた場合は、innerText変更後でも「elem」変数の中には元のエレメントが存在します。つまり、メモリは解放されていません。
意図せず参照が残って解放されないものが溜まっていくとメモリ不足になってPCの動作がモタついてしまいますが、具体的にどのくらい消費してしまうのか確認しました。
document.body以下のDOMエレメントは「document.body.innerText = ''」とすることで画面上からは消え去りますが、innerTextを変更する前に「var elem=document.body.firstChild」などを実行していた場合は、innerText変更後でも「elem」変数の中には元のエレメントが存在します。つまり、メモリは解放されていません。
意図せず参照が残って解放されないものが溜まっていくとメモリ不足になってPCの動作がモタついてしまいますが、具体的にどのくらい消費してしまうのか確認しました。
2017年3月21日火曜日
メモリ解放のタイミングと解放量のデータ
プログラムで使用するメモリはその他のプログラムなどと共有していて、そのメモリを管理するシステムが状況に応じて色々と処理するので、自身のメモリ使用量を確認するプログラムを作成しても結果がいつも同じということはなく、バラつきがあります。
複数の条件の試験結果を比較したい場合はそのバラツキも考慮しなければいけませんので、どの程度ばらつくのか確認しました。
その過程でHTAでのメモリ解放のタイミングと解放される量が少し分かりましたので試験データと併せて記録・公開します。
複数の条件の試験結果を比較したい場合はそのバラツキも考慮しなければいけませんので、どの程度ばらつくのか確認しました。
その過程でHTAでのメモリ解放のタイミングと解放される量が少し分かりましたので試験データと併せて記録・公開します。
2017年3月20日月曜日
setTimeout(func,0)を複数回連続実行した場合のfuncの実行順
setTimeoutを使うと任意の関数を任意の待ち時間後に実行させるよう予約できますが、以下のようにした場合実行順は予約順になるのか確認しました。
setTimeout(funcA,0)
setTimeout(funcA,0)
setTimeout(funcB,0)
setTimeout(funcC,0)
結論としては、予約順でした。
2017年3月19日日曜日
エレメント追加によるメモリ使用量の変化を調べるサンプル
経験的に、よほど大規模なアプリケーションを作るのでなければ気にするレベルではないとは思っていますが確認しないと気が済まないので確認用サンプルを作成しました。
結果としては「<div></div>」1つを追加すると250バイトぐらい増えるようです。
innerTextプロパティを書き換えることで対象エレメントの子要素を削除する方法でもメモリ使用量が低下することが確認できました。
結果としては「<div></div>」1つを追加すると250バイトぐらい増えるようです。
innerTextプロパティを書き換えることで対象エレメントの子要素を削除する方法でもメモリ使用量が低下することが確認できました。
2017年3月18日土曜日
textareaでタブスペースを入力できるようにする
プログラムを書く人にとってはインデントするために必要なタブスペースですが、ブラウザ上でのタブキーの役割はフォーカス移動なので、デフォルト状態ではタブスペースを入力できません。
入力できるようにするサンプルを作成しました。
入力できるようにするサンプルを作成しました。
2017年3月17日金曜日
インクリメンタルサーチ式ミニライブラリ
プログラミングの際に利用する定型文とそれを識別するためのキーワードをセットにして保存・検索するためのプログラムを作成しました。
サンプルプログラムもセットで保存することができ、動作確認が容易にできます。
サンプルプログラムもセットで保存することができ、動作確認が容易にできます。
2017年3月16日木曜日
メソッドの上書きによる高速化
先日、メソッド自身を上書きして次回呼出し時は初期化処理を省くという記事を作成しましたが、実際にどれぐらいの差がでるのか検証していませんでした。
その検証を行いました。
結論としてはメソッドの上書きは効果アリでした。
初回起動時のみfunction自身にメソッドを追加して以降はそのメソッドを呼び出す方法と比較して3倍の速度が出ました。(とは言え、遅い方でも1回あたり3マイクロ秒程度ですが。。)
その検証を行いました。
結論としてはメソッドの上書きは効果アリでした。
初回起動時のみfunction自身にメソッドを追加して以降はそのメソッドを呼び出す方法と比較して3倍の速度が出ました。(とは言え、遅い方でも1回あたり3マイクロ秒程度ですが。。)
2017年3月15日水曜日
正規表現の動作テスト用hta
正規表現を使うとテキストに対して複雑な検索・置換ができるのでとても便利ですが、構文が記号だらけで意味不明になりがちです。
正規表現を利用するプログラムを作る時は、正規表現の部分だけで意図した通りの動作をするか確認してからプログラムを作ると作業がスムーズに進みます。
正規表現だけで動作確認するためのプログラムを作成しました。
正規表現を利用するプログラムを作る時は、正規表現の部分だけで意図した通りの動作をするか確認してからプログラムを作ると作業がスムーズに進みます。
正規表現だけで動作確認するためのプログラムを作成しました。
2017年3月14日火曜日
メソッド自身を上書きして次回呼出し時は初期化処理を省く
例えばメソッドの内部で正規表現を扱う場合、その正規表現のパターンが毎回同じならメソッドが呼ばれる度に正規表現の再コンパイルするのをやめて、以下のようにするとコンパイルは初期化時一回のみになるので次回呼出し以降の実行速度が向上します。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<job> | |
<script> | |
obj={ | |
abc:function(){ | |
// この部分は「obj」にオブジェクトが代入される前に実行される | |
var reg=/\d+/ | |
// 下記functionが「abc」プロパティにセットされる | |
return function(str){return str.match(reg)} | |
}() | |
} | |
// 123 | |
WScript.Echo(obj.abc('adqq123qr')) | |
</script> | |
</job> |
しかし、だからといって初期化とメイン処理を分けられるものを何でも上記のようにしてしまうとローディングにかかる時間が伸びてしまいます。
フレームワーク級のオブジェクトの中身でこれを多用されると待ち時間が酷いことになります。初期化しても実際には呼ばれないメソッドなども多々あると思いますので、そういう意味でもムダです。
上記のような問題を解決するために「初回呼出し時に初期化して自身をメイン処理用functionで上書きする」ための関数を作成しました。
2017年3月13日月曜日
一次元配列内の数値を補正する
用途・目的
折れ線グラフを表示して、山の頂点から下までの高さの数値が欲しい時があります。
しかしデータの取り方によってはそのグラフが傾いていて、そのままでは知りたい部分の数値が分からないことがあります。
グラフの両端の値が等しくなるように傾きを計算して補正するサンプルを作成しました。
しかしデータの取り方によってはそのグラフが傾いていて、そのままでは知りたい部分の数値が分からないことがあります。
グラフの両端の値が等しくなるように傾きを計算して補正するサンプルを作成しました。
2017年3月12日日曜日
オブジェクト作成と関数呼び出しの時間を比較
オブジェクト型の引数を扱う関数をコールする際、あらかじめ用意しておいたオブジェクトの一部だけ変更して渡すのが速いか、オブジェクトを都度リメイクしても変わらないのか比較してみました。
リメイクするオブジェクトの規模にもよりますが、今回の条件ではリメイクすると一回あたり50~80%ぐらい余分に時間がかかります。
リメイクするオブジェクトの規模にもよりますが、今回の条件ではリメイクすると一回あたり50~80%ぐらい余分に時間がかかります。
2017年3月11日土曜日
2017年3月10日金曜日
小数点以下の桁を含む数値を一時的に整数化する
例えば「(-20.41) - (-43.3)」をJScriptで実行すると、答は「22.89」になる筈ですが実際には「22.889999999999997」という結果になります。そういう仕様ですが、もちろんこれでは困ります。
計算中のみ一時的に10とか100などの数字をかけて整数にして、最後に桁を元通りにすれば上記の問題を回避できます。
そのための関数を作成しました。
計算中のみ一時的に10とか100などの数字をかけて整数にして、最後に桁を元通りにすれば上記の問題を回避できます。
そのための関数を作成しました。
2017年3月9日木曜日
idのないiframeのlocationをgetする方法
iframeのlocationプロパティの値を取得したい場合はiframeに対応するフレームエレメントをframesから取得することが必須ですが、document.body以下のiframeとframes以下のエレメントを紐付ける方法はid以外に見つからない、という記事を先日書きました。
ページ内に存在する既存のiframeについては紐付けは無理ですが、スクリプトから新規作成するものについては可能なことに気が付きました。
以下がそのサンプルです。
2017年3月8日水曜日
ロック中のファイルアクセス回数を低減するサンプル
昨日公開した一時保留.htaでは、ファイルに対する処理をfunction形式で受け渡して、functionを配列に入れて、ロックに成功してアクセス権を取得したら配列内の関数を一つずつ実行していました。
その配列をテキスト化したものが以下になります。
fso.Read、fso.Writeはファイルに対する読み書きを行っています。
一つの関数内で読み書きを1セット行っています。
ファイルに対する処理が三回分まとまると以下のようになります。
かなり冗長な感じです。
対象ファイルのサイズが小さければ無視して良いかもしれませんが、サイズが大きいとか、ネットワーク越しで利用していてネットワークの転送速度が遅いとかいうことになると無視できない話になってきます。
この問題を解消するサンプルを作成しました。
その配列をテキスト化したものが以下になります。
fso.Read、fso.Writeはファイルに対する読み書きを行っています。
一つの関数内で読み書きを1セット行っています。
ファイルに対する処理が三回分まとまると以下のようになります。
かなり冗長な感じです。
対象ファイルのサイズが小さければ無視して良いかもしれませんが、サイズが大きいとか、ネットワーク越しで利用していてネットワークの転送速度が遅いとかいうことになると無視できない話になってきます。
この問題を解消するサンプルを作成しました。
2017年3月7日火曜日
断続的に発生しうる処理を一時的に貯める関数
一つのファイルに対して複数の読み書き要求が同時に発生しうる場合、先日公開したファイルロック.htaを使えば良いのですが、先日のソースではファイルに対する処理のタイミングが他人ではなく自分自身とも競合してしまい待ち時間が長くなってしまう状態でした。
例えばZ:\TEMP\lockTest.txtに対してアクセスしているのが自分ひとりだけだったとしても、数秒以内に複数の項目を書き換えるとそれぞれの操作に対して個別にファイルロック機能が働いていました。
連続した操作による変更なら出来るだけまとめた方が、ファイルのアクセス権獲得のためにロック試行を繰り返したりロックできなくて待機したりという時間を減らせます。
本日のソースでは変更操作を行ってもすぐにはファイルをロックせず、数秒以内に次の操作が行われればそこからまた待機時間を設けて期限が切れたらファイルをロックして変更を反映します。
2017年3月6日月曜日
プログラム終了後にファイルを削除するHTA
処理に必要な一時ファイルをプログラム起動時などに作成し、終了時に削除したい場合があります。
onbeforeunloadイベントを使えばそのようなことができますが、同様に「プログラム終了時に実行したい処理」が複数ある場合は「window.attachEvent」で各処理を登録するのが安全策ですが、各処理の実行順が重要な場合はattachEventに任せるのも危険です。
hta内で実行順などを考慮するのが面倒なので、htaのプロセスIDをwsfで監視して、プロセスIDの終了を検知したら関連ファイルを削除させるサンプルを作成しました。
onbeforeunloadイベントを使えばそのようなことができますが、同様に「プログラム終了時に実行したい処理」が複数ある場合は「window.attachEvent」で各処理を登録するのが安全策ですが、各処理の実行順が重要な場合はattachEventに任せるのも危険です。
hta内で実行順などを考慮するのが面倒なので、htaのプロセスIDをwsfで監視して、プロセスIDの終了を検知したら関連ファイルを削除させるサンプルを作成しました。
2017年3月5日日曜日
ファイルロック.htaで後始末用functionに対応
先日までのファイルロック.htaではファイルのロックに成功するまでwsfが待機して、成功したらwsfが終了するだけでhta画面へのフィードバックがありませんでした。
本日のサンプルではコマンドラインのリダイレクトを使ってwsfファイルの終了を検出するようにして、wsfファイルが終了したら後始末用の関数を実行するようにしました。
本日のサンプルではコマンドラインのリダイレクトを使ってwsfファイルの終了を検出するようにして、wsfファイルが終了したら後始末用の関数を実行するようにしました。
2017年3月4日土曜日
scriptを共有するサンプル
「外部スクリプト.js」などの名前のファイルを作成して、「<script src="外部スクリプト.js"></script>」のようにするのが普通だと思いますが、構成ファイルが複数個になるのは少し都合が悪いです。
ブラウザでは動的にscriptタグを追加するテクニックがありますが、HTAで試したらうまく動作しませんでした。
上記2つの理由により、HTAファイル内に記載したscriptをWSFファイルなどと共有するサンプルを作成しました。
2017年3月3日金曜日
ネゴシエーション式ファイルロック(成功するまで待機)
昨日のサンプルはロック開始ボタンを押した瞬間だけロックを1回トライするものでした。
本日のサンプルは、ロックが成功するまで適当に待ち時間を挟みながら繰り返しトライして、ロックできたら編集を実行します。
本日のサンプルは、ロックが成功するまで適当に待ち時間を挟みながら繰り返しトライして、ロックできたら編集を実行します。
2017年3月2日木曜日
ネゴシエーション式ファイルロック
複数のPCから一つのファイルに対してRead・Writeが同時に行われる可能性がある場合、誰かが更新作業中はファイルをロックして更新できない状態にしておかないとファイルの中身の整合性が失われてしまうケースがあります。
そのようなケースを回避するためのサンプルを作成しました。
そのようなケースを回避するためのサンプルを作成しました。
2017年3月1日水曜日
SJISでWriteするとエラーになるけどReadしてもエラーにならない文字
CreateTextFileメソッドを使う際、デフォルトではASCIIファイルが作成されますが、特定の文字を含む文字列をASCIIファイルとして保存しようとするとエラーが発生します。
その具体例を作成しました。
その具体例を作成しました。
2017年2月28日火曜日
innerHTMLを変更する時は描画ルールとタイミングを考慮しないとはみ出る
<input style="width:100%">なエレメントをinnerHTMLで作成する場合、inputの中身を書き換えるタイミングに注意しないとinputのwidthを100%にしているのに親要素の幅を無視してレイアウトを狂わせてしまう場合があります。
レイアウトが崩れる例と崩れない例のサンプルを作成しました。
レイアウトが崩れる例と崩れない例のサンプルを作成しました。
2017年2月27日月曜日
iframeからlocationをgetしたい場合はidが必須でframesから辿る
タイトルの内容を覚えられればそれでOKなのですが、私はどうやら覚えられないらしく、必要になるたびに過去のサンプルを確認しているアリサマなのでiframeをコントロールする時に使うメソッドもまとめておくことにしました。
2017年2月26日日曜日
間隔調整式setIntervalを作成しました
昨日の記事ではsetIntervalの間隔がわりとアバウトで、しかもズレが累積されていくということをご紹介しました。
ズレを考慮して次回までの間隔を自動的に調整するタイプのsetIntervalを作成しました。
ズレを考慮して次回までの間隔を自動的に調整するタイプのsetIntervalを作成しました。
2017年2月25日土曜日
setIntervalの精度は間隔の長さに比例する
精度はあまり良くないということは聞いたことがありましたが、実際にどういう感じなのか知らなかったのでサンプルを作って動作確認しました。
結論としては間隔が短いほど精度が悪化していきます。
あと、定期的に実行するfunctionが処理に要する時間に応じて精度が落ちていく、というか次の実行までの間隔が伸びていくので、setIntervalを実行した瞬間から計算して「このタイミングで何回目の処理が行われる」の時刻からどんどん遅れていくことになります。
2017年2月24日金曜日
getChildsで作成したオブジェクトからクローンを作成する関数
昨日公開したgetChildsが返すオブジェクトは「<div>メイン</div>」を「obj.divメイン」のように参照することができるようにするものでした。
必要に応じて複数回クローンを作成するようなモデルエレメントに対してgetChildsを実行した場合、getChildsの機能によってiTやvalueなどが変化するため、一度getChildsで処理したエレメントやその複製をgetChildsに渡すと、意図した参照用プロパティが得られないという問題がありました。
上記の問題は、本日公開するgetCloneという独自関数で解決できます。
必要に応じて複数回クローンを作成するようなモデルエレメントに対してgetChildsを実行した場合、getChildsの機能によってiTやvalueなどが変化するため、一度getChildsで処理したエレメントやその複製をgetChildsに渡すと、意図した参照用プロパティが得られないという問題がありました。
上記の問題は、本日公開するgetCloneという独自関数で解決できます。
2017年2月23日木曜日
idやname属性を使わずにエレメントを取得する関数
「<button id=btn作成>作成</button>」のような書き方が冗長だと感じていました。
「<button>作成</button>」を含むエレメントを渡すと「obj.btn作成」という形式でエレメントに参照できるようにする独自関数を作成しました。
「<button>作成</button>」を含むエレメントを渡すと「obj.btn作成」という形式でエレメントに参照できるようにする独自関数を作成しました。
2017年2月22日水曜日
二つの変数に入っているエレメントが同じものを参照しているか判定する
「同じ」と判定する基準としては
1.outerHTMLの値が一致する
2.document.bodyからのDOMツリー内ポジションが一致する
3.タグ名が一致する
などなど色々あり、どういう意味で「同じ」ものが必要かによって判定基準を変える必要があります。
この記事で扱うのは「変数Aから参照しているエレメントにinsertBeforeすると変数Bから参照しているエレメント側でも子要素が増える」という意味での「同じ」エレメントかどうかを判定する基準を用いた判定用関数です。
1.outerHTMLの値が一致する
2.document.bodyからのDOMツリー内ポジションが一致する
3.タグ名が一致する
などなど色々あり、どういう意味で「同じ」ものが必要かによって判定基準を変える必要があります。
この記事で扱うのは「変数Aから参照しているエレメントにinsertBeforeすると変数Bから参照しているエレメント側でも子要素が増える」という意味での「同じ」エレメントかどうかを判定する基準を用いた判定用関数です。
2017年2月21日火曜日
inputエレメントのtype属性はinsertBefore後は変更不可
常識かもしれないけどたまに忘れます。
しかもエラーメッセージも(いつものことですが)エラーの原因とは微妙に噛み合っていないので経験がないと分からない内容ですし。
備忘録としてメモ
しかもエラーメッセージも(いつものことですが)エラーの原因とは微妙に噛み合っていないので経験がないと分からない内容ですし。
備忘録としてメモ
2017年2月20日月曜日
2017年2月19日日曜日
2017年2月18日土曜日
複数のプロパティの値をまとめて変更する独自関数
obj.A = obj.B = obj.C = 1とか、そういうことではなく、例えばdivエレメントのinnerText、style.borderStyle、style.borderWidth…など複数のプロパティに対して個別の値を入れたい場合、この記事のソースを利用すると便利です。
2017年2月17日金曜日
ScriptControlでVBScriptのカプセル化
グローバル領域に影響しない形でVBScriptが利用できることが分かったので、VBScriptでしか利用できない機能をまとめてみました。
※昨日の「JScriptからデストラクタを利用する」もこれで利用できるようにしようとしましたが、ScriptControllを使用した場合はVBScriptとJScriptを跨ぐとClass_Terminateが実行されませんでした。。。
※昨日の「JScriptからデストラクタを利用する」もこれで利用できるようにしようとしましたが、ScriptControllを使用した場合はVBScriptとJScriptを跨ぐとClass_Terminateが実行されませんでした。。。
ラベル:
Administrator,
JScript,
VBScript,
できないこと
2017年2月16日木曜日
グローバル領域を汚さずにvbscriptを併用する
scriptタグを2つ用意して、それぞれのlanguageをvbscript、jscriptとするやり方だと相互にアクセスするものはグローバル領域に宣言しなければいけない…と思っていましたが、ScriptControlというコンポーネントを利用すれば、グローバル領域を綺麗に保ったままにできるようです。
ソースは以下
ソースは以下
2017年2月15日水曜日
JScriptからVBScript経由でデストラクタ利用
ただしVBScriptで「obj = Nothing」を実行した瞬間にobjに入っていたものが解放される…という感じのことはJScriptからは無理でした。
JScriptからは、スクリプト終了時にClass_Terminateを自動実行させることが限界のようです。
色々試して悪あがきして上記の結論に至ったソースは以下。
JScriptからは、スクリプト終了時にClass_Terminateを自動実行させることが限界のようです。
色々試して悪あがきして上記の結論に至ったソースは以下。
2017年2月14日火曜日
VBScriptではClass_Terminateが利用できる。。
でも私の大好きなJScriptでは利用できないようです。悲しい。MSからエコヒイキされているVBScriptが羨ましくてたまらない。
Class_Terminateとは、クラスが解放される時に発生するイベントです。
以下のソースを実行すると、二つのExcelが起動して、VBScriptから起動された方のExcelだけが、スクリプト終了時にQuitされます。
Class_Terminateとは、クラスが解放される時に発生するイベントです。
以下のソースを実行すると、二つのExcelが起動して、VBScriptから起動された方のExcelだけが、スクリプト終了時にQuitされます。
2017年2月13日月曜日
Excel用WSFファイルを作成する時に使うサンプル
wshやhtaからExcelをコントロールする際、Excel側で使えるメソッドや定数の値を調べるために「マクロの記録」を使っていますが、利用頻度が高いメソッドや定数を毎回調べるのはムダなので、よく使うものはまとめてみることにしました。
2017年2月10日金曜日
HTAで「少々お待ちください。。」を表示する
できれば待ち時間を作りたくはないけれども、処理の規模が大きくてどうしても待ち時間が生じてしまう場合は「すみませんが、現在全力で処理中ですので少々お時間ください」的な表示を出したい場合があります。
そのような表示を出すサンプルを作成しました。
そのような表示を出すサンプルを作成しました。
2017年2月9日木曜日
HTA画面上にドロップされたフォルダの中身をリストアップする
拡張子がwsfのファイルなら、処理させたいフォルダやファイルをwsfファイルのアイコン上にドラッグ&ドロップすれば、ドロップしたアイテムを引数として与えた状態でwsfファイルを起動できます。
しかしhtaではそれが出来ません。(レジストリを変更すればできますが、できれば触りたくないですし)
次善の策として、HTA画面上にiframeを配置して、そこにドロップされたフォルダのPathを取得してフォルダ内アイテムをリストアップするサンプルを作成しました。
ラベル:
HTA,
iframe,
ドラッグアンドドロップ,
リスト取得
2017年2月8日水曜日
iframeのonreadystatechangeを使う方法
用途・目的
iframeのonreadystatechangeメソッドはxmlHttpRequestなどでよく使われるので用法に関する情報は多数あるけれども、iframeエレメントの参照方法を気を付けないといけない点の説明が併記されていない場合も多いです。
……過去に何度も利用しているので知ってはいたけど正しいやり方を忘れていてハマったので教訓として残しておきます。
……過去に何度も利用しているので知ってはいたけど正しいやり方を忘れていてハマったので教訓として残しておきます。
ラベル:
iframe,
readyState,
サンプル,
できないこと
2017年2月7日火曜日
2017年2月6日月曜日
HTAからPowerShellの機能を利用するサンプル
フォルダ選択ダイアログを表示したくて、できればデフォルト値も設定できるメソッドを利用したいと思いました。その要求にマッチするものがPowerShellで利用できることが分かったので、思い通りに使えるようにするついでにPowerShellをHTAから利用するためのサンプルを作りました。
ラベル:
FolderBrowserDialog,
HTA,
PowerShell,
ps1ファイル
2017年2月1日水曜日
htaのscript内部で複数行文字列を扱う
ブラウザによってはECMAScript6の恩恵を受けてシンプルな書き方をすることもできますが、HTAでは今のところ利用できないので、以下の方法をよく利用してます。
2017年1月26日木曜日
webサーバ上のExcelファイルなどを開く
WScript.ShellオブジェクトのRunメソッドなどに「http://~~/sample.xlsx」などのアドレスを普通に渡すと、まずブラウザが起動して「ファイルを開く?保存する?」の問いかけメッセージが表示されます。

「開く」を選択するとファイルが開き、その前に開かれた空白のページは自動で閉じてくれるけど、、
ちょっとしたことだけど、煩わしいです。
まず問いかけを無くしたい。
そもそもブラウザを起動してほしくない。
……という要求を満たすアイデアを見つけました。

「開く」を選択するとファイルが開き、その前に開かれた空白のページは自動で閉じてくれるけど、、
ちょっとしたことだけど、煩わしいです。
まず問いかけを無くしたい。
そもそもブラウザを起動してほしくない。
……という要求を満たすアイデアを見つけました。
2017年1月19日木曜日
登録:
投稿 (Atom)