読者です 読者をやめる 読者になる 読者になる

M12i.

学術書・マンガ・アニメ・映画の消費活動とプログラミングについて

『Exam Ref 70-483 Programming in C# (MCSD)』の章立ての謎

Exam Ref 70-483 Programming in C# (MCSD)

Exam Ref 70-483 Programming in C# (MCSD)

Microsoft社の認定試験70-483の参考書です。同試験の参考書として事実上入手可能な唯一のもののようです。いろいろ思惑があって購入しました。

当然全編英語ですが、Google社のリファレンスなどと同様、文法的・語彙的に高度に統制を受けているようでかなり読みやすいです。英語というだけで苦手意識が先立つ人も多いかと思いますが(私自身その部類ですが)、試験勉強をするならともかく手にとって見たほうがよいのかなと思います。もっともまだ受験はしていないのでどの程度「役立つ」のかは不明な状況ですが。。

ただ、この参考書、章立てがヘンテコです。

  • Introduction
  • Preparing for the exam
  • Chapter 1: Manage program flow
  • Chapter 2: Create and use types
  • Chapter 3: Debug applications and implement security
  • Chapter 4: Implement data access
  • About the author

Chapter 1とChapter2の順序もやや違和感を感じるところですが、Chapter 1のサブセクションがもっと明らかに変です。

  • Objective 1.1: Implement multithreading and asynchronous processing
  • Objective 1.2: Manage Multithreading
  • Objective 1.3: Implement program flow
  • Objective 1.4: Create and implement events and callbacks
  • Objective 1.5: Implement exception handling
  • ...

1.1の"Implement multithreading and asynchronous processing"で、ThreadThreadPoolTask<T>やasync/awaitキーワード、そしてPLINQについて学んだあとに、1.3の"Implement program flow"でif/elseやfor/whileといった制御構文を学びます。

ようするに公式サイトで示されている試験で取り上げられるトピックの並び順に揃えられているようですが、なんとも違和感のある並び順です。

住野よる『か「」く「」し「」ご「」と「』

か「」く「」し「」ご「」と「

か「」く「」し「」ご「」と「

この人の作品を読むのは初めて。文体はとても読みやすい部類。ひとの「感情」、気分の浮き沈みや喜怒哀楽や恋愛対象なんかを記号という形で視覚的に知覚する特殊能力を持つ5人の高校生を主人公とするお話です。

設定は設定として割り切ってしまえば面白いお話です。だけどやっぱり感情が明確に知覚可能なメトリクスで表現される世界というのは変な感じです。つまり表情や身振り手振りの一次情報を解析・解釈して、感情を代弁する二次情報にして・・・というのがない。明確に定義付けされた情報がそこに所与のものとしてある。なんだかTVゲームっぽい。しかし人間という数十兆個の細胞からなる生体ステートマシンの持つ「状態」≒「感情」なんてものは畢竟観測不可能。いわんや記号による観測などとは、と。「否、そうであればこそ観測可能なものこそが事実そこにある『感情』なのだ」という立論はありうるとして、本書がテーマとしているのはそんな表面的な何かではないようです。

もちろん、人間は知覚した対象のカテゴライズを通じて秩序のないところに秩序を打ち立て、差異のないところに差異を作り出し、以て自らの知覚そのものの基盤とする生き物です(鶏と卵の関係)。記号として表現された作中人物たちの「感情」のリアリティはそのような意味で認められるべきなのでしょう。同じように本書中に登場する「友情」と「恋愛感情」の間の妙にさっぱりした線引きもそうですが。ま、こういう色々を考える切っ掛けをくれる作品はいい作品だと思います(と、乱暴にまとめ)。

OracleDBのUPDATE文でORA-01427エラーに苦しめられた

GW突入前、というかもう突入した後とも言い得る5月はじめ、仕事で保守しているシステムで、OracleDBのUPDATE文でORA-01427エラーに苦しめられました。

ORA-01427は、「単一行副問合せにより2つ以上の行が戻されます」というエラーメッセージに明らかな通り、SQLDML構文中、サブクエリの結果としてスカラー値(単一行)が戻されることが期待される箇所で、実際には複数行の結果が戻されたときに発生するものです。

問題のUPDATE文はだいたい以下のような構造でした:

UPDATE foos
SET foos.foo4 = (
		SELECT baz(foos.foo3, bars.bar3)
		FROM bars
		WHERE ((foos.foo0 = bars.bar0 
		AND foos.foo1 = bars.bar1)
                OR foos.foo2 = bars.bar2)
		AND bars.bar9 = '...'
	)
WHERE
	foos.foo9 = '...';

関係するのは(ここでは名前を伏せる必要があるので)foosとbarsという2テーブルで、UPDATE文はbarsに対するサブクエリの結果を使ってfoosを更新するものでした。bazは(もちろんこれも仮名で)何かしらの算術演算を行う関数と考えてください。

ここでサブクエリのWHERE句に登場するbars.bar0bars.bar1は2つセットでbarsテーブルのプライマリキーを構成しています。WHERE句の1・2行目foos.foo0 = bars.bar0 AND foos.foo1 = bars.bar1という条件に不備はありません。つまり、この条件を評価した結果、barsテーブルから2レコードが返されることはありえません。

一方、bars.bar2はプライマリキーでもなければ一意性制約の付与されたカラムでもなく、事実このテーブルではbars.bar2の値に重複が見られました。WHERE句の3行目の式foos.foo2 = bars.bar2では複数レコードが選択されてしまうケースがあるのです。元となるユーザが作成したCSVに重複があり、それがこのテーブルに取り込まれていました。これはすぐわかり、すぐ修正手配もできました。

ところがこのbars.bar2の重複を除去してもなお、ORA-01427エラーが発生します。この原因を見つけるのに手こずりました(私自身は作業指示者というか上長の上長みたいな立場にあり、本格的調査には参加していませんでしたが。まあチームとして手こずったということです)。GW前というかGW中という時季にあってメンバーの精神衛生に致命的ダメージです。

結論を言えば重複はfoosテーブルにも存在しておりそれが原因でした。通常のUPDATE文であれば更新対象が複数レコードだろうが単一レコードだろうがエラーになったりはしません。しかしこのUPDATE文ではUPDATE対象テーブルfoosのカラムがサブクエリの結果セットを定義するSELECT句内で参照されています(baz(foos.foo3, bars.bar3))。そしてサブクエリのWHERE句に記述された条件式(foos.foo0 = bars.bar0 AND foos.foo1 = bars.bar1) OR foos.foo2 = bars.bar2では、foosの複数レコードが選択されるケースがあったのです。で、これもユーザのCSVが遠因でした。

わかってしまえばどうということもない話ですが、「ORA-01427 = サブクエリの問題」と考えたとき、どうしてもそのサブクエリの対象となっているテーブルだけに目が行ってしまいやすく、かつ、UPDATE ... SET foos.foo4 = (SELECT ...)
...;
という見るからにスカラー値が求められている箇所にばかり注意が向けられやすい。結果、今回のような視野狭窄に陥るわけです。反省。。