2016年11月29日火曜日

前回終了時のウィンドウの位置とサイズを復元するHTA

終了直前のウィンドウサイズと位置をファイルに記録して、次回起動時にそのファイルを読み込んで元のサイズ・位置に戻すサンプルを作成しました。


localStorageの使い方確認を兼ねて個人的な入出時刻記録

2016年11月24日木曜日

htaのウィンドウをアクティブにする方法

HTA内部でWScript.ShellのAppActivateメソッドを実行しても、HTAのウィンドウをアクティブにすることはできませんが、HTAから外部スクリプトを作成して、そちらからAppActivateを実行すればアクティブにできます

アクティブにしたいHTAがシングルインスタンス制限を有効にしても良いならば、上記の方法より短いコードで同様の効果を得る方法がありました。


2016年11月15日火曜日

指定日時に文章画像や実行ボタンなどを表示させるリマインダーアプリ

デスクトップPC(Windows)用リマインダ―アプリです。
一旦予定を立てたら、その予定に従って行動している最中は日時に対して注意を払わなくて済むように(次の行動に移る日時になったら画面上に必要なものが表示されるように)するためのものです。
よくあるリマインダーアプリと違うところは「表示させるものをJavaScriptなどで制御できる」という点です。

2016年11月14日月曜日

任意のエレメントが画面上に表示されるようにScrollTopを調整する関数

用途・目的
スクロール可能なエレメント内部の任意のエレメントが画面に表示されるようにscrollTopを調整する関数
Chromeなどのブラウザで動くかは未確認。htaで使っています。

2016年11月2日水曜日

WebWorkerで作成したサブスレッドよりメインスレッドは37%ぐらい速い

WebWorkerを使うとJavaScriptでもマルチスレッド処理が可能になります。
ただしメインスレッド以外はHTMLエレメントにアクセス出来ないとかActiveXObjectは使えないとか色々制約があります。
制約があってできることが少ないというのは、逆に言えば「シンプルな状態」であり、もしかして、制約がある代わりに処理が高速だったりするのでは!?と思って先日比較テストしましたが、もう少し分かり易いデータが取得できました。


WebWorkerのpostMessageは非同期?

先日サンプルを作成して比較した結果、Workerスレッドの方がわずかに速いという結果になったのですが、数回分の試験データを比較した時に気になった点がありました。

タイトルの通り、postMessageは非同期なのか?ということが気になったので、それをプログラムで動作確認しました。


2016年11月1日火曜日

Excelに画像とファイル名を一括挿入するプログラム

Excelで画像を挿入する時、普通に以下のようにすると



仕上がりは以下のようになりますが



以下のように、「Path & 画像」の形式で並べたものが欲しい時がちょくちょくあります。



手作業で並び替えたりPathを貼るのは大変なので、自動でやってくれるプログラムを作成しました。


2016年10月28日金曜日

contentEditableでリッチテキストエディタ

HTML5では全ての要素でcontentEditableプロパティが使えます。
それを利用して「リッチテキスト」を作成するプログラムを作りました。
JavaScriptが扱える人なら容易に機能を拡張することができます。

何気なく思いついて作ってみたけど、なかなかの拡張性で実用性が高そう。

2016年10月21日金曜日

基数変換

用途・目的
toStringメソッドを使うと36進数までは10進数から変換できます。
37以上を指定すると「引数が不正です」というエラーが出ます。
37以上でも使える基数変換用の関数を作成しました。

2016年10月14日金曜日

共有フォルダ内のファイルやフォルダを、それを保有するPCからZIP圧縮させるスクリプト

LANで接続された2台のPCがあり、片方はPC1、もう片方はPC2という名前だったとします。
PC1はC:\testを共有フォルダとして設定済みで、PC2からはそのフォルダを参照できます。
この時、PC2からPC1の共有フォルダ内のファイルやフォルダを圧縮する場合、普通にやると水面下では以下のような処理が行われます。

1.PC1の共有フォルダからPC2に圧縮対象のデータが全てコピーされる。
2.PC2で圧縮したデータをPC1にコピーする。

合計サイズが小さいとか、ファイルやフォルダが少ない場合はこれでも問題ありませんが、大量のファイルを圧縮したい場合はネットワークでデータをやりとりする分のロスが大きくなってきます。

それを回避するスクリプトを作成しました。


2016年10月13日木曜日

ファイルやフォルダをCAB形式で圧縮するスクリプト

先ほどの記事でCAB形式は使わないことにする、と記載しましたが、その結論に至る問題が発覚したのはこの記事で公開するプログラムを作成した後だったのです。
問題はexpandコマンドだけではないですが、それがクリアになったら、もしかしたら心変わりするかもしれませんし、正常に動作するケースもありますので、一応作ったものを公開します。


expandコマンドにはバグがあると思う

makecabコマンドを使うとCAB形式でファイルを圧縮することができます。
Windowsの標準機能として、コマンドラインから圧縮機能を利用できるなら使いたいと思って少し試してみたのですが、展開用のexpandコマンドが正常に動作しないケースがありましたので履歴として残します。
(将来、このことを忘れて再びmakecabコマンドを使おうとした私が余計な時間を使わずに済むようにするためにも)


PsExecでリモートPCのドライブ空き容量を確認する

PsExecというものを使うとリモートPC上でコマンドを実行することができます。
それを利用してリモートPCに接続されているドライブの空き容量を確認するスクリプトを作成しました。
共有設定しているフォルダが保管されているドライブの空き容量が知りたい時に利用します。


2016年9月16日金曜日

フォルダ内のBMPファイルだけをbmp2png(コマンドライン版)に渡して変換後にBMPだけ削除する

BMP形式の画像ファイルを作成しまくるプログラムを使っています。
その画像について以下の要求がありました。
  ・画質を劣化させずにファイルサイズを小さくしたい
  ・サムネイル表示したい

ZIPなどで圧縮してしまうとサムネイル表示が出来なくなってしまいます。
ZIPファイル内にある複数の画像のうち、最初の画像だけを表示するソフトなどはありますが、今回の用途ではZIPファイル内の複数の画像をすべてサムネイル表示する必要がありました。

BMPからPNGへの変換なら画質劣化がなく、PNG形式ならサムネイル表示が可能なのでbmp2pngというソフトを使って変換することにしました。

ついでに、変換したら元のBMPファイルは削除したいので、プログラムを作成しました。


プログラムが保存されているフォルダのPathを取得する

プログラムが保存されているフォルダに各種情報を保存するフォルダを作成したりする時に使います。
HTAとWSHとで利用できるオブジェクトが異なります。

2016年9月6日火曜日

ウィンドウが非アクティブ状態の時間をカウントするHTA

常にウィンドウをアクティブにしていたいアプリケーションがありますが、文字通り「常に」だと色々と困ることがあるので、数分程度ならアクティブでなくてもOKですが、アクティブではない状態が数分間続いたら、ウィンドウを再起動するなどして再びアクティブにしたいです。

ウィンドウのfocus、blurイベントを検知してカウントするサンプルを作成しました。

2016年9月5日月曜日

指定日時から相対的な日時を取得するプログラム

用途・目的
「2016/10/1と同じ曜日は、今週だと○月×日」を調べたり
「次の1:00は○月×日 1:00」などを調べたいことがあったので、日時に関するプログラムを作成しました。

タスクマネージャでhtaの実行ファイルの名前を分かりやすくする

