2017年3月27日月曜日

[Windows] コマンドプロンプトで文字列入出力のTips

PowerShellとかありますが、なんだかんだ言ってWindowsのバッチファイルって、何気に使うと便利な場面多いですよね。
でも、Unixのシェルほど融通が効かないので困ってしまうことも多いよね。

なので、ちょっと文字列入出力について、まとめ。

リダイレクトやパイプの文字を出力する

リダイレクト(<>)やパイプ(|)の文字をechoでそのまま出力しようとしても、当然コマンドライン制御文字として判定されてしまうため、うまくいかない。

2017年3月21日火曜日

[unix] スティッキーなビット?

Unixのファイル権限

Unixのファイル権限は読み/書き/実行が4/2/1のビットで表されていて、ファイルの"オーナー/グループに所属するユーザ/それ以外"がそれぞれが8進数の1桁に割り当てられている。
例えば、あるファイルが
  • オーナーは読み書き実行OK
  • グループに所属するユーザは読み実行のみOK
  • それ以外は読み実行のみOK
であれば、"755"ということになる。

でも、もう一つ上の桁がある。

2017年3月13日月曜日

[Oracle] TO_DATEでのFX書式文字列

TO_DATEの書式指定

Oracleでテーブルに日付を格納するときにはTO_DATEで文字列からDATEやTTIMESTAMPに型変換したりする。
このとき、'YYYYMMDD'とかで書式指定すれば、文字列を書式に合わせてパースしてくれる。

> SELECT TO_CHAR(TO_DATE('2017-02-28 12:34:56', 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') FROM DUAL;
2017-02-28 12:34:56

ところが、あるデータで書式指定に合ってないのになんの問題もなく、テーブルにデータが格納してしまっていることに気づいた。

> SELECT TO_CHAR(TO_DATE('2017-02-28', 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') FROM DUAL;
2017-02-28 00:00:00

> SELECT TO_CHAR(TO_DATE('20170228 123456', 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') FROM DUAL;
2017-02-28 12:34:56

2017年3月6日月曜日

[JavaScript] JavaScriptのDateとmoment.js

JavaScriptのDate

JavaScriptのDateオブジェクトは日付指定生成時に間違えやすい。
例えば、以下のようにすると
Console.log(new Date('2017/01/01'));
Console.log(new Date('2017-01-01'));
Console.log(new Date(2017, 1, 1));
Console.log(new Date(2017, 0, 1));

※検証環境: IE11
[date] Fri Jan 01 2017 00:00:00 GMT+0900 (東京 (標準時))
[date] Fri Jan 01 2017 09:00:00 GMT+0900 (東京 (標準時))
[date] Mon Feb 01 2017 00:00:00 GMT+0900 (東京 (標準時))
[date] Fri Jan 01 2017 00:00:00 GMT+0900 (東京 (標準時))

'YYYY-MM-DD'形式だけ、時刻が9時間ずれている!

2017年2月27日月曜日

[VBA] On Error Resume Next で条件判定の次の行

VBAではエラーが発生しても、処理を継続させるための構文として On Error Resume Next が用意されている。
これを使えば、エラー発生時にも処理位置が次の行に移って、処理が継続される。

Visual Basic言語リファレンス On Error ステートメント
On Error Resume Next は、実行時エラーを発生させたステートメントの直後のステートメント、または、On Error Resume Next ステートメントを含むプロシージャの最新の呼び出しに続くステートメントで、実行を続行します。

うん、まあだいたいは分かるけど、If文の判定条件でエラーが発生したりすると、制御はどこに移動するんだろう?

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にする必要がある。