[SQLite]CでSQLiteのユーザ定義関数を作る その1

SQLiteを使ったデータの統計処理なんかをしているとSQL側で処理できてしまうと楽なのになー、と思うケースがあったりする。
そういう時はSQLiteで使えるユーザ定義関数を作ってしまおう。
PHPやPythonで書く手段もあるようだけど、SQLite自体の仕組みを知るためにもCで書いてみよう。

まずは自分で作った関数ではなく、以下で公開されている数値計算用の拡張ライブラリを組み込んでみよう。

SQLite Contributed Files

これを使うと、三角関数やらがSQLから使えるようになる。

[C]可変長引数の扱い。Cではどうするか?

可変長引数とオーバーロード その1ではJavaで可変長引数を使う場合はメソッド呼び出しの都度、配列を生成するため、パフォーマンスに影響があるということを書いた。

でも、本質的にはJavaでは可変長引数も配列引数も同様の扱いだった。
なので、以下のように配列を可変長引数に渡すことができた。
int[] n = { 1, 2, 3 };
int s = sum(n);

int sum(int ... n) {
    ...
}

[linux]Linuxでキャッシュをクリアする

grepのようにファイルを読み込む処理の実行速度を計測するときに1つ気をつけなくちゃいけないことがある。
同じファイルに対する操作を2回、3回と続けるとファイルの内容がメモリにキャッシュされて1回目と比べて、処理が速くなることがあるからだ。

これはどちらの処理結果が正しいということではなく、処理の種類によってどちらの結果を採用するかを決めたほうがいい。

grepのようなコマンドの処理であれば、キャッシュされていることを前提とせずに毎回HDDから読むと考えたほうがいいだろう。
逆にDBMSやWebサーバが参照しているファイルはキャッシュに乗っていることを前提として考えたほうがいいかもしれない。

実際にgrepを同じファイルに対して複数回実行してみよう。

[unix]ファイル名しか受け付けないコマンドで標準入出力を使う方法

Unixでフィルタ的な動きをするコマンドはたいてい標準入力と標準出力を扱えるけど、独自に作成されたツールでコマンド引数にファイル名しか受け付けないようなものもある。
そんなコマンドに対して前段後段の処理を実施する場合は一時的にファイルを作ることが考えられるだろう。
でも、パイプを使えば済むようなところでいちいちファイルを作るのはばかばかしいよね。
処理後に削除するとかも考えなくちゃいけないし。

そういう時は /dev/std* を参照すれば、標準入力、標準出力、標準エラー出力にアクセスできる。

[Java]可変長引数とオーバーロード その2

可変長引数とオーバーロード その1ではEnumSetのofメソッドに可変長引数と引数1〜5個までのオーバーロードがあるのを見た。

もう一つ、可変長引数で注意しなければいけないのは以下のようなケースだ。
java.io.PrintStream::printfメソッドのようにさまざまな型を受け付ける可変長引数の場合を考えてみよう。

PrintStream printf(String format, Object ... args)

Javaの可変長引数の実体は配列であり、実際に配列を渡すこともできる。
なので、以下2例は同じ結果となる。