manjaro-swayに移行したときに詰まったことまとめ

最近i3wmからswaywmに移行した。 swaywmとは、ざっくり言うと「i3wmのwayland版」といったところ。i3wmはX.orgという昔ながらのウィンドウシステムの上で動くので、実装が煩瑣で、そのため反応が遅かったりする。waylandはそれを整理してイケイケな感じにしたもの。ただ、まだまだ開発が途中なので、うまく設定してやらないとあまりうまく動かないアプリも多い。

swayはそんなwaylandを使って動くi3wmみたいなもの。イチから開発されているらしいが、i3wmの設定ファイルと互換性をもつことを目標としているので、i3wmからの移行がとても楽なのが特長。

どんなものか体験したいひとは、まずはyay -S swayとかで入れてみよう。で、manjaro-i3だとログイン時にlightDMが開いているはずなので、そこでswayを選択すればOK。

アプリによってはうまく動かないこともあったりするので、自分の使っているアプリが行けそうかどうか試してみよう。xwaylandなどを使えば大体はうまく行くと思うが。 まあ、これは個々人の環境次第だろう。

なお、この段階で色々いじってみたい人は、Linuxのデスクトップ環境をi3からswayへ移行してみたがおおいに参考になる。 ただし、自分のようなライトユーザならmanjaro-swayにとっとと移行してしまったほうが楽な気はする。

さて、自分は上の記事を参考にして色々設定し、ある程度なれてきた。 致命的な不具合等もなかったので、移行することに決めた。

というわけで、コミュニティによって整理されているmanjaro-swayクリーンインストールしてこれに移行した。 イケイケな設定を標準でやってくれていて、ライトユーザとしてはとてもありがたい。

しかし、ユーザが設定をすでにしている場合、それとコンフリクトして問題が発生する場合もある。

それらの問題を含め、自分がsway/wayland移行時にぶつかった問題と、とその解決策を残しておく。

zshが~/.zshrcを読み込んでくれない問題

manjaro-swayでは、~/.zshenv

export ZDOTDIR=~/.config/zsh

という設定がなされている。これにより、ホームディレクトリではなく~/.config/zshにあるファイルが読み込まれるようになっている。

このファイルを読めばわかるように、ユーザごとのzshの設定は~/.config/zsh/config.d/以下に書けばよい。ワイルドカードでこのディレクトリの中身をロードしてくれるようになっているためである。00_zshrcなどの名前のファイルをつくり、そこに書き込めばOK。

なお、このように設定ファイルの名前の前に数字を入れることがあるが、これはロード順を制御するためで特に意味はない。

あと、隠しファイルにするとワイルドカードの検索から外れて読まれなくなるので注意。.zshrcをそのままコピーした場合は、名前を変えて通常のファイルに戻そう。

swayの設定が勝手にされてしまうよ問題

これも上と似たようなものである。~/.config/sway/configにイケイケ設定が書き込まれているので、これを自分なりに修正すればよい。

ファイルの構造としては、/etc/swayにある設定ファイルを順にincludeするという形になっている。

まずinclude /etc/sway/definitionsで各種定数を定義する。 たとえばモディファイアキーがWinキーに設定されているので、これを変更したい場合はこのinclude文の直後で変更をかければよい。

