北國銀行が日本で初めて勘定系システムをクラウド化

プロジェクトオーガナイザの吉田聖書よしだみふみです。

今回は、石川県の金沢市に本店を置く北國銀行が、今月からクラウド環境での勘定系システムを稼働させたというニュースを取り上げます。

Read the rest of this entry »

スーパーコンピュータ「富岳」使ってみる?

プロジェクトオーガナイザの吉田聖書よしだみふみです。

去る3月9日に、
スーパーコンピュータ「富岳」が完成した
というニュースがありました。
ご存じの方もいらっしゃるかと思いますが、
私はこれを聞いて違和感を覚えました。

Read the rest of this entry »

パソコンをリサイクルに出してみた

プロジェクトオーガナイザの吉田聖書よしだみふみです。

今週はシルバーウィークということで
軽めの話題をお送りします。

職場ではなく、ご家庭でのパソコンの
リサイクルはどうしていますか。

今回初めてリサイクルに出したので
その様子をレポートします。

Read the rest of this entry »

新型コロナの検査結果にも応用できるベイズ理論

プロジェクトオーガナイザの吉田聖書よしだみふみです。

近年のAIブームによって、
特に機械学習の分野において
ベイズ統計学(ベイズ理論)が注目されています。

数学は苦手という方でも
「条件付確率」といえば
何となく覚えているという人もいるのでは。

それが、

新型コロナの検査で「陽性」と診断された時に
本当に感染している確率は?

という問に答えるものであるということです。

Read the rest of this entry »

ハードディスク(HDD)の準備と後始末

プロジェクトオーガナイザの吉田聖書よしだみふみです。

神奈川県が破棄したはずのハードディスク(HDD)が
転売されて重要データが流出した
というニュースにはショックを覚えました。

ある会社で複数のWebサービスを運営しており、
10年くらい前、私が業務委託で
リース切れに伴う物理サーバの更改を
支援した時のことを思い出しました。

Read the rest of this entry »

Last name と first name

ITコーディネータの吉田聖書よしだみふみです。

自分の氏名を書く時、
姓と名をどの順番で書いていますか。
あるいは名乗る時はどうでしょう。

きっと読者の多くの方が
姓→名の順番だと答えるでしょう。
では、海外へ行ったり、
ローマ字で書く場合はどうでしょうか。

Read the rest of this entry »

ドイツのトイレットペーパーは何枚重ね?他、小数点と単位とお金のこと

ITコーディネータの吉田聖書よしだみふみです。

前回に引き続きドイツでの話です。

日本でも、初めて行くタイプのお店では
どうやって買い物をし、どうやって支払えばよいのか
分からなくて戸惑うことがあると思います。

その地域なりの習慣や流儀があったり、
それで分からずもたもたしていると後ろで待っている人に迷惑かもしれない
などと思うと余計に焦ってしまいますよね。

今回はそんな、細かいけどちょっと戸惑った、
数字とお金について気づいたことを書きたいと思います。

Read the rest of this entry »

データベースの索引がイケてない話

以前、とある業務システムで検索スピードが要件を満たさずにリリースが延期されたという話を耳にしたことがあります。それを聞いた時、かつて少し関わっていた現場で、検索するとCPU負荷が100%に張り付くシステムや、ちゃんと動いていたのにある日を境に検索がタイムアウトするようになったシステムの存在を思い出しました。

この手の話はデータベースの索引が適切でないことに原因があることが多いのですが、データベース設計の教科書でも索引は基本的な単元であるにもかかわらずわりと良く聞く話でもあったりします。プログラムはゴリゴリ書けるけど、DB設計をきちんと学んだことが無い人が作っているという可能性もあるのですが、もしかしたらある程度きちんと機能する索引を付けるにはそれなりに経験を積んでセンスを磨く必要があるということなのかもしれません。