HTAアプリを多用していると、プロセスの一覧が以下のように「mshta.exe」だらけになってしまうことがあります。どのプロセスがどのアプリなのか判別しやすくなるようにするプログラムを作成しました。

2016年9月2日金曜日

いつかやるメモ

今やらなければいけないことがあって、他のことは保留にする必要がある状況なのですが、その優先事項を進めるために色々調べる過程で見かけた情報が、今回はちょっと関係無い内容だったけど今後役に立つ事例もありそうだと感じました。
時間ができたらテストしたいので思い出せるようにメモ


AppActivateはHTA内部のスクリプトでは動作しない

動作しませんが実行してもエラーは出ません。
それが良いのか悪いのかは分かりませんが、とりあえず外部スクリプトを作成してそちらから実行するようにすれば動作するようです。

以下がサンプルHTAのソースです。


HTAのプロセスIDを取得する方法

以下の関数を利用すると、HTAでも自身のプロセスIDを取得できます。

2016年8月26日金曜日

リテラルの外部化は、もう、してもしなくても良いようです

用途・目的
ループ処理を行う場合、リテラルを外部化すると処理が高速化できる、という記事を数年前に読んだ当時に自分の環境でもテストした結果、確かに効果があったので、それ以来ずっと外部化していたのですが、同時に「処理系が賢くなれば、リテラル最適化は処理系が勝手にやれる筈…変数を使うやり方は余計な宣言がある分、逆に遅くなってしまうのでは?」とも思っていました。
気にするほどの差ではないことは経験的に分かっていましたが、気になるタチなので確認してみました。

結論としては、現代のブラウザやHTAではリテラルを外部化してもしなくても速度は変わらないようです。

下記ソースのループ1は普通のループ処理で、ループ2は外部化したループ処理です。
ソース
サンプル


chrome52.0.2743.116の結果



ie11.0.9600.18426の結果



htaの結果


配列の要素0番目からlength-1番目までを処理する関数

用途・目的
配列の要素0番目からL-1番目までを処理するループの使用頻度が高いです。
ループをネストする際、添え字を扱う変数の名前でトラブルが起きがちです。

以下の関数を利用すると
・for(var i=0,L=arr.length;i<L;i++){~}という文章をほんの少し短くかけます。
・添え字を扱う変数名の重複を避けられます。

ただし、以下の問題があります。
・break labelができない。(私はほぼ使わないので関係ありませんが。。)

ちなみに、for(var i=0;i<arr.length;i++){~}だとlengthの長さの読み込み回数が増えるため、速度が遅くなります。

2016年8月25日木曜日

WSHやHTAでプログラムを作成する時によく使う定型文

ファイルの入出力やリストの取得などを行う独自関数は利用頻度が高く、かなり使いまわしています。そういう便利で大事なものを、バックアップのためにもまとめてみました。

2016年8月10日水曜日

コメントの行数をカウント

プログラムを作るときは出来るだけシンプルにしよう、と思っています。
行数はシンプルさの簡易的な指標になります。
しかし、分かりやすくするためにコメントを沢山書くと、その分行数が増してしまいますので、行数の増加が「コメントが増えた」ことによるのか「プログラムが長くなった」なのかが分からなくなります。
あくまで簡易的な指標でしかありませんが、コメントとプログラムの行数が修正前後でどのように変化したのか確認したいと思いました。
以下のテキストエリアにプログラムを貼りつけるとコメントなどの行数をカウントします。
コメント行として判定するのは「//」で始まる行に限定していますのでJavaScript専用です。
「/**/」とかは考慮しません。あくまで簡易的なものなので…


2016年8月6日土曜日

ファイルを復元するソフトを比較

SanDiskのSDカードを購入しました。
購入者特典として、有料の復元ソフトが1年間利用できるというライセンスがついていました。
先日作成した埋め尽くす.htaによって抹消したつもりのデータは無料の復元ソフト(Puran File Recovery)では復元できないことを確認済みですが、有料のソフトでも復元できないのか、確認してみました。


2016年8月5日金曜日

ファイルにタグを付けて管理するソフトを改良した

先日公開したtags.wsfを数日間、自分で使いこんでみて、使い勝手を良くするためのアイデアがいくつか浮かんだので、それを反映したものを作成しました。
tags.wsfはドラッグ&ドロップで使うことを基本としていますが、今回作成したものはキーボードでの操作を前提とした設計になっていて、tags.wsfのバージョンUP版という位置づけではないのでtags.wsfのソースは変更していません。


2016年8月3日水曜日

HTAでファイルを選択するウィンドウを開く

昔は(セキュリティの都合で?)出来なかったような気がしますが、今は出来るようです。
確認した環境はWindows7pro SP1 32bit、IE11.0.9600.18376

以下のようなウィンドウをプログラムから任意のタイミングで開けます。

showModalDialogで入力用ウィンドウを表示する

メインウィンドウとは別で小さいウィンドウを表示して、その小さいウィンドウに何か入力するか閉じるかしないとメインウィンドウを操作できない状態にするサンプルを作成しました。


2016年7月29日金曜日

tags.wsfの動作速度を確認

昨日公開したtags.wsfではdirコマンドでファイルを検索しています。
プログラム作成前は「Windows7の検索機能はわりと速い印象だから検索でファイル特定する処理は実用的な速度で動作するだろう」と思っていました。
検索機能とは、以下のようなヤツのことです。



実際にどれくらいの速度で動作するのか確認しました。

2016年7月28日木曜日

タグでファイルやフォルダを管理するソフト

ブログの記事をラベルで分類してみたら、ちょっと便利な気がしました。
ローカルのファイルやフォルダも同じように分類できたら便利かも?と思いました。
タグで分類するEvernoteは一時期(今も?)流行してたと思います。
そういうことができるソフトがあるのでは、と検索してみましたが、既存のソフトにはそれぞれ一長一短あるようです。

管理対象のファイルそのものには何も手を加えずに、ファイルを移動しても対応できるタグ管理ソフトが欲しいと思い、作りました。

2016年7月27日水曜日

ExcelVBAでファイルの一覧を取得する方法の速度を比較

Excelでファイルの一覧を取得する方法はいくつかあります。ソースのシンプルさを考えるとDir関数一択ですが、速度的にはどうなのか、試してみました。


2016年7月26日火曜日

selectタグの選択肢の中から任意の文字列を含むoptionを探すブックマークレット

セレクトボックスの項目数が多すぎて、選択したい項目を見つけ出すのに苦労することがあります。

任意の項目の先頭文字列が分かっていればセレクトボックスを選択した状態でキーボードから先頭文字列を入力すれば良いのですが、そのテクニックは先頭文字列が分からない場合は使えません。

わりと困っているのでブックマークレットで解決することにしました。

2016年7月9日土曜日

ローレベル バックアップ.htaを作成した

まだ作成中ですが…最近、HDD内のデータを完全に消去するとか逆に復活するとかいう話がありましたが、今度はデータを維持したいという話がありました。
世の中にはRAIDなど、色々な手段がありますが、利用するには事前に勉強や検証などが必要だったりします。

どうせ手間をかけるのなら、後で自分のやりたいように処理を変えられるやり方で、最低限のことが出来ればとりあえずOKかなと思い、今こんなの作ってます。

※2016/07/12追記:ちょっと色々と忙しくなってしまい、あまり進んでませんが、とりあえずバックアップの方はサブフォルダにも対応しました。テスト機能はまた後日。

