![]() |
zunbe |
![]() |
|
2005年8月 | ![]() |
| [ 1 2 3 4 ] [次へ>] [最後>>] | ||
2005/07/27
|
今日も、こんな事があった。
PostgreSQL 7.2.3 の pg_dump で出力したデータを、PostgreSQL 7.4.3 に読み込ませるためのコンバータを書かせた。
コンバータといっても、たいしたことはない。
CR と LF を、適切に変換するだけである。
具体的には、こうだ。
以下のデータを、7.4.3で読み込めるようにコンバートしたい(カッコ内は、生コード)。
----- 7.2.3 データ -----
COPY "table_hoge" FROM stdin;
AA
BB(CR)\
CC
\.
-----
このデータは、2レコードを投入する。
1レコード目は、「AA」
2レコード目は、「BB(改行)CC」
これを、7.4.3 で読めるようにするには、以下の様に変換すればよい。
----- 7.4.3 データ -----
COPY "table_hoge" FROM stdin;
AA
BB\r\nCC
\.
-----
この程度のフィルタ・プログラム、30秒で書ける。
ところが、社員は、3時間かけてこんなプログラムを書いた。
-----
#!/usr/bin/perl
foreach (<STDIN>)
{
s/\r//g;
s/\\//g;
s/\n/\\n/g;
print;
}
-----
ぜんぜんダメである。
(1).s/\r//g;
勝手にデータを削除するなよ。
(2).s/\\//g;
なんでデータから、すべての「\」を削除してしまうんだよ。
(3).s/\n/\\n/g;
こんな事をしたら、全部の行がくっついてしまうではないか。
要するに、社員は、以下の事が理解できていないのである。
・2レコード目のデータ中に含まれている改行は、「\」でエスケープされている。
こんな程度の事、プログラムを作成するときに、説明など必要なのだろうか?
あまりにも基本的な知識が無さすぎる。
このエピソードはいかがでしたか? ![]() ![]() | ![]() |
投稿者 zunbe : 2005/07/27 23:30:30 | コメント (0)
2005/07/21
|
最近、うちの会社では、公共の仕事を始めた。
もちろん、ソフトウェア開発の業務であるが、どうも、気に入らない事がある。
なぜ、国が購入するマシンは、デルとか、ヒューレット・パーカードが多いのだろう?
国土交通省のマシンセンターをぐるりと見渡しても、国産マシンはほとんど見かけない。
あったとしても、メンテナンス用に置いてあるノートパソコンばかりだ。
サーバマシンは、ほとんどすべてが外国製である。
デルやヒューレット・パーカードのマシンがいけないとは思わないが、国としてマシンを購入するなら、できるだけ日本製を選択するように、業者に指導するべきではないだろうか。
愛知県だけで、おそらく年間50台や60台はは購入しているのではないだろうか。
日本全国で同じように行われているのだから、何百台と購入しているはずだ。
やはり、日本製のサーバを購入して、少しでも内需拡大を進め、景気回復を目指すべきだ。
もちろん、外国製サーバマシンに、性能面、価格面で勝てないという事情は大いにあると思うので、日本製のサーバを選択するのは勇気がいるとは思うが、トータルするととても大きな金額になるので、海外に投げ捨ててしまうのは、ちょっとどうかと思う。
このエピソードはいかがでしたか? ![]() ![]() | ![]() |
投稿者 zunbe : 2005/07/21 11:53:15 | コメント (0)
2005/07/20
|
いかん、独り言のはずが、だんだんダメダメ・プログラム集になってきた。
このページを読んでいる皆さん、「こんなプログラムを書くヤツがいるんだな。あっはっは。」程度で笑い飛ばしてくれ。
先に指示したフィルタ・プログラムで、特定の情報をエラーに出力するように指示しておいたのだが、社員はこんなコードを書いた。
-----
print FILE sprintf("%07d", $no).":".sprintf('%X', $b)."\n";
-----
何だこの記述は?
「正しく sprintf() を使ったコードに書き直しなさい。」と指示。
次に出てきたコードは、こうだ。
-----
print FILE sprintf("%07d:%X\n", $no, $b);
-----
まぁ、当然、こうなるな。
そして、「変数 $b の出力は、ケタ数をきちんと合わせて出力しなさい。」と指示。
その指示に対して出てきたコードは、こうだ。
-----
print FILE sprintf("%07d:%02s\n", $no, sprintf("%X", $b));
-----
いったいぜんたい、何をどう考えたらこうなるのだろうか。
若いモンの発想は理解できん。
このエピソードはいかがでしたか? ![]() ![]() | ![]() |
投稿者 zunbe : 2005/07/20 09:46:28 | コメント (2)
|
最近、年のせいか、愚痴っぽくなった。
しかし、あまりの発想の貧弱さ、あまりの知識の無さには、正直言って腹が立つ。
今日も、こんな事があった。
先に指示したフィルタ・プログラムで、社員は以下の様なプログラムを書いた。
-----
open(EOUT, '>hoge.txt');
foreach (<STDIN>)
{
:
if (エラー発生?)
{
print EOUT "エラーの内容";
}
:
}
close(EOUT);
-----
ずんべは、このプログラムに対して、以下の様な修正指示を出した。
エラーの出力がバッファに溜まったままプログラムがこけると、エラーのダンプが無いまま終わってしまい、発生したエラーの状況が把握できない。
エラーの出力はバッファリングしないように修正しなさい。
この指示に対して、社員が行った修正は、こうだ。
-----
foreach (<STDIN>)
{
open(EOUT, '>>hoge.txt');
:
if (エラー発生?)
{
print EOUT "エラーの内容";
}
:
close(EOUT);
}
-----
我が目を疑った。
正気で書いたコードとは思えない。
何百メガもあるデータを1行読むたびに、エラーファイルを毎回オープンし直すだと?
これでは、処理速度が遅すぎて、使い物にならんではないか。
マシンにも余計な負荷がかかる。
若いモンの発想は理解できん。
このエピソードはいかがでしたか? ![]() ![]() | ![]() |
投稿者 zunbe : 2005/07/20 09:05:19 | コメント (0)
|
今日、こんな事があった。
簡単なフィルタ・プログラムを社員に書かせたんだな。
仕様はこうだ。
(1).標準入力からデータを取り込み、標準出力に出力する。
まぁ、フィルタだから、当然ですな。
(2).データは数百メガバイト~数ギガバイトもありうる。
この仕様で、社員が書いたプログラムは、こうだ。
-----
@idata = ();
foreach $line (<STDIN>)
{
push(@idata, $line);
}
@odata = ();
foreach $line (@idata)
{
# フィルタ処理
push(@odata, $line);
}
print @odata;
-----
こんなプログラムで何百メガも読み込ませたら、あっという間にマシンはパンクだ。
プログラムをよく見ると、エラー出力も、全部溜め込んで、最後に出力しているようだ。
ダメだ…。
メモリをバカ食い。
パイプラインを組んでも並列処理されない。
エラーで落ちても、何もエラーが残らない。もちろん、原因究明もできない。
まったく。
どうして、こういう発想になるのだろうか。
このエピソードはいかがでしたか? ![]() ![]() | ![]() |
投稿者 zunbe : 2005/07/20 00:59:52 | コメント (0)
| [ 1 2 3 4 ] [次へ>] [最後>>] | ||