オカエ・ザ・超雑記帳

徒然趣味主義主張

爽やか

RAGE shadow verseの予選に当選したのでシャドバの話

どうも。

まずはマスターオブシャドウバースに辿り着きました事をご報告します。なんかネット見てると1000勝以内で辿り着いたやでー、みたいなのをよく見るんですけど、僕は凡夫ということもあり1350勝目辺りでの昇格でした。

オカエAA帯サーガ

私がAA帯に辿り着いた辺りで収穫祭のナーフがあった、それを受け、いったん冥府エルフを床に置いた。

冥府エルフは無かった事とし、代替のデッキとして山本昌(サタンドラゴン)、乙姫孕ませ隊(乙姫ロイヤル)、土ウィッチ、ビショップコンを試したりしたが、勝率5割が関の山であった、私は途方に暮れた。

だめだこれやっぱ冥府バースやなと一念発起し、収穫祭レスの冥府エルフを手に取った。超勝てた、やっぱ冥府バースやなあ。

当時の冥府エルフには根源の回帰を入れてなかったが、勝てた。

しかしメタゲームが進むにつれ、ロイヤルネクロとの勝率が悪くなりBPが上がらなくなっていった。

そんな折、運営から根源の回帰をナーフするとのお触れが出た。私は衝撃だった。私のデッキに入っていないカードがナーフされるだと?

私は根源の回帰をデッキに3枚投入した。超勝てた。

私がマスターに辿り着く一歩手前で根源の回帰ナーフがあり、DRKの新発売があった。それを受け一旦冥府エルフを床に置いた。

冥府エルフは無かった事とし代替のデッキとして落合博満(竜呼びドラゴン)、埼玉ネクロ(魂の再利用ネクロ)、土ウィッチを試したりしたが、勝率は5割を切っていた、私は途方に暮れた。

だめだこれやっぱ冥府バースやなと一念発起し、根源の回帰レスの冥府エルフを手に取った。超勝てた、やっぱ冥府バースやなあ。

そうして私はマスターオブシャドウバースとなったのだ。

RAGEの話

RAGEとかいうe-sports屋さんがshadowverseを競技種目にして大会やるやでーと御触れを出したので試しにエントリーしたところ、運よく当選したのでぼちぼちデッキ等調整しようと思います。

ていうかRAGEのビジネスモデルが謎、参加費無料で賞金総額700万、大会の開催規模は1000人で対戦専用端末を個別に用意するとかなんとか・・・どうやったら利益が出るんじゃろ?という大判振舞でございますな。

MTGなんて3000人から参加費10000円とって賞金総額500万とかやぞ・・・

まあ謎なビジネスモデルは置いておいて、シャドバ者側からすれば出得な大会であります。

デッキはどうするか?

大会ルールとして2デッキ必要になります。ルールは2デッキのどちら共で勝った方が勝ちというものです。このルールでどういったデッキ組み合わせがいいのかちょっとシミュレーションしてみたんですが、結局は乗り手とメタの期待値込で強い順に2つのデッキを仕込むのが最強という結論になりました 。急所を補填し合う組み合わせとかは全然意味無さそう。

なんでまず冥府エルフは確定で行きます。手放すには手に馴染みすぎ、乗り手のアドですね。

残るデッキはマスターでBPを増やせるデッキってのを最低ラインとして、ビショップを模索中ですが心が折れそう。勝てる構築にたどり着けない、ビショ強いとか嘘やろ・・・アグロ環境なんで中低速に組めば勝てるはずなのに、アナルの弱そうな僧侶はデッキも弱いか。

寂聴アナルに見切りをつけた所でネクロコンが台頭してきた。悪戯マンサーとかファントム、腐嵐がエルフ狩りに最適かつ、ワイトキングがエイラの居る今のメタにガン刺さりしてます。

冥府とネクロコンどちらのデッキも超越にはアホほど弱いんですが、ルール上超越に負けるのはどちらか一方なので、交通事故と思って割り切る予定です。

おっぱい大好き。

 

201609週末記

土曜日

毎年恒例の同期ハゼ釣りに行った。

こちら人間陣営は毎年のトライアンドエラーによりハゼを釣るための施策を練りまくっているのに対し、ハゼ陣営と言えばアホ面さらしながら川底を漂って寝て飯を食っているだけであり、彼我戦力差は目に見えているのである。

