コンソールで動くインベーダーゲームっぽいやつ作った

何か急にゲームっぽいものを作りた衝動にかられて、インベーダーゲームくらいならシュッと作れるかなと思ってインベーダーゲームっぽい何かを作ってみた。

本物のインベーダーゲームはやったことありません。

 

f:id:ogidow:20170619082203p:plain

 

工夫したところというか、この手のものを作る時には当たり前だけど、画面がチラつかないように毎回、画面を全体を再描画という方法ではなく動きがある部分だけを描画するようにしています。

作るかと思って3時間くらいで動くもの作れたので満足(バグだらけだけど)。

微分について

微分をご存知でしょうか?

関数{f(x)}に対する微分は次の式で定義できますね
 {
\frac{df(x)}{dx}  =  \lim_{h \to 0}\frac{f(x+h)-f(x)}{h}
}

微分はでは関数{f(x)}の点{x}における接線の傾きを表します。
例えば、{f(x) = x^2}の関数を考えます。図で表すと以下のようになります。

f:id:ogidow:20170220084146p:plain

ここで{x=4}の点に接線を引きます。
f:id:ogidow:20170220085549p:plain

この緑の線の傾きが微分によって求めることができます。

では、任意の{x}の傾きを求めることができると何が嬉しいのでしょうか?

例えば、{f(x) = x^2}が体重とかコストとかを近似できると仮定します。体重もコスト小さいに越したことはないでしょう。
何らかのパラメータxが4の時、微分の値は{\frac{df(x)}{dx}  = 8 > 0}となりパラメータを小さくすれば、{f(x)}が最小になりそうだなと推測することができます。また、{f(x)}が最小の点で接線はx軸に水平になるので。{\frac{df(x)}{dx}  = 0}となり、{f(x)}は(厳密には違いますが)最小だと推測することができます。

何となく微分ができれば関数の最小値を求めることができて便利そうだなということがわかりました。
でもなぜ、微分で接線の傾きを求めることができるのでしょうか。直線の式といえば{y = ax + b}で表されます。
直線の傾きと呼ばれる部分は{a}です。中学校などで{(x1,y1),(x2, y2)}を通る直線の傾きは{a = \frac{yの増加量}{xの増加量} = \frac{y2 - y1}{x2 - x1}}と習ったと思います。
しかし、部分ではある1点における傾きを求めるので上記の方法は使うことができません。

