とても残念な事件があった

Hagex-day info

Hagex 氏が亡くなったそうだ。しかも、福岡のイベント後に刺されたのだそうだ。

サッカーのW杯を見ながら、Twitterをやっていたら、そんなツイートが目に飛び込んできた。
最初は、間違いであってくれと思ったが、時が進み詳細が明らかになるにつれ、Hagex氏であることが確定していった。
これまでに、ネットでしか知らない人、ネットで知り合った人の訃報を見聞きする機会はあったが、今回の事例は最悪だ。最終的に、日本代表が気になるからサッカーを見ているのか、Hagex氏のことを考えないようにするためにサッカーを見ているのか、よく分からなくなってきた。


夜の内に おいネット弁慶卒業してきたぞ 改めて言おう これが、どれだけ叩かれてもネ.. を読んだのだが、最初の内は騙りを疑っていた。しかし、警察に出頭した時間や年齢が報道内容と一致することから、ほぼ犯行声明であると考えて間違いないだろう。ちなみに、ここまではてなに執着した増田なのに、はてなの本社が東京にあると思っているようだ。この点は、犯行声明を書いた増田の残念さを浮き立たせているように思う。
昼前に、報道がまとまってきたが、こんな形ではてなIDを見る機会があるなど思いもしなかった。


警察に出頭した人物は 低能先生に対するはてなの対応が迅速でビックリ - Hagex-day info における「低能先生」であるようだ。報道では犯行動機として「低能と煽られた」などと書かれているが、ネット上で誰かが「低能先生」を低能と煽ったわけではなく、むしろ「低能先生」がIDコールで低能と煽って暴れまくっていた点は明記しておきたい。
所謂「低能先生」は、罵倒をIDコールで投げつけてくるのだが、即座にはてなの運営に通報され、アカウントが削除されてしまう。そして、直後に新しいアカウントを作り、一言一句同じIDコールを飛ばして、またアカウントが削除される行為を繰り返していた。
私も何度かIDコールされ、当初は律儀にはてなに通報していていたのだが、無視していても即座に削除されていたので、無視するようになっていった。時には、はてなブックマークのお知らせに「低能先生」が何度もIDコールしたと思われる通知のみが残っていることもあった。
アカウント名が一定しないため便宜的に「低能先生」というあだ名が付けられたという経緯であろう。もちろん、揶揄する意図がまったくなかったとは言い切れないだろうが。
アカウントが即効削除されるため、記録が殆ど残っていないが、はてなブックマークで「死ね」「ゴミカス」等の誹謗中傷を行われたときの対処について|tekito_yuma|note などが、「低能先生」と称されるアカウントが行っていたことの一部である。

古来からのネット作法に総括を迫られているのかもしれない - 日毎に敵と懶惰に戦う によると、その罵倒も、直接危害を加えることを示唆するなど、エスカレートしていたらしい。完全にアウトな発言ではあるが、警察などに通報して、果たして意味があったのかは疑問ではある。犯行を未然に防げたかは分からない。

私も、彼からIDコールされたことがある身であるし、どちらかというと Hagex 氏に近いスタンスでもある。それ故に、今回の事例が恐ろしい。そして、ただ茫然とHagexさんについてのニュースを眺める: 不倒城 で語られるように「テロ」であろう。そして、このテロは、たまたま Hagex 氏が「低能先生」の近くにやって来たから実行されたように思える。

ちょうど10年前となる2008年の記事だが 本名バレてもへっちゃら? - ぼくはまちちゃん!(Hatena) は示唆的だなと思う。ネットがインフラになるにつれ、広く発信できるようになったが、同時におかしな人に遭遇する機会も増えている。というか、こんな記事を書くこと自体がある意味でリスクでもある。実名、匿名論にもつながるが、以前から一般人が実名と顔写真をネット上に公開するリスクが語られていた。

個人的に、最近のHagex氏は、目線を隠しているとは言え、少々露出し過ぎてはないかなと危惧していた。やまもといちろう氏は やまもといちろう 公式ブログ - Hagexに王様はいなかった - Powered by LINE 、において、Hagex氏こと岡本顕一郎氏がリスクを取ったのだろうと書かれいる。岡本氏の活動を見るに、ネットのリスクを警鐘するために、徐々に露出を増やすつもりではあったのかもしれない。それが、今回のような事件になってしまい、とても残念である。

一連のことは、ブログに書くか迷ったが、記録することがブログの本分であろうから、残しておくことにする。

スタバの呪文注文は受入れられているのにSUBWAYがだめな理由

SUBWAYが店舗を減しているそうで

サブウェイが4年で170店舗も閉めた理由 | プレジデントオンライン

「サブウェイ」4年で170店舗も閉店していた…「好きなのに」「近くに店舗がない」とファンからは悲しみの声 - Togetter
サブウェイの注文方法の改善案とオススメデッキレシピの共有「何も知らない状態で『君だけの最強デッキをつくりだせ!』とかいきなり言われるのは確かにやばい」 - Togetter