※2016/07/20追記:テスト機能も作成しました。自動化するか悩んでます。しばらく使ってみてから必要なら改良します。

2016年6月30日木曜日

社内webにアップロードするファイルからネットワークドライブ上のファイルにリンクする

先日「ドラッグ&ドロップされたファイルからハイパーリンクを作成する」というサンプルを作成しましたが、このサンプルが出力したPathが使えるのは「コマンドを指定して実行」画面や


エクスプローラのアドレスバーなどです。



サンプルで作成したハイパーリンクをWordファイルなどに貼りつけることは可能ですが、そのWordファイルが「http://~」で始まるアドレスに移動した場合、そのリンクは無効になってしまいます。



「http://~」で始まるアドレスに移動する場合は、ハイパーリンクのリンク先アドレスを少し変える必要があります。


2016年6月29日水曜日

WebWorkerでナンプレを解くサンプルを作成しました

WebWorkerの利用例として適切なテーマを模索中。
そこそこの計算コストが必要でマルチスレッドにも向いている……と思いナンプレを選んでみましたが、作ってみたら25x25でもサブスレッド1つで2秒で解けちゃいました。
捨てるのも勿体ないので公開します。


2016年6月27日月曜日

2016年6月24日金曜日

WebWorker使用時のメインスレッドとサブスレッドの速度比較

WebWorkerを使うとJavaScriptでもマルチスレッドな処理ができます。
ただし、メインスレッドではdocumentエレメントなどのDOMにアクセスできますが、サブスレッド側からはDOMにはアクセスできません。アクセスしようとするとエラーになります。他にもActiveXObjectなどが使えないなど、サブスレッド側には色々な制約があります。
そのため、サブスレッド側でできることは非常に限られていて、使いどころがあまりないです。。

しかし、ふと思ったのですが「様々な機能をそぎ落として基本的なことしかできないようになっているスレッドは、メインスレッドより高速な処理が可能なのでは?」とデメリットがメリットに転じる可能性を検証したくなりました。


無効なPathの、有効な部分を調べるプログラムを作成した

メールなどで「○○のデータを下記Pathに保存しました」という連絡を貰うことがあります。
メールに記載されているPathをコピーして「Win + R」で「ファイル名を指定して実行」を呼出し、Pathを貼りつけてエンターキーを打つと、くだんのファイルが開く…と思いきや開かず以下のようなメッセージが出ることがあります。



2016年6月23日木曜日

ネットワークドライブ上で動作する簡易的な伝言板

テキストファイルを使った簡易的な伝言板を作成しました。
起動中は定期的にファイルが読み込まれて、常に最新の情報が表示されます。
伝言板の画面上でテキストを編集すると、即座にファイルに反映されます。(ファイルを選ぶ、開く、保存などの手間を省略しています)
プログラムも出力ファイルもすべてがメモ帳で表示・編集可能なので自由に改造できます。


2016年6月17日金曜日

cipherコマンドでドライブ内のデータを完全に削除する

ファイルやフォルダを削除しても運が良ければ復元できます。誤って削除してしまった場合には復元できた方が良いのですが、機密情報の入っているHDDを廃棄したい場合は復元できてしまっては困ります。HDDに入っていたものを復元できないようにするためにcipherというコマンドが利用できるのですが、これは使用する上で色々と注意が必要です。
今回はその注意点について解説します。(次の記事でそれを気にしなくて良いサンプルを公開します)
2016/06/17追記:ストレージの廃棄を目的としてcipherを実行する場合に必要な下準備からcipher実行までを自動化するサンプルを作成しました。
2016/07/04追記:記事末尾にも追記しましたが、cipherで処理したHDDからでも復元できるソフトがあるようです。。
2016/07/06追記:cipherに比べて非常に時間がかかりますが復元ソフトで元のファイルを取り出すことができない状態にすることができました。記事末尾に詳細を追記しました。
2016/07/07追記:アロケーションユニットサイズを大きくすることで、高速に埋め尽くすことが出来ることを確認しました。埋め尽くすためのプログラムを公開しました。
2016/07/13追記:埋め尽くす.htaのソースを修正しました。(処理中断ができるようにした。処理終了or中断時に、WSFファイルを削除するようにした。空き容量が0になったらHTA側も停止するようにした)

2016年6月15日水曜日

ドラッグ&ドロップされたファイルからハイパーリンクを作成する

フォルダやファイルのPathをメールに添付する時に、単純な文字列ではなくハイパーリンク化すると、相手は「文字列をコピー → Win + R → 貼りつけ → Enter」などの手間なく、クリックするだけで開けるようになりますが、ハイパーリンクを作成する方法はメールソフトによっては少し面倒なやり方だったりします。その煩わしさを回避するためのサンプルを作成しました。Wordなどでもハイパーリンクの作成がラクになります。

※2016/06/17 21:00追記:ウィンドウサイズを内容に合わせて(6/17 1:00更新時よりも更に)適切なサイズになるように修正しました。あと、多重起動した場合は後始末のところでエラーが出てしまっていましたが、そちらも修正しました。

2016年6月14日火曜日

フォルダやファイルの名前に含まれる特定の文字列を変換する.wsf

WSFファイルにドラッグ&ドロップされたアイテムの名前に特定の文字列が含まれていたらリネームするサンプルを作成しました。フォルダを指定した場合はフォルダ内のサブフォルダ、ファイルをシラミツブシに判別&変換していきます。


2016年6月13日月曜日

共有フォルダを追加、削除するサンプル

WSHのMSDNには共有フォルダを追加するサンプルがありますが、説明が難解でサンプルも長くて難しいです。VBScriptですし。
コマンドを使ってもっとシンプルに実行するサンプルを作成しました。

2016年6月11日土曜日

メロンとメロンパンみたいなもの

プログラミングをするのが本業ではない職場で私がJavaScriptを使っている時に、上司から「君が作っているJavaのファイルについて教えて欲しいんだけど」と言われたことがありました。

私はJavaは使ったことがありません。よく知らないです。

Javaと比べるとJavaScriptは変数の型が動的だとか引数は基本的に省略可能だとか色々違う点があるだろうと思い、そんな感じで上司には説明したのですが、理解を得ることができませんでした。

上記の出来事は数年前の出来事で、今は職場も上司も違いますが、当時の上司にはタイトルのように説明したら分かりやすかったかなと今さら思いました。

名前は少し似てますし見た目も若干共通するところがありますが、モノとしては全く別物です。と。

2016年6月10日金曜日

ADO警告画面が出ないスクリプトファイルのサンプル

HTAでMySQLなどを利用したい場合、ADODB.Connectionを使用しますが、これはOpenメソッドを実行するたびに以下のようなメッセージが表示されます。


このメッセージが表示されないようにするサンプルを作成しました。


タスクマネージャでwshの実行ファイルの名前を分かりやすくする

WSFファイルを普通に起動すると、タスクマネージャのプロセスタブに表示されるイメージ名は「wscript.exe」になります。
使用するファイルが一つ二つ程度なら問題ありませんが、さまざまな用途のファイルを使用してバックグラウンドでループ実行するようなものを使い始めるとタスクマネージャの表示がこんな感じになってきます。


2016年6月9日木曜日

MSDNの「エクスポート」を使ってみた

scd56jp.exeがダウンロードできなくてショックだった、けどMSDNのページには「エクスポート」という機能が付いてるのに気が付いた。
コレを使えば同等の情報をオフラインで閲覧できるようになるのでは!と思って試した。
結論から言うと、頑張れば出来そう。でもめんどい。


