プログラマ ずんべ の日記

zunbe

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

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

2005年8月 プログラマ ずんべ の日記


[ 1  2  3  4 ] [] [最後>>

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

【会社・仕事】国が購入するマシンは…

国が購入するマシンは…

最近、うちの会社では、公共の仕事を始めた。
もちろん、ソフトウェア開発の業務であるが、どうも、気に入らない事がある。

なぜ、国が購入するマシンは、デルとか、ヒューレット・パーカードが多いのだろう?
国土交通省のマシンセンターをぐるりと見渡しても、国産マシンはほとんど見かけない。
あったとしても、メンテナンス用に置いてあるノートパソコンばかりだ。
サーバマシンは、ほとんどすべてが外国製である。
デルやヒューレット・パーカードのマシンがいけないとは思わないが、国としてマシンを購入するなら、できるだけ日本製を選択するように、業者に指導するべきではないだろうか。

愛知県だけで、おそらく年間50台や60台はは購入しているのではないだろうか。
日本全国で同じように行われているのだから、何百台と購入しているはずだ。
やはり、日本製のサーバを購入して、少しでも内需拡大を進め、景気回復を目指すべきだ。

もちろん、外国製サーバマシンに、性能面、価格面で勝てないという事情は大いにあると思うので、日本製のサーバを選択するのは勇気がいるとは思うが、トータルするととても大きな金額になるので、海外に投げ捨ててしまうのは、ちょっとどうかと思う。



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

投稿者 zunbe : 2005/07/21 11:53:15 | コメント (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)

【若いモンの発想はわからん】(その2) 数ギガバイトのデータを読むんだぞ

(その2) 数ギガバイトのデータを読むんだぞ

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

簡単なフィルタ・プログラムを社員に書かせたんだな。
仕様はこうだ。

(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 ] [] [最後>>