SUBWAYヘビーユーザーのこの俺が貴様らにSUBWAYの使い方を伝授してやる: 不倒城

SUBWAYが店舗を減らしているニュースを知り、以前からSUBWAYブランディングと注文方法に問題があると考えていたので、その点をグダグダとツイートしてたら、攻略記事が書かれていた。まさに、SUBWAYの注文は「攻略」であり、デッキを構築するゲームに近い。デッキを構築する楽しみはあるが、そんなことをしたくない人もいるだろう。そういう人のためにも、SUBWAYはスターターパックを用意して欲しい。

Chipotle(チポトレ)上陸して欲しいなぁ

ちなみに、私はSUBWAYの注文方法の改善、あるいは根付かせる方法には興味はあるが、SUBWAYそのもにの興味はあんまりない。SUBWAYの注文を改善したい理由は、アメリカ発のメキシカンである「Chipotle(チポトレ)」が日本に上陸して欲しいと願っているからだ。Chipotle(チポトレ)の注文スタイルはSUBWAYのそれに近いが、より複雑である。クオリティは自信を持ってオススメできるが、注文方法を変えなければ日本では流行らないだろう。

https://tokuhain.arukikata.co.jp/losangeles/2014/10/_chipotle.html
マクドナルドの売り上げがアメリカでも激減している理由とは?
Chipotle(チポトレ)では、先ずにタコス、ボウル、ブリトーを選ぶ。そして、ライスを入れるかを決める。ライスを入れるとボリュームたっぷりになるので、個人的には入れない。次に肉、トッピングを選ぶのだが、ここは恐らくSUBWAYよりも複雑だ。追加料金なしのトッピングもあれば、そうでないものもある。しかし、それが一見して分かるようにはなっていない。SUBWAYの注文方法が受入れられなければ、Chipotle(チポトレ)が日本進出しても成功の見込みはないだろう。

SUBWAYの注文スタイルをブランディングする

SUBWAYの注文方法はややこしい。しかし、ややこしさとしてはスターバックスの呪文注文や二郎系ラーメンの注文方法と変わらない。なぜ、SUBWAYはダメなのか。
組み合わせが多すぎるからだろうか。しかし、ファミレスなどでも数種のメニューから組み合わせを「選択」するセットに帯する不満などは聞かれない。

スターバックスではオプションを選択すると結果的に呪文注文が生成されるが、オプションを選択しなけば指さしのみで注文可能である。二郎も「普通で」などど言っておけば済む。ファミレスなどのセットメニューでも、指さしのみで意思は伝わるし、順々に選んでいくため迷うことはあっても道筋は見える。SUBWAYでは道筋が見えない。
SUBWAYで選択の道筋が見えないのは、オプションが多すぎるからだ。主に、対話でのコミュニケーションが必要であるのも、道筋を見えなくしている。また、オプションの選択が強制されているのも避けられる理由かも知れない。

サブウェイが店舗デザインを一新、業績回復に貢献するか | BUSINESS INSIDER JAPAN
改善する一つの方法は、店員との対話を減らすこと。アメリカでは、アプリで注文を選択し店舗で受け取ることができるように改善されている。店頭に設置されたタブレット端末から選択したり、注文票を用意するなどの方策が考えられるだろう。
もう一つは、デフォルトの設定を用意すること。つまりスターターパックである。野菜は基本的に全部入りにして、苦手な野菜を抜く形式が望ましい。足し算ではなく、引き算にするわけだ。

スタバや二郎の注文が受入れられているもう一つの理由は、それがブランディングされているからだろう。調理が目の前で行われるのは一つのイベントである。きちんと注文さえできれば満足できるはずた。つまり、SUBWAYの注文スタイルそのものをブランディングすることが可能なはずだ。それができないのは、注文の道筋が見えないからで、注文の方法自体の改善は必要だろう。

まとめ

1. SUBWAYの注文スタイルをブランディングする。
2. 選択肢を明確にし、望みの注文ができるようにする。
3. デフォルトのスタイルを設定する。

スタバや、コストコバーガーキングなどの例のように、アメリカンなスタイルをブランディングすることは十分可能だ。特に、バーガーキングはアメリカ本国とは異なるブランディングをしている点は興味深い。
オプション選択がSUBWAYの魅力の筈だが、それが多すぎる。そのため注文の道筋が見えない。選択肢を明確にする方法として、モバイルアプリや店頭での注文票やタブレットの導入が考えられる。選択肢を予め明確に示すことができれば、どのような方法でも良いと思う。
それと同時に、いちいち色々選ぶのが面倒だという人もいる。そのような人のために、「普通で」を用意しておく。そこから、嫌いなものを抜く形式の方が注文も簡単だろう。

というわけで、自分自身としてはSUBWAYの注文形式が広まって、その結果としてSUBWAYスタイルのファストフードが進出して欲しいなぁと願っているのでした。ただし、日本でメキシカンを広めるなら、最近流行のキッチンカーの方が向いてそうですね。