ではどうするのでしょうか。{f(x) = x^2}として、
{(x1,y1),(x2, y2)}ではなく{(x,f(x)), (x + h, f(x + h)}と考えてみます。すると、2点を通る直線の傾きは{a =  \frac{f(x + h) - f(x)}{x + h - x} = \frac{f(x + h) - f(x)}{h}}と書けます。求めたいのは2点を通る直線の傾きではなく1点を通る直線の傾きです。{h}が限りなく0になれば2点ではなく1点を通る直線になりそうです。
{\lim_{h \to 0}\frac{f(x+h)-f(x)}{h}}としてhを限りなく0に近づけると、微分の定義戻りました。
微分によって、関数の最小値を求めることができると単回帰分析などでサンプルしたデータ群を元にデータを近似したモデルを作ることができるようになるのですがそれは別の記事で書きます。

若手エンジニアLT大会で登壇した

登壇してからかなり時間が経ちましたが書きます。

11月22日にドリコムさん主催の若手エンジニアLT大会で登壇させていただきました。

きっかけ

社内で@june29さんから声をかけていただき、登壇経験もなかったのでチャンスだと思い若手エンジニアLT大会に参加することを決めました。

内容

僕は、学生時代にコードレビューという文化が存在しなかったので、社会人になって初めてコードレビューというものを行いました。コードレビューをやってもらったり、やったりした中で感じたことを発表しました。

感想

各社の若手の皆さんはどうやって会社に技術貢献してきたかや入社して何をやってきたかなどを発表していました。 すべての発表においてレベルが高く、ポジティブな意味で自分ももっと頑張らないとなと思いました。

とても緊張しましたが参加してとてもよかったと思います。 あと、ドリコムさんのオフィスがめちゃくちゃお洒落でした。

お産ウィークがありました

お産ウィークとは

お産ウィークとはエンジニア、デザイナ研修の一環で、新卒エンジニアと新卒デザイナが、1週間でWebサービスを協働開発を行います。 新卒エンジニアが5人、新卒デザイナが1人なのでエンジニア3人のチームとエンジニア2人、デザイナ1人の2チームに分かれて開発を行いました。

僕はエンジニア2人、デザイナ1人のチームになりした。

作ったもの

お産ウィークではチームにそれぞれテーマが与えられ、そのテーマに沿ったwebサービスを開発します。 僕のチームは「旅行の思い出をもっと残せるサービス」というテーマが与えられました。

チームであれこれ話し合ったり、方向転換したりしながらなんとか動くサービスを作れました。(イケてない仕様だったりバグも多く見れらますが...)

反省

最初にサービスの方針を決める段階でチーム内だけで盛り上がってしまい、自分たちが考えたサービスを客観的に見ることができませんでした。その結果、お産ウィーク3日目で「あれ、このサービスを使いたい人っているのかな?」と疑問が出て、結局サービスの方針を練り直しますことになりました。サービスの方針を練り直すと今度はメインの機能を作り直すことになり時間に追われることになりました。

結果論かもしれませんが、サービスの方向性が決まった時点でチーム外の誰かにサービスの方向性についてレビューしてもらってたら後戻りすることもなくもう少し機能の部分を詰めたり、バグを潰したり出来なのかなと感じます。

最後に

とはいえ、サービスを動く状態にできたのは良かったです。また、同期のエンジニアやデザイナもすごい人ばかりだなと実感することができました。 祝日を挟んで木曜日からモバイル研修が再開します。そちらも頑張っていきたいです!

完全独習 ベイズ統計学入門を読んだ

完全独習 ベイズ統計学入門

完全独習 ベイズ統計学入門

この本のコンセプトは四則演算のみでベイズ推定を基本を理解するところにある。 第1部は確率を長方形の面積に見立て、確率記号を一切使わずに設定した問題に対してベイズ推定を行っている。 本当に簡単な四則演算のみでベイズの更新や事後確率の意味、逐次合理性、従来の統計学(ネイマン・ピアソン統計学)との違いなどが説明されている。

第2部では、より汎用的に推定を可能にするために確率分布を用いた推定方法が解説されている。まずは、ベータ分布と正規分布などのよく利用される確率分布の説明から始まり、問題に対して確率分布を選択するために「共役事前分布」の説明を行って最後に実際に確率分布を用いた推定を行う、という流れだった。 さすがに、確率分布の導入あたりから四則演算のみでは説明が難しく、多くの結論を天下り的に与えている。 しかし、冒頭で作者が

完璧に解説しようとすると大学レベルの微分積分が必要になってしまいます。 ... そこで本書ではやむなく、これらの解説は簡易的に済ませることにしました。

完璧な理解を欲する人も、本書を読んでから専門書に挑戦したほうが得策だと思います。

と述べているように、この本の目的は厳密な理解ではなく、ベイズ統計学を勉強する足がかりとなることだと思う。 そういう意味では、僕のような全くない人がベイズ統計学とは何なのかということを知るためには最適な本だと思う。

次はこの本の文献にもあった「入門ベイズ統計学」を読みたい。

フィットネスジムに入会した

最近、地元の友人に会うたびに必ずと言っていいほど「太った?」または「ハゲた?」と言われます。「ハゲた?」の方は遺伝っぽいのでどうしようもないが、「太った?」の方は改善する余地がある。
実際に体重測ってみると、高専で一番痩せてた時期より10kg以上太ってるし、上京してからも4kg以上は太ってました。

ということで、痩せるためにフィットネスジムに入会しました。

フィットネスジムの選び方

選び方というか家から歩いて通えるという条件は外せないので、家から歩いて通える距離にあるフィットネスジムを探してみるとエニタイムフィットネスというジムしか見つかりませんでした。

選択肢こそなかったものの、このエニタイムフィットネスといジムは一ヶ月7000円で好きな時間に通い放題というなかなか好条件のジムでした。
他のジムだと、好きな時間に通い放題のプランだと軽く1万円は超えてきます。
安い代わりにプールとかは付いてないが、元々、プールに入る予定はなかったしマシン類は充実しているので問題はないです。ラッキー

目標

目標体重を決めるのも良いかと思ったけど、そもそも運動続けてると脂肪は減るが、筋肉も付いてくるので、体重の増減に一喜一憂するのもなんか違うなと思います。

なので、まずはゆるーく週2回ジムに通うという事を目標に頑張ります。



まだ、入会して2週間くらいしか経ってないですが、今のところ、週3くらいのペースで通えてます。
当初はダイエット目的でジムに入会しましたが、実際に通ってみると体を動かすことで良いストレス発散にもなっています。

この調子でどんどん痩せていきたいです。

ベイズの定理のお勉強

機械学習の基礎中の基礎であるベイズの定理について少し勉強していきます。

ベイズの定理

ベイズの定理とは、みんな大好きWikipedia先生によると

ベイズの定理(ベイズのていり、英: Bayes' theorem)とは、条件付き確率に関して成り立つ定理で、トーマス・ベイズによって示された。
なおベイズ統計学においては基礎として利用され、いくつかの未観測要素を含む推論等に応用される。
ベイズの定理 - Wikipedia

らしいです。ベイズの定理は機械学習における重要な概念です。機械学習系の参考書を読むと必ず出てくる言葉なので、ベイズの定理を理解することは機械学習を学ぶ上での最初の第一歩なのでは?と考えています。


ベイズの定理は次の式で表されます。
{P(B|A) = \frac{P(A|B)} {P(A)} \cdot P(B)}

ここで、{P(B|A)}を事後確率、{P(A|B)}を尤度、{P(A)}{P(A)}を周辺確率、{P(B)}を事前確率と呼びます。

この式は、
何も情報がない状態では事象{B}が発生する確率は{P(B)}(事前確率)である。しかし、事象{A}を観測した時、この確率は尤度と周辺確率の比({\frac{P(A|B)} {P(A)}})で修正され{P(B|A)}になる。
と解釈できます。

3人の囚人問題

式だけではいまいちイメージが湧きにくいので、
理解を深めるために3人の囚人問題をベイズの定理に当てはめて考えてみたいと思います。

ある監獄にX、Y、Zという3人の囚人がいて、それぞれ独房に入れられている。罪状はいずれも似たりよったりで、近々3人まとめて処刑される予定になっている。ところが恩赦が出て3人のうち1人だけ助かることになったという。誰が恩赦になるかは明かされておらず、それぞれの囚人が「私は助かるのか?」と聞いても看守は答えない。
囚人Aは一計を案じ、看守に向かってこう頼んだ。「私以外の2人のうち少なくとも1人は死刑になるはずだ。その者の名前が知りたい。私のことじゃないんだから教えてくれてもよいだろう?」すると看守は「Bは死刑になる」と教えてくれた。それを聞いた囚人Aは「これで助かる確率が1/3から1/2に上がった」とひそかに喜んだ。果たして囚人Aが喜んだのは正しいか?
3囚人問題 - Wikipedia

問題を整理していきます。

最初の時点では3人とも助かる確率は等しいので、「Xが助かる」という事象をAX(Alive X)とすると、事象AXが発生する確率は
{P(AX) = \frac{1}{3}}
となります。これが事前確率です。

次に囚人Xは看守に「私以外に死刑される者の名前を知りたい」と言って看守は「Yが死刑になる」と答えています。
このやりたとり(事象)が発生したことでXが助かる確率は変わってきそうですね。

看守が「Yが死刑になる」と答える事象をDY(Dead Y)とします。
Xが看守に「私以外に死刑される者の名前を知りたい」と聞いたとき、看守がとりうる選択肢は

  • 「Yが死刑になる」
  • 「Zが死刑になる」

の2つです。
よって、事象DYが発生する確率{P(DY)}{P(DY) = \frac{1}{2}}となります。

最後にXの恩赦が決定している場合に看守が「Yが死刑になる」と答える確率、{P(DY|AX)}を考えます。
こちらも、看守のとりうる選択肢は

  • 「Yが死刑になる」
  • 「Zが死刑になる」

の2つなので、{P(DY|AX) = \frac{1}{2}}です。

必要な情報がそろったので、Xが助かる確率が本当に上昇したのか確かめてみます。
今回知りたい情報は、事象P(DY)を観測した時に囚人Xが助かる確率{P(AX|DY)}です。
整理した情報をベイズの定理に当てはめます。
{\begin{eqnarray*}
P(AX|DY) &=& \frac{P(DY|AX)} {P(DY)} \cdot P(AX) \\
&=& \frac{\frac{1}{2}}{\frac{1}{2}} \cdot \frac{1}{3}\\
&=& \frac{1}{3}
\end{eqnarray*}}

なんと、看守が「Yが死刑になる」という前後でXが助かる確率は変化していませんでした。
囚人Xはぬか喜びだったことになります。