ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

転ばぬ先の杖のような、システムのチェックと修正

最近は、5月に利用が終了したシステムを再利用するために設定変更作業をしつつ、プログラムをチェックしています。

不具合の報告があったわけではないので、プログラムのチェックはしなくてもよさそうです。
それでも、システムの利用開始後に得た新たな事項を反映すべきではないのかとチェックしています。

どんなことをチェックしているのか

  1. ショートタグ(<?)が使われていないか。
  2. 同時に同一Webサイトの別システムを利用された場合の制御が行われているか。
  3. POST動作の後に、フォームをリロードする動作をしていないか。
  4. メールの送信は、PEAR::Mailを使っているか。
  5. ボタンを誤って連続で押されないように、無効化処理をしているか。
  6. データベースロックを行っていて、適切な位置で行われているか。

f:id:AJYA:20160624164528j:plain
photo credit: Lomac LM-80L Andy Walker with a Pico Ammeter ? 81_21 via photopin (license)

それぞれどんな理由でチェックしているのか

  1. 利用中のエディタがショートタグ(<??を許可していなくて、コードの色分けがされず読みづらいので、長い形式(<?php)のタグに置きかえています。
  2. 同時に同一のWebサイトの別のシステムを利用されると、セッションで保持している値が後からの値で上書きされてしまうので、エラーになるように修正します。
  3. リロードすると、POST動作を再実行する際の警告メッセージが表示されるので、リロードではなく、GET動作をするように修正します。
  4. mb_sendmail()でメール送信をしていたら、特定のユーザーだけメールの件名が文字化けする現象が発生しました。
    PEAR::Mailでメール送信を行うように修正したら、文字化けしなくなったので修正しています。
  5. ボタンを連続で押すつもりがなくても押してしまい、2重登録されるときがあるので、ボタンを無効にする処理を追加しています。
  6. 登録の上限に達していいたら、登録できないようにチェックしています。
    データベースのロックがされていなくて、残り登録可能数が1のときに同時に登録をテストしたら、エラーになかった経験があります。
    登録の上限チェックの開始時点で、データベースをロックするように修正しています。


過去のシステムの使いまわしといえども、使うたびになんらかの修正を加える手間がかかります。

チェックボックスがOFFと無効の組み合わせで正しく動作しない現象を対策しました

既存のソースコードで以下の正しく動作しない現象を見つけ、修正しました。

現象

データベースに「0」とだけ保存されているはずのカラムに、「0,0」と保存されていました。

動作の流れ

直前にデータの更新操作をしたので、更新時にデータが誤ったデータで更新したと推測されました。

更新処理は、まず更新用のページに値を表示して、変更後のデータを入力してもらい、更新をします。
表示は、

  1. データベースから値を取得する。
  2. セッション変数に、データベースから取得した値を設定する。
  3. セッション変数を表示する。

という処理をしています。

更新は、更新ボタンをクリックすると、

  1. 更新用ページのフォームからPOSTされた値を使って、セッション変数を更新する。
  2. セッション変数の値を使って、データベースを反映する。

という処理をしています。

誤ってデータが更新された箇所は、1個目のチェックボックスがチェック状態で固定されていて、2個目以降はチェックをON/OFFできるようになっています。
0・変更不可
1・変更可能
2・変更可能

HTMLのソースコードは以下のようになっています。

<input type="checkbox" name="chk" value="0" checked="checked" disabled>0・変更不可
<input type="checkbox" name="chk" value="1">1・変更可能
<input type="checkbox" name="chk" value="2">2・変更可能

f:id:AJYA:20160623061034j:plain
photo credit: 2015 TechGirls at iD Tech Camp at American University via photopin (license)

原因

更新ボタンをクリックすると、更新用ページのフォームからPOSTされた値を使って、セッション変数を更新します。
チェックボックスの1個目は、選択状態ですがdisabledのために値がPOSTされません。
チェックボックスの2個目以降は、選択されていないと値がPOSTされません。

POSTされた値がないため、セッション変数はデータベースから読み込まれたときの値のまま「0」になります。
このセッション変数の値に対して、必ず「0」は選ばれているので、「0」を連結する処理が動作して、「0,0」という値を生成していました。
この値を使ってデータベースを更新していたので、該当のカラムに「0,0」と保存されていました。

対策

更新ボタンをクリックしたら、該当のセッション変数を初期化してから、POSTされた値を使って、セッション変数を更新するようにしました。
セッション変数が初期化されているので、POSTされた値が無い場合は、空文字に対して「0」を連結する処理が動作して、「0」になります。
POSTされた値がある場合(例えば2)は、空文字に対して「0」と「2」を連結する処理が動作して、「0,2」になります。
これで修正が完了しました。

値がPOSTされない場合があることを忘れない

ついフォームに表示されている要素は必ずPOSTされると勘違いしてしまいがちです。
無効だったり未選択では、POSTされないことを忘れないようにしないといけません。

ビニール折り畳み傘の存在を最近知り、普段は自動開閉折り畳み傘を使っています

今週のお題「雨の日グッズ」で思い出したのが、最近「マツコの知らない世界」という番組で放送されたビニール傘の回です。
アーカイブ|TBSテレビ:マツコの知らない世界

この放送のおかげで、コンビニの傘なんて、どこも一緒の安いだけだと思っていたら、意外にも各社特徴があることがわかりました。

取り上げられた中で一番気になったビニール傘

一番気になったのは、株式会社スギタの「ショートワイドビニール傘」です。
hygge web shop / ビニールショートワイド雨傘

ビニール傘で折り畳みがあるなんて、予想もしていませんでした。
単純に考えてみれば、生地が違うだけなんで作れそうです。

株式会社スギタのオンラインストアでは在庫がなくなっているようですが、Amazonでは在庫があるようです。

オンラインストアの倍の値段になってます。

自動開閉折り畳み傘は便利

普段の通勤カバンには、いつでも折り畳み傘を入れています。
傘専用のスペースがあるカバンなので、そこに入れっぱなしです。
出張で違うカバンを使うときに、移動し忘れることもあります。

僕が使っている折り畳み傘は、何年か前のハンズメッセで購入した、自動開閉する折り畳み傘です。
ボタンを押すとシャフトが伸びるのと傘が開いてくれて、建物からでるときに片手で操作できて便利です。

閉じるときは、ボタンを押すだけで傘を閉じてはくれますが、シャフトは伸びたままです。
シャフトを縮めるためには、傘の先端を持って押し込む必要があります。
バネの力で伸びているので重たくて、雨で濡れているのもあって慎重に押し込まないと戻ってしまうこともあります。

シャフトを縮められないのが残念ですが、閉じると同時にシャフトも縮む折り畳み傘ってないんですかね。