黒本に嘘の情報を提供したスクウェアの罪と罰

嘘の資料を渡したスクウェア

nlab.itmedia.co.jp
live.nicovideo.jp

【FFT】黒本「小数点以下の確率で盗める」【20年目に驚愕の事実発覚?!抜粋コメ付き】

スクウェアの前廣和豊氏がニコ生中に、黒本として名高いファミ通、JK・VOICEが出版したファイナルファンタジータクティクスFFT)について言及し「小数点以下の確率で盗める」の真相が明らかになった。なんと、開発資料を検証もせずに、そのまま掲載する出版社にイラついていた伊藤裕之氏が、嘘の資料を渡していた。

黒本の中で、最も悪名が高いのが「小数点以下の確率で盗める」であり、この記述を信じて挑戦し無残にも諦めたプレイヤーも多いだろう。スクウェアから嘘の資料を渡されるファミ通の信頼性のなさも問題だし、黒本にはこれ以外にも相当数の誤植や誤情報があるため、ファミ通とJK・VOICEの責任は重い。その一方で、最終的に割を食うのはエンドユーザーであるプレイヤーのため、嘘の情報を故意に渡したスクウェアにも責任があるだろう。

スクウェアの攻略事情

誤情報が多すぎる黒本

書籍/【ファイナルファンタジータクティクス大全】 - ファイナルファンタジー用語辞典 Wiki*
dic.nicovideo.jp

ファミ通とJK・VOICEによるFFTの攻略本は、エルムドア以外の記述に関しても誤植、誤字や誤情報が多い。どんなに校正を行っても誤植は生じえるが、それにしたって多い。出版社として最低限やるべき仕事を怠っているのは疑いようがない。

伊藤氏の発言を別角度から見てみると、当時からゲーム開発元とゲーム雑誌の関係が、あまり良好ではなかったことがうかがい知れる。昨年、ファミ通の水間氏が任天堂がグッズを内製し、それを告知するサイトも内製である点を愚痴っていた。ゲーム開発会社と雑誌社が、こんな関係性だからこそ、ゲハ系ブログの影響力が強くなったのかなぁと、暗い気持ちになった。

ゲーム開発会社とゲーム雑誌社の関係性

よくよく考えると、当時のスクウェアデジキューブを立ち上げ、スクウェア・オンラインなど、既存の販路やメディアに依存しない方向を目指していた。まぁ、映画とこれらの事業が上手くいかずに、結果的にエニックスと合併することになるのだけど。スクウェアエニックスと合併した理由の一つに、エニックスが出版を手がけていたからとも言われている。

また、スクウェアの攻略本と言えばNTT出版だったが、PSの頃からは、FF7やサガ・フロンティアの攻略本がファミ通系列の「解体真書」から出版されている。その関係もあり、FFTの攻略本もファミ通が携わることになったのだろう。FF8以降は「解体真書」を手がけた「スタジオベントスタッフ」がアルティマニアデジキューブおよび、デジキューブが倒産してからは、スクウェア・エニックス出版で刊行している。「スタジオベントスタッフ」は、サガ・フロンティアの裏解体真書など、実際にやり込みを行い攻略本を書いていたようなので、スクウェアとの関係も良好だったのだろう。

とは言うものの、解体真書アルティマニアにも誤植や誤情報があるんですけどね。サガフロンティアの1と2なので、どっちもサガですね。
裏解体真書の間違い
アルティマニアの間違い

ファミ通とJK・VOICEは検証しなかったのか?

ファミ通とJK・VOICEによるFFTの攻略本、いわゆる黒本には多くの誤植と誤情報があるため、同出版社がゲーム開発会社から提供された情報を検証もせずにそのまま掲載していた点は間違いない。実際、ファミ通の攻略本は、そのコピーである「大丈夫。ファミ通の攻略本だよ。」を文字って「大丈夫?ファミ痛の攻略本だよ?」とネットで揶揄されほどひどい内容のものがある。
ただし、エルムドアの源氏装備に関しては、ファミ通を擁護する声もある。数々のゲームのレアアイテムを集めるゆっくりレアハンターであるマラリア氏が、その一人だ。

マラリア氏は、2014年にアップロードした動画で、ファミ通とJK・VOICEによるFFTの攻略本における「小数点以下の確率で盗める」関連の記述が不自然であること、および北米版のFFTでは、エルムドアから源氏シリーズを盗めることから、本来は開発側が盗めるように意図していたものの、設定を誤りか変更のため盗めなくなり、結果として誤った情報を元に攻略本が書かれたのではないか?と推測していた*1FF5において、源氏シリーズはギルガメッシュから盗むこと、またエルムドアの見た目がセフィロスっぽいことも相まって、ロマンを追い求めたくなる。

以下に攻略本のエルムドアの正宗および源氏シリーズの記述を引用する。

  • 村正はChapter4でエルムドアが装備している。ただし、盗むのは至難の業。(P125)
  • 超レアアイテムの正宗は、ランベリー城場内に登場するエルムドアが装備している。
  • 源氏シリーズの防具も、ここでしか見れない。