script56.chmがダウンロードできない

私はWSHなどでスクリプトを利用する際、[Microsoft Windows スクリプト テクノロジ]のページを利用しています。
嘘です。上記サイトと同じ内容を持つヘルプファイルを使用してます。
よく使うのでデスクトップに保存してます。

iframeを使って任意のページをスクリプトから利用する

iframeに任意のページを表示して、ページ内の情報を利用したりエレメントを操作するサンプルを作成しました。
色々と問題が起きやすい手法ですが、一時的な対応としては使えます。

2016年6月8日水曜日

バイナリデータを読み書きするサンプル

バイナリ形式でファイルを読んだり書いたりできます。
このサンプルファイルに適当なファイルをドラッグ&ドロップすると、そのファイルと同じフォルダに「(ファイル名)_書き換え後」というファイルを作成します。
書き換えたい場合は一番下の実行結果の画像を参考にして、書き換えたい部分の特定&リプレイスして、改行コードを削除してからbin_write関数に渡してください。

2016年6月6日月曜日

ファイル名をもとにファイルをフォルダ分けするスクリプト

フォルダ内のファイルを一定のルールでフォルダ分けしたい場合があります。
ファイル数が多すぎるフォルダは取扱いが色々と面倒ですし。
エクスプローラの検索フィルターを併用して、手作業で何とかなる程度のファイル数ならプログラムは不要ですが、グループの数が多すぎる場合はプログラムを使った方がラクです。
dirコマンドによるファイルのリスト取得を使ってフォルダ分けするサンプルを作成しました。

[JSON形式?]オブジェクトをテキストに変換する[evalで復元可能]

数値や文字列、関数や配列など様々な型のプロパティを持つオブジェクトをテキストに変換するプログラムを作成しました。
作成したテキストをeval関数に渡すと元通りのオブジェクトが作成できます。
ただし以下のような、循環参照を含むオブジェクトを渡すと無限ループしてしまいます。

[循環参照を含むオブジェクトの例]
  obj = {a:0, b:1}
  obj.c = obj

ブックマークレットと複数行テキストを双方向に変換するJavaScript

ブックマークレットは1行にまとめられていて、文字数にも制限があるため処理に無関係な空白は基本的にありません。
そのため編集の難易度は普通のプログラムよりも高いです。
少しでも見やすく、編集しやすい状態にするためのサンプルを作成しました。
また、複数行のテキストから余分なスペースや改行を取り除くサンプルも作成しました。

ユークリッドの互除法で最大公約数を求めるJavaScript

X,Y軸の長さが決まっていて幾つで分割すると縦横の比が等しくなるのか知りたい時などに使用します。
数値1
数値2


2016年6月3日金曜日

dirコマンドによるファイル(フォルダ)のリストを取得する

フォルダの中にあるフォルダやファイルのリストを使って何かの処理を行うプログラムを作る時があります。そういう時に使うサンプルを作成しました。

FFmpegでムービーファイルをH265形式に変換するスクリプト

FFmpegをダウンロードして、コマンドラインで「ffmpeg.exe -i C:\movie\h264.mp4 -vcodec libx265 C:\movie\h265\h264_変換済み.mp4」などと入力すれば、手持ちのムービーファイルをh265形式に変換することができ、画質を維持してファイルサイズを半分以下にすることができます。
しかし1ファイルごとにコマンド入力するのは面倒です。
ドラッグ&ドロップで実行できるようにするスクリプトを作成しました。
<job>
<script>
fs = new ActiveXObject('Scripting.FileSystemObject')
shell = new ActiveXObject('WScript.Shell')
ffmpeg = fs.GetParentFolderName(WScript.ScriptFullName)+'\\ffmpeg.exe'
// WScript.Echo(ffmpeg)
arg = WScript.Arguments
if(!arg.length){
WScript.Echo('変換するファイルをD&Dしてください')
WScript.Quit()
}
fun = function(str){return str.indexOf(' ')>0 ? ('"'+str+'"') : str}
path_h265 = fs.GetParentFolderName(arg(0))+'\\h265'
if(!fs.FolderExists(path_h265)){ fs.createFolder(path_h265) }
for(i=0,L=arg.length;i<L;i++){
path = arg(i)
pathOut = path_h265+'\\'+fs.GetBaseName(path)+'.mp4'
shell.run(ffmpeg+' -i '+fun(path)+' -vcodec libx265 '+fun(pathOut), 1, true)
}
</script>
</job>

2016年6月2日木曜日

ExcelVBAでファイル選択画面(複数選択可)を表示する

ExcelVBAには「GetOpenFilename」というメソッドがあり、それの使用例がヘルプにも記載されています。しかしその使用例は単一ファイルを選択する場合に限って有効であり「MultiSelect」引数をtrueにしている場合はエラーが発生します。
「MultiSelect」をtrueにした場合でもエラーが出ないサンプルを作成しました。


アドセンス側でページビューがカウントされ始めました

以前から、ブロガーの管理画面で「投稿」タブを見ると、各記事が数回程度表示されていることになっていましたが、昨日まではアドセンスの管理画面側では「ページビュー:0」になっていました。

2016年6月1日水曜日

WSHとは、Windowsでよく繰り返す作業の手間を減らすツール

使用するのに必要なものは基本的にはWindowsだけです。
メモ帳で作成、編集ができます。
例えば、Excelでファイルを読み取り専用で開きたい場合、以下の文字列を
<job>
<script>
excel = new ActiveXObject('Excel.Application')
excel.Visible = true
excel.Workbooks.Open(WScript.Arguments(0) , 1 , true)
</script>
</job>
view raw sample.wsf hosted with ❤ by GitHub

文字数を表示する

SEO的に「タイトルは32文字が最適」らしいです。

SEOで適切なページタイトルタグの付け方 Google検索結果の文字数(長さ)、キーワード数
タイトルタグ(title)のSEOに最適な文字数や記入方法


文字を数えるのが面倒なので入力中の文字列の長さを表示するサンプルを作成しました。

[アドセンス]Bloggerの同じアカウントで運用する別ブログへの広告貼りつけ

5/30に別ブログの管理画面で、「収益」タブから「Adsenseの利用条件」をクリックして





「SIGN UP FOR ADSENSE」をクリックして





「はい」





以降は青いボタンを押していけば申請手続きは済みました。





その後、広告の表示設定が変更できるようになり





5/31に広告が表示されるようになりました。





メールでの連絡は無し。
ついでに広告ユニットがいつの間にか整理されてました。

2016年5月31日火曜日

[WSH]Excelファイルを読み取り専用で開く

「読み取り専用」でExcelで開くサンプル。
起動中のExcelがあれば、それで開く。なければ新しいExcelを起動して、そのExcelで開く。
<job>
<script language=JScript>
fs = new ActiveXObject('Scripting.FileSystemObject')
arg = WScript.Arguments
if(!arg.length){WScript.Quit()}
try{var excel = GetObject('','Excel.Application')}catch(e){var excel = new ActiveXObject('Excel.Application')}
excel.Visible = true
for(i=0,L=arg.length; i < L ;i++){
excel.Workbooks.Open(arg(i) , 1 , true)
}
</script>
</job>

[WSH]FTPコマンドファイルを作成・実行

