DBMS の seed data は手で作ってもいいけど DB から出力して生成してもよい。特に Typus などの管理画面用のツールを使っている場合、とりあえず手で入力してどんなもんか見て、それを export するようにするとお手軽だし、他の人にデータ作りを手伝ってもらいやすくなると思う。
まぁとにかくそんなこんなで DBMS の export について調べてみた。
Typus
Typus の csv export は gem v 3.0.4 以降で正しく機能する。ただし、
Typusのcsv downloadがセミコロン区切りな件 - あーありがち(2011-01-18)
に書いた通り。Comma Separated じゃない。
DBMS
Typus を採用しているのを前提として。
Typus の export 機能は大事だが、それより大事なのは開発者のデータの取り回し。Typus がうまく動かない場合は他の機能で実現する必要がある。
Rails の helper を書いて export を作ることはもちろん可能だしそれほど難しくないが、Typus の利用を前提にすると管理画面にこうした細かい機能追加を行うのはややこしいしゼロから書きたくない。
ということで次は SQL レベルの方法。(そもそも頻繁に発生しない前提。)
SQL COPY
PostgreSQL で作られたものを SQLite が porting している。つまりこの2つでは COPY コマンドが使える。
MySQL は INTO
MySQL は SELECT の INTO でファイルに吐き出したりできるみたい。
MySQL :: MySQL 5.5 Reference Manual :: 12.2.9 SELECT Syntax
なるほどな。select 一発でできてしまうとは。
SQLite でも .mode csv にすればよいし、PostgreSQL でも
-A
--no-align
Switches to unaligned output mode. (The default output mode is
otherwise aligned.)
-F separator
--field-separator separator
Use separator as the field separator for unaligned output. This
is equivalent to \pset fieldsep or \f.
-o filename
--output filename
Put all query output into file filename. This is equivalent to
the command \o.
-t
--tuples-only
Turn off printing of column names and result row count footers,
etc. This is equivalent to the \t command.
の組み合わせで実現できるかな。でも使うオプションが多いな。
- ある程度以上古くて
- ある程度以上放置されている
ファイルをあぶり出してみた。
以下の2つのスクリプトを組み合わせて、
sh anasvn.sh | ruby warning.rb
みたいにして使う。(スクリプトの名前は適当。)閾値とかファイルの洗い出しルールは自分で勝手に書き換えてください。
読めば分かるけど必要なのは
- svn
- find
- awk
- ruby
です。CVS ? svk ? git ? RCS ? 現物合わせで適当にしてください。
確認は gawk 3.1.4, Ruby 1.8.4, svn 1.4.4 で行いました。
anasvn.sh
対象ファイル群を洗い出すための find のルールを適当に書き換える。例では
- 実行したディレクトリ以下で
- 拡張子 .php のファイル
をダーっと洗い出してチェックします。で、出力は
filename TAB 最初のcommit日時 TAB 変更のあった回数
という形式です。
#! /bin/sh
LANG=C
for i in `find . -name '*.php'`;
do
svn log -q $i | awk -v filename=$i '
BEGIN {
sum = 0;
FS = "|";
OFS = "\t";
}
/^r[0-9]+ / {
sum++;
time = $3;
}
END {
# time means first commit datetime
print filename, time, sum;
}
'
done
warning.rb
TOO_OLD, TOO_FEW を適当に書き換える。
出力は上のものをそのままスルーで出します。
#! /usr/bin/env ruby
require 'time'
FS = "\t"
TOO_OLD = Time.parse( '2006-01-01' )
TOO_FEW = 5
while ( line = gets )
arr = line.chop.split( FS )
filename = arr[0]
date = Time.parse( arr[1] )
times = arr[2].to_i
if ( date < TOO_OLD and times <= TOO_FEW )
puts line
end
end
最終的にはある程度「作った」のが古くてあんまり人の手に触れていないファイルを TSV の形式で抜き出すことができます。
これで出力されるファイルはカタいライブラリか、さもなくば見捨てられている可能性があります。
cron で回すようにすると「この子は可愛そうです、相手してあげてください」アピールになってよいかもしれない。どうだろ。
全国展開しているどこのプロバイダもそうなんだけど、アナログや ISDN のダイヤルアップ接続のアクセスポイントはどんどん全国統一番号にシフトしてきている。アクセスポイントの維持費がペイしないから集約しましょってことなんだろうけど、うちの実家がそれにやられてしまいましたorz
ADSL にしろしろとは前から言ってるんだけど、今使えているものをなぜ契約変更しなければいけないのかという感覚。変更のメリットと変更の面倒くささを比べると面倒くささの方が勝っちゃうので話がまったく進まない。そんなわけでアクセスポイントに繋がらなくなってからヘルプの電話。
そんなこと言われたって電話じゃどうにもならねーよ、ということでこの週末作業したわけですが、原因は私でしたorz 中古のルータをメーカーのサイトから落としてきたツールで設定しておいたんだけど、その設定ツールをフロッピーなりで保管しておかなかったのが敗因。数年経ち本体をリプレイスしたのでツールはどこにもない状態だったのです。つまり繋がらなくなった瞬間に何もできなくなったわけです。そらあかんわなぁ。
日本のメーカーだったので、今回はメーカーからフロッピーを取り寄せるところまではやってもらって、あとはおれっちが設定するだけで済んだわけですが、再現できないシステムを遠隔地に放置したらいけませんという例ですな。
今回はそのルータの設定をどうやったのか全然覚えていなかったので、ちゃんとメモを残さないとダメだなぁという当たり前のことを思い知らされた次第。ひょっとしてルータってシリアルで設定するんだっけな? てゆーか実家の機械にシリアルってあったか? えー全然覚えてなーい、ということでそれだけのために ThinkPad + USB/シリアル・パラレル変換ケーブルまで持っていった。やってみたら Ether から設定できるシロモノだったのでまったく必要なかった。ブラウザで設定できるタイプじゃなかったのが返す返すも悔やまれます。でもこれ買ったとき金なかったんだもんな。
http://slashdot.jp/journal.pl?op=display&uid=277&id=108025
経由で
http://itpro.nikkeibp.co.jp/free/NT/NEWS/20030217/4/
普段は /.j の日記なんか読まないのですが、blogネタから脱線して、つい。
個人的には Netscape は 4 の敗北から立ち直れていなかったように見えるので、しょーがないというか、まいっかーというか。
Mozilla をベースに、いい具合に改良が加えられているブラウザも増えてきているし、Opera みたいに数 MB でブラウザとして十二分に通用するものがあると分かっていると、30MB も落としてらんないし、長いインストールも待ってらんない。実際 Netscape ユーザーは 6 には散々裏切られたので、頑固に 4 のままだったりする。(わたしゃ Mozilla にしたけど。)
AOL もそんなに余裕ないだろうし、Netscape らしさを引きずるよりも、もっと AOL がユーザーにアピールできる形になった方がいいでしょうね。
ただ、ダウンロードできなくなっちゃったりすると困る。常用してなくたって確認用には動かすです。
と思ったらNetscape 7.02 リリースだそうで。触発されて Mozilla 1.0.2 入れてみました(笑) Breeze.NET にハマってしまいました。