いずれも盗める確率は0パーセントと表示されるが、このゲームでは小数点以下を切り捨てているため、実際は小数点以下の確率で盗める。
気が遠くなるほど低い確率だがゼロではない。
十分にレベルを上げ、即死や、吸血を防ぐアイテム類を完璧に揃え、何度も何度も挑戦すれば盗むことが可能。
盾を壊す事ができれば回避率が下がる為、盗める確率が多少上がる。
スロウも効かないわけではない。ただし成功率は果てしなく低い。(P200)

  • 盗める確率はほとんどの場合において0パーセント。まず盗めない(初版P214)
  • 正宗と源氏シリーズを装備するがいずれもエルムドア専用装備であるため、絶対に盗めない。(第二版P214)

スクウェアがどのような資料を提供したか不明である。「小数点以下の確率で盗める」 がスクウェアファミ通のどちらか来たかはわからない。
仮に上記の通りの資料を渡していたならば、ファミ通の責任はかなり重い。ただし、最終的に不利益を被るのはユーザーなので、スクウェアも無責任である。

伊藤氏は検証すればすぐに分かることとするが、本当に検証可能であろうか。

エルムドアから源氏シリーズを盗めるようにしていた?

エルムドアにはメリットアビリテとして「メンテナンス」が付いているため、バグでもない限りは装備品を破壊することも盗むことも100%不可能だ。

ただし、この特性はゲーム内で明記されているわけではない。また、FFTのアークナイトはNPC専用で公開情報のみから、その特性を判断するのは困難である。アークナイトとして、エルムドアの他に、ディリータやザルバッグが登場するが、彼らはメンテナンスを所有していない*2。また、同じアークナイトであっても異なるアクションビリティを有しており、さらにザルバッグは騎士剣、エルムドアは刀と装備まで違う。エルムドアはサポートアビリティとして格闘を所有している点も解せない。


FFT エルムドアから源氏シリーズを盗む Steal the Genji from Elmdor

北米版のエルムドアには「メンテナンス」が付いていないものの、レベルを上げ、さらにステータスを十分に低下させないと盗むのは困難である。

以上の点から、本来は正宗と源氏シリーズをエルムドアから盗めるようにしていたとの推測も成り立つだろう。ただし、この点がPSP版で修正されていない点が不可解である。北米版の方が設定ミスである可能性もある。

「小数点以下の確率で盗める」は検証可能か?

伊藤氏はすぐに検証できる発言しているため、エルムドアが「メンテナンス」を持っている点をファミ通へ資料提供していたのだろう。その一方で、エルムドアから盗めるとも書いていたのだろう。

再度エルムドアの源氏シリーズに関する記述を読むと、マラリア氏が指摘するように、必死さが感じられる。この件に関しては、実際に試したが、無理だったため必死さのにじみ出る文言なのかもしれない。
「小数点以下の確率で盗める」ならば、仮にそれが0.9%ならば、100回やっても盗める確率は60%で250回でようやく90%ととなる。また0.1%の場合、1000回やっても37%の確率で盗めないことがある。
エルムドアに「メンテナンス」が設定されているとの資料を信じるか、それとも源氏シリーズを盗めるとの情報を信じるか。プレイアブルなキャラクターとNPCでは、同じ能力名であっても違うことがある。特に、アークナイトであるエルムドアに付与されている「メンテナンス」は非公開情報な上、他のアークナイトと比較しても不可解な点も多い。恐らく、最終的に疑いながらも盗める方に賭けたのであろう。

盗めないならスクウェアに正誤を問いあわせるべきではある。しかし、当時のスクウェアファミ通の関係性からは無理そうである。また、松野氏が擁護するように締め切りもある。ただし、そうであっても誤植の多さは大いに問題である。全体としては、ファミ通を擁護しきれないが、困るのはユーザーであるため、意図的に嘘の情報を提供するのは悪質だ。特に、手に入らないレアアイテムの情報は。

開発元が提供した資料に誤りがあったと推測される事例

開発元が出版社に提供した資料に誤りがあり、それを検証せずに掲載するのはファミ通に限らない。もちろん、通常は故意に誤ったデータを渡すわけではない。結果的に誤った情報を渡してしまったケースの方が多いだろう。

FF5の「ちぬられたたて」

NTT出版FF5攻略本である「基礎知識編」では、「ちぬられたたて」がピラミッドで入手できるとされている。しかし、実際にはアイテム変化のバグを起こさない限りは入手できない。データとしては存在しているが、手に入れられないのだ。FC版DQ2のあぶない水着のように没にしたのかも知れないし、あるいはピラミッドに設置し忘れたのかも知れない。

魔界塔士サガにおける共通する誤情報

