2017年2月20日月曜日

[WSH] Windowsのコマンドプロンプトで正規表現を使って、文字列置換

ファイルや標準出力の内容を文字列置換したいなんてことはよくあるよね。
こんなときUnixだと、sedやawkを使うところだけど、Windowsのコマンドプロンプトでは該当するコマンドが用意されていない。
バッチに変数の文字列置換をする機能はあることはあるけど、バッチでループをするのもなんだし、正規表現も使えない。

もちろん、PowerShellを使うって選択肢もあるけど、PowerShellはPowerShellの中に閉じた世界で、既存のコマンドとの連携がしにくいってのがある。

で、Windowsに標準搭載されている機能でなんとかしようとすると、WSHでスクリプトを組んでしまうのが一番簡単だと思う。

2017年2月13日月曜日

[VBA] IsError関数によるエラー処理

VBAには On Error によるエラートラップ以外にIsError関数によるエラー判定方法が存在する。

"On Error" or "IsError" ?

例えば、引数が負数であればエラーとする処理は以下のようになる。
Function MustBePositiveOnErr(ByVal v As Long) As Variant
    MustBePositiveOnErr = v

    If v < 0 Then
        Err.Raise 5 ' Invalid Procedure call or argument.'
    End If
End Function

例外処理に慣れたプログラマであれば、なんということもない処理だね。

CVErrは整数値をErr型に変換してくれる。
ただし、CVErrを使った関数は戻り値の型をVariantにする必要がある。

2017年2月6日月曜日

[VBA] VBAの条件演算子は短絡評価にならない

タイトルどおりだけど、VBAの条件演算子は短絡評価にならない。
どういうことかというと、以下のようなNULLチェックがうまくいかない。
If x = Nothing Or x.Foo = "abc" then
これはxがNothingではない場合に限って、x.Fooを参照することを意図している。

でも、VBAのOr演算子は2項の演算項を両方とも評価してから、Or演算を実行するので、xがNothingの場合も x.Foo = "abc" が評価されて実行時エラーが発生してしまう。

2017年1月30日月曜日

[VBA] 動的配列の初期化判定

VBAで動的配列を使うときに自分で変数を宣言した場合は初期化のタイミングがわかるけど、共通に使う関数の場合は引数の配列が初期化済みかどうか判定したい場合がある。

Not Not

こんなときに使われるイディオムとして Not Not で比較するというものがある。
    Dim arr() As String
    ReDim arr(0)
    If Not Not arr Then
        Debug.Print "arr is ReDim."
    End If

2017年1月25日水曜日

[Salesforce]Force.com Security Source Scanner の誤検知

ソースコードのセキュリティをチェックすることができる、Force.com Security Source Scanner というサイトを利用してみました。

今回スキャンしたのは、以下のようにApexでレコードのdeleteをしているものを含むソースです。

【レコードをdeleteするApexコード】
  1. List<ScanTest__c> scanTestList = [SELECT Id, Name FROM ScanTest__c];
  2. delete scanTestList;

すると、delete文に対して以下のようなエラーが出ました。

2017年1月23日月曜日

[JavaScript] 配列のようなものって?

arguments変数を本物の配列に変換する方法ではArray.applyを使ってarguments変数を配列に変換した。
でも、Function.applyメソッドの第2引数は基本的には配列ってことになってる。
配列を作るために配列を渡すってのは変だね。applyメソッドって、配列じゃなくても受け取れるようだ。

Function.prototype.apply() JavaScript MDN

うーん、どうやらプロパティとしてlengthを持っていて、0以上、length未満の数字を名称としたプロパティを持ったオブジェクトであればいいみたい。
var arr = Array.apply(null, { length : 3,
                              0 : 'orange', 
                              1 : 'banana', 
                              2 : 'grape' 
                            });
console.log(arr);
// orange,banana,grape

2017年1月16日月曜日

[JavaScript] arguments変数を本物の配列に変換する方法

JavaScriptで任意の関数の戻り値の真偽を逆転するような関数を生成するには以下のようになる。
function not(pred) {
  return function(args) {
    return !pred.apply(null, arguments);
  }
}

var p = not(function () { return true; });
console.log(p());
// false

p = not(function (x) { return x; });
console.log(p(false));
// true

arguments変数はすべての関数で特別に用意されるローカル変数で、lengthプロパティを持っているし、一見配列のように振る舞う。
例えば、渡されたすべての引数をconsoleに出力したければ、こうなる。