また、include /etc/sway/modes/*では、便利な各種モードと、そのモードを使うためのキーバインドが定義される。やめてほしい。

特に、defaultファイルでは「デフォルトモード」とでも言いたいなのだろうか、標準状態でのキーバインドが勝手に設定される。やめてほしい。

これを防ぎたい場合はこの行全体をコメントアウトするしかない(/etc/を書き換えると、すべてのユーザの設定が一括で変わってしまうのでおすすめできない)。そうすると、各種モードは自分で定義することになる。

どこで定義するかと言うと、最後の行である。最後の行では、ホームディレクトリ下のパスから設定を読み込む。これは、ユーザの設定を読み込むための行である。ここに自分のキーバインドや設定をおけばよい。上で公式の設定ファイルの一部を読み込まないように設定していた人は、そのディレクトリからコピーしてきて一部改変するのもいいだろう。

Firefox/Thunderbirdが低解像度になっちゃうよ問題

高解像度のディスプレイと低解像度のディスプレイ(正確には高DPIと低DPI)を組み合わせて使ってると起こるっぽい。 例えば、自分の環境ではThinkpad X1 carbon 2019の内部ディスプレイと、HD画質の23インチディスプレイを使っているので、まさにこの状況である。

sway output scale xでいじり、DPIを揃えるのでもよい。しかし、これだと整数倍にしかできない *1 ので使い勝手が悪い。

直接的に解決するには、 MOZ_ENABLE_WAYLAND=1という環境変数をつけて起動するようにすればよい。例えば、 bindsym $mod+F1 exec "MOZ_ENABLE_WAYLAND=1 firefox"みたいな感じ。

ターミナルとかからFirefoxを開くとエラーが出るよ問題

自分のよくやる作業だと、Jupyter notebookを開いたときとか、cargo doc --openしたときに発生する。

Firefox is already running, but is not responding. To use Firefox, you must first close existing Firefox process, restart your device, or use a different profile.

みたいな感じのエラーが出る。 このスレッドで議論されているが、これは環境変数としてMOZ_DBUS_REMOTE=1と設定しておけば回避できる。

なので、.bashrc.zshrcあたりにこの設定を書いておこう。

以上。詰まった箇所を解決できるごとにこの記事は更新する。

*1:整数倍以外にもできないことはないが、整数倍で描画したものを線形補間して拡大して表示するため、画像が荒くなる

留学の中間報告

また1ヶ月以上記事が空いちゃいました、うっでぃです。

さて、11月も中旬、ここカナダはかなり冷え込んできました。
近頃は雪を見ない日がありません。気温がほとんど氷点下なので、降った雪がなかなか溶けないからです。
もうそろそろすると路面が凍りつく日々がやってくるのでしょう。それまでに1年以上履き続けて足の裏がツルツルになったスニーカーを買い換えないといけないし、氷点下50℃にもなるという本格的な冬に備えてコートも買い換える必要があります。出費が痛いですが、まあ仕方がないですね。

f:id:WoodyWoodpecker:20181119024955j:plain

雪の下にある草を掘って食べてます。かわいい。


さて、こうして記事を書いているわけは、早くも僕の留学期間がおよそ3分の1すぎたからです。
僕は9月から来年の4月末まで8ヶ月間留学するので、 2.5ヶ月でその3分の1です。
というわけで、いい節目なので、最近どうやって過ごしているかを書こうと思います。

とは言っても、ほとんど勉強しかしてなかったのでそのことについてしか書けないですが……。

最初の方はつまんないかもなんで、そういう人は「転機」から読んでください。

これまでのこと

僕が現在取っている授業は3つで、Statistics, Logic and Computation, Enterpreneurshipっていうやつです。

Statisticsは京大でとっていた確率統計学の続きみたいなやつですね。尤度関数・信頼区間を勉強して、今はt分布とかやってます。PRMLっていう機械学習の本でベイズ的考え方(事前・事後分布とか)の基礎を齧ってたこともあってそこまで苦労はしていませんね。
Logic and Computationはコンピュータのための論理学というのが適切な和訳でしょうか。プログラムが適切に動くかどうかを論理を使ってチェックしていきます。数学苦手な自分には辛いですがなんとかついて行ってます。
Enterpreneurshipは楽単ときいていました。騙されました。学期の最後にビジネスアイデアについて15分間プレゼンしないといけません。

 

勉強してて一番楽しいのはStatisticsなんですが、全体に言えることは、どの授業も先生が熱心でわかりやすいってことですね。英語がそんなに得意じゃない自分でも聞こうとしてさえいればスルスルと理解できます。聞こうとさえしていればの話ですが。
たとえば、statisticsの先生が、「統計学的に有意」という言葉がいかにバカらしい(absurd)ものかということを授業時間の半分かけて語ってくれたりしました。京大の授業でも感じましたが、その学問に思い入れのある人の話を聞くというのはとても楽しいものですねえ。

 

ウォータールーは授業1つあたりの時間が長く、授業時間だけで2時間40分/週あります。なので、最大でも学期あたり5つしか授業が取れないようになっています。
とはいっても、僕の週間授業時間はその3倍で8時間。京大でいうと週に5~6コマしか授業がないということに相当します。こちらの課題はかなりヘビーだとはいえ、さすがに忙しくはないです。

なので、最近はずっと図書館とか自宅のリビングで自習してました。ただ、人と話さなすぎて人恋しくなってしまったがために、たまに面白い事実を発見したら興奮するあまり寝ている兄にハイテンションで電話をかけるというめちゃんこ迷惑な奴になっていました。

転機

最近できた知り合いに「ここではみんなFacebookで知り合いを見つけるのさ」という衝撃の事実を聞かされました。
そうです。クラブ活動を宣伝するのもFacebook。起業をしたときに人を募るのもFacebook。友達にメッセージを送るのはLINEじゃなくてMessenger。
京大でいうサークル大百科みたいな紙媒体がないので、僕はほとんど存在を知りませんでしたが、ウォータールーにも日本の大学と同じようにサークルがたくさんあったようです。

まえにディベートソサエティにメールして返事がなかったときも、もう使われてないメルアドが残ってただけで、Facebookページは別にちゃんとありました。

とってもびっくりです。皆さんも僕のネットリテラシーのなさにびっくりでしょうが。
……というわけで、彼にいくつか面白そうなサークルを紹介してもらったので、これからは外に出ていくことも増えると思います。やったね。というお話でした。

これからのこと

なので、これからは紹介してもらったサークルとかの活動にもコミットしてみようかなと思っています。
今は、自動運転車をつくるプロジェクトに入ることになって、そこで画像認識を担当するっぽいです。車載カメラを使って、人とか他の自動車とか標識とかを認識するプログラムを書くのが僕の仕事ですね。目標は1月の全北米大会で優勝することです。
Waterlooは工学系の大学というだけあって、工学部の建物にアホほどお金がかかっています。本物の自動車とか、二足歩行ロボットとか、それらを整備できる専用の格納庫とかがあるめっちゃでかい建物があります。そこでやってるプロジェクトの一つというわけですね。


自動運転車の技術は最近ホットなので、全メンバーが200人くらいしかいないのに毎年800人位新規の応募があってそこから面接で選考してるらしいです。すげえ。

でも、秋学期の選考は僕がカナダに着いたときにはもう終わっていたので入れないんだろうなーって諦めてました。
なんですけど、上に書いた友達の友達(親が日本人なので日本語がわかる)に以前作った太鼓の達人AIの記事を見せたところ、僕のことをいたく気に入ってくれたみたいで、リーダーに直談判して入れてくれることになりました。びっくりです。
なんかこれだけ書くと僕どんな天才なの、みたいに思えますが、そもそも応募してくる人の中でプログラミングができる人自体がそんなにいないっていうのがあるんですね。ですので、「君みたいにプログラミングできて機械学習学んでる人材は大歓迎だよ」って感じでした。

というわけで、これからはもっぱらそれで忙しくなりそうです。

ディベートも……できたらいいなあ……時間あるかなあ……。

 

上に書いた日系人の人なんですが、日本語を親としか話さないから、同年代の日本人と話すのがとても新鮮らしく、いろいろ親切に面白いことを教えてくださいました。

彼に聞いた制度で、まだ参加は未確定ですがおもしろそうなものが、学部生のうちから研究できる制度・URAです。彼もこれを利用して画像認識の研究をしているらしいです。

先生がメンターしてくれるうえ、成績がいい学生だと奨学金まで出るなど、まさに至れり尽くせり。僕は来たばっかで成績が存在しないので、さすがに奨学金は無理ですが。

秋学期に始めるための締切は9月末なので大幅ぶっちなんですけど、「太鼓の達人の記事を英訳してメールしたらたぶんウケてなんとかなるよ」とのことでした。さっきから思ってたんですけど締切が意味をなしてなくないですか?

 

ちなみにその話を聞いて速攻で英訳しました(現金)。あとでメール出してみようと思います。

留学が終わってからのこと

僕が日本に帰れるのは春学期のあとなので最短でも5月頭になります。すると、京大での前期もお休みすることになるので、留年して後期から始めようと思います。となると、10月に後期が始まるまで、5ヶ月間空いてしまうので、そのあいだにインターンでもしようかと思っていました。

という予定を日系人の彼に話すと、「欧米流の履歴書の書き方ってのがあるから、送ってくれたら添削するよ」だそうです。いい人すぎる……。もう彼に足を向けて眠れません……。


あとは、以前、自分のアドバイザーの先生が「もう京大やめてそのままWaterlooに転学したら?」とかいうトンデモプランを出してきてたんですが、正規生としてこっちに在籍することになると学費がとってもお高いので、厳しいかなあと思っていたんです。
しかしなんと、これまた日系人の彼いわく「お給料たくさんもらえるインターンがゴロゴロあるから、普通は卒業する頃にはプラマイゼロになる。だから、お金のことは気にせず自分のやりたいキャリアプランにするべきだ」そうです。ほ、、ほんとうかいそれは!!!??💰💰😍💰💰

トンデモプランかとおもっていたらなんと現実的だったとは。ごめんなさい先生。


まあそれも含めて残り半年の間、じっくり考えてみようかな〜という感じです。

 

こんな長い記事をここまで読んでくれてありがとうございました。それでは、プレゼンのための台本を暗記する作業に戻ります。ばーい。

モントリオール紀行

あらまし

カナダに行ってからまた記事を書くよと言ってから一ヶ月何をしていたのやら。ウッディです。

いや記事書いても良かったんですけど、こっちの生活が日本とそんなに変わらなかったんですよね。

確かに人種・性別・年齢の多様性はこっちのが高いですけど、もともと自分そういうの気にしない人なので……

知り合いも授業終わりにちょっと話す人とかはできたんですけどまあそれくらいです。

 

学校までバス通いなので、図書館&学校と家を往復してたら特にイベントもなく1ヶ月経っちゃいました。

英語ディベート部のメルアドに参加したいってメール出したんですけど返事こないし……

 

そうこうしながら過ごしていると、オリエンテーションの時に知り合った中国人の人(ドンくんといいます)に「今度の秋休みでモントリオール行かない?」と言われました。

 

まず浮かんだ疑問が「秋休みって何?」だったことからぼっち具合が伺い知れます(感謝祭の日(Thanksgiving)を中心とする5日間の休みのことです)。

せっかくの休みだし、もう行く機会もないかもしれないということで行ってきましたよモントリオール

 

f:id:WoodyWoodpecker:20181014234554j:plain

宿の話

ホテルを取っても良かったんですけど、ツイッターで知り合ったマーシャさんって人がマギル大に留学していたので、ダメ元で彼の家に突撃してみることにしました。ほら、息の詰まるせっまいホテルで一人っきりよりそっちの方が楽しそうじゃないですか?

 

ありがたいことに快諾してくれたので、泊まらせてもらうことにしました。

どうしてOKしてくれたのかというと、彼はESSのりんちゃんと知り合いだったんですね。それでりんちゃんに自分の評判を聞いて「見知らぬ人のところにいきなり泊まりに行くとかやばいけど危険なやつではなさそう」ということになって、ならまあ泊めてもいいかということになったようです。日頃の行いは大事ですね。

 

せっかく泊まっているので、マーシャさんとはたくさんお話ししました。

ウォータールーとマギル大の違い(マギルは学校がダウンタウンにあるので、地価が高めです)とか、

京大に帰ってからの学習計画(マーシャさんは留年しないそうです、理学部はいいなあ!)とか、

社会の問題に関して(独裁者になりたいねという結論を得ました)とか、

 

本当にいろいろお話ししました。楽しかったです。

 

マーシャさん、ありがとう。きみがウォータールーに泊まることはないと思うので、また京都に帰ってから何かお礼をさせてください。

 

街の話

結論から話すと、モントリオールフランス語圏です。道ゆく人の会話はほぼ全てフランス語です。ただ、英語圏の影響も強い地域なので、看板は全て二か国語併記だし、ショップの店員さんは全員英語も話せます(フランス語と英語が似た言語とはいえこれってすごいことですよね)。

 

マーシャさん曰く、モントリオールはフランス語圏だという理由でマギルを敬遠する人が多いらしいのですが、以上のような理由により英語だけで日常生活が完璧に可能である上、マギルは(大学ランキング的には)カナダトップなので、留学先として穴場だそうですよ!

あと、ウォータールーに行きたい人はほぼ工学部生なので、留学するとほぼ留年が確定します。従ってみんな留年を敬遠するのでウォータールーも穴場になってますよ!(なってない)

 

街並みはとっても綺麗です。近代的なビルと、おフランスな感じの建物が調和しています。モダンとトラディショナルのインテグレーションという意味では京都に似たものを感じます。「世界一美しい街」との呼び声も頷けますね。

 

f:id:WoodyWoodpecker:20181014234806j:plain

 

 

物価は高めだという印象を受けました。外食すると最低でも10CADくらいのものがメニューに並んでいて、それに消費税・地方税・チップ合わせて50パーセント近くが加算されちゃいます。その分とても美味しいし、旅行するにはいい街って感じですね。住む分にはウォータールーがいいです、びんぼーしょーなので。。

 

思い出深い瞬間(わかりづらいネタを入れるのはやめろ)

というわけでここからはスポットに絞ってMemorableだった場所の話をしようと思います。

モントリオール美術館

モントリオールといえば芸術の街。そこにある美術館だからさぞすごいんだろうと思って行ったら想像以上でしたよこれが。

 

まあ美しさが何かは人の好みによるのでなんとも言えないんですが、僕は「自分にはこれは作ることができなさそうだ」というものを美しく感じる傾向があります。手に入らないものを好きになっちゃうのは人類共通だから仕方ないね。

 

f:id:WoodyWoodpecker:20181014231714j:plain

青いハートに、様々な道具、たまにおもちゃです。しかも、それぞれの道具の縮尺が一定ではないんです。自分的にはこれは「作者の心の中で占める比重」に対応してるんじゃないかと思いました。

f:id:WoodyWoodpecker:20181014231924j:plain

f:id:WoodyWoodpecker:20181014232006j:plain

やばくないですか……この「乱雑な世界観を一つ一つ精巧に作り込んだ」かのような情報量過多の絵、僕がひっくり返って一生を費やしても書ける気がしません。尊みが深すぎて召されそうです。

まあという感じで俺得な作品がたくさんあったよというお話でした。

 

モン・ロワイヤル山 (Mount Royal)

皆さんは、モントリオール(Montreal)の語源をご存知ですか。実はモン・ロワイヤルから来ているんですよ!

最初にモントリオールに来たあるフランス人が、先住民に導かれて山に登った時に、その風景の素晴らしさに感動してMount Royalと名付けたことが発祥だそうです。頂上の石碑に書いてありました。

それから500年経った今も、その景色の美しさは変わりません。いや、開発で景観自体はめっちゃ変わってるんですけどね。

景色は綺麗だったんですけど、先住民が踏みにじられた結果だということを考えると複雑な気持ちになりますね。昔のこととはいえ、現代の人権意識から考えると相当非道い事やってますし。

などと偉そうなこと言ってますが、こういういうことを考え出したのも友達のツイートがきっかけですし

もっと教養を深めないといかんなという気持ちになりました。せっかく地球半周して勉強しに来てるんだし。

 

 ノートルダム大聖堂

さっき複雑な気持ちになるとか言っときながらクッソエンジョイしとるやんけ、という反論は見なかったことにします。

 

最初に行った時は感謝祭の日で、14:30以降は閉まってしまっていたので次の日に再チャレンジしました。

f:id:WoodyWoodpecker:20181014235301j:plain

僕自身はキリスト教に思い入れがないので「ふーん、綺麗だなー」としか思わなかったのですが、日本を発つ直前に「カラマーゾフの兄弟」をマンガで読んだんですよね。

相当話がカットされているにも関わらず、なお示唆に富んだ話ですごく良い本で、漫画でかなりスルスルと読めるのでとてもおすすめなのです。

https://www.amazon.co.jp/dp/B07DN92NYC/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

カラマーゾフの兄弟はテーマの解釈が人によって分かれるくらい奥の深い作品なんですけど、僕の気に入ったテーマの一つで「たとえどんなに壮麗な教会を作ったとしても、盛大な儀式を行ったとしても、世の中から悪は消えない、ということに気がついてしまった(=神をもはや信じられなくなり、他の人に「嘘」をついて生きなくてはならなくなった)人の信仰は、生き方は、神との関係は、どのようにあるべきか」というのがあるんですね。劇中劇「大審問官」で顕著に現れています。

まあそれを読んだというのもあって、こういう大きな宗教的建築物を見ちゃうとどうしてもしんみりします。

 

終わりに

多分合計ウン万円使っちゃった今回の旅行ですが、その分とってもエンジョイしました。名物料理のプーチン(ポテトと肉にチーズをぶっかけたカロリーの火薬庫みたいな料理)も食べて満足です〜〜

f:id:WoodyWoodpecker:20181015004658j:plain

 

小分けにして記事にすればいいのですが、どうも塊で記事を書いちゃう癖があるようです。3500字もの記事をここまで読んでくださった読者さんに感謝を。

 

P.S. 本格的に冬になる前にナイアガラの滝にも行ってみたいですね!

【インターネット基礎】DNSの歴史・仕組み

はじめに

今回はインターネット通信のために重要な、DNS (Domain Name System)について説明します。

例えば、ブラウザにwww.apple.comと入力するとApple のウェブページに飛ばされますよね。どんなにマイナーなサイト名を入力しても、必ずきちんとウェブページに飛ばしてくれます。この便利な機能を担っているのがDNSです。アプリケーション層に相当します。

 

アプリケーション層が何か知りたい人はこの記事を読んでください。 

woodyobenkyo.hatenadiary.jp

 

 

最初期

コンピュータの住所、というべきものにIPアドレスがあります。最初にできた(といっても今でも現役の)IPv4は32ビットの長さを持っているので、$2^{32}=4,294,967,296$ 通り(42億通り)の住所があることになります。

IPアドレスについて

32ビット = 8 x 4ビット = 256パターン x 4

なので、IPアドレスを人間が読む必要があるときはふつう10進数で0.0.0.0〜255.255.255.255という書き方をします。

例えば、AppleのwebサイトのIPアドレスの一つは17.142.160.59なので、これをブラウザの上のアドレスバーに直接入力することでAppleのサイトに行けます。試してみてもいいでしょう。

hosts.txt

しかし、これは管理が非常に面倒です。暗記なんてとてもできません。

iPhone買いたいなー。17.142.160.59にアクセスするか

みたいなことがそらでできる人がいたらびっくりしますね。

ですので、hosts.txtという表を作ることにしました。これに、例えば

みたいに書いておけば、ウェブサイト名だけを覚えておき、入力すれば良いです。PCに「Appleと入力されたら17.142.160.59に変換」というプログラムを入れればいいですからね。

これがコンピュータに入っていれば安心ですね。

hosts.txtの共有

しかし、例えば新しいサイトがたくさん出てきたらどうしましょう。

例えば、Facebookのサイトができたのはあなたがパソコンを買ったのより後だったとします。あなたのパソコンのhosts.txtにはFacebookのサイトのIPアドレスとの対応がないのでアクセスできません。

もちろん、いちいち新しいサイトができるたびに手動で追加していくという方法もありです*1。しかし、このやり方はホスト数が多くなってくると/広い範囲に広がるようになると非現実的です。

その解決策として、hosts.txtを共有するという方法が考え出されました。

まず、Facebookのように新しいサイトができたとすると、その管理人はNIC (Network Information Centre) という中央コンピュータに自分のIPアドレスと名前の対応表を登録します。NICは自らのhosts.txtにそれを書き込みます。

そして、ネットワークの全てのパソコンがNICIPアドレスを覚えておき、定期的にNICにアクセスしてそのhosts.txtをコピーすればいいのです。

これで、あなたのパソコンは

のように更新されます。

DNSの登場

しかしさらに問題が発生しました。

インターネットが世界に浸透していくにつれ、何万、何十万ものサイトが乱立するようになってきたのです。

Internet Hosts Count log.svg
By Kopiersperre , Ke4roh - Own work, CC BY-SA 3.0, Link

この図を見ると1990年ごろですでに100万ホストに達しているのがわかります。
仮にこの状態でNICからhosts.txtをダウンロードすると何が起きるのでしょうか。簡単に思いつくのがファイルの肥大化です。
一つのサイトの名前(平均10文字とします)とアドレス(32ビット)の対応表のサイズは(英語1文字=1バイト=8ビットなので)、$10+\frac{32}{4}=18$バイト。
これが100万ホスト分あるとすると、1800万バイト=18MB。当時、記憶装置としては100MBのHDDとかが主流だったことを考えるとべらぼうなサイズです。
アクセスするかもわからない何十万ものホストのためにこんなにリソースを取られてはやってられません。

そこで、DNS (Domain Name System)という仕組みを考えることによりこれを解決しました。

DNSの仕組み

まず、DNS(正確にはRFC819というルール)では木構造を用いてアドレスを管理しています。

f:id:WoodyWoodpecker:20180916011506p:plain

このように、edu (Education、教育)、com (Company、会社)、gov (Government、アメリカ政府)向けなどに木のように広がり、それぞれから各ウェブサイトへと広がって行きます。

木に見えないって人はひっくり返してください。一つの根っこからわっさぁって生えてるように見えませんか?

この「広がり」というイメージから、英語では上の図の丸の部分をドメインと言います。「領域」と訳されることもある英単語です。edu,com,netなどの一番上のドメイントップレベルドメイン、何かの下にあるドメインサブドメインということもあります。

そして、それらを後ろから繋げて表現します。例えばapple.comやwhitehouse.gov、www.ucl.ac.beみたいな感じです。

これにより、先頭にサイトの名前が来るというわかりやすさを保ちつつ、後ろの方に「タグ」のようなものをつけるという仕組みになっています。

さて、ここからがミソです。DNSではNICに訊くかわりにnameserverというサーバにIPアドレスを訊くのですが、namserverは全てのIPアドレスを覚えているわけではありません。

かわりに、次の二つを覚えておきます。

  1. 自分の担当しているドメイン直下にあるホストIPアドレス
  2. 自分の担当しているドメイン直下にあるサブドメインを担当するnameserverIPアドレス

よく考えると、このルールに則っていれば一番上から質問をしながら下っていって任意のホストにたどり着けることがわかります。これにより、全てのホストの対応表をおぼておく必要は無くなりました。やったね!

ただし、ここで一番上というのはトップレベルドメインを担当するnameserverではなくそれらのnameserverのIPアドレスを知ってるサーバーです。木の根(root)にあたるのでRoot nameserverといい、世界に12台くらいあり、常に同期しあって同じ情報を提供できるようにしています。

え?12台って少なくない?と思われた方は非常に鋭いです。世界中の人たちがネットにアクセスするたびにroot nameserverにアクセスしてたら、とても12台ではこなせません。

DNS resolver

そこで考えられた仕組みが、DNS resolverです。標準設定だといちいちroot nameserverにアクセスするのではなく、近くのDNS resolverに聞くようになっていて、DNS resolverもそのサイトがわからなかった場合のみnameserverにアクセスするようにします。これのメリットとしては、

  • パソコンたちはroot nameserverのIPを覚えていなくてもよく、近くにあるDNS resolverがわかりさえすればいい
  • DNS resolverが取得したIPをしばらく覚えておいて代わりに捌いてくれるので、何回もアクセスしてもnameserverたちにかかる負荷が小さくて済む

というのがあります。

補遺

例えば、京大のローカルネット (KUINS-Air) にアクセスしている時のDNS resolverは10.224.254.1です。これは京大のサーバなので、京大はやろうと思えばえっちなサイトにはアクセスできなくできますね。

どうやるかというと、DNSゾルバに「ブラックリスト」を乗せてやればいいわけです。「このアドレスは聞かれても教えないよーん」みたいな。あなたがえっちなサイトに精通しすぎてIPアドレスを覚えているなら話は別ですが、そうでない限りはお手上げに見えます。

解決策としては京大のじゃないDNSゾルバを利用してやるというのがあります。これでえっちなサイトがどこでも見れるぞ!まあ見れたところでどうしたって感じですが。

やり方についてはここでは省略するので、MacOS/Linuxの人は"nslookup"で検索してください。興味があればどうぞ。Windowsのやり方は知りません。

別にえっちなサイトを見たいからこの話をしたわけではなく(重要)、この問題はなかなか奥が深いんですよ。例えば、以前問題になった「漫画村」というサイトをブロックしようという話は、DNS resolverではなく漫画村を担当するDNS自体に漫画村IPアドレスを教えないよう」ブラックリストをつけさせるというものです。

まあ日本の法律に縛られない海外の公開DNSを使うなり*2、自前でDNSゾルバを作ってそこに事前に漫画村のアドレス覚えさせとくなりとやりようはいくらでもあるので、こうして仕組みをきちんと知ってる人にとってはすり抜けることは容易なんですよね……

なお、こうした取り組みはすでに児童ポルノのような極めて悪質性の高いサイトには行われています。ただ、通信の秘密をある程度侵害する仕組みであるのは否定できないので、もし漫画村みたいなサイトに適用するにしても、中立的・客観的で厳密な運用が必要とされるでしょう。安易なDNSブロックが厳しく批判されたのは記憶に新しいですね。ていうかとっとと漫画もダウンロード違法化したほうが手っ取り早いんですけどねえ?

 

出典:BUSINESS INSIDER JAPAN 漫画村問題:海賊版サイトブロッキングに代案はあるのか? インターネット事業者らが提言

こちらも参考にしました。とてもわかりやすくためになる記事です。

 

 

この記事はOlivier Bonabentureによる

Computer Networking : Principles, Protocols and Practice, 2nd edition — Computer Networking : Principles, Protocols and Practice

の一部の抄訳を含みます。

*1:サーバを購入するたびに、そのIPアドレスをメモした紙を持って通信したい相手のところまで行き、端末を操作して書き込みます

*2:中国ではこれを防ぐため一部の海外DNSへのアクセスが禁じられています

【インターネットの基礎】5層モデル、TCP/IP参照モデル、OSI参照モデルの概説

はじめに

今回はインターネット通信の根幹的な仕組みである、階層モデルについて説明します。名前は聞いたことがあるかもしれません。

もはや私たちの生活に必要不可欠となったインターネットですが、これがどのようにして動いているのかをなんとなくでも理解している人は少ないのではないでしょうか。その仕組みをわかりやすく理解することの助けになるのがこの階層モデルです。 

 

 

ネットワークの5層階層モデル

コンピュータといった機器(ネットワークの話においてはホストと呼ばれます)は二進数のデジタル、すなわち0と1に全ての情報を還元してから送受信しています。

私たちが例えば
「今日は晴れですね」
という言葉を送信した時、それがうまく相手に送信されるまでにはいくつかのステップがあります。それを階層と呼びます。
階層がどのように作られているかを理解するには、下から考えるとわかりやすいです。物理的な信号から、僕たちの扱いやすいカタチに徐々に持って行くということですね。

f:id:WoodyWoodpecker:20180914051959p:plain




物理層

もっとも下の階層、すなわち物理的な信号を01に変換してくれるところを物理層(Physical layer)と呼びます。物理層で運ばれている情報の単位は"0"か"1"のいずれかであり、ビット(bit)と呼ばれます。

すなわち、物理層とは光ファイバーとかWi-Fiを流れている物理信号を電気信号などに変えてくれる装置のことです。文字通り二つのホストを物理的に直接繋いでいます。

ちなみに、光ファイバーや電気線といった物理的に信号を流しているものが上の図にあるPhysical Transmission Mediumですね。重要じゃないので割愛します。

ここで注意しないといけないのは、物理層の通信は完璧ではない(Unreliable)ということです。送られたビットが抜け落ちたり勝手に増えたり、そもそも届くのが止まったりすることがありえます。実際、Wi-Fiをつないだまま圏外へ出た時とかに起こりそうですね。これについては物理層ではどうしようもないので、これが起こった時に上の層でリカバリーする仕組みを作ることが重要になります。

データリンク層

その上の階層をデータリンク層(Datalink -)と言います。流石に送信エラーがある情報を01で扱うのはピーキーすぎるので、フレーム(Frame)と呼ばれるある程度の長さのビット列を固めたもので送受信します。どうやって送信エラーに頑健なフレームを作るか、というのも興味深いですが、ここでは割愛します。

送信異常の検知・修正を行うこともあります。

ネットワーク層

なんだかデータリンク層までで十分な気もしますが、実は全然十分じゃありません

ここまででの機能では2つのホスト間に直接物理線が張っている時しか通信できないからです。これは大問題です。通信する際にいちいち相手のところにまで線を引っ張らないといけないなんてただの糸電話です(例えばこの記事はカナダから書いているので、日本にいる人はこの記事をほぼ確実に読めなくなりますね)。

例えばあなたのパソコンがこのブログを見ている時には、Wi-Fiを通じてWi-Fiルータと繋がり、Wi-Fiルータ光ファイバーをいくつも経由しながらはてなブログのサーバにつながり...という流れを経由しているはずです(携帯電波の方もいるかもしれませんが)。

このように、「あなたのパソコン」「Wi-Fiルータ」「プロバイダのサーバ」などなど、たくさんのホストが網状につながって情報をうまくやりとりしてくれないとネットワークとは言えませんよね。そのためにはWi-Fiの電波から光ファイバーへ、などなど物理線を乗り換えることが必要です。それを可能にしてくれるのがネットワーク層(Network -)です。一つ以上のフレームからなるパケット(Packet)という単位で情報をやりとりします。

f:id:WoodyWoodpecker:20180914052006p:plain

トランスポート層

ここまでで基本的にインターネットで通信すること自体は可能になったので、あとは便利な機能を付け加えていくことになります。トランスポート層(Transport -)は一つ以上のパケットの塊であるセグメント(Segment)という単位で情報をやりとりし、(必要なら)通信の信頼性の確保コネクションの確立などを行います。

ここでいうコネクションとは、相手に「しばらくの間通信したいんでよろしく」と挨拶をしておくことです。これをすることで何が便利かは省略させてください

TCPというものが有名で、高信頼・コネクション型と至れり尽くせりです。大概はこれで通信します。調査によるとインターネットの通信の90パーセント以上がこれらしいです。

「そんなたくさん機能いらないよ、信頼性が低くてもオッケー」という場合はUDPというのが使われます。非コネクション型・低信頼ですが、その分速度・応答性がいいです。Youtubeなどの動画コンテンツのような、ちょっとくらいノイズが乗っても問題ないようなものに適しているでしょう。特に低遅延性が必要とされる場合にとても役に立ちます。例えば、ネットを介したFPSなどのアクションゲーム、FaceTimeなどのネット電話がそれにあたります

f:id:WoodyWoodpecker:20180914061659p:plain

セグメントは相手に直接届いている(少なくともトランスポート層からはそう見える)ことに注目。階層構造のおかげで、物理線を乗り換えたことを気にすることなく通信ができる。


アプリケーション層

残り全部です。んな雑な、と思われるかもしれませんが、その通りなので。

起動するアプリによって、インターネットにして欲しいことは様々ですよね。テキストを送って欲しい、動画を送って欲しい、お金を振り込みたい、etc……どのようにそれを01に落とすかがここの層の仕事です

これは簡単そうに見えてとても奥の深い仕事です。より効率的に01に変換したいことがあるかもしれませんし、テキストはテキストでも様々なフォントや改行の仕組みはうまく考えないといけません。場合によってはデータを暗号化する必要があるかもしれません。そのようにアプリケーションによって色々と違うことが行われていますが、これら「インターネットに送り込むための準備」をする部分を総称してアプリケーション層(Application -)と言います。

この雑さは、昔のパソコンはそこまで高度なことをこの層で行っていなかったことに由来します。そもそも、ネットワークを作るための仕組みを考えていたのだから、ここのプログラムを細かく考えても無意味ですしね。

f:id:WoodyWoodpecker:20180914052111p:plain

私たちから見えるのはアプリが通信しているということだけで、普段はそれ以下を気にしなくても問題はない。通信している場所や、携帯電波かWi-Fiかなどを気にしなくていいのはこの一連のプロセスのおかげである。



TCP/IP参照モデル

TCP/IP参照モデルは、その名の通り、TCPやIPという言葉ができてから生まれた考え方になるので、割と後にできた言葉です。ですので、細かく定義するのめんどくさくね?っていう考えがベースにあります。5層階層モデルを少しアレンジしたものであり、 

の4層に単純化してあります。リンク層はその名の通り「2点間のリンク(接続)は俺たちに任せろ!」って感じのネーミングですね。インターネット 層という名前もわかりやすくていいですね。

OSI参照モデル

こっちは逆に、「いやアプリケーション層もっと細かくせんとわからんやろ!💢」っていう発想でできた考え方です。

アプリケーション層をさらに3層に分けており、

  • セッション層:トランスポート層(いっこ下)で起こりうる問題を解決したり、データの順番の整ったデータ通信を可能にしたり、正しいやり方でコネクションを切断したりする。データ通信を司る最高の層。
  • プレゼンテーション層:様々な種類の情報を01で表現する
  • アプリケーション層:残り

という感じです。

f:id:WoodyWoodpecker:20180914060632p:plain

昔この図をいきなり見せられた自分はやる気をなくしました。



 

この記事は概観をつかんでいただくための簡単なものなので、興味が出てきた方は

qiita.com

 

www.cisco.com

このあたりが参考になるかと思います。

 

この記事はOlivier Boabentureによる

Computer Networking : Principles, Protocols and Practice, 2nd edition — Computer Networking : Principles, Protocols and Practice

の一部の抄訳です。

【データ解析入門】Pandasでデータ処理・Kaggle/Titanicを題材に

 

今日は、Python表計算ライブラリであるPandasによるデータ処理について説明します。データの読み込み・可視化・簡単な穴埋めを行います。

Pandasは非常に高機能ですが、使い勝手が独特なので、練習して慣れましょう。

Kaggle: Your Home for Data Science の練習問題である

Titanic: Machine Learning from Disaster | Kaggle を題材に練習します。Titanicの乗客リストから死者か生存者かを予測する問題です。なんだか不謹慎な気もしますが、これが風化ということなのでしょうか。

 

乗客リストのデータはkaggle公式サイトからダウンロードできます。

 データをまずは読み込む・可視化

ライブラリのインポート


# pandas
import pandas as pd
import numpy as np

# visualization
import seaborn as sns
import matplotlib.pyplot as plt

import pickle

ファイルの読み込み

train_df = pd.read_csv('./train.csv')
test_df = pd.read_csv('./test.csv')
combine = [train_df, test_df]

後で見るように、combineしておくとfor文による一括処理が可能です。

データをざっと見てみる

print('='*100)
print('Train data')
print(train_df.describe())
print('='*100)
print(train_df.describe(include='O'))
print('='*100)
print('Test data')
print(test_df.describe())
print('='*100)
print(test_df.describe(include='O'))
print('='*100)

出力結果


====================================================================================================
Train data
       PassengerId    Survived      Pclass         Age       SibSp       Parch        Fare
count   891.000000  891.000000  891.000000  714.000000  891.000000  891.000000  891.000000
mean    446.000000    0.383838    2.308642   29.699118    0.523008    0.381594   32.204208
std     257.353842    0.486592    0.836071   14.526497    1.102743    0.806057   49.693429
min       1.000000    0.000000    1.000000    0.420000    0.000000    0.000000    0.000000
25%     223.500000    0.000000    2.000000   20.125000    0.000000    0.000000    7.910400
50%     446.000000    0.000000    3.000000   28.000000    0.000000    0.000000   14.454200
75%     668.500000    1.000000    3.000000   38.000000    1.000000    0.000000   31.000000
max     891.000000    1.000000    3.000000   80.000000    8.000000    6.000000  512.329200
====================================================================================================
                     Name   Sex  Ticket Cabin Embarked
count                 891   891     891   204      889
unique                891     2     681   147        3
top     Webber, Mr. James  male  347082    G6        S
freq                    1   577       7     4      644
====================================================================================================
Test data
       PassengerId      Pclass         Age       SibSp       Parch        Fare
count   418.000000  418.000000  332.000000  418.000000  418.000000  417.000000
mean   1100.500000    2.265550   30.272590    0.447368    0.392344   35.627188
std     120.810458    0.841838   14.181209    0.896760    0.981429   55.907576
min     892.000000    1.000000    0.170000    0.000000    0.000000    0.000000
25%     996.250000    1.000000   21.000000    0.000000    0.000000    7.895800
50%    1100.500000    3.000000   27.000000    0.000000    0.000000   14.454200
75%    1204.750000    3.000000   39.000000    1.000000    0.000000   31.500000
max    1309.000000    3.000000   76.000000    8.000000    9.000000  512.329200
====================================================================================================
                                                     Name   Sex    Ticket            Cabin Embarked
count                                                 418   418       418               91      418
unique                                                418     2       363               76        3
top     Cardeza, Mrs. James Warburton Martinez (Charlo...  male  PC 17608  B57 B59 B63 B66        S
freq                                                    1   266         5                3      270
====================================================================================================

読みづらい人はコピペするか、右下にある三角を引っ張って広げてください。include='O'で数値以外のサマリを表示できます

head関数は表の上の方をパッと出してくれて見やすくて便利です。お尻を出すにはtail関数を使います。

print('='*100)
print(train_df.head())
print('='*100)
print(test_df.head())
print('='*100)

====================================================================================================
Train data
       PassengerId    Survived      Pclass         Age       SibSp       Parch        Fare
count   891.000000  891.000000  891.000000  714.000000  891.000000  891.000000  891.000000
mean    446.000000    0.383838    2.308642   29.699118    0.523008    0.381594   32.204208
std     257.353842    0.486592    0.836071   14.526497    1.102743    0.806057   49.693429
min       1.000000    0.000000    1.000000    0.420000    0.000000    0.000000    0.000000
25%     223.500000    0.000000    2.000000   20.125000    0.000000    0.000000    7.910400
50%     446.000000    0.000000    3.000000   28.000000    0.000000    0.000000   14.454200
75%     668.500000    1.000000    3.000000   38.000000    1.000000    0.000000   31.000000
max     891.000000    1.000000    3.000000   80.000000    8.000000    6.000000  512.329200
====================================================================================================
                              Name   Sex Ticket        Cabin Embarked
count                          891   891    891          204      889
unique                         891     2    681          147        3
top     Ryerson, Miss. Emily Borie  male   1601  C23 C25 C27        S
freq                             1   577      7            4      644
====================================================================================================
Test data
       PassengerId      Pclass         Age       SibSp       Parch        Fare
count   418.000000  418.000000  332.000000  418.000000  418.000000  417.000000
mean   1100.500000    2.265550   30.272590    0.447368    0.392344   35.627188
std     120.810458    0.841838   14.181209    0.896760    0.981429   55.907576
min     892.000000    1.000000    0.170000    0.000000    0.000000    0.000000
25%     996.250000    1.000000   21.000000    0.000000    0.000000    7.895800
50%    1100.500000    3.000000   27.000000    0.000000    0.000000   14.454200
75%    1204.750000    3.000000   39.000000    1.000000    0.000000   31.500000
max    1309.000000    3.000000   76.000000    8.000000    9.000000  512.329200
====================================================================================================
                        Name   Sex    Ticket            Cabin Embarked
count                    418   418       418               91      418
unique                   418     2       363               76        3
top     Watt, Miss. Bertha J  male  PC 17608  B57 B59 B63 B66        S
freq                       1   266         5                3      270
====================================================================================================

グラフ化

grid = sns.FacetGrid(train_df, col='Survived', row='Pclass', height=2.2, aspect=2.0)
grid.map(plt.hist, 'Age', alpha=.5, bins=20)
grid.add_legend();
plt.show()

f:id:WoodyWoodpecker:20180915145937p:plain

grid = sns.FacetGrid(train_df, col='Embarked', height=2.2, aspect=1.6)
grid.map(sns.pointplot, 'Pclass', 'Survived', 'Sex', palette='deep')
grid.add_legend()
plt.show()

f:id:WoodyWoodpecker:20180915150923p:plain

データ前処理

Embarkedはどのように生存率に影響しているのか

print(train_df[['Embarked', 'Survived']].groupby(['Embarked'],
                                               as_index=False).mean().sort_values(by='Survived', ascending=False))

  Embarked  Survived
0        C  0.553571
1        Q  0.389610
2        S  0.336957

というわけでSが一番生存率が低く、Cが高いので、そのようにmapしてみようと思います。

非数データを数値データに変換

for dataset in combine:
    dataset['Sexvalue'] = dataset['Sex'].map({'male': 0, 'female': 1})
    dataset['Embarked'] = dataset['Embarked'].map({'S': 0, 'Q': 1, 'C': 2})
    dataset.drop(['Cabin', 'Sex', 'Ticket', 'Name'], axis=1, inplace=True)

map関数は辞書内の適用をします。 drop関数は第一引数がリストで、その内容を落とします。軸が0だと各行、1だと各列を取り除きます。今回は1なので、Cabin,Sex,……といった情報そのものが表(Dataframe)から取り除かれます。ただし、inplace引数をつけないと取り除かれないので注意しましょう。(取り除いたDataframeを戻り値として返すようになります。inplaceをつけると戻り値が無くなる代わりにそのものから取り除きます)

またここで扱いづらいCabin名とかチケット名とかを落とします。

データの欠損を確認

もう一度describeし、countを調べます。足りていないのがあればそれはデータが不足しているので、埋めることが必要になります。


Train data
       PassengerId    Survived      Pclass         Age       SibSp       Parch        Fare    Embarked    Sexvalue
count   891.000000  891.000000  891.000000  714.000000  891.000000  891.000000  891.000000  889.000000  891.000000
〜中略〜
Test data
       PassengerId      Pclass         Age       SibSp       Parch        Fare    Embarked    Sexvalue
count   418.000000  418.000000  332.000000  418.000000  418.000000  417.000000  418.000000  418.000000

というわけで、AgeとFareとEmbarkedが欠けています。

運賃データを修正

# Fare and Embarked completion
for dataset in combine:
    dataset.loc[(dataset.Fare.isnull()), 'Fare'] = dataset.Fare.dropna().median()
    dataset.loc[(dataset.Embarked.isna()), 'Embarked'] = dataset.Embarked.dropna().median()

中央値を空いているところにとりあえず代入しておきます。

年齢データを訂正

# age data completion
age_guess = np.zeros([2, 3])
for dataset in combine:
    for i in range(2):
        for j in range(3):
            guess_df = dataset[(dataset['Sexvalue'] == i) & (
                dataset['Pclass'] == j+1)]['Age'].dropna()
    age_guess[i, j] = guess_df.median()
    age_guess[i, j] = int(age_guess[i, j]*2)/2

    for i in range(2):
        for j in range(3):
            dataset.loc[(dataset.Age.isnull()) & (dataset.Sexvalue == i) & (
                dataset.Pclass == j+1), 'Age'] = age_guess[i, j]

ちょっと長くてわかりにくいですが、age_guessは性別とPclass別に推定年齢を格納する変数です。推定とはいっても、中央値を入れているだけです。中央値を求めた後で、isnullなものにその中央値を代入しています。

 

保存

combine = [train_df, test_df]
with open("combine.pkl", 'wb') as f:
    pickle.dump(combine,f)

真珠湾紀行

前回のエントリで書いた通り、今カナダへ絶賛移動中です。この記事を書いているのもホノルル→アトランタの機内です。ホノルル時ではPM9時頃なんですけどアトランタ時間AM4時頃。ややこしいです。

f:id:WoodyWoodpecker:20180901204312j:plain

気温は高いですが、湿度が低いので汗がすぐ乾き快適です。

さて、ホノルルで飛行機の乗り換えまでの時間が暇なので、真珠湾にいってきました。アリゾナ記念館です。アリゾナっていうのは、アリゾナ州のことではなく、それにちなんで名付けられた戦艦アリゾナのことです。1941年の日本の真珠湾攻撃で撃沈された戦艦の中のひとつです。

 

現地のバスに乗るのには2ドル75セント必要です。(5ドル50で1日乗り放題パスが買えるので、今思えば行き帰り2回は乗ることを考えるとこっちの方がお得でした)

最初乗ろうとした時、小銭が25セントしかないことをバスの運転手のお姉さんに恐る恐る伝えたら、

まじ?じゃ両替してきてね。じゃ!

と無表情で断られました。すごいあっさりです。これがアメリカンスタイルなのでしょうか。

というわけでスタバで買い物ついでにレジの人に両替をお願いした後、數十分待ちぼうけをして、バスに揺られることさらに20分。

f:id:WoodyWoodpecker:20180901204039j:plain

ハワイのバスは「とまります」ボタンじゃなくてこの紐を引いてバスを止めます。面白いですねえ。

f:id:WoodyWoodpecker:20180901203344j:plain



つきました!アリゾナ記念館です。

屋外の展示物は海外の戦争記念館にはありがちな感じで、第二次大戦以降の様々な兵器のレプリカが置かれていました。あとは真珠湾で亡くなった兵士の方々への碑とかですね。海軍管轄の施設なので、海上兵器・船の乗組員のものが中心です。

f:id:WoodyWoodpecker:20180901210410j:plain

4機の機関砲がそれぞれ毎分120発の弾丸を発射する。ロマンだ。

f:id:WoodyWoodpecker:20180901203515j:plain

核魚雷。幸運にも実戦で使用されたことはない

f:id:WoodyWoodpecker:20180901203518j:plain

唯一展示されていた日本軍の兵器。


屋内展示はより第二次大戦前後の歴史にフォーカスした感じで、いかにして日本が軍事独裁国家へと変貌していったのか、いかにして真珠湾攻撃が成功したのかなどが説明されていました。日本が軍事国家に転落した経緯は日本史でやった内容と大体一緒だったので飛ばして、真珠湾攻撃の話について書こうと思います。

 

真珠湾は当時アメリカの太平洋前衛基地として重要な役割を担っており、山本五十六を筆頭に日本軍はここに打撃を与えないと東南アジアに戦線を拡げることが不可能だと理解していました。そのため成功率を少しでもあげようと奇襲という形となりました。しかし、それは理解していながらも、真珠湾は浅いので航空機から魚雷を放つことは不可能だと考えていたのもあるのでしょう、アメリカ軍の側は、正直航空機による急襲はないと考えていました。むしろ現地の日系人の反乱*1を恐れて飛行機をギッチギチに詰めて駐機したり(爆撃の格好の的です)、当時としては最新鋭の兵器である、レーダーで日本軍の飛行機を検知したにも関わらず自軍の戦闘機だろうと誤認しました。

一方日本軍は、特殊なフィンを後部につけた新型の魚雷を作成。熟練したパイロットが飛行機の高度・速度・姿勢を高度に制御しながら放つことで、最大海深たった30フィート程度で巡航できる魚雷を開発していました*2。また、同じく新たに開発された投下爆弾は、20センチの鋼板も貫ける威力を持っていたそうです。すなわち、一撃で軍艦の火薬庫に火をつけることができる威力を持つということです。

これらの新兵器、日本軍の緻密な作戦、そしてアメリカ軍の油断が重なり、真珠湾に集結していたアメリカの戦艦はその巨砲の威力を活かすことができないまま多くが破壊され、空母(aircraft carrier)の重要性が認識されるようになりました。戦艦の時代は終わり、海戦の多くは空母と護衛艦で行われるようになります。

ルーズベルトは翌日「12月7日は我々の顔に泥を塗られた日だ」と会見。第二次世界大戦が始まります。「リメンバー・パールハーバー真珠湾を忘れるな)」を合言葉にアメリカは強く結束し、ミッドウェイ海戦で日本に大勝。真珠湾攻撃に使われた船舶の多くを撃沈し、「復讐」は果たされることになりました。

 

……こういう、「教科書に史実としては載ってるけど細かくは何があったか知らないこと」の解説ってめっちゃ知的好奇心そそりますね。

 

そのあとは、そのまま帰ろうかと思ったのですが、真珠湾を船で回る無料ツアーがあったので参加させていただくことにしました。本当は整理券が必要なのですけど、海軍のお兄さんがこっそりいれてくれました。優しいです。僕が日本人だからぜひ見て欲しいと思ったのでしょうか。

ボートで海を進んでいくと、白いコンクリートの塊が見えてきます。側面には"USS Arizona BB"などの文字が。そう、アリゾナやユタといった沈没した戦艦がこの下にまだ眠っているのです。船に飲み込まれた数百人の乗組員と一緒にです。

f:id:WoodyWoodpecker:20180901205503j:plain

 

「その日」、非番だったために生き延びることとなった海兵の多くは同僚たちのことを生涯忘れませんでした。ある元海兵の老人は自分が死んだら遺骨を真珠湾に撒いてほしいと家族に頼んだそうです。海軍の提案により、老人の遺骨は水密シールドされ海の底に供えられることになりました。

 

こういう話は、日本の資料館でも同じですね。戦争は勝っても負けても兵士にとっては地獄です。韓国の戦争記念館にいった時もそうだったのですが、戦勝国で仮にも軍隊を持っている国なので、日本の資料館のようにアンチ軍隊メッセージはありません。しかし、兵器を沢山展示して、軍隊や兵士を英雄視するような描き方をしたからって、戦争を肯定しているわけではないのです。

 

f:id:WoodyWoodpecker:20180901205540j:plain

「戦争のある限り、どこかで、私のために死んでゆく人がいる。ならば、たとえ辛くとも自問自答せねばならない。私は、彼らが死ぬ価値のある人間だったのかと」



ここまで書き終えた時点でアトランタ時間AM8:15なうです。トロントへのフライトが9:30なので、次の記事こそトロントからになりそうですね。


兄にもっと更新頻度あげたら?って言われましたし、書きたいことがあったらどんどん書いていこうと思います。お楽しみに〜!

*1:結局日系人は暴動を起こさなかったそうです。

*2:真珠湾の海底が45フィートくらい