FTPコマンドファイルを作成して、FTP起動オプションでそのファイルを指定して処理してもらうサンプル。
転送を自動化した場合、コマンドファイルをいくつか抜き取り確認して内容に問題が無いか見るときなどに使用する。
<job>
<script>
fs = new ActiveXObject('Scripting.FileSystemObject')
Read = function(p){try{var r=fs.OpenTextFile(p),v=r.ReadAll();r.Close();return v}catch(e){alert('Read Err.\n'+p)}}
path = fs.GetSpecialFolder(2) + '/' + fs.GetTempName() + '.ftp'
cmd = [
'open 192.168.1.1',
'USER',
'PASSWORD',
'binary',
'cd /var/www/doc',
'lcd "\\\\PC1\\ABC"',
'put ABCDE.csv',
'quote site chmod 755 ABCDE.csv',
'close',
'bye'
].join('\r\n')
ws = fs.CreateTextFile(path)
ws.Write(cmd)
ws.Close()
// ファイルの内容が出力内容と一致するまで待たないと、コマンドファイルが中途半端な状態で次の処理に進んでしまう場合があるので
// 内容が一致するまでループする。
while(true){
WScript.Sleep(1000)
if(Read(path)==cmd){break}
}
shell = new ActiveXObject('WScript.Shell')
shell.Run('%windir%/system32/ftp -s:"' + path + '"' , 0)
</script>
</job>

2016年5月30日月曜日

アドセンスの有効化が完了した

5/28 AM7時頃に以下のメールが来て



それまでは以下の表示だったのが



こんな感じになりました。



アドセンスの広告ユニットの画面にある「ステータス」の表示は作成直後から現在まで、「新規」のまま変わらず。


2016年5月27日金曜日

FTPサーバからファイルをダウンロードするWSF

コマンドファイルを作成してftp.exeに渡すという手もあるけど、まずはWSHのみでダウンロードするサンプル。
列挙されるアイテムは全てファイルという前提になってます。フォルダがある場合は想定していません。
<job>
<script>
fs = new ActiveXObject('Scripting.FileSystemObject')
Write = function(path,v){with(fs.CreateTextFile(path)){Write(v);Close()}}
Write8 = function(path,v){with(fs.OpenTextFile(path,8,true)){Write(v);Close()}}
d = new Date()
二桁 = function(v){var t='0'+v, L=t.length; return t.slice(L-2,L)}
path = fs.GetAbsolutePathName([d.getFullYear(),二桁(d.getMonth()+1),二桁(d.getDate())].join('-'))
if(!fs.FolderExists(path)){fs.createFolder(path)}
// FTP接続でパラメータファイルをダウンロードする
shell = new ActiveXObject('Shell.Application')
remoteF = shell.NameSpace('ftp://USER:PASSWORD@192.168.250.1/home/parameter')
localF = shell.NameSpace(path)
for(i=0,L=remoteF.items().count; i<L ;i++){
アイテム = remoteF.items().item(i)
名前 = アイテム.Name
サイズ = アイテム.Size
localF.copyHere(アイテム)
カウント = 0
// localに「名前」のファイルが出来るまで待つループ
while(!fs.FileExists(path+'/'+名前)){
WScript.Sleep(500)
if(++カウント>100){
// 100回カウントしてもダメなら諦める
Write8(path+'/log.txt','timeout\t'+名前+'\r\n')
break
}
}
// ダメだった場合は次のファイルのトライに移る
if(!fs.FileExists(path+'/'+名前)){continue}
while(true){
ファイル = fs.GetFile(path+'/'+名前)
if(ファイル.Size==サイズ){break}
if(++カウント>100){
Write8(path+'/log.txt','timeout\t'+名前+'\tサイズ不足\r\n')
break
}
}
}
</script>
</job>
view raw FTP.wsf hosted with ❤ by GitHub

2016年5月26日木曜日

各PC、各ユーザのログオン状況を確認する

誰がどのPCを利用中で、どのPCが空きなのか分かるようにしたい時に使用するプログラム。
以下のプログラムを、状態把握したいPCのグループポリシーに登録すると履歴が残るようになります。
<job>
<script>
fs = new ActiveXObject('Scripting.FileSystemObject')
net = new ActiveXObject('WScript.Network')
d = new Date()
path = fs.getParentFolderName(WScript.ScriptFullName)
ws = fs.OpenTextFile(path + '/履歴.txt', 8, true)
モード = WScript.Arguments(0)
二桁 = function(s){s='0'+s;return s.slice(s.length-2,s.length)}
ws.Write(
[
[d.getFullYear(),二桁(d.getMonth()+1),二桁(d.getDate())].join('/')+' '+[二桁(d.getHours()),二桁(d.getMinutes()),二桁(d.getSeconds())].join(':'),
モード,
net.userName,
net.computerName
].join('\t')+'\r\n'
)
ws.Close()
pathPC = path+'/computerName/'+net.computerName+'/'+net.userName
pathUser = path+'/userName/' +net.userName +'/'+net.computerName
makeFolders = function(path){
var arr=path.replace(/\\/g,'/').split('/'), i=1
if(!arr[0] && !arr[1]){i=4}
for(var L=arr.length;i<L;i++){
if(!fs.FolderExists(arr.slice(0,i).join('\\'))){
fs.CreateFolder(arr.slice(0,i).join('\\'))
}
}
}
switch(モード){
case 'ログオン':
makeFolders(pathPC +'/1')
makeFolders(pathUser+'/1')
break
case 'ログオフ':
fs.FolderExists(pathPC ) ? fs.DeleteFolder(pathPC ) : 0
fs.FolderExists(pathUser) ? fs.DeleteFolder(pathUser) : 0
break
}
</script>
</job>
1.グループポリシーを開く


2.ユーザーの構成 → Windowsの設定 → スクリプト(ログオン/ログオフ)


3.「編集」ボタンをクリック


4.「スクリプト名」にスクリプトのUNCパスを入力する。パラメーターは「ログオン」の「スクリプトの編集」画面では「ログオン」を入力。「ログオフ」の方は「ログオフ」にする。


以上で、次回のログオン・ログオフ時から以下のような履歴が残ります。
[履歴]
スクリプトと同じフォルダ
├ computerName
| ├ PC1
| | └ User1
| └ PC2
└ userName
  ├ User1
  | └ PC1
  ├ User2
  └ User3
上記の場合、PC1はUser1がログオン中(「ユーザーの切り替え」でユーザー選択画面になっていてもこの状態)
PC2は誰もログオンしていない。
User1はPC1にログオン中。リモートデスクトップなどでPC2にログオンすれば、userName\User1の下にPC2のフォルダが作成される。
User2、User3はどのPCにもログオンしていない。
User1がPC1からログオフすると、computerName\PC1\User1は削除される。

2016年5月25日水曜日

[WSH]ZIPファイルを作成して、その中にファイルやフォルダを入れる[JScript]

ZIPファイルを作成して、その中にファイルやフォルダをコピーするプログラムのサンプル。
MS系のScriptingの神とも呼ばれる吉岡 照雄さんの作品を参考にさせていただきました。
なぜそのまま利用させてもらわないのかと言えば、私はVBScriptが苦手で、出来るだけJScriptを利用したいからです。。

最初にZIPファイルを作成してますが、何故コレでZIPファイルが出来るのか意味不明です。。