魔界塔士サガの攻略本にも誤植があったのを思い出したので調べてみたら、面白いことが分かった。魔界塔士サガの攻略本は、徳間書店、ゲイブンシャ、辰巳出版から刊行されているが、三社とも本来5000ギルである「ドア」の値段を500ギルと間違っている。また、徳間書店辰巳出版は共に、「きんのはり」、「じゅうじか」、「めぐすり」、「いきかえりのくすり」の値段を同じように間違っている。刊行の遅い辰巳出版徳間書店の情報をパクった可能性もあるが、スクウェアから提供された資料に誤りがあった可能性が高い。これらの間違いは検証すれば分かることではあるが、どの出版社も締め切りとしてはギリギリだったと考えられる。魔界塔士サガは1989年12月15日の発売だが、徳間書店版はガイドブックという位置づけのため、1月に発売されている。辰巳出版は3月、そしてゲイブンシャは4月発売である。徳間書店は検証する時間はほぼなかったであろう。

魔界塔士SaGa攻略本の正誤表

サガの嘘情報はひどい

スクウェアのゲームの中でもっともひどいのはサガシリーズだ。
ロマサガ2は特にひどく、メニュー上の値と戦闘で参照される値が異なる事例が多々ある。例えば、オートクレールはゲーム上最強の攻撃力である50と表記されているが、実際は35しかない。防具も、メニュー上の表記と実際の値が異なる事例が多い。ほぼ詐欺である。これに加えて隠しステータスがあるため、プレイヤーは何を信じて良いのかさっぱりである。

ロマサガ3においては、仕様の変更により最上位のモンスターが登場しなくなったことを河津氏が明らかにしていた。

先の、解体真書アルティマニアもサガ・フロンティアに誤植や誤情報があった。サガシリーズは納期を絶対に守らせる河津氏の作品だからこそ、仕様と実装の違いが生じやすいのであろう。

「小数点以下の確率で盗める」はスクウェアにも責任あるよね

上記で示したように、開発元から出版社へ提供される仕様に基づいた情報が、100%正確であるとは限らない。ロマサガ3の最上位モンスターのように、意図した仕様と異なってしまうこともあるからだ。
それを検証するのが、攻略本を作製する編集者や出版社の仕事ではある。だがしかし、開発元が意図していない、あるいは認知していない誤情報を、出版社が検証するのは容易ではない。時間も予算も人も限られている。情報があるだけ、余計なバイアスもかかってしまう。出版社はデバッカーではないわけで、出版社だけが責められるべきではないだろう。

もちろん、出版社としての責務を怠り、開発元からの情報を何ら検証せず、また誤植や誤情報だらけの攻略本は責められるべきである。その点で、ファミ通、JK・VOICEにおるファイナルファンタジータクティクスの攻略本、通称黒本は許されるべきではない。しかしながら、この本の誤情報は開発元が故意に提供したものである。ファミ通やJK・VOICEがきちんと検証したかは定かではない。「小数点以下の確率で盗める」に関しては、検証した可能性はありそうだ。「小数点以下の確率で盗める」に関しては、誤情報を故意に提供したスクウェアにも責任があるだろう。最終的に困るのは、ユーザーであるからだ。

*1:ただし、マラリア氏は動画の中程でPSP版ではエルムドアから盗めるようになった説明しているが、最後のお詫びに事実では無い点を謝罪している

*2:ザルバッグはサポートアビリティにセットされることがある

日本には7重内陸区市町村が存在する

f:id:lastline:20180515135054p:plain

n重内陸区市町村問題

世界には、48の内陸国が存在するが、その中でも海に出るために二つの国境を越える必要のある二重内陸国は、リヒテンシュタインウズベキスタンの2国しかない。
二重内陸国を日本の都道府県に当てはめてみようと思ったが、二重内陸都道府県は存在しない。海なし県として、栃木県、群馬県、埼玉県、長野県、山梨県岐阜県滋賀県奈良県があるものの、これらの県は一つの県境をまたげば海に出ることができる。奈良県以外は、互いに他の海なし県と接しているのが面白い。
二重内陸国の概念を市町村に拡張すると、二重ではすまないことが容易に想像できるだろう。言い換えると「日本の市町村において、海に出るまでに n 個の境界を越える必要のある市町村を n重内市町村としたとき、最大の n はいくつか」という問題になる。

市町村の区分としては、基盤自治体を元とする。つまり、東京都の「特別区」は「区」を、政令指定都市の「区」は「市」を境界とする。これは、東京都の「特別区」は「市町村」と同等の基盤自治体であることによる。

白地図に海岸線を有する市町村から順に内陸方向へ塗りつぶすことで、最大のnは7であることが分かった。つまり、7重内陸市町村が存在する。
各地域毎の結果を最後にまとめて表示した。

解法の指針

