近畿のツーリスト会社の予約システムバグ

数日前、近畿のツーリスト会社の予約サイトで旅行予約を行った時に強烈なバグに遭遇しました。
一般ユーザ向けのWEBサービスでバグを見つけたのは初めてです。
バグの内容的に予約を行った一般ユーザ側が損をしたり旅行が残念な結果になる内容でした。

バグ発生の手順は以下の通りの簡単な方法です。
(1) 普通に予約処理を進め、支払い手前の最終確認ページまで進める。
(2) (1)の最終確認ページは置いておいて、ブラウザの別タブを開いて新規に予約処理を再度進め、支払い手前の最終確認ページまで進める。
(3) (1)の最終確認ページで申込みボタンをクリック。
この手順で進めると、(1)の予約ではなく、(2)が予約されてしまいます。
再現テストも2回行い、計3回同じバグが発生したので間違いないです。

たぶん、予約情報がユーザアカウントに紐づいて1つだけサーバに格納されており、(1)の申込みボタンをクリックすると、(2)の予約情報で予約されるのでしょう。

しっかり実装するのであれば、予約情報とユーザアカウントを紐づけではなく、予約情報とユーザアカウント+一時トークンを紐づけですね。

とりあえず暫定で対応するならば、予約情報が変化していたら申込みボタンクリック後にエラー発生ですね。
これで間違った予約はされないですが、ユーザからすると不便なので大きな機会損失になるでしょうね。

今回、全国割の結果が最終確認ページまで進まないと分からないので、同じバグに遭遇している人は多いはず。

よくありそうなバグなので、自分も気をつけなあかんなという思いです。

この内容はすぐにツーリスト会社に連絡し、再現PDFも送付しました。
ツーリスト会社からシステム開発会社に確認依頼中で、まだ結果は出ていないです。
キャンセル料無しで取り消ししてくれるだろうと思っていますが、結果どうなるのかはまた記載します。

[追記]
ツーリスト会社から連絡があり、症状の確認が出来たのでキャンセル料無しで取り消しを行ってもらえるとのことでした。よかった。
予想通り予約情報が上書きされていたとのことでした。
同じバグで被害に合っている人が全員対応してもらえるのだろうか。気になります。
とりあえず解決です。

PowerToysのスクリーンルーラー

PowerToys(マイクロソフト製のWindows便利ユーティリティ)を以前から使用しております。

最近、「スクリーンルーラー」という機能が追加されました。
これがなかなかGUIのデザイン作成時などに役立ちそう。

C#でCPUパフォーマンス解析

作成したアプリの各処理のCPU使用量を知りたい場合、VisualStudioがインストールされている環境ではパフォーマンスプロファイラを使用すれば良いのですが、本番環境の本番運用ではそうはいきません。

というわけで、C#でCPUパフォーマンス解析を行う機能を実装しました。

詳細は記載しませんがざっくり説明すると、ProcessThreadインスタンスのTotalProcessorTimeプロパティでプロセッサを使用した時間の合計値が取得できるので、各処理開始から終了までのTotalProcessorTimeの差を積算していき、
各処理ごとのCPU使用量を集計することで実現できます。

この集計結果を定期的にログファイルに出力しておけば、問題発生時や性能改善時の役立ちそうです。

Windows11の小さいタスクバー

Windows11では残念なことに「小さいタスクバー」表示が設定から出来なくなりました。
ノートPCなどでは限られたデスクトップ領域を広く使用したいので小さくしたいですよね。

レジストリを直接弄れば小さく出来るのですが、日時やアイコンがはみ出ていてブサイクです。

どうにか出来ないかと調べていると、フリーソフトのTClockを使用すると改善できることが分かりました。
助かりました。
※似たソフトにTTClockというものがありますが、これは全く別のソフト。

UVCカメラ対応

先日、WEBカメラなどUVC規格のカメラを使用する案件を行いました。

いつもはUVCカメラのアクセスはOpenCVで行っていたのですが、OpenCVで露光やフォーカスなどのサポート有無や値範囲の取得方法が分からず(対応いていない?)、しかたないのでDirectShowを使用しました。

DirectShowのCOMオブジェクトを直にアクセスして操作するのはなかなか大変でしたが、良い経験になりました。
ライブラリ化を行ったので今後の案件では楽に使用できそうです。

QRコードの読み込み

今行っている案件で、QRコードの読み込みを実装しています。

QRコードの読み込みにはZXing.Netを使用しましたが、画像の明るさやQRのサイズによって結構読めない場合がありました。
普通にZXing.Netを使用すると以下の結果になり、6個中3個しか読めていないです。見た目にはかなり綺麗にQRコードが撮影できているのですが。

単純に、前処理に大津の2値化を行うだけでもだいぶ精度が良くなりますが、今回はもっと高精度な前処理+ロジックを行うようにしました。詳細は秘密。
結果、全てのQRコードが読めるようになりました。

string型プロパティの複数行入力

TextBoxコントロールのTextプロパティなどはプロパティウィンドウで複数行入力が可能です。
以下の画面のように右端の下矢印ボタンクリックで複数行用の入力ウィンドウがポップアップします。

今回、これと同じ挙動を自作のプロパティで行いたく、調べた結果、以下のように属性指定すると複数行入力が行えることがわかりました。


        [Editor("System.ComponentModel.Design.MultilineStringEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(System.Drawing.Design.UITypeEditor))]
        public string Text {
            get => _Text;
            set {
                ...
            }
        }

VisualStudioの起動が遅い

弊社で開発している、ある案件のVisualStudioソリューションを開くのが異常に遅い問題があり、
てっきりプロジェクト数が100個くらいあるのでしかたがないと諦めていたのですが、
原因がわかり速くなりました。

問題は「Microsoft Visual Studio Installer Projects」で作成したインストーラプロジェクトでした。
インストーラプロジェクトを含んでいるとVisualStudioソリューションを開いていからマウス操作がまともに行えるようになるまで1分くらいかかっていたのですが、
インストーラプロジェクトを省くとマウス操作が数秒で行えるようになりました。

今は、ソリューションに空のダミーインストーラプロジェクトを含むようにし、インストーラを作成するときだけソリューションファイルを置換してダミーインストーラプロジェクトから本番インストーラプロジェクトに切り替えるようにしました。

もっと早くに気づけばよかった。