防災の日(ほんとにあった怖いデータベース)
9・1なので防災について考えてみる。頭に浮かぶのは、遠い過去に見た、とても怖い「災害時安否確認Webデータベース」。今でも思い出すと寒気がする↓
Webで入力する項目がいくつかある。
・安否「無事です」とか「怪我しています」とか。
・場所「○○にいます」「××で待つ」とか。
・その他コメント、など入力して「確定」すると記録されて、家族・関係者等と安否情報共有ができる、というものだ。
ここまではよい。
※問題は、入力後、情報を追加したいときに、どうなるか?
どうなるかというと、「全部まっさら」になる。!
そう。まっさら。・・・・何を言っているかって?
ーーーーーーーーーーーーーー
たとえば、「安否」、「場所」、「コメント」、その他もろもろの項目一つ一つを、入力して確定したとする。
その後、状況が変わった(避難場所が変わった)ので「場所」だけ変更したいとする。
安否、場所、コメント、その他項目全てが全部空欄の入力画面が出る。
「場所」の項目に新しい情報を入力し「確定」をクリックする。
すると「上書き」されてしまう。「追記」ではない。「上書き」。しかも「全項目上書き」だ。
場所の情報を変えただけのつもりが、最初に入力した「安否」も「コメント」も、その他もろもろの項目も、一切残らない。履歴としての記録もされていない。
ーーーーーーーーーーーーーー
そんなものにどれだけコストをかけていたのか。「情報の扱い方」の基本が「全くわかっていない」業者にでも作らせたのだろうか。
台湾の医療費
台湾の医療費(健保)、不思議だ。通っているクリニックでは、『受診前』に200元(約650円)前払いしたら終わり。その後、採血検査等をしても追加料金は発生しない。
薬代も不思議。
同じ薬なのに、前々回は、2週間分で10元。
「ずいぶん安いね?」と聞いたら、「健保があるからね!」みたいな事を言われた。
前回は1箇月分で30元。(比例しないのか?)
今日は、医師から3箇月分の処方箋をまとめてもらった。ただし、薬局で渡されるのは1箇月分までで、あとは毎月薬局にとりにいく方式。
薬代を聞いたら、「要りません。」という。「健保があるからね!」みたいな事を言われた(?)。
お試し期間(副作用チェック中)だけ、薬代が要る(?)のかなぁ。その辺、納得できるくらいまで聞きだせる会話力はまだ無い。
待ち方(締め切り過ぎて思い出した怖いコード)
納涼!ほんとにあった怖いコード(by CodeIQ×はてな)
↑の締め切りは過ぎてしまったので、これはもう応募対象にはならないが、一つ思い出した怖いコードの紹介を。
N88BASICの頃は、「ちょっと待機」というとき、
10 FOR I=1 TO 10000:NEXT I
みたいな書き方がしばしばされていた。
・時代は下ってWindowsになっても、しばらく装置制御関係では、「もとN88BASICのソースコード」を強引に移植したようなコードがかなりあった。
ループ回数を増やしたり、ループ内に重い処理を置いたりという『工夫(?)』はあるが、本質は変わらない。「待つ」べきところに来ると一定時間「ハングアップ」したように、マウスもキーも受け付けなくなる。
そんなコードにしばしば出くわした。あちらこちらにあった。
たまに見かけたコードの「待ち」のループ内に、DoEvents(VB)とかApplication.ProcessMessages(Delphi) とか使ってあるだけで、当時は「とても素敵」に思えたものだ。
※でも、「待ち」の処理にForループってのは、流石に今はもうやめてもらわないと。
下手ほど儲かる?(お題:CodeIQの問題・パズルを考えよう!)
CodeIQの問題・パズルを考えよう!(by CodeIQ×はてな)
「下手な開発者の方が儲けているよね」
という声を耳にしました。
なるほどそうかも?
・簡潔。高い汎用性。他人が見てもメンテナンス容易。
そんなコードを書いてもそれきり。
・無駄に長くて下手。汎用性なし。書いた本人しかわからない。
そんなコードを書いて、特定のユーザーに食い込むと、そのあとずっとメンテの仕事にありつける。担当を外されることもない。
こんなことが続けば、エンジニアのスキル向上の意欲がそがれ、長期的には、この分野の衰退につながるかもしれません。
何か良い対策は、ないでしょうか?
あらかじめ正解がある問題じゃなく、アイデアコンテストです。
昔、「こういうの、どうにかならないものか」と思った実体験から。
見切り発車(お題:納涼!ほんとにあった怖いコード)
納涼!ほんとにあった怖いコード(by CodeIQ×はてな)
↓↓↓ ここに君が見たクソコードを書こう!! ↓↓↓
見かけは、ちょうど、次のリンク先(ナショナルインツルメンツ社、技術資料サイト)の「Figure.1」のような、「グラフィカル」な「スパゲッティコード」だった。
http://zone.ni.com/devzone/cda/pub/p/id/1735
が、肝心なのは、そこではない。本当に怖いのは、駆動制御なのに、動作完了を確認せずに次の命令を出していたこと。そして、例外処理が無かったことだ。
↑↑↑ここまで↑↑↑
「PHP」話が続いたので、別の言語の話をしてみる。
もう10年以上前になるが、実験装置の制御で「LabVIEW」という開発ツールに触れたことがあった。グラフィック型言語の一種だ。
VI(Virtual Instruments)というアイコンを並べ、間を線でつないでいくとプログラムが完成するという『画期的』な開発ツール。
各種装置制御や、表示のライブラリが充実している。必ずしもプログラミングに深い知識を持つわけではない実験研究者が、「ちょっと装置を動かしたい」というときには適しているのだろう。
当時の実験プロジェクトのリーダーは言った。
「開発業者に基本骨格のところを作らせておいて、あとはキミたちプログラムが得意な人が、イロイロ肉付けしていけばいいよね。」
・・・適当な「業者」が見つからないので、装置(ハードウェア)の開発元に来てもらうことに。
「『LabVIEW』は初めてでして・・・」
我らがリーダーは有無を言わさない。
「でも、これはグラフィカルで簡単だから、オタクの技術力を持ってすればどうにかなるでしょ?この機会にちょっとがんばって覚えてもらえば、今後の業務の幅も広がるというもの・・。」
納期は当初予定より半年近く遅れた。
納品されたのは、「グラフィカル」な「スパゲッティコード」だった。
当時のソースコードは手元には無いが、ちょうど、次のリンク先(LabVIEW開発元ナショナルインツルメンツ社、技術資料サイト)の「Figure.1」のような図が、何枚もあった、と言えば、雰囲気は伝わるだろうか。そういったコードだ。
http://zone.ni.com/devzone/cda/pub/p/id/1735
リーダー曰く、「あとはキミたちが肉付けを・・・」
できるかっ!
ーーーーーーーーーーーーーーーーー
で、「誰も触れないコード」になってしまった。
開発依頼した機能は「スキャン測定」つまり、「座標などの条件を少し変え」ては「測定する」という動作を繰り返すもの。何千~万の測定点をつなぎ合わせると「スペクトル」とか「分布図」とか言われる実験データができる。夜間もずっと装置を動かして、データを取り続ける。
さて、納品されたコード。「あるがまま」に使うしかないわけだが、「稀にエラーでとまる」という問題があった。その確率、数千点の測定で一回程度。(一晩で1~2回程度。たまに一晩に4回、5回と落ちると、関係者の間では「御祓いしなきゃ」という話になる。)
エラーで止まったことに気づかずにいると、貴重なマシンタイム(装置割り当て時間)をふいにしてしまう。なので、終夜、誰かが寝ずの番でディスプレイを「見張る」。
当時、「寝ずの番」担当の合間に、私はこの開発言語のマニュアル片手にスパゲティコードを追いかけ、止まる原因を探っていた。そして驚愕の事実を知った。
スキャン測定は、
1.(位置、角度などの)条件変更命令
2.条件変更の動作完了を待つ
3.測定開始命令
4.測定完了を待つ
この4つの繰り返しが基本だ。特に『待ち方』が大事だ。
しかし、そのコードは2.で動作完了の確認をしていなかった。代わりに「固定秒数待機」の処理が入っていた。
つまり、「まあこのくらいで十分か?」というところでの『見切り発車』だった。
「条件変更」にかかる時間にはバラつきがある。動作がまだ終わらないうちに、次の命令を出してしまうと、装置からエラーコードが返る。
しかし
「例外処理は実装されていない」
ので、しばしば、そのまま止まっていたわけだ!
絞込み(お題:納涼!ほんとにあった怖いコード)
納涼!ほんとにあった怖いコード(by CodeIQ×はてな)
↓↓↓ ここに君が見たクソコードを書こう!! ↓↓↓
$Data=@file($csv_filename);
(中略)
for($i=0;$i<=sizeof($Data);$i++){
$lines=explode(",",$Data[$i]);
$keyword_hit = "";//初期化
if($search_keyword){
for($n=0;$n<sizeof($KeyArray);$n++){
if(mb_eregi($KeyArray[$n],$lines[1])){ //SN
$keyword_hit = 1;
}else if(mb_eregi($KeyArray[$n], $lines[6])){ //タイトルA
$keyword_hit = 1;
}else if(mb_eregi($KeyArray[$n], $lines[8])){ //タイトルB
$keyword_hit = 1;
}else if(mb_eregi($KeyArray[$n], $lines[11])){ //キーワードA
$keyword_hit = 1;
}else if(mb_eregi($KeyArray[$n], $lines[13])){ //キーワードB
$keyword_hit = 1;
}else {
$keyword_hit = 0;//該当なし
break;
}
}
}else{
$keyword_hit = 1;
}
( ・・・・長い長~いコード、略・・・・ )
}
↑↑↑ここまで↑↑↑
PHPソースの一部。
『SQLのwhere句』みたいなことをやろうとしている雰囲気は伝わってくる。
(・・・・・ただ、なにより、ともかく、遅いんだ。)
(8/26追記)
「稼ぐ」ことだけを「成果の指標」とするならば、この開発者は最も「効率的」に「成果」を上げていたといえるのかもしれない。CSVのデータ項目を「増やす」、「入れかえる」、検索対象項目の「変更」・・って、そのたびに「プログラム改修費」だものな。
カンマ(お題:納涼!ほんとにあった怖いコード)
納涼!ほんとにあった怖いコード(by CodeIQ×はてな)
↓↓↓ ここに君が見たクソコードを書こう!! ↓↓↓
//整形・保存
$Str=str_replace(",",";;;;",$Str);
(中略)
//読み出し、表示
$Str=str_replace(";;;;",",",$Str);
↑↑↑ここまで↑↑↑
これは、とあるPHPコードの、と~っても長~い関数の中の、インデントの深い深~いところで見つけた不思議な処理のごく一部。
これは何か?
CSVファイルにデータを格納・読み出す際の、「カンマ」の我流エスケープ(?)だったようだ。(なるほど、セミコロン4つなら、実際のデータ中に出てくる可能性はまず、無い?:笑)
そもそも、要件は単に、高々百数十件程度のデータの保存および、(絞込み、ソートして)、表形式で表示するだけのこと。
しかし、膨大なコードをたどってみると、この開発者、どうやら「データ形式"CSV"」で、PHP使って「データベースそのもの」の、劣化再発明を意図しているようだった。
「そっちへ行ってはいけない。」そう呼びかけようとするも、声が出ない。そんな怖さを感じた。