日本の中心はどの県だ?グラフ理論(ネットワーク)の基本的な諸概念 - アジマティクス
市区町村隣接関係一覧
当初は市町村の隣接データを元に、スクリプトを書いてグラフ理論で解こうと考えていた。しかし、「日本一マクドナルドから遠い場所」において、力業で求めた方がもっともらしい回答が得られていたので、白地図を地道に塗り塗りすることにした。
そもそも、市町村が多すぎるためデータの取り扱いが煩雑である。また、結果を可視化する場合にも色分けされた地図が必要となる。得られた結果を確認するためにも、ある程度手を動かす必要がある。結果を知りたいだけならスクリプトを書くよりも、地道に塗った方が早そうである。
都道府県における、n重内陸市町村をリストアップするならスクリプトを書いた方が間違いは少ないだろうが、興味があるのは最大の n のみなので、やはり手作業の方が単純で容易そうだ。

日本一マクドナルドから遠い場所 - Qiita
「本当に」日本一マクドナルドから遠い場所|🌏地図川さん🌏|note

高解像度の白地図

地図を塗るにも、それなりの高解像度の白地図が必要である。これは、スクリプトを書く場合も同様で可視化のためにベクター形式の地図情報があると便利である。

そこで、白地図 KenMap (白地図作成ソフト)白地図を用いることにした。関東付近は市町村が非常に過密なため、境界がやや曖昧になるものの、塗り分け用の地図としては必要十分である。

ちなみに、国土地理院から白地図を得られるが、市町村の区分まで表示するには倍率を上げる必要がある。一つの県を表示するのがやっとである。これをつなぎ合わせも良いが、手間がかかりすぎる。

Shapefileを読んでみる - 日々適当
shape形式のファイルを読み込む手も考えられるが、全国区で市町村を表示するとかなりの数のポリゴン数になるようである。そもそも、市町村を全国区の表示で見る用途など、想定されていないのだろう。

7重内陸市町村が最大

1重内陸市町村までしか有しない都道府県

1重内陸市町村しか存在しないのは、沖縄県、鹿児島県、長崎県佐賀県山口県愛媛県香川県福井県、石川県、富山県三重県の11県である。
中でも、沖縄県長崎県山口県は、1重内陸市町村を一つしか有しない。それぞれ、沖縄県南風原町長崎県波佐見町山口県美祢市である。島からなる沖縄県に内陸市町村があるのは興味深い。

7重内陸市町村は埼玉県と群馬県にある

n の最大値は7である。つまり、日本には7重内陸市町村が存在する。埼玉県の美里町滑川町東松山市、吉見町、北本市行田市羽生市、および、群馬県千代田町明和町が該当する。

次に、各7重内陸市町村が海へ出るルートを考えてみよう。千代田町群馬県を抜け新潟県へ、明和町は一旦栃木県に入り、再度群馬県に戻り、新潟県側へ出るルートが最も境界が少ない。
また、美里町は、千代田町とほぼ同じ道筋を辿る日本海ルートの他に、長野と山梨を経由して静岡県側から出るルートもある。その他の市町村は東京湾に出た方が境界が少ない。東松山市、吉見町、北本市などはさいたま市を経由し、東京へ出るルートが距離的にも短くなる。行田市羽生市は、細く長く伸びた千葉県野田市のお陰で越えるべき境界数が少なくなっている。

埼玉と群馬にnが最大となる市町村が存在する理由は、関東の市町村が非常に多いことに起因する。特に、埼玉県は小さな市町村が非常に多い。そのため、海に出るために経由すべき境界が増加しやすい。

その他の地域は市町村の合併により、市町村数が減少し、また、本来海外線を有しなかった市町村が海外線を有するようになり、n が減少した可能性が考えられる。恐らく、旧市町村の区分だと、 n はより大きくなるだろう。

地域別のn重内陸市町村

地域別に見ると、九州では福岡県と佐賀県に3重内陸市町村が存在する。これは、福岡県に市町村が多いためだ。
中国地方では、岡山県のみに3重内陸市町村がある。山がちな地域のため納得ではある。一方で、四国は2重内陸市町村までである。その中でも徳島に2重内陸国市町村が多いのも山によるものだろう。
関西は奈良県に4重内陸市町村があり、橿原市田原本町などが該当する。山がちな点と、大阪府奈良県に市町村が多いためと考えられる。長野県と岐阜県は意外にも3重内陸市町村しか存在しない。岐阜県高山市や長野県松本市の面積が広いため、多くの市町村と接することになるためだ。
東北地方は福島県に4重内陸市町村があり、北海道は3重内陸市町村までとなる。東北は、海岸線を有する市町村が割と内陸まで入り込んでいる場合が多い。その中で、福島県の場合は地形的のも内陸に入り込み、また市町村が多いため、内陸市町村が多くなっている。

海岸線を有するにも拘わらず、茨城県には5重内陸市町村が存在する。それぞれ、古河市結城市、八千代町であるが、これは海あり県では、最大である。そもそも、海なし県である、群馬県と埼玉県が最大の7重、次いで栃木県に6重があり、5重で茨城県山梨県が並んでいる。他の海なし県である、長野県、岐阜県滋賀県奈良県よりも多いのだ。これは、茨城県の内陸部が海なし県と接しているためであろう。

やっぱりスクリプト書いてみるかなぁ