「アイテム数」はコピー完了確認用ループに入る前に毎回取得してますが、「for(i=0」のところでアイテム数=0にして、そのあとはインクリメントで完了確認ループ中のみ取得するようにした方が高速になるのでは?とか、

何かのトラブルでコピー完了確認のループが終わらない場合はフリーズしちゃう…とか、プログラムを見直して気になる点はありますが、今までコレを利用していて速度が気になったりフリーズしたりということが無かったので、そのままにしときます。


※右記のOSでのみ動作確認済み:Win7、XP
<job>
<script>
arg = WScript.Arguments, L=arg.length
if(!L){WScript.Echo('引数を指定してください'); WScript.Quit()}
fs = new ActiveXObject('Scripting.FileSystemObject')
shell = new ActiveXObject('Shell.Application')
Write = function(path,v){try{with(fs.CreateTextFile(path)){Write(v);Close()}}catch(e){WScript.Echo('Write Err.\n'+path)}}
getNS = function(p){return shell.NameSpace(p)} // NameSpace = shellオブジェクトで扱う「Folder Object」を取得するメソッド
getPFN = function(p){return fs.GetParentFolderName(p)}
// ZIPファイル作成
path0 = arg(0)
pathZIP = getPFN(path0).replace(/([^\\\/])$/,'$1/')+fs.GetBaseName(path0)+'.zip'
if(fs.FileExists(pathZIP)){
WScript.Echo('下記PathにZIPファイルを作成しようとしましたが、同じPathのファイルが既に存在しているため、処理を中断します。\n\n'+pathZIP)
WScript.Quit()
}
Write(pathZIP,'PK'+String.fromCharCode.apply(null,'56000000000000000000'.split(''))) // ← ZIPファイルのヘッダー
// ZIPファイルのFolderObjectを取得する
zip = getNS(pathZIP)
// ZIPファイルの中にファイル(フォルダ)をコピー
for(i=0;i<L;i++){
file = getNS(getPFN(arg(i))).ParseName(fs.GetFileName(arg(i)))
// ParseName = shellオブジェクトで扱う「Folder Item Object」を取得するメソッド。
// fs.GetFileで取得できるものとは別物っぽい。
// GetFileで取得したものをCopyHereに渡してもエラーにはならないが、ZIPファイルには何も入らなかった。
// zipファイルにアイテムを追加する前のアイテム数を取得しておく。
アイテム数 = zip.Items().Count + 1
zip.CopyHere(file)
// ZIPファイル内のアイテム数が増えるまで待機してから次に進まないと、取りこぼしが生じる。(3つのファイルを入れたつもりが2つしか入ってないとか)
while(zip.Items().Count<アイテム数){WScript.Sleep(1)}
}
</script>
</job>
view raw zip.wsf hosted with ❤ by GitHub

2016年5月24日火曜日

[WSH]Administratorsグループのメンバーをリストアップ

使用中のPCでAdministratorsグループに登録されているメンバーを表示するサンプル。
これなんてJScriptの存在意義あるの?と思いそうなサンプルだけど、これに関してはJScriptで出来るのはコレだけだったという記録のために入れてあります。

VBScriptが苦手なのでできれば使いたくなくて、JScriptだけ使いたいのですがGetObjectもFor EachもVBScriptでなければ動作しなかったんです。。
JScriptではfor inとかEnumeratorとか使ってみたんですが、駄目でした。

VBScriptはWindowsに対して特権がある…けど好きになれません。
<job>
<script language=VBScript>
function a()
' JScriptとVBScriptではGetObjectで得られるものが違うっぽい。
' JScriptでGetObjectしたのを引数で渡すとMembersが無いエラーになる。
Set objGroup = GetObject("WinNT://" & objNet.computerName & "/Administrators")
For Each objUser in objGroup.Members
str = str & objUser.name & vbLF
Next
a = str
end function
</script>
<script language=JScript>
objNet = new ActiveXObject('WScript.Network')
WScript.Echo(a())
</script>
</job>
view raw admin.wsf hosted with ❤ by GitHub

WebWorkerをHTAで利用する

HTAでもマルチスレッドで処理できる。
WebWorkerを使ううえでの注意点(別スレッドからはDOMにアクセスできないなど)はブラウザで使用する場合と同じ。

「C:\app\WebWorker.hta」のようなローカルPathから起動された場合はtempフォルダ内に外部スクリプトを出力して、それがWorker用のスクリプトファイルとして利用される。

「\\PC名\共有フォルダ\WebWorker.hta」のようなPathから起動された場合はBlobが上記の代わり利用されます。

Blobは作成元のHTAファイルの文字コードに関係なく、(おそらく)UTF-16になるため、HTAファイルもUTF-16(メモ帳でいうところのUnicode・・・)で保存しておかないと、実行時に文字化けしてエラーが出ます。

ローカルPathから起動された場合はFileSystemObjectのCreateTextFileでスクリプトファイルを出力するので、そのファイルと作成元HTAの文字コードが一致していれば問題ないので何でも良いですが、Blobを使う状況になっても文字コードを変えなくても良いように、HTAファイルもUTF-16で保存してください。(下記サンプルソースではCreateTextFileの第3引数をtrueにしてスクリプトファイルもUTF-16で出力していますので、HTAファイルもUTF-16にしないとエラーになります)

<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
</head>
<title>web worker</title>
<body>
UNCパス上では動く。<br>
ローカルでは動かない(new Workerのところでsecurity errorになる)<br>
<a href="http://outofmem.tumblr.com/post/95984469624/html5javascriptweb-workers%E3%81%A8%E6%88%A6%E3%81%86">同一生成元ポリシーに違反してしまう?</a><br>
<br>
try~catchでBrobのがエラーになる場合はtempファイル作成して読ますようにしたらローカルでも動いた。
<script type="text/jscript">
function getFunctionBody(fun){
return fun.toString().trim().match(/^function[\s\w]*\([\w\s,]*\)\s*{([\w\W]*?)}$/)[1]
}
function fun2Worker(fun){
var str=getFunctionBody(fun), blob=new Blob([str], {type:'text/javascript'}), url=URL.createObjectURL(blob), worker
try{worker = new Worker(url)}
catch(e){
// Workerに渡すアドレスは同一生成元ポリシーを守らなければいけない。
// 変数urlの中身は「brob:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX」のランダムな文字列
// 呼び出し元ファイルのアドレスがローカルのものなら、ローカルPathしか渡せない。
var fs=new ActiveXObject('Scripting.FileSystemObject'), path=fs.getSpecialFolder(2)+'/'+fs.getTempName()+'.js', ws=fs.CreateTextFile(path, true, true)
ws.Write(str)
ws.Close()
worker = new Worker(path)
}
return worker
}
function abc(t){return t+'1'}
worker = fun2Worker(function(){
// ワーカー側スコープ
onmessage = function(e){ postMessage(abc(e.data)) }
function abc(t){return t+'0'}
})
worker.onmessage = function(e){
confirm(abc(e.data))
}
worker.postMessage('aaa')
</script>
</body>
</html>
view raw WebWorker.hta hosted with ❤ by GitHub

HTML5とHTA:Applicationタグの併用

HTML5モードだとHTA:Applicationタグが無効になる。
そのためiconなどが設定できなくなるが、ラッパーを使用すれば併用できるようになる。
※ただし画面偏移可能になってしまうのでhta内部でリンクをクリックしたり、HTML5のD&D機能を使うつもりで画面上にファイルを入れると画面偏移してしまう。
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="refresh" content="0;URL=中身.hta">
<HTA:APPLICATION
NAVIGABLE="yes"
/>
</head>
</html>

ホスト専用のアカウントになりました。。

昨夜のうちにアドセンスでの審査が行われたらしく、本日AM1:00頃に審査完了連絡メールが届いていました。

「ホスト専用」については下記参照ください。
http://links-creations.com/monetize/hosted-account/


実際にどんな画面が表示されて、それになっていることを知ったのかを文章ではなく画像で説明したい…と思いますが、利用規約には以下の記載があります。
9.        秘密保持お客様は、当社の事前の書面による承諾なく Google 機密情報を開示しないことに合意するものとします。「Google 機密情報」には、(a)本サービスに関連する一切の Google のソフトウェア、技術および文書、(b)本サービスとの関係において広告媒体の実績に関連したクリックスルー率その他の統計、(c)本サービスにおけるベータ版機能の存在およびそれに関する情報、ならびに(d)Google により提供されるその他の情報であって、機密であると指定されるか、それが提示される状況において通常機密とみなされるものが含まれます。Google 機密情報には、お客様による本サービスの利用より前にお客様にとって既知であった情報、お客様の責によらず公知となった情報、お客様が独自に開発した情報、または第三者によりお客様に適法に与えられた情報は、含まれないものとします。

サービス利用前から知りうる可能性がある情報であれば載せても問題ないと思いますが、その可能性を探すのが面倒です。それほど機密性の高い情報とも思えないですし、載せてはいけない情報なら連絡をいただいてから削除すれば問題ないと思います。

あと、冒頭で記載したアドレスの記事は「公開日:2016年01月30日」で、アカウント取得後の画面が部分的に公開されていますので、多分大丈夫なのだろうと思います。

というわけで、私が見たメッセージは以下。
※アドセンスのアカウントを有効化した直後だけ表示されていました。現在は表示されていません。


とりあえず…非ホスト型アカウントに変更する方法もあるようですし、今のところはそのままでも問題ないですが……。

2016年5月23日月曜日

AdSenseへの登録が可能になった

5/14にブロガーのアカウントを作成して5/23で「収益」タブの「AdSenseに登録」ボタンが押せるようになりました。半年ぐらいかかるのかと思っていたので驚きの速さです

ブロガーでアカウントを作成してから、ブロガーでのアドセンス利用についてググってみたら「ブロガーからアドセンスに登録するとサイト毎に審査が必要になるから駄目!」という情報を見つけました。
しかし「ブロガーから登録しても特殊なアカウントにはならなかった」という情報もあり、真偽不明です。

私はgoogleのサービスのいくつかを好んで利用していますし、できればブロガーを利用していきたいので、ブロガーからアドセンスのアカウントを作成して、このブログの審査を申し込みました。


どうなるでしょうか…?

ADODBでMDBファイルのテーブル名一覧を取得する

本当は任意のテーブル名の有無を判定する方法が知りたかったんだけど、分からなかったのでテーブル名一覧を取得する方法を選択した。
REFERENCEタグを使うと定数も利用できるらしい。


コチラを参考にさせていただきました。
<JOB>
<REFERENCE object="ADODB.Connection" />
<SCRIPT>
fs = new ActiveXObject('Scripting.FileSystemObject')
pathMDB = fs.GetFile('Database.mdb').path
// ファイルを開く
cn = new ActiveXObject('ADODB.Connection')
cn.Open("provider=Microsoft.Jet.OLEDB.4.0;Data Source="+pathMDB)
// テーブル一覧のレコードセット
rs = cn.OpenSchema(adSchemaTables)
str = 'フィールド一覧\n'
for(i=0,L=rs.Fields.count; i<L ;i++){
str += rs.Fields(i).Name + '\n'
}
str += '\n'
str += 'テーブル一覧\n'
for(; !rs.EOF ;rs.MoveNext()){
str += rs.Fields('TABLE_NAME').Value + '\n'
}
str += '\n'
rs = cn.OpenSchema(adSchemaTables, [null, null, null, "VIEW"])
str += 'ビューのみのテーブル一覧\n'
for(; !rs.EOF ;rs.MoveNext()){
str += rs.Fields('TABLE_NAME').Value + '\n'
}
WScript.Echo(str)
rs.Close()
cn.Close()
</SCRIPT>
</JOB>

FileAPIをHTAで利用するサンプル

FileAPIを使うと、画面上にドラッグ&ドロップされたファイルを扱える。
ただしフォルダは扱えない。下記サンプルにD&Dすると「typeを取得できませんでした」になる。
ファイルであってもPathは取得できないので、単一ファイルの入力に対して何かを返すアプリケーションを作る時だけ使える。

ちなみにHTML5以前のHTMLにiframeエレメントを入れて、その中にHTML5のページを表示してFileAPIを利用する…というのはブラウザでは可能。HTAでは不可。
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
</head>
<title>D&D</title>
<body>
<script type="text/jscript">
if(!window.File){
document.body.innerText = 'FileAPIが使用不能'
}else{
doNothing = function(e){
// e.stopPropagation()
e.preventDefault()
}
document.addEventListener("dragover", doNothing)
document.addEventListener("drop", function(e){
doNothing(e)
var files = e.dataTransfer.files
if(!files){return}
try{document.title = files[0].type}catch(e){return document.body.innerText='typeを取得できませんでした'}
// if(!files[0].type.match('text.*')){return} // hta…application/hta
var R=new FileReader()
R.onload=function(ev){ document.body.innerText=R.result }
R.readAsText(files[0], 'shift-jis')
})
}
// https://msdn.microsoft.com/ja-jp/library/hh673539(v=vs.85).aspx
</script>
</body>
</html>
view raw FileAPI.hta hosted with ❤ by GitHub

HTMLページ内にEval用テキストエリアとボタンを追加

動作テストしながらブックマークレットを作る時に使う。
文字列をコピーしてアドレスバーに貼りつけてエンター押せば実行される筈だけど、貼りつけた時点で「javascript:」の部分が削除されてうまくいかない時がある。そういう時は貼りつけた後に手書きで「javascript:」と入力してからエンター押す。
javascript:void (function(){var d=document,di;d.body.insertBefore(di=d.createElement('DIV'));di.innerHTML='<textarea wrap=off style="width:400px;height:200px;"></textarea><button onclick="eval(this.previousSibling.value)">eval</button>'})()

2016年5月20日金曜日

コントロールパネルでシステムDSNなどを設定していないPCでもMySQLの通信をする

サーバとの接続に必要な情報をプログラム内部に持つタイプのサンプル。
ただしドライバがインストールされていなければいけない。

ドライバのダウンロード方法は下記参照。


<job>
<script>
;(function(){
var con = new ActiveXObject('ADODB.Connection')
execSQL=function(str){
try{ return con.execute(str) }catch(e){}
// conの中身がopen実行前だったり、
// openしてから時間が経って接続が失われている場合は以下へ進む。
// ただし「str」の中身が構文エラーでも下に進むことになる。
// その場合、接続が有効な状態の時は「接続済みです」的なエラーが生じる。
con.open(
'Provider=MSDASQL;'+
'Driver={MySQL ODBC 5.1 Driver};'+
'Server=192.168.1.100;'+
'DATABASE=DBNAME;'+ // ケースセンシティブ
'UID=username;'+
'PWD=password;'
)
return arguments.callee(str)
}
})();
レコード = execSQL("select * from tbl_test where id=123")
str = ''
for(; !レコード.EOF ;レコード.moveNext()){
str += レコード.Fields('password').value + '\n'
}
WScript.Echo(str)
</script>
</job>
view raw MySQL.wsf hosted with ❤ by GitHub

2016年5月19日木曜日

ファイルやフォルダの絶対Pathを取得するWSH

ローカルエリアネットワーク内の、どのPCからでもアクセスできる形式のファイル(フォルダ)Pathをさくっと取得するためのWSH。 WSFっていうべき?
SendToフォルダに入れて使ってます。

引数が1つの場合はVBScriptによるinputboxでのPath表示。
引数が複数の場合はテキストファイルにしてメモ帳で開きます。
<job>
<script language="VBScript">
function vbInputBox(prompt, title, def)
vbInputBox = inputbox(prompt, title, def)
end function
</script>
<script language="JScript">
arg=WScript.Arguments
if(!arg.length){WScript.Quit()}
jsInputBox = function(p,t,d){
return vbInputBox(p, t?t:WScript.ScriptName, d?d:'')
}
fs = new ActiveXObject('Scripting.fileSystemObject')
shell = new ActiveXObject('WScript.Shell')
gsf2 = fs.GetSpecialFolder(2)
Write = function(path,v){with(fs.CreateTextFile(path)){Write(v);Close()}}
WshNetwork = WScript.CreateObject("WScript.Network")
// ネットワークドライブのドライブ文字vsネットワークパスの組み合わせを取得する
drives = WshNetwork.EnumNetworkDrives()
objDrive={}
for(var i=0,L=drives.length;i<L;i+=2){
objDrive[drives.Item(i)] = drives.Item(i+1)
}
getPathUNC = function(p){
if(unc = objDrive[fs.GetDriveName(p)]){
return unc + p.replace(/^[A-Z]:/,'')
}else{
return 共有(p)
}
}
// 共有設定しているフォルダ内のファイルにも対応する
arr共有=[]
objEnum = new Enumerator(WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer().ExecQuery("Select * From Win32_Share"))
for(i=0; !objEnum.atEnd() ;objEnum.moveNext()){
item = objEnum.item()
if(!item.path){continue} // IPC$はpath無いので何にでもマッチしてしまう
arr共有[i++] = {path:item.path, name:item.name}
}
arr共有len = arr共有.length
reg = /[\\\/]$/
共有=function(path){
for(var i=0;i<arr共有len;i++){
// index=0以外は無視
if(path.indexOf(arr共有[i].path)){continue}
var head='\\\\'+WshNetwork.computerName+'\\'+arr共有[i].name
return head+(head.match(reg)?'':'\\')+path.slice(arr共有[i].path.length, path.length)
}
return path
}
if(arg.length==1){
jsInputBox('getPath',0,getPathUNC(arg(0)))
WScript.Quit()
}
str = ''
for(i=0,L=arg.length;i<L;i++){ str += getPathUNC(arg(i)) + '\r\n' }
path = gsf2+'\\'+fs.getTempName()
Write(path, str)
shell.run('notepad '+path, 1, true)
fs.DeleteFile(path)
</script>
</job>
view raw getPath.wsf hosted with ❤ by GitHub

Gistで作成したソースコードをwebページ上で実行する

プログラムの動作テストを気軽に出来るようにしたい。
テストせずに「書いただけ」だとバグの含有率高いし。
ある程度使い慣れた言語ならバグがあってもエラーメッセージを読めば簡単なプログラムなら修正できるけれど、プログラミングを始めて間もない時期に「そういうこと」に遭遇するとお手上げです。
自分も他人も不幸にしないために「バグ無く動作すること」がすぐに確認できるようにしたい。
for(var str='',i=0,L=3;i<L;i++){
str += i
}
confirm(str)
view raw test.js hosted with ❤ by GitHub

2016年5月18日水曜日

画像ファイルと個人情報

記事作成時に画像を使いたい時がありますが
ファイル形式によっては「見えているもの以外」の情報を含んでいる場合があります。
Exifとか。
知らずにネットで公開すると作成者の使用しているPCのユーザー名や組織名などが漏れそうで怖いので確認しました。


余計な情報を公開していないか確認する方法はいくつかありますが
公開済みの画像について手軽に確認したい場合はネットサービスが良さそうです。

http://mgt.jp/t/exif



他にも以下のような情報が、記事に添付するためにアップロードすると消えるのか消えないのか気になります。



Exifはファイル形式をPNGにしておけばOK。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11105142341

Windowsでファイルのプロパティに表示される情報はNTFSの管理情報なのでアップロードしたファイル自体には情報は入ってない。
http://oshiete.goo.ne.jp/qa/7257700.html


出典についてはもう少し信頼度の高いところをもってきたかったのですが、すぐに見つからなかったので参考程度の情報です。
信頼度の高い情報を見つけたら追記します。

2016年5月16日月曜日

ソースコードを美しくブログで表示する

Gistというのを使うと簡単でした。

1.GitHubでアカウント作成
https://github.com/

2.「New gist」ボタンを押します。
3.ファイル名を入力します。拡張子に応じてハイライトが変化します。
4.「Create public gist」ボタンを押します。

5.「<script ~」をコピーして、ブログに貼りつける。




出来上がり。
for(var str='',i=0,L=3;i<L;i++){
str += i
}
confirm(str)
view raw test.js hosted with ❤ by GitHub



残念ながらwshはハイライトの恩恵が受けられないようです。。まぁ複数の言語が利用できる拡張子ですし、仕方がないですよね。
<job>
<script>
var str = 'Hello'
WScript.Echo(str)
var fs = new ActiveXObject('Scripting.FileSystemObject')
WScript.Echo(fs.getTempName())
</script>
</job>
view raw test.wsh hosted with ❤ by GitHub

iframeを使ってソースコードを表示

iframeのonLoadイベントを利用して、ページが表示されたらiframeの後ろにPREエレメントを追加して、そのエレメントのinnerTextに関数の内容を表示する。というサンプル。

function(){
abc = 1
def = 2
}

編集画面でも閲覧画面でも同様の表示が得られるようにしたい欲求に対する、iframeを用いた回答。
「<」を使うとそこから後ろが消えちゃう問題には未対応。

……素直に通常の(HTMLでない)編集画面で書く方が良い?
どっちみち編集画面じゃ水平タブによる字下げなどが出来ないしエディタで書いたプログラムを動作テストしてから貼りつける、で良いのか。。

2016年5月14日土曜日

投稿用HTMLソースを作成するページ

以下の入力欄に文章を入力して「変換」ボタンを押すと、投稿用HTMLソースを作成できます。
動作テスト用ボタンもついています。
<を含む文章でも問題無く表示されるように変換できます。

プログラムの公開方法

以下のようなテキストを、コメントや予約語などの部分だけ文字色を変えて表示したい

fs    = new ActiveXObject('Scripting.FileSystemObject')
shell = new ActiveXObject('WScript.Shell')

// テキストファイル入出力
Read  = function(path, swCreate, swUnicode){
 if(!fs.FileExists(path) && !swCreate){return ''}
 var rs=fs.OpenTextFile(path,1,swCreate,swUnicode), str=rs.AtEndOfStream?'':rs.ReadAll()
 rs.Close()
 return str
}
Write = function(path,str,swUnicode,sw追記){
 with(fs.OpenTextFile(path,sw追記?8:2,true,swUnicode)){Write(str); Close()}
}
RAS = function(path){return Read(path).split('\r\n')}

初投稿

ブログ開設時期の記録目的の投稿です。

使いながら覚えるために幾つかのテストに使用する記事としての役割も兼ねます。