[JavaScript][PHP] Setのないプログラミング言語でハッシユをSetとして使う

Setがない。

PHPやJavaScriptではデータ構造として、Set(集合)がない。
少なくとも、PythonのようなSetは存在しない。
※ちなみにSPLでもSetはないみたい。

[unix] 複数キーでjoinしたい

unixでRDBのテーブル結合のように複数のファイルを共通のフィールドで結合する場合はjoinコマンドを使う。

簡単な例

$ cat items
1001 2017-10-08 バナナ 100
1001 2017-10-09 バナナ 90
1002 2017-10-08 りんご 150
1002 2017-10-09 りんご 200
1003 2017-10-08 みかん 80
$ cat shops
1001 2017-10-08 蒲田
1001 2017-10-09 蒲田
1002 2017-10-08 横浜
1002 2017-10-09 横浜
1003 2017-10-08 品川
$ join -11 -21 items shops
1001 2017-10-08 バナナ 100 2017-10-08 蒲田
1001 2017-10-08 バナナ 100 2017-10-09 蒲田
1001 2017-10-09 バナナ 90 2017-10-08 蒲田
1001 2017-10-09 バナナ 90 2017-10-09 蒲田
1002 2017-10-08 りんご 150 2017-10-08 横浜
1002 2017-10-08 りんご 150 2017-10-09 横浜
1002 2017-10-09 りんご 200 2017-10-08 横浜
1002 2017-10-09 りんご 200 2017-10-09 横浜
1003 2017-10-08 みかん 80 2017-10-08 品川

[C] ヘッダファイルで、関数マクロではなくstatic inline関数を使う

Cでの関数名の競合

Cでは小さなユーティリティ関数を関数マクロで実現する場合も多いけど、関数マクロだとコンパイラによる型チェック等の恩恵を受けられなくなってしまう。
※わざと、型に関係なく汎用的な処理をさせたいために関数マクロを使うことも多いと思うけど。

また、Cの場合は名前空間がないために、関数名の競合を避けるために外部に見える関数は関数名にプリフィックスをつけて区別するようにすることも多い。
こうすると、ちょっとしたユーティリティ関数を呼ぶためにプログラム中に長い関数名が登場することになってしまう。

[bash] Linuxでリダイレクトがよくわからなくなったときの確認

標準出力と標準エラー出力のリダイレクト

Linuxで標準出力や標準エラー出力をファイルに保存するのにリダイレクトさせたり、ファイル保存しつつ、端末表示するときにteeコマンドを使ったりするのは日常的にあるだろう。
でも、bashで複雑なリダイレクトをしていると、どのように動作しているのかよくわからなくなってくるときがある。
こんなときは /proc/self/fd を表示させて、確認しよう。

例えば、標準出力と標準エラー出力をそれぞれ、別のファイル(out.log, err.log)に出力しつつ、端末表示させたい場合は次のような書き方ができる。
$ { { somecommand | tee out.log 1>&3; } 2>&1 | tee err.log; } 3>&1

[Java] ジェネリックメソッドの戻り値でワイルドカードを使うと

Collections.addAllとArrays.asList

ジェネリックメソッドで可変長引数を使うと警告が出るでSetにデータを詰めるのに Collections.addAll を使ったんだけど、この手のもので、変数宣言と同時に使われる記法としては Arrays.asList を使うアイデアがある。
    private static final Set<String> fruits = new HashSet<>(Arrays.asList("1", "2", "3"));

Collections.addAllとArrays.asListのインターフェースは以下のようになっている。

public static <T> boolean addAll(Collection<? super T> c, T... elements)
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Collections.html#addAll-java.util.Collection-T...-

public static <T> List<T> asList(T... a)
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Arrays.html#asList-T...-

[Java] ジェネリックメソッドで可変長引数を使うと警告が出る

ヒープ汚染

Javaで定数のSetを作ろうとして、以下のようにしたら、コンパイル時に警告が出てしまった。
    private static final Set<String> fruits = readOnlySet("apple", "banana", "orange");

    private static <T> Set<T> readOnlySet(T ... a) {
        Set<T> set = new HashSet<>(a.length);
        Collections.addAll(set, a);
        return Collections.unmodifiableSet(set);
    }