日本の市町村において、海に出るまでに n 個の境界を越える必要のある市町村を n重内市町村としたとき、最大の n は 7 である。この時、東京都の「特別区」は境界とし、政令指定都市の「区」は「市」を境界とした。
ちなみに、地図は掲載しないが、東京23区をひとまとめにした場合もnの最大値は7となる。また、政令指定都市の区を境界とすると、nの最大値は8となる。

7重内陸市町村は、埼玉県の美里町滑川町東松山市、吉見町、北本市行田市羽生市、および、群馬県千代田町明和町である。それぞれ、日本海側、東京湾および静岡経由で海に抜けるルートが存在する。今回は、最長のルートを有する市町村は考慮しなかったが、これを求めることで、最内陸市町村を決定できそうである。また、今回のルートは山による境などを加味していないため、踏破できないことも十分考えられる。

海あり県では、茨城県に5重内陸市町村が存在する。長野県、岐阜県滋賀県奈良県より多いn重内陸市町村を有している。

スクリプトを書けば、より詳細なリストやルートが得られそうだが、これは今後の課題にしたい。

塗り分けた結果

緑が濃くなるごとにnが大きくなる。
f:id:lastline:20180515133921p:plain
f:id:lastline:20180515134119p:plain
f:id:lastline:20180515134208p:plain
f:id:lastline:20180515134327p:plain
f:id:lastline:20180515134346p:plain
f:id:lastline:20180515134431p:plain
f:id:lastline:20180515134518p:plain

Pythonでスペクトルのフィッティング

非プログラマーがPythonを学ぶために読んだ本 - 最終防衛ライン3 の「2. 一ヶ月勉強して、できるようになったこと」で書いた、Pythonでスペクトルのフィッティングを行った例を示します。matplotlib と pandas などを扱ったグラフの出力に関しては、別当まとめようと思います。matplotlib は手に取ってみるとなんとなくで扱えるのですが、真面目に取り組むと結構ややこしく、自分のためにも備忘録をしっかりまとめておきたい。
フィッティングだけならExcelでもできますが、データを大量に取り扱うとなるとマクロを組む羽目になりますし、マクロよりも、スクリプト言語を扱った方が拡張性があります。デーだ処理だけなら、Rを使う手もありますが、グラフを出力すること以外にもPythonを使った方が、やりたいこと、またできることが多いので。

フィッティングする適当なデータがなかったので、放射線スペクトル表示ツール SPViewer / 説明ページ における スペクトル例(FNF-401) を利用しました。確認用データを生成してそれをフィッティングしても良いのですが、それだとフィッティングできて当たり前ですし。
放射線スペクトルは、正規分布を取ることが知られているのでガウシアンフィッティングに最適。またバックグラウンドも二次式程度で近似できそうなので、丁度良いかなと。

f:id:lastline:20180412092647p:plain

スペクトルのフィット:例2Pythonでやった結果を表示しています。
先ず、pandas で CSV ファイルを読み込み、
フィッティング関数を定義し、scipy.optimize の curve_fit でフィッティングを実行します。
そして、その結果を matplotlib で描画しています。
フィッティング関数の定義や、データの取り扱いには numpy を利用しています。

以下のコードを実行すると、グラフが出力されます。
CSVファイルは、先述のように 放射線スペクトル表示ツール SPViewer / 説明ページ から スペクトル例(FNF-401) をダウンロードし、同名のフォルダに保存してください。URLから直接取得することもできますが、本質ではないのでカット。
過剰とも思えるコメントを付記しています。調べた際に、分かりにくかったポイントをまとめてあります。。そのくせに、関数の document は記述していない。

#モジュールのインポート
#import モジュール名 as * は非推奨。使っているコードを見かけますけど。
import pandas as pd
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

#データの読み込み
#関連として df を用いるが、データに即した変数名を使うべき。
#ベクトルとして取り出すことも可能。
#ただし、x, y を個別に取り出した方がフィッティングの際に扱いやすい。
#engine='python' と指定すると日本語ファイルも読み込めます。
file = 'fnf401_milk.csv'
df = pd.read_csv(file, engine='python', skiprows=250, nrows=350, header=None)

#元データがint値で、そのままではフィッティングできないので、float型に変換している。
channels = np.array(df.iloc[:, 0], dtype=float)
counts = np.array(df.iloc[:, 1], dtype=float)

#フィッティング関数の定義
#n次式を定義しやすいように、0次から記述した。
def quadratic(x, a, b, c):
    return a + b * x + c * x**2

#ガウシアンはより簡素に記述できるが、初期値を類推しやすい式にした。
def gauss(x, a, sigma, mean):
    return a / np.sqrt(2.0*np.pi) / sigma * np.exp(-((x-mean)/sigma)**2/2)

