[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