DoorKeeper
http://sqlap.doorkeeper.jp/events/15394
以下の書籍をターゲットとした読書会なのです。
![]() | SQLアンチパターン (2013/01/26) Bill Karwin 商品詳細を見る |
場所はいつもの湯島、株式会社アルティネットさんではなく、今回は秋葉原のクラスメソッド株式会社さんでした。
@yokatsuki さん、クラスメソッドさん、会場提供ありがとうございます。
参加者は12人かな。
今回は @t_wada さんが諸事情により初の欠席ということで、皆勤賞の行方は makopi23 に委ねられたのでした!
この日は22章「シー・ノー・エビル(臭いものに蓋)」がターゲットでした。
■ 発表
今回は @grimrose さんが発表担当でした。
フルスクリーンは コチラ です。
ログや例外処理に関する資料への参照や考察が入っていて、とても勉強になります。
あと、今回はJavaとScalaで検証用のコードも書かれたとのことで、そちらの紹介もありました。
コードはGitHubに公開されています。 https://github.com/grimrose/SQL-Antipatterns-22
■ ディスカッション
今回もディスカッションしたいネタをみんなで付箋に書き出しました。

ちなみにクラスメソッドさんでの初ディスカッション風景はこんなカンジ。

今回は例外設計やログ設計に関するネタが多かったです。以下、個人メモ。
---
■ 契約による設計(契約によるプログラミング、DbC)
- レンガ本に載っている。
- wikipedia
- コードを呼ぶ側が事前条件と不変条件を満たす義務を負うことで、呼ばれたコードはその条件が恒真であるとの前提を利益として得る。引き換えに、呼ばれたコードは事後条件と不変条件を義務として負い、呼ぶ側の利益としてこれを保証する。
■ Loan Pattern(ローンパターン)
- リソースのオープンとクローズを共通化して、リソースをパラメータで受け取った関数にリソースを受け渡す実装方法のことらしい。
- 参考: 備忘録的なblog: ローンパターンを使用したリソース開放
- 借りたものは返しましょう。
■ ログ制御
- ログレベルは開発中はDebug,本番はInfoにすることが多い。
- ログはローテートさせて、バックアップも取る。
- エラーログと正常ログはファイルを分けてる。
- ソシャゲ開発はスピード優先なので、エラーを握りつぶしちゃうことがある。
- VB4時代、ログへ日時を和暦で出力している人がいた。。。
- アプリとミドルでログを分ける。
- ログを日本語で出すと文字化けすることがあったので、英語で出すようになった。
- 昔はログをターミナル経由で見ることがあって、環境によっては文字化けした。
- ログにはエラーコードだけ出して、エラーメッセージは後でエラーコードから突き合わせる、ということをやってた。
- コネクトやリトライ、リソース不足などが発生した時にログを出す設計をしてない人がいるので注意。
■ 非チェック例外の扱い
- あるAPIを使っていて、そのAPIが内部で呼び出している共通部品が独自の非チェック例外(javadocに書いてない)をthrowして、呼び出し元まで突き抜けてきた。
- APIは、非チェック例外をcatchしてjavadocに書いてあるチェック例外に置き換えてthrowしなおすべき?
- それとも非チェック例外はそのまま突き抜けさせるべき?
- 非チェック例外は上に突き抜けさせて、フレームワークに処理を任せるべきでは。
■ 富士ソフトのトランザクション問題
裁判では(中略)セプトは原因について、データベースシステムで発生し得る「デッドロック」と呼ぶ障害を未然に防ぐためのプログラムを、富士ソフトが開発していなかったことにあると指摘。「富士ソフトは、デッドロック予防のプログラムを導入すべき義務に違反した」と主張している。 --- 地獄だ
— Kumazaki Hiroki (@kumagi) 2014, 7月 30
これに富士ソフトは真っ向から反論。「契約内容通りにシステムを開発した。賠償を請求できる瑕疵(かし)担保期間も過ぎている」と主張する。富士ソフトはトラブルの原因について、自社が関与していないシステム運用・保守の不備の可能性がある、とも指摘している。 --- 泥沼だ
— Kumazaki Hiroki (@kumagi) 2014, 7月 30
直前2ツイートは 日経の『システム危機を回避、五つの心得 「動かないコンピュータ」を乗り越えて】 http://t.co/6yRXBdxUr8 からの引用です。
— Kumazaki Hiroki (@kumagi) 2014, 7月 30
■ 例外/ログ設計に関するTIPS
- APIはあんまり使われないような使い方はしない方がいい。動的型付け言語だと、それで死ぬことがある。。。
- サンプルアプリとサービス(デーモン)の開発は、例外設計がまるで違う。
- サンプルアプリはClose処理を忘れてもすぐ終わるのに対し、サービス(デーモン)は長く使われ続けるので。
- Windowsだと、ログファイルをサクラエディタなどで開くとロックがかかるので注意。
- それでシステム障害を起こしたことがある。。。
- Javaでログ出力するなら、SLF4J+Logbackの組み合わせが良い。
- 様々なログAPIにはアダプタが用意されてて、どこに寄せるかを決めないといけない。
- log4j2 とか log5j なんてのもある。
- Railsやってるとフレームワークがログを全部やってくれるので、ミドルのログとか見なくなる。
■ コネクションプーリング
- 長い時間アイドル状態になると、タイムアウトで自動的に接続が切れる。
- 接続OFFを考慮していないような設計はダメ。
- 接続の生き死にの設定がどうなってるかを確認しておくべき。
- 生存確認のハートビード用SQLは、デフォルトで "select 1 from T" のようになっていることが多い。
- MySQLの"show databases;"はディレクトリを全部舐めに行くので、生存確認をそれでやるとタイムアウトで死ぬことがある。。。
- 生存確認で数秒毎にinsertやcreateを実行するDBMSもあるらしい。
- MySQLのpingは内部的に"select 1 from T"というSQLを実行しているらしい。
■ ログの整形
- EclipseのDBViewerはSQLを整形して見れる。
- ログにSQLを出力する際、アプリ側でSQLを改行していると、改行したままログに出力されることがある。
- grepとかするときに、ログは1行に出ている方が良いかも。
■懇親会
読書会終了後は8人くらいで「俺の煮込屋 三蔵 岩本町店」に行きました。
リーズナブルで美味しかった~
★感想:
ログ設計や例外設計に広く話が及んで、とても勉強になりました。
あと、 @grimrose さんのスライドで紹介されてたいろんなコンテンツも、あとで読んでとても参考になった。
契約による設計、infoレベルのログは出力しない、などなど。。。
あとディスカッションで出た、ログAPIはいろんなものがあるのでアダプタで寄せる、という概念は初めて知りました。
ログや例外処理はアプリ開発で必須なので、これだけでいっぱいネタが出てきますね~
次回以降も皆勤目指しておべんきょしようと思います。
みなさんありがとーございました。
■おまけ:過去の「SQLアンチパターン読書会」ブログ
1章:SQLアンチパターン読書会 「ジェイウォーク」に参加しました
http://makopi23.blog.fc2.com/blog-entry-65.html
2章:SQLアンチパターン読書会 「ナイーブツリー」に参加しました
http://makopi23.blog.fc2.com/blog-entry-70.html
3章:SQLアンチパターン読書会 「IDリクワイアド」に参加しました
http://makopi23.blog.fc2.com/blog-entry-73.html
3章:SQLアンチパターン読書会 「続・IDリクワイアド」 に参加しました
http://makopi23.blog.fc2.com/blog-entry-77.html
4章;SQLアンチパターン読書会 「キーレスエントリー」 に参加しました
http://makopi23.blog.fc2.com/blog-entry-84.html
5章:SQLアンチパターン読書会 「EAV(エンティティ・アトリビュート・バリュー)」に参加しました
http://makopi23.blog.fc2.com/blog-entry-90.html
6章:SQLアンチパターン読書会 「ポリモーフィック関連」 に参加しました
http://makopi23.blog.fc2.com/blog-entry-94.html
7章:SQLアンチパターン読書会 「マルチカラムアトリビュート」に参加しました
http://makopi23.blog.fc2.com/blog-entry-97.html
8章:SQLアンチパターン読書会 「メタデータトリブル」 に参加しました
http://makopi23.blog.fc2.com/blog-entry-105.html
9章:SQLアンチパターン読書会 「ラウンディングエラー」 に参加しました
http://makopi23.blog.fc2.com/blog-entry-109.html
10章:SQLアンチパターン読書会 「サーティーワンフレーバー」に参加しました
http://makopi23.blog.fc2.com/blog-entry-115.html
11章:SQLアンチパターン読書会 「ファントムファイル」に参加しました
http://makopi23.blog.fc2.com/blog-entry-118.html
12章:SQLアンチパターン読書会 「インデックスショットガン」に参加しました
http://makopi23.blog.fc2.com/blog-entry-121.html
13章:SQLアンチパターン読書会 「フィア・オブ・ジ・アンノウン」に参加しました
http://makopi23.blog.fc2.com/blog-entry-128.html
14章:SQLアンチパターン読書会 「アンビギュアスグループ」に参加しました
http://makopi23.blog.fc2.com/blog-entry-130.html
15章:SQLアンチパターン読書会 「ランダムセレクション」に参加しました
http://makopi23.blog.fc2.com/blog-entry-133.html
16章:SQLアンチパターン読書会 「プアマンズ・サーチエンジン」に参加しました
http://makopi23.blog.fc2.com/blog-entry-134.html
17章:SQLアンチパターン読書会 「スパゲッティクエリ」に参加しました
http://makopi23.blog.fc2.com/blog-entry-136.html
18章:SQLアンチパターン読書会 「インプリシットカラム」に参加しました
http://makopi23.blog.fc2.com/blog-entry-138.html
19章:SQLアンチパターン読書会 「リーダブルパスワード」に参加しました
http://makopi23.blog.fc2.com/blog-entry-140.html
20章:SQLアンチパターン読書会 「SQLインジェクション」に参加しました
http://makopi23.blog.fc2.com/blog-entry-144.html
21章:SQLアンチパターン読書会 「シュードキー:ニートフリーク(疑似キー潔癖症)」に参加しました
http://makopi23.blog.fc2.com/blog-entry-147.html
- 関連記事
-
- SQLアンチパターン読書会 「ディプロマティック・イミュニティ(外交特権)」に参加しました
- SQLアンチパターン読書会 「シー・ノー・エビル(臭いものに蓋)」に参加しました
- アジャイルサムライ横浜道場 「ユーザーストーリーを集める」に参加しました