警告: [unchecked] パラメータ化された可変引数型Tからのヒープ汚染の可能性があります
    private static  Set readOnlySet(T ... a) {
                                                ^
  Tが型変数の場合:
    メソッド readOnlySet(T...)で宣言されているTはObjectを拡張します

[シェルスクリプト] [ -a ][ -o ]が POSIX では Obsolescent になっていた?

[ -a ]

シェルスクリプトで変数の値が0と100の間にあるかどうか、確認するときはこんなふうに書いたりする。

$ i=100
$ if [ $i -ge 0 -a $i -le 100 ] ;then echo "$i"; fi
100

testコマンドの条件の間に -a を入れることによって前後の条件式を and で結んでいる。

ところが。だ。

[シェルスクリプト] forループでのパス名展開

forループ

シェルスクリプトでファイルごとに同じ処理を実行するなんてことはよくあるね。
そんな場合はforループでパス名展開を使う。
例えば、*.log形式のファイルの中身をすべて出力したい場合は以下のようにする。
for f in *.log
do
  cat "$f"
done

※この場合、実はループなんか使う必要はなくて、cat *.log で十分だけど。

[Linux] pkg-configでパッケージ情報を取得する

コンパイルオプション

[Linux] FUSEでデータ生成でFUSEアプリケーションのコンパイルをするときに以下のようなコマンドで実行した。

$ gcc -Wall zero.c $(pkg-config fuse --cflags --libs) -o zero

この場合はpkg-configでFUSEのコンパイルフラグとライブラリのパスを取得して、そのままgccに渡している。
pkg-configは開発系パッケージをインストールしたときにインストール先がどこかを表示してくれるツールなので、これを使えばコンパイラにそのままパスを渡せるというわけだ。

[Linux] FUSEでデータ生成

データ生成

[Linux] FUSEを使ってみようではFUSEを使って、ファイルシステムとしてマウントする例を見たけど、今度はFUSEを使ってデータを生成するファイルを作ってみよう。

開発用のヘッダファイルとかが必要になるので、https://github.com/libfuseからライブラリを入手するか、fuse-developパッケージをインストールしよう。
今回はfuse 2.9.3を使用した。

[Linux] FUSEを使ってみよう

fusermount

Linuxでユーザ側のアプリケーションレイヤーでファイルシステムを実現する仕組みとして、FUSE(Filesystem in Userspace)がある。
これを使うと、いろんなものをファイルシステムとして扱うことができる。

https://github.com/libfuse

まず必要なのはfusermountなので、ディストリビューションでパッケージとして用意されている場合は、パッケージでインストールしてしまおう。
fusermountコマンドは単独で使うというより、後述のコマンドでマウントしたファイルシステムをアンマウントするときに使う。

$ fusermount -u /path/to/mounted

[Java] スレッド開始前後の共有変数

[Java][C]JavaのvolatileとCのvolatileでJavaのvolatileについて書いた。

けど、以下のようなコードでエンクロージングクラスからキャプチャされたローカル変数が起動された側のスレッドから見えることや、起動されたスレッドが設定した変数がスレッド終了を待機した側のスレッドから見えることが保証されているのか、実はあまりよくわかっていなかった。
        Counter counter = new Counter();
        
        IntStream.rangeClosed(1, 100).parallel()
            .forEach(x -> counter.increment());
            
        System.out.println(counter.getCount());

[C] 対話型コマンドでユーザ入力サポート

bashやsqlite3のような対話形式のコマンドでは上下の矢印キーでコマンドの履歴をたどれたり、tabキーでファイル名を補完できたりする。
自分で作った対話型コマンドでも、こんな機能が使えたらいいよね。

readline

こんな時は GNU readline を使うことが多いかもしれない。

https://cnswww.cns.cwru.edu/php/chet/readline/rltop.html

でも、GNU readlineはライセンスがLGPLではなく、GPLなので、ライブラリとしてリンクしてしまうと使用しているアプリケーション側もGPLにしないと、配布できなくなってしまう。

[sqlite] SQLiteでの日付型の扱い その2

前回はSQLiteでの日付の表し方だったけど、今度は日付を用いた計算をしてみよう。

日付の足し引き

1年以上前のデータを削除するような場面では現在から1年前の日付が必要になる。
sqlite> select date('now', 'localtime');
2017-07-09
sqlite> select date('now', 'localtime', '-1 year');
2016-07-09

オプション引数は何個でもつけることができるので、3ヶ月先の月の末日を求めたい場合は以下のようになる。

[sqlite] SQLiteでの日付型の扱い その1

日付型がない

SQLiteは型として日付(Date)型を持っていない。
なので、どうするかというと以下の3つのパターンがある。
  • ISO-8601形式 : TEXT
    ISO-8601の文字列形式で日時を保持する。
  • ユリウス通日 : REAL
    紀元前4713年1月1日の正午からの日数を実数型で保持する。整数部分が日数で小数部分が時刻を表す。
  • Unix時間 : INTEGER
    19070年1月1日真夜中(午前0時0分0秒)からの秒数を整数型で保持する。

[SQLite] SQLiteで実行計画を見てみよう その3

explain

[SQLite] SQLiteで実行計画を見てみよう その2ではテーブル結合の実行計画を取得して、nested loopの様子を見たけど、SQLiteではさらに詳細に内部の実行手順を見ることができる。

今度はexplain query planではなく、explainを使う。

The SQLite Bytecode Engine

[SQLite] SQLiteで実行計画を見てみよう その2で実行したSQLにexplainをつけて、見てみよう。

[SQLite] SQLiteで実行計画を見てみよう その2

テーブルをもう1つ作成

[SQLite] SQLiteで実行計画を見てみよう その1では結合もサブクエリもないSQLだったので、selectid,order,fromがすべて0の実行計画だった。
テーブルを結合した時の実行計画はどうなるだろうか?

まずはもう1つのテーブルTest2を作成しておく。
$ cat create_table2.sql
create table if not exists Test2
  ( id integer primary key
  , name text
  , last_modified text
  );

create index if not exists idx_Test2_name on Test2
  ( name
  );
$ paste -d, \
  <(seq 10000) \
  <(LC_CTYPE=C tr -dc 'A-Za-z0-9' </dev/urandom |
    fold -w8 | head -n10000) \
  <(LC_CTYPE=C tr -dc '0-9' </dev/urandom |
    fold -w10 | sed -e 's/^0*//' |
    awk '$1<1497711600{ print $1 }' | head -n10000 |
    sed -e 's/^/@/' | date -f- '+%Y-%m-%d %T') \
  >Test2.csv

[SQLite] SQLiteで実行計画を見てみよう その1

テーブル作成とデータ投入

[unix] シェルを使って、テストデータ生成でテストデータを作ったので、SQLiteにデータを投入してみよう。

まずはテーブルのDDLを作成する。
$ cat create_table.sql
create table if not exists Test1
  ( id integer primary key
  , name text
  , last_modified text
  );

create index if not exists idx_Test1_name on Test1
  ( name
  );

[unix] シェルを使って、テストデータ生成

[シェルスクリプト]ランダムな数値では乱数の生成をしたけど、改めてシェルを使ってのテストデータ生成を考えてみよう。
できるだけ、デフォルトでありそうなコマンドかつ移植性のありそうな方法で。

同じ文字列の繰り返し

同じデータを繰り返し生成する場合はyesコマンドに文字列を渡して、headで行数を指定しよう。
$ yes ABCDE | head -n5
ABCDE
ABCDE
ABCDE
ABCDE
ABCDE

[awk] awkでカラム方向の計算

tr -s ' ' '\n'

前回は以下のようなコマンドでcalコマンドの結果を行方向に変換した。
$ cal | tr -s ' ' '\n' | 
awk 'NR==2 { mm = $1 } NR==3 { yy = $1 } NR>10 { print mm,$1,yy }'

これはawkの中で行毎にカラム数分ループさせるのがかっこ悪いなあと思ったので、事前に tr でデータの並びを行方向に展開する方法を取っていた。

でも、これって本当に効率がいいんだろうか。
ひょっとして、awkの中でループした方が速いんじゃないだろうか。

[unix] dateコマンド違い

ある月の土日の日付を列挙するスクリプトを作っている時に、dateコマンドの挙動がOSによってかなり違うことに気づいた。

Mac(BSD) date

最初にMac(BSD)で実行する例。
$ cal | tr -s ' ' '\n' | 
awk 'NR==2 { mm = $1 } NR==3 { yy = $1 } NR>10 { print mm,$1,yy }' | 
xargs -I{} date -j -f '%B %d %Y' {} '+%Y/%m/%d(%a)' | 
grep [土日]
2017/06/03(土)
2017/06/04(日)
2017/06/10(土)
2017/06/11(日)
2017/06/17(土)
2017/06/18(日)
2017/06/24(土)
2017/06/25(日)

[XML] xmllintを使って、XMLの内容を検証する

xmllint

前回に引き続き、コマンドからXMLを取り扱う話。
今度はxmllintを使って、XMLの内容を検証してみよう。
今回はXMLの内容検証用にXSDファイルを用意する。

http://xmlsoft.org/xmllint.html

入力データは前回使用した2種類のXMLをそのまま使おう。

フラットな構造のXMLを検証する

planets1.xmlの構造を定義したXSDファイルを用意しよう。
planets要素の下にplanet要素が並ぶ構造を表現する。

[XML] xsltprocを使って、XMLをCSVに変換する

xsltproc

XMLをDBのテーブルに格納したい時はDBのツールを利用するために、一旦CSVに変換したくなる。
XMLからCSVへの変換っていうと、プログラムを組まなきゃって思うけど、xsltprocを使うとXSLTファイルで変換マッピングを作ってあげれば、シェルからでも変換処理ができる。

http://xmlsoft.org/XSLT/xsltproc.html

フラットな構造をCSVに展開する

まずはそのままCSVに展開できそうなフラットなデータ構造の場合を考えよう。

[Java,C] 浮動小数点での丸め誤差の例

floatやdoubleといった浮動小数点数で計算をしていると、丸め処理をしているつもりでも誤差が出ることがある。
これの簡単な例がないかなぁと思っていたんだけど、 0.35 * 3.0 でうまく表現できそう。

Javaで 0.35 * 0.3 を計算してみる

Javaのdoubleで 0.35 * 0.3 を計算してみると

System.out.println(0.35 * 3.0);
// 1.0499999999999998

[bash] IFS(Internal Field Separator)について

シェルスクリプトでreadを使う時にフィールド分割したくない場合やフィールドの区切り文字を変えたい場合なんかにIFSの値を変えたりする。
でも、実際にIFSの値を変えるとどこまで影響があるんだろうか?

read

これが最も一般的な使い方だと思う。
例えば、IFSが明示的に設定されていない場合は <空白><タブ><改行> が区切り文字になるので、入力に空白があると行が区切られて変数に格納される。

[linux] grepでファイル単位の検索条件

grepを使うときは基本的に1行の中のパターンを検索するし、たいていの場合はそれで問題ない。
でも、たまに条件に合致するファイルを抽出する必要がでてきたりするよね。
行単位ではなく、ファイル単位での検索条件を考えてみよう。

準備

今回、試したのはGNU grep。
また、確認用のファイルとしてtest1,test2,test3を用意する。

[unix] 標準出力の接続先によって、動作を変える

[unix] パイプ処理時のバッファリングではgrepやsedに出力のバッファリングオプションがオプションがあるのを見た。
他にも出力先によって、動作が変わるコマンドはある。

lsの出力

例えば、lsも出力先が端末だと、ファイル名を適当に区切って並べてくれるけど、出力先がパイプだと、ファイル名を縦に並べる。
むしろ、縦に並べる方が本来で、端末の場合は見やすくしてくれていると考えた方がいいかもしれない。

[unix] パイプ処理時のバッファリング

xargsで出力を遅延させる

フィルタの役割をするコマンドは大抵バッファリングするので、teeとかでデバッグしていると、フィルタリングされたテキストがすぐに端末に表示されないことがある。
何かバッファリングの効果を目に見えるように再現できるいい方法はないかなと思ってやってみたけど、xargsを使って、無理やり出力を遅延させるのがわかりやすいかなぁ。

例えば、これだとコマンド実行の2秒後に"2"が表示される。
$ seq 10 | xargs -I% sh -c 'sleep 1; echo %' | grep 2
2
$

[sed] sedのホールドスペースの練習

[awk,Ruby,C#,Java]いくつかの言語でフィボナッチ数生成でawkとかを使ってフィボナッチ数列を生成したけど、sedでこれができないかなーと思ってやってみた。

sedでフィボナッチ数列生成

sedは数値演算を直接サポートしていないので、文字列の長さを数字とみなしてみる。

[awk] awkで指定行毎に改行除去

行区切りのデータを適当な行数でまとめるで paste を使って、指定行毎に改行を除去する方法を書いたけど、改めて見ると、こんなの awk で簡単にできるじゃん。

指定行毎に改行を除去するってのは
1
2
3
4
5
6

[Windows] パイプでつないだコマンドはサブシェルで実行される

echo foo | set /p x= で x は設定できない

[Windows] コマンドプロンプトで文字列入出力のTipsでは改行なしのメッセージを set /p を使って出力した。
>set /p x=hello<nul & echo world
hello world

>

これを使って、別のコマンドの出力をパイプを通して変数に格納できないかなと思ってやってみたら、できなかった。

[Java] Streamで例外処理を扱う

UncheckedIOException

Java8から UncheckedIOException という例外が追加されている。

https://docs.oracle.com/javase/jp/8/docs/api/java/io/UncheckedIOException.html

これは文字通り、RuntimeExceptionを継承した非検査例外だけど、なんでこんな例外が追加されたんだろうか。

例えば、Streamを使って、ファイルの内容をすべて標準出力に出力しようとすると、こんな感じになる。

[C] ポインタのアドレス参照範囲と未定義処理

不正ポインタ

CでNULLポインタや解放済みのメモリ領域を指すポインタ(ダングリングポインタ)を参照すると、未定義の動作となる。
バッファオーバーランとかの書き込みではなく、厳密にいうと参照だけで未定義動作になるんだね。

ただし、ポインタが指している領域ではなく、ポインタが保持している値(アドレス)そのものについてはルールが違う。

NULLポインタの場合はポインタの値を参照していい。そうじゃないと、そもそもNULLかどうかのチェックができないよね。
    /* これはできるよね! */
    if (p == NULL)

[C] マクロトークンの文字列化

マクロの文字列化演算子

Cのマクロで数値定数が存在する場合にログに数値のみではなく、定数名を出力したい場合がある。
こういうときはマクロの文字列化演算子(#)を使う。
#define STR(S) #S

#define ORANGE 1
#define APPLE  2
#define GRAPE  3

...
 printf(STR(ORANGE) "\n");
上記の例だと、以下のようにマクロが展開され、標準出力に ORANGE と出力される。
 printf("ORANGE" "\n");

[LL] Let's LL

社内の技術発表会で発表した資料をSlideShareに投稿しました。
CやJavaプログラマがLLにも目を向けてみるって感じの内容です。

Let's LL
https://www.slideshare.net/t_ichioka_sg/lets-ll

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

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

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

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

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

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

Unixのファイル権限

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

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

[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

[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時間ずれている!

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

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

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

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

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

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

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

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

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

[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" が評価されて実行時エラーが発生してしまう。

[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

[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文に対して以下のようなエラーが出ました。

[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

[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に出力したければ、こうなる。

[unix,perl,正規表現] perlでsed,grep,awkライクに

sedでダブルクォートで括られてる("ABC")ような文字列の置換をしようとしていたんだけど、うまくいかなかった。

$ sed -e 's/"[^"]+"/"xxx"/g'
"foo"
"foo"
"f+"
"xxx"

これだと、ダブルクォートの中が以外の任意の1文字と"+"の場合しかマッチない。
ダブルクォートの中には必ず1文字以上ある事を意図して"+"記号を使っていたんだけど、どうもsedではこれを特殊記号として扱ってくれないらしい。
なので、以下だとうまくいく。

$ sed -e 's/"[^"][^"]*"/"xxx"/g'
""
""
"foo"
"xxx"

どうしてこんなことになるかというと。。。

[Java]System propertiesとOutputStreamからの文字列取得

Javaを使ったプログラムででエラーが起こった時に使っていたJavaのバージョンやOSの環境が知りたいことはよくある。
その度に確認するのも大変だよね。
なので、プログラムの起動時にSystem propertiesの値をログなんかに出力しておくといいかもしれない。

単純に標準出力に出力するのであれば、以下のようにすればいい。

PropertiesSample.java
class PropertiesSample {
    public static void main(String ...  args) {
        System.getProperties().list(System.out);
    }
}