結果爆釣、ほぼオールタイム入れ食いでした。ハゼとはなんと脆いものか・・・

3年前の初ハゼ釣りではみんな合わせて10匹くらいだったけど、今回は一人当たり7,80匹はゲット出来てた、人間の成長は早い。

陸に上がってBBQして肉の隣で焼いたりして食ったけど、流石に食いきれずクーラーボックス係の僕が家で処理することに。処理したレシピは以下である

ハゼの素揚げ

ハゼ 100匹位

サラダ油 適当

塩 適当

胡椒 適当

 

うますぎる・・・浜口は素揚げ連打してたけど気持ちは良くわかる。

でもハゼの素揚げは身が脆いのでボロボロになりがち、手間を惜しまない人は魔法の粉を付けて揚げましょう。

日曜日

高校時代の友人ワロス君(仮名)の家で世界最古であり至高のカードゲーム、マジックザギャザリングをやった。今回は新段カラデシュの発売ということで、新カードを使ったゲームに興じた。

割とメンツが固まりつつある中、HN:無欲な安部(仮名)が新規参入してきたが、話すこと全てが貪欲すぎて、これまで禅の者達が偉そうに語ってきた無欲という言葉の定義をあいまいにしていく逸材だった。

ここ最近のカードだが、コズミックホラーとかタイムリープとかハードSFを引きずりまくってやたら重たいストーリーに沿ったどんよりとしたカードが多かったけど、ことカラデシュに関してはなかなか爽快なインド映画風デザインになってて結構頭とろけてる感じでフィールグッドだと思います。

ダークネスエボルヴ語

こんにちは、今朝メンテが完了して無事ダークネスエボルヴが実装されてましたね、というわけで新段のカードが各リーダーにどんなデッキをもたらすのかについて妄想していきたいと思います。

1:ヴァンプ

今回のカードリストを眺めてると、まず目につくのはヴァンパイアの強カードですね。

貴き血牙

吸血姫・ヴァンピィ

のアグロ要素超強化により序盤は蝙蝠アグロで強力な立ち回りができそうです

中盤以降は

ブラッディメアリー + 漆黒の契約 or ソウルディーラー

でバーストダメージが期待できそうですね。

ブラッディメアリーは5/4/5なので5ターン目に暇ならバニラとして出しつつ、終盤に上記の同時出しを狙う形になるでしょうか?ブラッドウルフや、3点火力と組み合わせるだけでもかなり強烈そうです。

貴き血牙がエルフに対して有効そうであり、ウィッチは高速アグロに弱いため、なかなか活躍しそうな気がします。ただしこれまでのヴァンプと違いロイヤルを受け回せなくなりそうなのは注意ですね。

2:ビショップ

ハンプティダンプティが追加されて一番喜ぶのはビショップだと思います。特にロイヤルとの対戦ダイヤは劇的に改善されそうですかね。

ただし、コントロールというデッキタイプ事態が冥府への道により否定されている現状、使用者数が増えるとは思えません。メタの変遷によりロイヤル・ネクロ・ヴァンプが隆盛することになればソリューションとして使うのはよさそうです。

あと地味に5/2/4とステータスこそゴミなもののCIP3ゲイン1ドローという小器用な事をするレディアントエンジェルは良さげかな、エンシェントアルケミストに近い性能だと思うけど、GMDのが強いか? 

アグロ観点で行くとガルラ、うんアルミラージで良い、4/4と2/1疾走アミュは強いけど、劇的に強いわけでもないからまだまだ無理そうですね。

3:ネクロ

魂の再利用、メチャ強くないですか?ネクロが収穫祭を手に入れたまである。

