サポンテ 勉強ノート

サポンテの勉強ノート・読書メモなどを晒します。

SQL アンチパターン (Bill Karwin,和田卓人,和田省二,児島修 オライリージャパン)

免責

この本を読んだことがない人が、このノートから本の内容を脳内に展開することはできません。見出し部分は Amazon などで「目次」の内容として公開されている範囲にとどまります。

この本を買うかどうか悩んでいる人は是非購入しましょう。これは価値のある本です。

本の紹介

SQL つまり RDBMS を使ったアプリケーション開発や運用の中で遭遇する「アンチパターン」についてまとめられている本です。出版年を見ると歴史が古いことがわかりますが、Amazon で見ると最近も非常に人気があるロングセラーであることがわかります。読んでみると、それは確かに納得のいくものでした。

アンチパターン、つまり「やらない方がよい手法」を集めたものですが__多くの人が共感してくれると思いますが__よくやってしまう手法でもありました。なんとなく「まずいんじゃないかな〜」と思って(ついつい)やっていること(あるいは賢明にも避けたこと)に対して名称を付け、するべきではない理由、あえて採用する場合の基準などを明確に説明してあります。この本は RDBMS を扱う仕事をする人の道しるべなのです。

ノート

これは本をまるごと1冊、見開き2ページにまとめてみました。

全体は3つの部に分かれています。それぞれのパターンの見出しを箇条書きのようにまとめてみました。実際の業務にあたっては、この見開きだけを参考にして進めていくことができます。簡単なチェックリストにもなります。

本と違えたところ

この本を持っている人の中には「見出しが違うな」と気づいた方もいるかもしれません。これは自分でわかりやすい形に書き換えました。最初に断っておくと、翻訳が気に入らないということではありません。実際、この本の翻訳はすばらしいと思います。そうではなく自分が経験した業務にはなじみのない表現であったり、この方が自分が思い出しやすいなど、現実に使いやすくあることを念頭に作ったノートです。

追加したもの

また「この本の中にない見出しがあるぞ」と気づいた方もいるかもしれません。別の書籍で記されているアンチパターンや Web で調べて見つけたりしたものを追加してあります。いずれも、この本に収められていても不思議ではない知見です。これからも見つけ次第、追記してきます。ノートは、こうして成長していくのです。

それぞれの出自を記します。

とりあえず削除フラグ

訳者の方がネット上に公開しているスライドです。詳細はリンク先をご覧下さい。

SQLアンチパターン 幻の第26章「とりあえず削除フラグ」

論理削除フラグという名の死亡フラグ - @ledsun blog

これほど明確で的確な命名はありません。シビれます。

買い物リストとカートの中身

これは「 理論から学ぶデータベース実践入門 」という別の書籍に書かれていたアンチパターンです。検索性能を上げるために別のカラムなどから導き出される結果をフラグにして持っておくなどの冗長設計をして、そのメンテナンスを怠るといった内容です。その書籍にはキャッチーな名前が付いていなかったと思いますので、自分で勝手に名前をつけました。

スーパーで買い物をするとき買い物リストを持っていきますが、売り場の順序とリストに書かれている順番は違います。カートに入れた商品に対して買い物リストにチェックを入れ忘れると、売り場を回っているうちに「あれ?これはカートに入れたっけ?」とわからなくなります。そうなるとカートの中に入ったたくさんの商品をかき回して調べなければいけません。そんなイメージです。

単語帳

これは「 楽々 ERD レッスン 」という書籍から引用し、私が設計上のアンチパターンとして名前をつけてノートに記しました。

ビジネス上のコード__例えば社員番号や商品コード__をテーブルの主キーにする設計手法を指します(やっている人は多いのではないでしょうか?)。

学生がよく使っている単語帳は一見すると単語それ自体が主キーになりそうですが、同じ単語で複数の意味を持つ場合に、カードを分けたい場合があります。そのようなイメージです。

ビジネス上のコードはビジネス上のルールに則っています。ビジネスルールである以上、ビジネスルール自体が目的を持ち、しかもそれはシステムの寿命やスコープと一致するわけではありません。ビジネス上のコードはシステムの都合ではなくビジネスの都合によって決められ、そして頻繁に変更されます 1

その他、どのような場合に問題が発生するかは「 楽々 ERD レッスン 」自体をご参照ください。これもいい本です。


  1. 頻繁というのは相対的な言葉ですが、ここでは「システムの寿命と比較してはるかに」という意味です。ユーザーは「ごく稀に変更がある」という程度の認識でしょう。ユーザーの「滅多に無い」という言葉を「システム上のレアケース」とは思わない方が良いです。

