プログラマ ずんべ の日記

zunbe

プログラマ ずんべ の日記
プログラマ ずんべ の日記

探し物は見つかりましたか? サイト内検索を試してください。


<<先頭] [<前へ] [ 1  2  3  4  5  6 ] [] [最後>>

2005/08/03

【若いモンの発想はわからん】(その7) なんでもかんでもエスケープ

(その7) なんでもかんでもエスケープ

今日も、こんな事があった。

先日から作成しているバックアップ・プログラムで、目的のファイルを取得するのに、社員はこんなコードを書いていた。

-----
@files = grep(m/^.*.tar.gz$/, @files);
-----

「これでは、"ABCDEFGXtarXgz"でも対象になってしまうのではないか」と指摘したところ、こんなコードが出てきた。

-----
@files = grep(m/^.*\.tar\.gz$/, @files);
-----

これはいい。
ところが、プログラムの他の部分をよくみると、なぜかこんな修正が入っている。

-----
`tar czf ABCDEFG\.tar\.gz hoge auau`;
-----

何でやねん。
正規表現と単なる文字列を区別できんのか。



このエピソードはいかがでしたか?

投稿者 zunbe : 2005/08/03 06:00:56 | コメント (0)

2005/08/01

【若いモンの発想はわからん】(その6) なんでCHDIRしてるの?

(その6) なんでCHDIRしてるの?

今日も、こんなことがあった。

簡単なバックアップ・プログラムを社員に書かせたのだが、バックアップ対象とするファイルを取得するのに、以下の様な指示を出した。

(1).バックアップの対象はファイルのみ。
  シンボリックリンクなどは対象としない。

社員が書いたプログラムは、こうだ。

-----
$folder = '/hoge';

chdir($folder);

opendir(FOLDER, $folder);
@files = ();
while (defined($file = readdir(FOLDER))
{
  next if (! -f $file);
  push(@files, $file);
}
closedir(FOLDER);
-----

ちょっと待て、何で chdir なんかしてるんだよ。
社員に聞いてみると、こうのたまう。

ファイルかどうかの検査を -f で行っているのですが、うまくできませんでしたので、この様にしました。

当たり前だろう。
readdir で返ってくるのはファイル名だけだ。
パスを加えて -f をしなければ、正しく動作するはずがないではないか。
それを解決するために、chdir するとは、いったいどういう発想やねん。

若いモンの発想はわからん。



このエピソードはいかがでしたか?

投稿者 zunbe : 2005/08/01 20:27:19 | コメント (1)

2005/07/27

【若いモンの発想はわからん】(その5) 「エスケープする」の意味がわからない?

(その5) 「エスケープする」の意味がわからない?

今日も、こんな事があった。

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/20

【若いモンの発想はわからん】(その4) sprintfごとき、きちんと使え

(その4) sprintfごとき、きちんと使え

いかん、独り言のはずが、だんだんダメダメ・プログラム集になってきた。
このページを読んでいる皆さん、「こんなプログラムを書くヤツがいるんだな。あっはっは。」程度で笑い飛ばしてくれ。

先に指示したフィルタ・プログラムで、特定の情報をエラーに出力するように指示しておいたのだが、社員はこんなコードを書いた。

-----
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)

【若いモンの発想はわからん】(その3) 何万行も処理するんだぞ

(その3) 何万行も処理するんだぞ

最近、年のせいか、愚痴っぽくなった。
しかし、あまりの発想の貧弱さ、あまりの知識の無さには、正直言って腹が立つ。

今日も、こんな事があった。

先に指示したフィルタ・プログラムで、社員は以下の様なプログラムを書いた。

-----
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  3  4  5  6 ] [] [最後>>