得意なアグロの息切れに使うもよし、無限のアドでコントロールの可能性も出てきたんじゃないか?ただしコントロ(以下略。

毎ターンネクロマンスしなきゃいけないので冥府・デスタイとの相性は悪そうか。

コントロールならスパルトイソルジャーとかも地味によさげですね。

蠅の王は見た目以上に使いづらそうに見えるが、最初4/4守護ひいて本体守れれば強そうだと思う。

4:ロイヤル

えー・・・アドバンスブレーダー・・・アークエンジェル・レイナ・・・えーパッとしない印象、脳筋系でデザインに幅が出せないせいか、カードプールが広がるたびどんどん弱くなっていってしまいそう。

5:ドラゴン

ムシュフシュは相手の進化殴りで相打ち取れる率が高いのでかなり強そうです、既存のドラゴンライダーと丸ごと交換してよさそう。荒牙の竜少女は運命とコンボで大ダメージらしいですが・・・ドラゴンが運命を上手に使えるとは思えず、前評判だけのような気がします。

ファイアリザード+ジークフリートで確定除去になるので、両方3積みしたミッドレンジドラゴンが安くて強そう。

あと竜呼びの笛、これ2枚目以降は全部4/3に代わると考えると超強いかもしれないですね。

6:ウィッチ

スペルウィッチはウーン微妙、バウンススノーマンは強いっちゃ強いが重いのでブースト稼げない印象、進化フォロワもマーリン一択すぎるので割り込みは難しいか。

秘術ウィッチは低コストに優秀な土が2種追加されたのでかなり強化された、パメラはノノノの次ターンで出るとやばいがそれ以上でも以下でもないか。

7:エルフ

まず根源の回帰ナーフによる影響は結構大きいと思われます。特にロイヤル・ネクロのエルフに対する勝率が大幅に改善されそうです。

冥府エルフは最早アグロに寄せてしまうか、森の意思、フェアリービーストを代替案とするかになると思いますが、デッキ力の低下は否めなさそう

逆に優秀な中コストが増えたことでミッドレンジが組めそうです。ロイヤルのようなデッキを組めばわからん殺しできるかもしれないですね。

メタ妄想

結局のところ、まずは新段関係なしに根源の回帰ナーフによるエルフ:アグロロイヤル&ネクロの相性改善によりアグロロイヤル、ネクロが増える+新段で明確に強化された蝙蝠ヴァンプが増える。ような気がします、つまりアグロ環境。

あれ?ハンプティダンプティ系のコントロール行けるんじゃね?竜かビショか・・・いやあえてヘビーネクロにしてぶち込むか・・・

まああたるかあたらんかはともかく予想は大事、ことさら人の作ったデッキがすでに時代遅れになるのがシャドウバースというゲームなので、先見の明は必要だと思います。

モトズキッチンリバイバル その1

さあやって参りました、月に一度新鮮な魚を手に入れたときにだけ開かれるキッチン!それがモトズキッチンリバイバルでございます。

モトズキッチンとは

筆者がツイッターかなんかで適当に作った晩飯をすげえ適当なレシピと共に上げる企画。いわば男の料理であり、塩・胡椒・醤油・油・焼く!みたいなそんな感じである。

しかしながら実家の飯が余り旨くなかった事もあり、自前でささっと簡単にうまいものを作る技術は中々の物であると自負しているのである。

今日のメニュー

・あら汁

・魚と香る野菜を蒸したやつ

 の2本立てです、こっそり裏で刺身にしてますが、刺身は切って醤油かける以上の事が発生しないので割愛。

 

あら汁

伊豆へ行き魚を捕まえてフリースタイル魚捌きしてあらを用意する。

あらをザルに突っ込む。

湯をかける、これは湯引きというプロセスであり、仕上がりの臭みが消えるとか消えないとか。

湯を沸かす、適当に塩と酒入れる。

沸いた湯にあらを入れる。

気の済むところまで煮たら味見をして、ちょうどいい味になるまで塩を足す。

塩加減が良いかなといったところで醤油を垂らす。

椀に盛って、お好みでネギとか散らす。

完成

レシピ

あら 2匹分

塩 適量

醤油 3垂らし位

酒 適当

水 あらに対して3~5倍くらいの量

感想

もう毎度これ食ってるけどうまい、特に魚の顔とカマがうますぎる。

ぶっちゃけ新鮮なんで湯引きとか灰汁とりとか要らんかもしれん。

自分の好きなとこまで後出しで塩を振れるので、間違いなく自分好みの味になるので安定感がある。

あらは最強出汁なんで化調も昆布も不要、素材からゴリゴリ出汁のでる料理は塩、間違いない。

蒸したやつ

伊豆へ行き蒸し物に最適な魚を捕まえる。

長ネギ、青い部分は魚の下に敷くので10cm位。白い部分の回りは細切りで白髪ネギ、芯は輪切りにして香味油に使う。

三つ葉、葉っぱは適当に切って魚の下に敷く、茎は白髪ネギ位の長さに切る

ミョウガ、適当に細く切っといて、上に置いたり下に敷いたりハラに詰めたりする

冬瓜、乱切りにして下に敷く、冬瓜なんて料理したことなかったのでググったら皮と種喰えるって書いてあったんで皮種付きのまま乱切り、皮は良いが種はメロンぐらい主張してきたので種は取る安定。

野菜の上に魚を乗せて、酒を散らして塩を適当にかけて蓋をして火にかける。

汁が出たら水気が飛び過ぎないように火を弱くする。

f:id:inmoress:20160926221500j:plain

 こんな感じになったら三つ葉の茎と白髪ネギとミョウガを上に乗せて熱したネギ油をかけて完成

レシピ

魚 1匹 + 刺身にしなかった腹の部分

冬瓜 1/4

長ネギ 1本

ミョウガ 3個

三つ葉 1束

塩 適当

酒 適当

感想

蓋開けたら三つ葉臭が来て勝ちを確信した。のっけたネギと三つ葉の茎がシャキシャキで下はくたっと出汁が染みてまいうーだった。汁が旨いのはわかってたんで冬瓜突っ込んだけど最強の瓜だった。

ネギ油はよくわからんかった、ぶっちゃけ下の部分だけでも良かったまである。

モトズキッチンズプロパガンダ

出汁の出そうな何かに塩を振って加熱すればどうやったって超旨い。

醤油だけで味付けすんのやめてください、本だしで良いので入れてください、塩入れてください。

美味い食材食う時、めんつゆはめんつゆ味にしかならないので使わんといてください。

鍋食う時、初手ポン酢やめてください。

なんとなくうまくなりそうだから酒入れてるけど、あんまよくわかってないので聞かなんといてください。

 

おわり

合法的何して遊び方のススメ

ねえねえ何してねえねえなねえねえ何して遊ぶのー?

shadow verseで遊んでんだ、わかるな?

というわけで今日はcreepy nutsの曲に合わせてエルフのプレイングcipをまとめていきたいと思います。

仕事中に鼻歌で「ッテッテッテーっててれてれてれてれ」が無限再生される位にはハマるこれです。

Creepy Nuts(R-指定&DJ松永) / 合法的トビ方ノススメ 【MV】 Clean Ver. - YouTube

 

YO 溜めに溜めた墓地のカード パッと開放する冥府のロード
どうしたのリノさんピストン運動みたいに導かれるフェイスアグロ
収穫祭のナーフでもいけない強さ持ち合わせそう
ランク上げるならぶちまけろ 気持ちいいことしよう
One shot!!

妖精液体フェアリーとメイジ囁き 森荒らしへの報い
運命が答え 逝きたいと絶えずのさばるフェアリーに置き換える
砕いて裂いて巻いて焚いて吸って吐いても
まして炙っても打っても得れてる死体に
たまらず Give Some More ei yo!!

耳から体内に入る 脳内を蝕み犯すリンゴン(リンゴン)
再生するたび息吹き返す お前ねえねえ何して遊ぶの~?
いつだってクレイジーなエンシェントのエルフの数値
魂売るのは30回 対戦相手はすぐに死ぬ

サイゲームスのテストから海の向こう 蔓延する elf & elves & elven & Royal
調教済みの豚共は声上げろ 超越するwhich & Drugs & Rock & Roll

とっくのとうにプリンセスメイジ 逆らえない僧侶
フェアリーサークル※もリノセウスも場末のベルエンジェルも

無くてはならない 抜いてる奴クレイジー
根源と収穫祭よこせ
合法的なトビ方を心得よ

※フェアリーサーコーと発音し、フェは4拍子食いで入る事

 

気持ちいいことしよう

手札が大回転
さあ枯れない具合に手札をダンプしてプレイ
ソートの寄る戻す冥府下の方
手札に3枚異常でしょう?
後遺症残りそうな乙姫の業
寄り添っちゃ突き放すヴァンプの微笑

フォルテの返しで遊びましょう(1点)
ねえねえ何して遊ぶの〜?

One shot!

 

インアウトインインアウト
自然の導きでリノ回す

高めの打点でお死体積み上げます
ですから押し倒して乗ります

何点?二撃で8点 進化で10点 ゴブリンマウンテン
めちゃ強グロリノセウス
増やしたるビッチアス電話したウィスパラー

フェアリー ワンダエルフ でも 不安もわかるけどワンダエルフ
いつもはぐらかしてたぶらかして引く

カスカードの名は冥府!

この替え歌が出回ればshadowverseでエルフの使い方ムズいから誰か手取り足取りくれよんとか言ってる頭パーな女子高生達がシャドバ上級者達に体を売らずに済む・・・

お後がよろしいようで(二番は無い、なぜならアニメとかドラマのオープニングだって二番流さないでしょ、別に面倒くなったとかではなくそういう仕様なんです。)

9/19 3連休暇すぎたので誰も望まぬ二番が出来ました。

 

ポケ廃百匹一首のゲームデザイン考

ポケモーニング。

前書き

百人一首とのふれあい

先日知人氏が参加する百人一首大会を見学しに行ってきました。JS,JC,JKがバチバチに超反射ハイスピードバトルを繰り広げるさまは圧巻でしたし、その知人氏も一回戦を勝ってたのでなかなか見応えのある見学となりました。

色々見たり聞いたりする中で百人一首が持つ競技性の高さとか高尚さというか、んまあとにかく古来から積み重ねてきたゲームシステムとかセオリーなんかは非常に洗練され合理的であり他の対人競技と比較しても非常に優れてる面があるなあと、そう感じました。

とにかく百人一首は奥の深そうな面白そうなゲームです。最近は素潜りなりシャドバなりちょっと面白そうだなと思ったらとりあえずやってみてるチャレンジ精神旺盛なわたくしでございますのでちょっとやってみようかなと思った次第であります。

参入障壁の高さ

百人一首、勝負できるようになるまでには最低でも百首の上の句と下の句の関連を覚える必要があります。もっと詳しい話をすると下の句と対応する決まり字の関連なんですが・・・まあそこら辺興味のある方は一回見学しただけの僕なんかよりカルタ者様の方々が詳しいので他のサイトで勉強してください。

とにかく、万葉集?それ三葉虫とどっちが歴史古いの?古文?僕21世紀レペゼン現代人なんでね。というレベルで古典文学に興味のない私には百首を記憶する行為は超苦行です。というか苦行が透けてて結局覚えようともしてません。

きっとうら若き小僧だった時代なら余裕だったかもしれませんが、最早おっさんの手前、残される時間も限られている事を悟り始めた僕にとって、なかなかにヘビーな訓練を課す百人一首を始めるってのは、勇気の要る事であきらめざるを得ませんでした。

天啓

見学させてもらった大会の終了後、浦安で適当に知人氏達と飲んでいたのですが、その時に盛り上がった内容が今回のブログを書くきっかけとなりました。

あんまはっきり覚えてないんですが、百人一首やってみたいが~百首覚えるのが~今の内JSに唾つけれれば~ていう上述したような件をくだくだ話していた所

「オカエ氏、700匹居るポケモンの名前と形覚えてるし、レート頻出のポケモンならタイプと種族値覚えてるんだから、百人一首も同じようなもんでしょ」

みたいな話を振られ、 ああそうか、ポケモンの色、形、名称、属性値を覚えるのは上の句下の句と同じで1:1のデータをあてていく事だから一緒か・・・いや待てよ?上の句と下の句が覚えられない事が百人一首を始める障壁になってるなら我々が古来より記憶してる内容(ポケモン情報)を上の句下の句にしてしまえば障壁を超えて百人一首できね?しかもあの競技性の高さに足してポケモンというキャッチーさは鬼に金棒ちゃうか?

そう、小倉が過去の人になった瞬間である。(ただし小倉百人一首の小倉は苗字じゃなくて場所)

なんか面白そうなのでどういったゲームにするか考えてみることにしました。

概要を詰める

概要詰めるも何も、既存のゲームの組み合わせな訳でプロダクトする部分ほとんどなかったです。

ゲームの名称

ポケ廃百匹一首

買ってくれそうなターゲット層

ポケモンバトルに精通しており、かつ百人一首をやってみたいが百首覚えるところで挫折してしまった10-50代の男女

レート人口は多分10万人位いて、そのうちの百人に一人が興味を示してくれれば1000人・・・

ポケ廃向けっていう話題性により購買数爆増も有りうるのでビジネスチャンスとしては無くはなさそう。

ゲームルール

百人一首と基本的に同じとする、ただし読み手への要求事項は異なり、かるた風の風流な感じではなくアニメのオーキド風に詠む。

特殊ルールは出来るだけ作らない方向にしたい、が・・・

でもせっかくポケモンを題材にしてるので取った時に効果が発動する特殊な札(メガ進化札を取ったら追加で相手に一枚渡せるとか、ギルガルドを取ったら次のターン相手は札を取る手を逆にしなきゃいけないとか、キノガッサを取ったら次のターン相手はうつ伏せスタートとか、ガルーラ取ったら両手使えるとか)とかそういう体を使ったルール破壊要素があったら面白いかもしれん。

首数を考える(百匹への過程)

現在(2016/9/12)のポケモンの種類数は721種居る。そのため最初の内は七百二十一匹一首も考察していたが、以下の理由から百匹一首が妥当であると判断した。

・721匹分の種族値はさすがに知らない。

 僕の想像を遥かに凌駕する廃人の方はどうか知りませんが、基本的にレートに出ないような進化前、どマイナーポケモン種族値を把握している人はあんま居ないと思われるので百匹のレート頻出ポケモンで札を作るのがちょうど良さそうです。

百人一首のルールが百札前提で考えられている。

 詳しいルールは省きますが七百二十一首もあると百人一首のルールが破たんしオリジナルルールを設ける必要がありゲームルールの前提に反するのは厳しい。

上の句を考える

上の句はひとまず以下の内容と順番の構成がポケ廃向けになりそうです。

素早さ種族値

タイプ1

タイプ2

ほにゃららポケモン(ネズミポケモンとかのあれ)

ポケモンの名前

"皆もポケモン、ゲットじゃぞ"

何故素早さ種族値が最初に呼ばれるんやか?という点、ポケモンバトルにおいて素早さは非常に重要な要素であるため、他の種族値に比べ皆が覚えてる率が高いし、ポケ廃百人一首からポケモンバトルに参入する人にとっても素早さ種族値って重要なんだなあと言う刷り込みができる。

上にも書いたけど百人一首の上の句には決まり字っていう何文字まで読んだら下の句が確定する。っていう理論があるんだけど、それをポケ廃百匹一首でも似たような形で再現したかったのもあり、かぶりのあったりなかったりするS種族値を読まれる先頭に持ってきた。

たとえば70とかならニョロトノメタグロスキリキザン等結構いるのでタイプまで聴かないと札を取りに行けないが、S61ならバンギラスしかいないので読み手がオーキド風に「ロクジュウイ・・・」と読んだ瞬間にバンギ札を取れる。

下の句

下の句は見た目で判別出来ればいいのでポケモンの絵が描いてあれば十分でしょう。

百匹を選ぶ

ガブガルゲンアローニンフカイリュークレセボルトランドドランスイクンライコウエンテイエルフテラキルカリオマニュハッサムクロバトノグドラルンパサザンガルドギャラロトムバシャナットサンダーサルサマリルリラグキザンマンダバンギドリュブルンノオーシャンドサイジバコゴチルランクルスカポトドンクチヤミラミキッスリザバナゲッコウガガッサグロスドーブル・・・

上ので大体50匹位、100匹列挙はきついか?まじめにやるなら上の句と一緒にエクセルでデータ化すべき

 

とりあえずここまで決まればゲームとして体を為すかな?ルールと上の句はテストプレイでより良い物に出来そう。

後書き

たぶん完成したら一部に大受けすると思うんだけど、いかんせん企画力が足りない。行けると思った誰か氏ー全権委譲するんでコミケに出品しましょう。

知っておくと得するSQL

ハローワールド

今日はSQLのSELECT文について書いていきたいと思います。SQLって何だ?って人は日本人にとって共通言語は日本語、SEにとっての共通言語はSQL(ここでHTMLとか言うやつはSEというかWEBやってる人です。)みたいなものだと思ったりしてそっとタブを閉じてください。

SELECT文なんて大体同じ、だがたまに居る問題児

SQLってそこそこ業務系のプログラムやってればもう大体定型句みたいな感じで「あーはいはいこういう時はこういう奴ね」という感じでさくさくと書ける様になるもんですよね。(・・・僕は物覚えが悪いのか数ヶ月ぶりにINSERT書く時とかは毎度ググってますが)

なぜ定型句になってくのか?ってとこですが、そこら辺の企業の扱ってるデータの関連なんて大体がマスタトランとかヘッダ明細のモデルの組合せで9割以上が表現しきれてしまえるためです。

扱うデータが違えどデータの関連が似た構造になるので、どの企業のデータを扱っても「こういう奴ね」ってなって過去のSQLと同じような実装で対処できる訳ですね。

実際、RDB上手の人たちが受けるデータベーススペシャリストの問題も上述したマスタトラン、ヘッダ明細、たまに連関、位のリレーションの組合せによるデータ構造を例とした問題が殆どです。

なぜそこら辺の企業のデータ構造が大体「こういう奴ね」ってなるモデルに集約されてしまうのか、という話をし始めるとDOAとかデータベース正規化の話をしていかなければいけませんが、次に行きたいので省きます。

今回の記事はシステム開発を行なう上でたまーに居る「こういう奴ね」に該当しない1割弱のデータ構造をどうやってSELECTしていくかっていう話になります。

頻発しないせいかネットでググってもうまく業務要件に該当してるかわからんわけで、と言ってもググっても出てこないだけで脱初級者レベルの専門性ではあるんですが、日々しょうもないレベルの仕事を延々こなすIT土方にとってはアカデミックな専門書を読む時間もまま取れぬということで。

今回のケースですが、一緒に仕事してたおっさんが数週に渡り頭を悩ました結果ゴミのような処理に仕上げてしまいました代物です。知ってれば半日足らずで綺麗に解決出来たのに、知らないと時間と精神だけが削られて行くわけで、やはり無知は罪ですね。

そんな可哀想な人が増えないようここに解決法を書いておく事で一人でも多くの迷えるプログラマーを救いたいという思いです。

ケース1:階層構造型データ(隣接リストモデル)の検索

RDBってのは行列形式にデータを蓄積していく仕組みなんで、階層がいくつも重なる多次元的なデータモデルは扱いづらいってのが定説です、実際RDBで階層構造を扱うぜ!って話だけでクッソ分厚い技術書を1冊かけるらしいのですが、今回は階層構造型のデータの内、最もポピュラーらしい隣接リストモデルを用いたデータ構造の検索方法について述べていきます。正にこいつが知ってれば半日、知らんと数週間の初見殺しマンでした。

1-0:EMP表の説明

ではここからはscott/tigerのEMP表を例としてSQLの解説をしていきます。(注:scott/tigerはオラクルDBのデフォルトで入ってるスキーマ、ちなみにオラクルにはSQLを独自で拡張したCONNECT BY句とか言う超便利な文法がありこれから書く内容と同じことを超簡単なSQLで実装できるのでオラクラーの人はそっちでどうぞ)

EMP表、日本語で言うと社員マスタといったところです。この表が何故隣接リストモデルに値するデータ構造なのか?というところを軽く説明すると

外部キーとしてEMP表のプライマリーキー(上司の従業員番号)をデータに持ってるから

とか書いておけば情報処理の試験では○を貰えるんじゃないでしょうか?データの中身と様式は以下のような感じです。

従業員テーブル(EMP)

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
従業員番号(★) 名前 職種 上司の従業員番号(☆) 入社日 給与($) 歩合給($) 部署コード(☆)
7369 SMITH CLERK(事務員) 7902 80-12-17 800   20
7499 ALLEN SALESMAN(営業マン) 7698 81-02-20 1600 300 30
7521 WARD SALESMAN(営業マン) 7698 81-02-22 1250 500 30
7566 JONES MANAGER(管理職) 7839 81-04-02 2975   20
7654 MARTIN SALESMAN(営業マン) 7698 81-09-28 1250 1400 30
7698 BLAKE MANAGER(管理職) 7839 81-05-01 2850   30
7782 CLARK MANAGER(管理職) 7839 81-06-09 2450   10
7839 KING PRESIDENT(社長)   81-11-17 5000   10
7844 TURNER SALESMAN(営業マン) 7698 81-09-08 1500 0 30
7900 JAMES CLERK(事務員) 7698 81-12-03 950   30
7902 FORD ANALYST(アナリスト) 7566 81-12-03 3000   20
7934 MILLER CLERK(事務員) 7782 82-01-23 1300   10

 

http://replication.hatenablog.com/entry/2015/02/26/093000氏から引用しました。問題あれば消します。

こういう持ち方をしておけば常に階層の下位が一つの上位の階層をポイントできる(社長のKING氏は一番偉く上位がないのでnull)ため、階層構造、つまりこの例で行くと社員の序列を表現できてるということです。

今回は以下の要件に当てはまるSQLの実装を書いていきます。

・とある管理職が管理すべき社員を一覧したい(上位から下位への検索)

1-1:SQLの実装と概説

初めに断わっておきますが、DB2環境の業務に使ってるテーブル向けに書いたSQLをEMP表に読み替えて手書きで再作成したSQLです。手元にORACLEの環境もないので、動作確認もしてませんので動かなくても知りません。(ちなみに元のSQLもIBMknowledgecenterの奴を丸パクリ・・・つまり長ったらしく書いてるけど、URL張れば一発で終わってしまう内容である。)

ーーーーーーーーーーーーーーーーーーーーーーーーーーーー

とある管理職の部下にあたる従業員番号を一覧するSQL

WITH REMP (PATH,LVL,MGR,EMPNO) AS
(SELECT EMPNO, 0,ROOT.MGR, ROOT.EMPNO 
  FROM EMP AS ROOT
  WHERE MGR = "とある管理職のEMPNO"
  UNION ALL
  SELECT CONCAT(PARENT.PATH,CHILD.PATH) , 
  PARENT.LVL + 1 ,CHILD.MGR,CHILD.EMPNO 
  FROM REMP AS PARENT, EMP AS CHILD
  WHERE PARENT.EMPNO = CHILD.MGR AND LVL <= 100
 )
SELECT * FROM REMP ORDER BY PATH

ーーーーーーーーーーーーーーーーーーーーーーーーーーーー

説明しやすいように色分けしてみました。結論から書くとSQLで実装された再帰処理ですね。階層構造は再帰的な形状をしてるので再帰処理で検索するのが筋です。

最初の黄色、WITH句でREMPというビューを定義してます。WITH句で先にビューを宣言しとくと後続でそのビューを参照できるって奴ですね。このREMPビューの検索内容が()内の緑と青になりますが、青の検索にWITHで宣言したREMPを使うため再帰的検索となります。

の検索は検索の始点です。とある管理者の直属の部下達が検索されます。

の検索ではREMP表とEMP表を結合させて、部下の部下達を検索します。検索した結果はREMP表に格納されていきそのREMPの内部では部下の部下の部下達を検索し・・・、と末端に辿り着くまで階層構造を検索します。

ここで注意したいのは俺の部下が実は俺の上司だった、つまり釣りバカ日誌的状況です。このようなデータがあると「俺だ、浜崎だ、俺の会社の社長は鈴木だ、呼んでくる。俺だ、鈴木だ、俺の釣りの師匠は浜崎だ、呼んでくる。俺だ、浜崎だ・・・」と再帰処理が無限に循環してしまうのでスタックオーバーフローを起こします。循環を起こさないために茶色を入れて深い階層が発生しないよう100階層までの検索で打ち止めにしてます。

ちなみにPATHというデータはとある管理職からとある従業員に至るまでの上下関係の変遷となります。イメージとしてはPCの絶対パスみたいなもんですね。これをデータとして持っておくと、別パターンの階層構造である経路列挙型モデルの実装にも応用が利くようになるんじゃないでしょうか。

終わりに

見出しにケース1とか連番振っておいて終わりかよ!って感じですけど。ケース一個で取れ高十分すぎたので終わり。このブログの記事は僕が終わりと思ったら終わる。そんなブログ。