WSHのJScriptでは変数宣言を強制できないので、JScript.NETコンパイラで静的チェックを行う

JScript.NETとは違い、WSHJScriptでは変数定義を強制できない。
そこで、変数宣言の静的チェックを行うため、JScript.NETコンパイラを利用する。
なお、ソースファイルのエンコードは「Unicode(UTF16) BOMなし」「UTF7 BOMなし」を避けること。
これらの文字コードのファイルはコンパイルエラーとなる。

以下はサンプルソース。変数 i が宣言されていない。

// sample.js
var a = [4, 5, 6];
for(i = 0; i < a.length; i++) {
    WScript.Echo(a[i]);
}

次はコンパイル・コマンドの例。jsc.exeがコンパイラの実行ファイルの名前

"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\jsc.exe" sample.js

コンパイル結果

C:\tmp>"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\jsc.exe" sample.js
Microsoft(R) JScript Compiler version 14.00.4084
for Microsoft(R) .NET Framework version 4.0.30319
Copyright (C) Microsoft Corporation. All rights reserved.

sample.js(3,5) : error JS1135: 変数 'i' が宣言されていません。
sample.js(4,5) : error JS1135: 変数 'WScript' が宣言されていません。

C:\tmp>

WScriptオブジェクトはWSHJScriptで使えるがJScript.NETでは使えない。次のエラーが出る。

error JS1135: 変数 'WScript' が宣言されていません。

とりあえず、ダミーで最初の行に宣言する。

// sample.js
var WScript;
var a = [4, 5, 6];
for(i = 0; i < a.length; i++) {
    WScript.Echo(a[i]);
}

コンパイル

C:\tmp>"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\jsc.exe" sample.js
Microsoft(R) JScript Compiler version 14.00.4084
for Microsoft(R) .NET Framework version 4.0.30319
Copyright (C) Microsoft Corporation. All rights reserved.

sample.js(4,5) : error JS1135: 変数 'i' が宣言されていません。

C:\tmp>

元のWSHスクリプトには手を入れないよう対処することもできる。
次のファイル vars.js を用意する。

// vars.js
var WScript;

次のようなコマンドでコンパイルする。

"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\jsc.exe" /out:sample.exe vars.js sample.js

以上のように静的チェックができる。
当然ながら出来たEXEファイルは実行してもエラーが出る。

Amazon プライムビデオ 視聴履歴(続けて観る)の消し方

「続けて観る」のリストからビデオリンクを削除するには、その作品のすべての再生済み動画を開始0:00で停止すれば良い。
PCでは各再生済み動画について以下のいずれかの操作を行う。

  • 動画が再生中なら、タイムラインのスライダーにある ◯(つまみ)を左端(開始0:00)までドラッグ&ドロップする。ドロップは左端を少し左に越えた位置で行う。

あるいは

  • 動画が一時停止中なら、10秒巻き戻しボタンを押して、再生時刻を0:00まで戻す。


「次のエピソードへ」ボタンを利用すれば、続けて処理できる。
スマホなら「シーズンを未視聴としてチェックする」の機能を使う(現在、機能が削除されてるかも)。

タイムスタンプをすべてリセットしても、まだ表示される場合、以下を試してみる。

  • ①プライムビデオの設定ボタン(画面右上の歯車)をクリック ②視聴履歴タブに切り替える ③対象シーズンの視聴履歴を削除する。
  • ウォッチリストから削除する。

サクラエディタ マクロ 保存時の処理サンプル

//保存時の処理
S_SetDrawSwitch(0);    //描画オフ
S_MoveHistSet(0);      // 現在位置を移動履歴に登録
S_ReplaceAll('(?:^|\G)(?: {4}|\t)', '\\t', 36);    // すべて置換(インデントをスペースからタブに変換)
S_MoveHistPrev(0);     // 移動履歴: 前へ
S_SetDrawSwitch(1);    //描画オン
S_ReDraw(0);           // 再描画

HTML のウィンドウ・アクティブ・イベント

javascript なら 以下のコードで取得可能。

window.addEventListener("focus", function(event) 
{
    何か処理する;
}, false);


参考1
Is there a browser event for the window getting focus?
https://stackoverflow.com/questions/3478654/
stackoverflow.com より

ただし、Firefox では windows focus イベントおよびメソッドを有効にするにはオプションの設定が必要。古いバージョンの Firefox なら、オプション設定の画面から設定できたようだか、最近の Firefox では、ブラウザのアドレスバーに about:config と入力し、dom.disable_window_flip を false に設定する必要がある。なお、HTMLの仕様では window focusメソッドは非推奨にされている模様。


参考2
why window.focus() not working in Mozilla firefox?
https://stackoverflow.com/questions/4085544/
stackoverflow.com より

正規表現 インデント 置換

次の正規表現でインデントをスペースからタブに置換できる。

検索文字列の {4} でインデント幅を指定している。サクラエディタで置換可能。

検索文字列
(?:^|\G)(?: {4}|\t)
置換文字列
\t


参考
https://stackoverflow.com/questions/12807987/regex-to-change-the-number-of-spaces-in-an-indent-level

ADODB.Stream UTF-8 BOMなし ファイル読み書き VBScriptサンプルコード

Function ReadAll(FilePath)

    Const adTypeText = 2
    Const adReadAll= -1
    Const adReadLine = -2

    With CreateObject("ADODB.Stream")

        .Type = adTypeText
        .Charset = "UTF-8"
        .Open
        .LoadFromFile FilePath
        ReadAll = .ReadText(adReadAll)

'        Do Until .EOS
'            Dim Line
'            Line = .ReadText(adReadLine)
'        Loop

        .Close
    End With
End Function


Sub WriteAll(FilePath, Content)

    Const adTypeBinary = 1
    Const adTypeText = 2
    Const adSaveCreateOverWrite = 2

    With CreateObject("ADODB.Stream")
        .Type = adTypeText
        .Charset = "UTF-8"
        .Open
        .WriteText Content

        .Position = 0
        .Type = adTypeBinary
        .Position = 3

        Dim buf
        buf = .Read()

        .Position = 0
        .Write buf
        .SetEOS
        .SaveToFile FilePath, adSaveCreateOverWrite
        .Close
    End With
End Sub