索引は検索キーやソートキーに付与するというのが基本ですが、複数カラムを指定して検索する場合にその索引が使われなければ、別途使われるような索引を付与するといったことをします。ただ、あまり索引を付け過ぎると更新処理のパフォーマンスが落ちるので、検索スピードが欲しい場合はマスタとは別に検索用のテーブルを用意することもよくあります。最初は普通に結合して選択していたものが、段々パフォーマンスが落ちてきたために途中で検索用テーブルを追加するといったことは別におかしいことではありません。

適切な索引が無ければどんなにSQLを効率的に記述してもパフォーマンスは出ませんし、また、基本的な索引は理論だけで行けるとしても、RDBMSの実行計画は実際にテーブルに格納されているデータの件数だけでなく内容によっても変わってきます。なので、もし絶対に止めてはいけないようなシステムの場合は、テストの段階で本番さながらのテストデータを使って本番さながらの件数を格納した上で動作を確認しチューニングする必要があります。

チューニングの作業は私は結構楽しいと思っていますけれど(例えばチューニングして検索スピードが10分の1になったら楽しくないですか?)、面倒くさいと感じる人はなるべくやらずに済ませたいと思ってしまうのでしょうか。


ログレベルとメッセージコード体系の調和

久しぶりにアーキテクトっぽい話題としてログの話をします。その中でもログレベルとメッセージコードの設計にまつわる失敗談をお伝えしたいと思います。ログまたはロギングは情報システムにとって主要な機能でないにも拘らず、おざなりな設計をすれば後で痛い目に遭うという曲者です。

ログレベルというのはエラーレベルとも言いますが、ログに記録する事象の重要度(あるいは緊急度)を示しており、大別すると3種類で故障・警告・情報です。ただ、ログレベルの種類はそのレベルの定義も含めて運用設計に関わってくるので、一般化しようと思ってできるものではありません。ですので、ここではログレベルそのものの話題ではなく、メッセージコードの体系との兼ね合いについてお話しすることにしましょう。

メッセージ設計の観点

まず考えることとして、メッセージコードにログレベルを持たせるかどうかという点があります。それはつまりメッセージコードを見ただけで、ログのレベルを判断できるようにするかどうかということです。故障ならErrorの頭文字を取ってE001、警告ならWarningの頭文字を取ってW001などとするのはこの考え方です。

次に考えることとして、発生したメッセージのログレベルに応じた制御があります。例えばバッチプログラムではジョブストリームの制御、Webアプリなどのオンラインプログラムでは画面遷移の制御を切り替えるということ。それらに加えてログ監視によるエラー検知と警報(エラー通知)を行うことも最近ではごく一般的なことだと思います。

ログ出力の方式の失敗

さて、そのログ出力処理ですが、あるシステムでは、ログ出力処理にログレベルとメッセージコードの両方を渡していました。これは愚直な方法ですがシステム全体において両者の整合性を保つ必要があるため、正直しんどい方式です。

そこで、私がアーキテクチャを担当した別のシステムでは、メッセージコードだけを渡す方式を採用しました。ログ出力処理の中で渡されたメッセージコードからログレベルを判別して以降の制御を行うというものです。これはほとんどの場合においてうまく行きましたが、ログレベルの変更に弱いということが分かりました。ある事象についてのログレベルを変更したいという場合、ログ出力処理を呼び出している個所のメッセージコードも併せて変更する必要があるということです。

また、ログレベルと画面遷移が必ずしも対応してないケース、つまり、同じレベルのエラーでもエラー画面に遷移すれば良い時もあれば、前の画面に戻したい時もあり、そういったケースでは単純な共通コードでは実現できないため少々苦労しました。それに、ログレベルが変わっただけで画面遷移(あるいはジョブ制御)が変わってしまうと不都合もあるでしょうし、バグになりやすいのです。

ログレベルとメッセージの現実的なアイデア

そこで、現実的にはログレベルと制御を分離した上で、ログレベルの変更に強いログ出力方式を考案する必要があります。前提として、メッセージの文言は定義ファイルに設定されており、メッセージコードから一意に引当てることができるものとします。

いくつか考えられると思いますが、ログに記録するメッセージコードの体系は、既に運用設計の中で定められており自由に決められない場合があります。そういう場合でも対応できるようにログに記録するメッセージコードとは別に内部のメッセージコードを定義すると良いのではないかと考えています。