#フィッティング関数は二次関数とガウシアンをまとめて定義してもよい。
#ガウシアンを三度呼び出すので、分けて記述した。
#文頭のアスタリスクのついた*paramaters は引数を幾らでも渡せる。
#本来ならば引数を個別に指定すべき。
#今回はあまりにも冗長になるため、*paramaters と指定した。
def fitting(x, *paramaters):
    a0, b0, c0, a1, sigma1, mean1, a2, sigma2, mean2, a3, sigma3, mean3, = paramaters
    return quadratic(x, a0, b0, c0) + \
           gauss(x, a1, sigma1, mean1) + \
           gauss(x, a2, sigma2, mean2) + \
           gauss(x, a3, sigma3, mean3)

#初期値の設定。
#ガウシアンの場合、meanを適切に設定しないと発散しやすい。
#線形近似であっても適切に設定することが望ましい。
#関数の引数が複数ある場合は、タプルで渡すこと。
initial_quadratic = 70., 0.1, 0.1 #a0, b0, c0
initial_gauss1 = 1., 1., 300. #a1, sigma1, mean1
initial_gauss2 = 1., 1., 325. #a2, sigma2, mean2
initial_gauss3 = 1., 1., 395. #a3, sigma3, mean3

#初期値が多いので、個別に指定して接続した。
initial_parameter = initial_quadratic + initial_gauss1 + initial_gauss2 + initial_gauss3

#フィッティングの実行
#paramater_optimalが最適化されたパラメータで、covarianceは共分散。
paramater_optimal, covariance = curve_fit(fitting, channels, counts, initial_parameter)

#matplotlibの設定
plt.rc('font', family='Arial', size=14) #フォントの設定
plt.rc('xtick.major', width=1, size=6) #x軸の主目盛りの設定
plt.rc('xtick', direction='in', top=True) #x軸目盛りの向き、上側に表示するか
plt.rc('ytick.major', width=1, size=6) #y軸の主目盛りの設定
plt.rc('ytick', direction='in', right=True) #y軸目盛りの向き、右側に表示するか
plt.rc('axes', linewidth=1.5) #枠線の太さ
plt.rc('lines', linewidth=1.0) #プロットの太さ

#今回は、Axes が一つしかないので fig, ax1 = plt.subplots() の方が簡素。
#慣例として ax1 を用いるが、df 同様に意味のある変数名にすべき。
fig = plt.figure(figsize=(8, 6), dpi=80)
gs = gridspec.GridSpec(1, 1)
ax1 = fig.add_subplot(gs[0])

#データをグラフに表示する。
ax1.plot(channels, counts, ls='-', c='g', label='row data')
ax1.set_xlabel('Channel', fontsize=16)
ax1.set_ylabel('Count', fontsize=16)
ax1.yaxis.set_data_interval(0, 100) #set_ylim を使う方が一般的

#フィッティングした曲線の表示
#np.corrcoef で相関係数を求める。
#結果が2×2の行列で返るので、1行目2列目もしくは2行目1列目の値を取得。
ax1.plot(channels, fitting(channels, *paramater_optimal),
         lw=1.5, ls='--', c='k', label='fitting curve\n' + \
         f'$R^2$ = {np.corrcoef(counts, fitting(channels, *paramater_optimal))[0][1]}')

#二次関数のパラメーターを利用したいので、スライスで取り出す。
a0, b0, c0 = paramater_optimal[0:3]

ax1.plot(channels, quadratic(channels, a0, b0, c0), c='b',
         label=r'$y = a_0 + b_0x + c_0x^2$' +'\n'+ f'$a_0$ = {a0}\nb$_0$ = {b0}\nc$_0$ = {c0}')

#各meanをグラフ上に表示する。繰り返しのため for 文を利用。
for i in range(3,12,3):
#この関数内の、a0, b0, c0 はグローバル変数である。
    def quadratic_gauss(x, *paramaters):
        a1, sigma1, mean1, = paramaters
        return quadratic(x, a0, b0, c0) + \
               gauss(x, a1, sigma1, mean1)

#annotate で Axes 内にテキストや矢印を表示できる。
    mean = paramater_optimal[i+2]
    ax1.annotate(int(mean), fontsize = 14,
                 xy=(mean, quadratic_gauss(mean, *paramater_optimal[i:i+3])+3),
                 xytext=(mean, quadratic_gauss(mean, *paramater_optimal[i:i+3])+15),
                 ha="center", va='top',
                 arrowprops=dict(shrink=0.05, facecolor='k'))

#凡例の表示。Figure の判例を出力することもできる。
ax1.legend(loc='upper right', frameon=False)

gs.tight_layout(fig) #グラフ描画前に行うべし。慣例では、fig.tight_layout()
plt.show(fig) #慣例では plt.show() と fig を指定しない。

参考文献やサイト

詳細! Python 3 入門ノート

詳細! Python 3 入門ノート

matplotlib や numpy が簡単ではありますが、まとまっています。

matplotlib や numpy の取り扱いで大変役に立ちました。

Python for Data Analysis: Data Wrangling with Pandas, NumPy, and IPython

Python for Data Analysis: Data Wrangling with Pandas, NumPy, and IPython

主に、pandas の取り扱いを参考にしました。