「完全独習 統計学入門(小島寛之 ダイヤモンド社)」 勉強ノート「第二十一講」

はじめに

第二十一講の勉強ノートです。t分布の相対度数と母平均を区間推定する方法について書かれています。

この本はこの講で終わりです。最後に、今までのまとめのページを作ります。

f:id:saponte:20170630214307p:plain

免責

ノートには著作権法に抵触しないよう、自主規制が入ります。

本の紹介

「完全独習 統計学入門(小島寛之 ダイヤモンド社)」 勉強ノート「第二十講」

はじめに

第二十講の勉強ノートです。t分布が登場しました。母平均以外は標本データから算出できる統計量Tと、その分布について書かれています。

母分散の推定方法がわかったところで、同様の手法で母平均の推定に挑んでいきます。

f:id:saponte:20170630214204p:plain

免責

ノートには著作権法に抵触しないよう、自主規制が入ります。

本の紹介

「完全独習 統計学入門(小島寛之 ダイヤモンド社)」 勉強ノート「第十九講」

はじめに

第十九講の勉強ノートです。母分散を推定する方法について書かれています。

f:id:saponte:20170630214031p:plain

免責

ノートには著作権法に抵触しないよう、自主規制が入ります。

本の紹介

PHP を使って VBScript コードを作る(な、何を言っているのか...

背景

先ごろ VBS を使って2000行を超えるスクリプトを二つ作りました。しかしこの二つのスクリプトソースコードのうち 2/3 は同じです。

Visual Studio 2015 でデバッグとプロジェクト管理をしています。便利です。後ほどリンクをご紹介します。

開発環境には別の仕事の関係で PHP もインストールしてあります。

ソースコードの分割

VBS には include という概念がないため、一つのファイルに全ての処理を書かなければいけません。手軽に実行がモットーのスクリプトですから、これは制限というよりむしろ美徳です。しかし開発時はファイルが別々になっててくれた方がうれしい場合があるのも事実。二重管理しなくてすむし、再利用もしやすくなるしね。

include には下記の別の方法もあるにはありますが、やっぱり最終的な実行ファイルは一つにしたいです。

vbScriptでinclude文を使う - tekkの日記 C#,VB.NET

ユーザーに配るとき「これをダブルクリックしてね」と言うだけで済みますからね。せっかく Visual Studio を使っているので、「ビルド」として複数のスクリプトファイルを一つにまとめる処理を作ってみましょう。

手順1:プロジェクトの作成

メモ: Visual Studio を使って VBScript の開発を行う - 高東ソフトウェアサービス

まずはこれでプロジェクトを作ります。私の場合は 2008 と 2015 で同じ手順を行い、確認しました。VBS 開発もこれで IDE の恩恵を受けることができます。

リンク先の手順をざっくり書くと、以下のようになります。

  • Visual C++ のメイクファイルプロジェクトを流用して、VBScript 用のプロジェクトを作る。
  • 新規プロジェクトで「Visual C++」「メイクファイルプロジェクト」を選択する。プロジェクト名を決めたらウィザードはすぐに終了。
  • ソリューションエクスプローラーに表示される以下のものは不要。
    • ソースファイル
    • ヘッダーファイル
    • リソースファイル
    • readme.txt
  • Windows エクスプローラ上で VBSTest.vbs を作成し、ソリューションエクスプローラーにてプロジェクトに追加する。
  • プロジェクトのプロパティで以下の設定をする。
    • 「構成プロパティ」->「全般」->「構成の種類」を「ユーティリティ」に変更する。
    • 「構成プロパティ」->「デバッグ」->「コマンド」に「wscript.exe」を設定する。
    • 「構成プロパティ」->「デバッグ」->「コマンド引数」に「VBSTest.vbs //X」を設定する。

手順2:メインファイルの作成

手順1のリンク先にある手順の通りにプロジェクトを作ったものとして、プロジェクトのルートに VBSTest.vbs があるものと想定します。中身は空でかまいません。これをビルドのたびに書き換えるイメージです。

次に VBSTest.php を作成します。タイプミスではありません。拡張子は PHP です。 何を言っているのかわからねーと思 いますが、つまり PHP を VBS のプリプロセッサとして使用するのです。

PHP で VBS のプリプロセッサ

PHPプログラマーが知らないPHPの用法 | 株式会社きじねこ

PHP は Hypertext Preprocesser の略です。HTML のプリプロセッサという出自を持ちます。しかし PHP さんにとって PHP の外側の世界が本当に HTML なのかどうかは知ったこっちゃありません。つまり VBS でもなんでもいいのです。

VBSTest.php の中身は以下の通りです。

<?php
require_once 'classes/ApplicationEntry.vbs';
// require_once 'tests/HelloWorldTest.vbs';
require_once 'classes/HelloWorld.vbs';

見ての通り、ファイル内容を結合しているだけです。コメントアウト部分は後ほど説明します。

手順3:サブフォルダの作成

次に include する対象のクラスファイルを格納する「classes」フォルダを作成します。

そしてこれに対応するフォルダ「みたいなもの」をプロジェクトに作ります。ソリューションエクスプローラー上で右クリックして「追加>フィルター」を選択します。Visual Studio 上でフォルダ「みたいに」使えるのでこれでいいです。

手順4:クラスファイルの作成

次にこの「classes」フォルダの中に二つのクラスファイルを作ります。

以下のファイルは「集中例外ハンドラ」です。深い階層から Err.Raise したいときに便利で必ず作るので、この記事には関係ありませんが、備忘録としてここに書かせていただきます。

try~catchを実装するには - 城陽人の本棚

classes/ApplicationEntry.vbs です。

Option Explicit

Dim app
Set app = New ApplicationEntry

app.Start
WScript.Quit(0)

Class ApplicationEntry
    Sub Start()
        On Error Resume Next
        Call Me_Main() ' この後に何も行を書かないことで上の On Error Resume Next を集中例外ハンドラにできる。
    End Sub

    Private Sub Me_Main()
        On Error Goto 0 ' この行は Me_Main() 内部でのみ有効。

        Dim h
        Set h = New HelloWorld
        h.Greeting "Hello"
    End Sub

    Private Sub Class_Terminate()
        If Err.Number <> 0 Then
            WScript.Echo Err.Number & ":" & Err.Description & "@" & Err.Source
            WScript.Quit(Err.Number)
        End If
    End Sub
End Class

PHP はファイル末尾の改行を無視するので、最後は二つの改行で終らせるのがいいかもしれません。

次に HelloWorld クラスを記述します。classes/HelloWorld.vbs です。

Class HelloWorld
    Public Sub Greeting(ByVal msg)
        WScript.Echo msg & "World!"
    End Sub
End Class

手順5:ビルドバッチの作成

プロジェクトのプロパティで「構成プロパティ>ビルドイベント」を選択します。

コマンドライン」の欄に「Build.bat」を設定します。

次にその Build.bat をプロジェクトフォルダ直下に作成します。中身は以下の通りです。

@echo off
php -c C:\php\php-cli.ini VBSTest.php >VBSTest.vbs
type VBSTest.vbs
echo 0

type しているのは PHP の部分でエラーが発生した場合に、それをビルドエラーとして Visual Studio で検知できるようにするためです。後ほど実際にやってみます。

手順6:作成したファイルをプロジェクトに追加

作成したファイルを全て Visual Studio からプロジェクトに追加します。ソリューションエクスプローラー上で右クリックし「追加>既存の項目」を選択してスクリプトを追加します。

「classes/ApplicationEntry.vbs」「classes/HelloWorld.vbs」はもちろんフィルタ「classes」の下に、VBSTest.php と Build.bat はプロジェクト直下に追加します。

ビルド

これでプロジェクトの「ビルド」をすると VBSTest.vbs の中身が PHP によって作られるようになります。

手順7:デバッグ

その後は「デバッグなしで実行」するとデバッグもできます。何を言っているのかわからねーと思いますが、いや 先ほど紹介したリンク にもちゃんとそう書かれています。VBS をデバッグするためにはなぜか「デバッグなし」の方を選ばなければなりません。Visual Studioツールバーをカスタマイズして、こちらも直ぐにクリックできるようにしておきます。

ビルドエラーの検知

さて、PHP ファイルのコメントアウト部分を以下のように変更してリビルドしてみてください。

<?php
// require_once 'classes/ApplicationEntry.vbs';
require_once 'tests/HelloWorldTest.vbs';
require_once 'classes/HelloWorld.vbs';

「tests/HelloWorldTest.vbs」というファイルはまだ作っていないですからエラーが出てほしいです。Visual Studio の「エラー一覧」ペインを見ると、ちゃんとエラーが表示されていることが確認できると思います。PHP の出力するエラーを「ビルドエラー」のように見ることができます。

「tests/HelloWorldTest.vbs」を実際に実装すれば、クラスの単体テストを行うことができます。あるいは ApplicationEntry.vbs の中で WScript.Quit(0) しているので classes/HelloWorld.vbs の中に直接テストコードを埋め込んでしまってもいいでしょう(実行されないため)。個々のクラスファイルを指定すると単体テスト、ビルドして結合テスト、などができるようになります。

これでソースコードの管理や再利用が簡単になるだけでなく、 プリプロセッサの恩恵 にあずかることもできます。

集中例外ハンドラのファイル(classes/ApplicationEntry.vbs)にハードコーディングしている「HelloWorld」を PHP の変数にしてしまえば(例えば「<?=$className ?>」のように)再利用できます。

開発時にはトレースを出して、本番リリースのスクリプトでは__それをフラグ一つで無効化するのではなく__処理自体を削除するというようなこともできるようになります(単体テストしづらくなりますが)。

聞いただけでゲンナリする VBS の開発も、これでだいぶ楽になると思います。

参考文献

「完全独習 統計学入門(小島寛之 ダイヤモンド社)」 勉強ノート「第十八講」

はじめに

第十八講の勉強ノートです。標本分散と比例する統計量Wの作り方が書かれています。この講から何か核心に入っていく感じです。ワクワクします。

f:id:saponte:20170702204924p:plain

免責

ノートには著作権法に抵触しないよう、自主規制が入ります。

本の紹介

ピーターの法則 (ローレンス・J・ピーター, レイモンド・ハル ダイヤモンド社)

ピーターの法則 創造的無能のすすめ

ピーターの法則 創造的無能のすすめ

はじめに

またすごい本を見つけちゃったな、という印象です。

冒頭に出版の経緯が書かれていますが、推敲よりも世に出すことを急いだようです。 そのためかいくつか気になる点があります。

  • 体系化が甘い
  • 事例が少ない(普遍性が甘い)
  • 内容に古さを感じる(普遍性が甘い)

それでもなお、1969年に発表されたというこの本に書かれていることには刮目すべきものがあります。

内容

簡単にまとめると__ネタばれですが__以下のようになります。

有能な人間は抜擢され、その有能さを発揮できない地位まで昇進し、やがて社会全体が 「成熟」期を迎えると全てのポストが無能(有能さを発揮できない)人間で埋められる。

それを避けるためには「創造的無能」__つまり有能さを発揮しつつも昇進の価値がない 人間であると見せかける能力__を身に付けることが有効であり、ひいては世界を救うこと になる。

概ね上記の2点です。

体系化が甘い

内容が若干冗長なのか、読んでいて飽きが出てくるところが多いです。 また重要な文脈が流れるようにつながっているのではなく「散らばっている」ように感じます。

事例が少ない

上の「有能さを発揮できない地位」というのは、日本では「器」という言葉で計られます。 他の国では違うのかもしれませんが、それでもある程度のコントロールがなされている 可能性はあるでしょう。そうしたことに言及はされていません。

また昇進がなければ有能さを手に入れられなかった人もあるでしょう。地位が人を作る ということもあるはずです。そうしたことに対する言及は「危機に際したとき」くらい しか書かれていません。

世界には、そうした事例もあるかもしれませんが、そうした横方向の「事例の蓄積」が 少ないです。もっとも作者に言わせれば、そうした社会があるならそれはまだ「成熟」 の度合いが低いということかもしれません。

内容に古さを感じる

終身雇用制が一般的であったり、経済成長が一定であったりした時代であれば、昇進は 不可逆なものであったのかもしれません。しかし今日ではどちらも破綻、あるいは少なく とも普遍的ではないことが共有されています。

昇進したけれどしっくりこない場合に、あえて条件のよくない転職をして充実した社会 生活を選択するという生き方も、現在では珍しくありません。

出版年が古いためか出版を急いだためか、この本はそうした時代を経ることによって 得られる「事例の蓄積」が少ないです。縦方向の普遍性が甘いです。

著者が存命なら、このあたりを更に推敲して改訂版を出してくれたものとと期待されますが お二人とも既に他界されていることは残念です。

本の位置づけ

文章には「階層社会学」という単語が多く見受けられますが、あまりにも皮肉っぽい 書き方なのでどこまでが本気なのか計りかねます。

おそらくは出版を急いだために体系化があまくなった、と信じたいところです。

上記のような欠点はあるものの、この本はやはり読んでおいてよかったと思う本です。

成熟した社会の先へ

世界は、今日より明日、明日よりその先の未来へ、よりよいものになっていくと 私たちは信じています。

しかしながら、この本はそれが単なる幻想に過ぎないことを示唆します。 事実、連日のように信じられない不祥事や頑迷な官僚主義、目を覆いたくなる暴力への 無関心、安かろう悪かろうになっていく日用品など、その証拠がたくさん目に付く状況です。

ただ時間が過ぎ去るだけでは、より良い未来は手に入りません。それはやはり、 市井の人々の努力にかかっているのです。