この方式では内部のメッセージコードにはログレベルを表す文字を含めず連番(とその他の記号)のみとし、ログレベルはメッセージ定義ファイルの中に文言と一緒に定義しておきます。ログを出力する時は内部メッセージコードをログ出力処理に渡します。するとメッセージ定義ファイルからログレベルと文言を引当ててログに記録します。

こうしておくと、ログレベルを変更するにはメッセージ定義のみを変更すればよく、ログ出力処理を呼び出しているコードの修正を行う必要がありません。ログレベルの変更で悩まされたという方は是非一度試してみてはいかがでしょうか。

過去と今のコミュニケーション

また久しぶりにデータベースの話をしたいと思います。前回は「論理削除か物理削除か」というテーマで記事を書いたらそこそこ反響がありました。こういったテーマは実際にDB設計に関わっている方でないと刺さらないのだと思いますが、そのうち入門者向けの話題も提供したいと考えています。

IDの採番方式

さて本題ですが、今回はIDの採番において私が実際に遭遇したトラブルについての話です。そもそも採番という言葉が一般的ではないのかなと思っていますが。というのも普通にPCで「さいばん」と打っても変換されないので、新しい現場へ行ってPCが貸与されると大抵この単語を辞書登録するからです。英語で言うと numbering が近いのでしょうか。別の言い方をすると発番あるいは番号の払出しといったところでしょうか。

利用するDBMS製品によってはIDの列に自動採番の属性を付与することで済ませるケースもありますが、多少癖もあるので緻密な運用を行いたい場合は自前で実装することになります。実装と言ってもそんなに難しいことはなく、IDが連番であることを利用してその最大値に1を足したものを新しいIDとするだけなのですが、その方式によっては注意が必要です。

これは設計者の好みの問題もあるのですが、テーブルの行数を見積もった時に、まあ普通に取り扱える規模であれば毎回最大値を計算して1を加算しても大した負荷にならないので私はその方式を良く使っています。一方で最大値を計算するのが負荷となるほどの行数が見込まれる場合は、本テーブルの他に最大値を管理する採番用テーブルを作ってそこで管理するケースがあります。

ちぐはぐなロジック

ある現場でデータの移行を実施した時のことです。ファイルに用意したデータ件数と、実際に取り込まれたデータの件数が1件だけ異なるという事故が起きました。あまり細かい話をしてもしょうがないのでざっくり書くと、そのシステムはWEBアプリケーションで、移行はバッチアプリケーションでしたが、両社でIDの採番方式が異なっていたためにWEBアプリで作られたデータを1件バッチで上書きしてしまっていたということが判明しました。

具体的には、WEB側では、採番用テーブルのIDに1足した番号を新しいIDとして本テーブルのレコードを作成し、その番号で採番用テーブルのIDを更新していたのですが、一方のバッチ側では、採番用テーブルのIDを使って本テーブルのレコードを作成し、そのID+1の番号で採番用テーブルのIDを更新していたのです。つまり採番用テーブルの番号が「使っている値の最大」なのか「次に使うべき値」なのかという解釈において相違があったわけです。

例えば、WEB側でIDが1~5までのデータが作成されていたとします。そこへ移行バッチでデータを追加すると本当は次のレコードのIDは6番でなければいけないのですが、採番用テーブルのIDが5番であるために追加するレコードのIDを5番としてしまい、すると結果的に既にある5番のデータが上書きされてしまうという事象が発生してしまいました。

鍵はコミュニケーション

この話の留意点は、どっちの方式が正しいかという議論ではないというところです。よくありがちなコミュニケーション不足、検討不足の症例です。要はどちらかのやり方にもう一方が合わせていれば全く問題の無かった話です。

また、これが実際に起こった時には、移行の作業等に起因してもっと状況がややこしく、原因を突き止めるのに苦労したのですが、その移行作業の問題点というのは本題を外れるので、いずれ機会があれば書きたいと思います。データベースの話と言いながらマネジメントの話っぽくなってしまいましたね。