みどりねこ日記

よくわからないけど、頑張りますよ。

「迷子になったら動くな」を検証してみた

今日友達とホームセンターに行ったら迷子になってしまった。

いや、はぐれちゃっただけなんだけど、僕は携帯を持ってなかったし、この年で迷子センターに行くのもなーってことでしばらくウロウロして探した。

そこでふと幼い頃「迷子になったらそこから動くな、探される方がウロウロしてしまうと見つけにくくなるから」とママンに言われたのを思い出したんだけど、これって本当だろうかと思って検証してみた。

コードはgistにある。

動作させるとこんな感じ

迷子になったホームセンターを模したマップを作って、それに対して人を2人だけ用意してランダムに配置し、見つけられるまでに行動した回数をカウントする。

「双方動いた場合」っていうのと「ママンだけが動いた場合」っていう2つの状況を100,000回ずつ試して、その行動回数の分布を見てみる。

このシミュレーションでは、ひとはステップごとに移動と向きを変えることができて、向いている方向に対象の人がいたら見つけたことになる。

結果はこんな感じ。 横軸が試行回数、縦軸がその試行回数で発見できた回数。 試行回数の最高値は16,811なんだけど、双方動いた場合の最高値は1,995なのでこのグラフは全体の一部だけの表示。

f:id:paprikas:20150206034033p:plain

双方動いたときの平均試行回数が131.15286であるのに対し、動かなかったときの平均回数が536.75194。 ちなみに分散はそれぞれ27,592.7712938と692,246.087266。

双方動いたほうが圧倒的に早い!!!!!!!!!!

真面目に考察するなら、「ここにはいなかったからきっとあっちだ」っていう予想をAIがするようになれば、移動しないほうが探索回数の上限が決まるので早いと思う。

無限の大きさを持つホームセンターならどうなるんだろう。

簡単に人の顔に泥を塗る方法

僕は人の顔に泥を塗るのを得意とするのですが、泥を塗るのにも労力がかかるんですよ。 なので常日頃からこの作業を自動化できないかと思っていたので、論文の息抜きにやってみました。

import sys, cv2, random

imagefilename = sys.argv[1]

image = cv2.imread(imagefilename)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.equalizeHist(gray)

faceCascade = cv2.CascadeClassifier("./lbpcascade_animeface.xml")
faces = faceCascade.detectMultiScale(gray)

for (x, y, w, h) in faces:
    points = []
    for i in range(1, 8):
        points.append((x+x/4+random.randint(-w/20,w/20), y+i*h/8+random.randint(-h/20,h/20)))
        points.append((x+w-x/4+random.randint(-w/20,w/20), y+i*h/8+random.randint(-h/20,h/20)))
    for i in range(1, len(points)):
        cv2.line(image, points[i-1], points[i], (64, 122, 170), 40)

cv2.imwrite("mud_"+imagefilename, image)

f:id:paprikas:20150204223231j:plain

これであなたも人の顔に泥をぬれる!!!!!!!!

lbpcascade_animeface.xmlはこちらからいただきました。

ヤドカリごっこ

結局NAIST自然言語の研究することに決めた。

関係者各位よろしくお願いします。

高校時代と大学入った当初はプログラミング言語に一番興味あって、当然大学院もそっち方面を研究しようと思っていた。

まさか自分が当時一番胡散臭いと思っていた自然言語に進むとは。人生わからんものだ。

東京での学生生活ちょっと憧れたけどな!!!!

進学先を決めたのはいいんだけれど、家が見つからない。

生駒駅周辺で探しているが、なんかもう結構埋まってる。

ひぃ。

追記: 駅から1分くらいのところに家決まりました。

大学のメールアドレスにスパムメールが届いた人へ

おはようございます。

昨日酔った勢いでスパムメールを書いてしまいました。

今は公開している。

そもそもなぜこんなことをしたかというと、大学からフィッシングメールに対する注意勧告のメールが来たので、ちょっとしたジョークということで試してみました。

送った先は冗談のわかってくれそうな教員方数名と生成した学籍番号全員です。

もし迷惑であると感じたなら 大変申し訳ございませんでした。 delihiros@gmail.com までご連絡ください。申し訳ねぇ!くらいは謝罪させていただきます。

本当は以前諸事情で手に入れた全学生のメールアドレスのリストを使おうと思っていたのですが、データがどこかに行ってしまっていて(多分大学の研究室に置きっぱなしのPCの中)、仕方がないのでリストを生成することにしました。

大学のメールアドレスは基本的には以下の構造をしています。

年度番号 学部アルファベット(工学部の場合T) 学科番号(情報工学科の場合5) 3桁の学籍番号 アルファベット

最後のアルファベットはチェックディジットのようなもので、ISBNのような計算式で求めることができます。以前式を求めたのですが、そのメモも見つからなかったし考えるのも面倒だったので、アルファベット総当りする実装になっています。

gmailの仕様として、一定時間内に多くのログインがされるとメールが出せなくなったり、1日に遅れるメールの数に制限があったりするので、Thread/sleepなんかを入れています。

実際に送ったのは教員の方々と11年度生のみです。

ちなみになぜこの記事を書いているのかというと、朝起きたら酔いが冷めていたからです。

大変申し訳ございませんでした。

東京大学大学院情報理工学系研究科合格しました

無事合格しました。

関係者の皆様、特に研究室のメンバーとアルバイト先の方々、ありがとうございました。

入学した場合は創造情報学専攻の千葉研究室でプログラミング言語の研究などをすると思います。

先月NAISTの窓口に問い合わせたところ、悩む猶予をいただけるとの事だったので、できるだけ早くどちらに入学するかを決めたいと思います。

試験はTOEFLの提出、実技(プログラミング)または数学、筆記試験、面接という感じです。

以下は参考にした本です(といっても一冊しかないのですが……)。

過去問を見た限りだと広い範囲が出題されそうだったので、過去問を解きつつこれをパラパラと見て、ちょいちょい何かを実装して、……という感じで対策?しました。

ピンチだったのはTOEFLで、6月半ばに$200の受験料を払ってTOEFLを受験しにわざわざ新潟まで行ってきたんですが、試験終了後のダイアログメッセージをよく読まずキャンセルボタンを押してしまいました。 これ実は「試験の結果自体をキャンセルしますか」というメッセージだったらしく、$200が泡になる+TOEFL提出が間に合わなくなる事態に陥りました。 結局東京大学で受験できるTOEFL iBTを受験し事なきを得ました。

試験結果をキャンセルしたいひとなんているわけないでしょ!!!

僕は数学ダメマンなので迷わず実技を選びました。 プログラミングコンテストのような問題が出題されたので、Clojureでちまちま解きました(言語自由)。 REPLで出力結果を確認しながら解けるし、全探索書いてもそこそこ速いし、core.match強力だし、なによりメモリ管理気にしなくていいのでこういう試験には便利です。

筆記は全部解けたんじゃないかと思います。 距離測定器について述べよ的な問題が出たのですが、うちの研究室はレーザー屋なので楽勝でした。

面接はやたら早く終わったから落ちたかと思った。

あと苦労したことは合格発表ですね。 書類には掲示板に合否を貼りだすと書いてあったのですが、掲示板どこだよまじファック。 警備員のおじさんに聞いたら本部へ行けと言われたので本部棟に向かったら、本部棟2号へ行けと言われ、本部棟2号のおばさんには「私は知らないですね、管轄じゃないです」みたいなこと言われた。

結局研究科の入試課に問い合わせました。最初からそうすればよかった。

NAIST合格しました

奈良先端科学技術大学院大学情報科学研究科に合格しました。

みなさんには大変お世話になりました。ありがとうございました。

僕は言語処理とかに興味があったのですが、うちの大学ではそのへんを扱っている研究室はなかったので外部の院を探していたところ、NAISTの中村研究室が面白そうだと知って受験しました。

試験は数学、英語(TOEICまたはTOEFL)、面接です。また出願時に小論文を提出します。

小論文は提出期限当日の昼に慌てて書き始めたので、ひどいものでした。 しかし友人と教員が真っ青になりながら深夜まで添削を重ねてくれたおかげで、かなりまともなものになりました。

当日消印有効だったのですが、小論文をイチから書きなおしたりしたため、日付の変わる頃に郵便局に駆け込むなどというギリギリの世界を楽しみました。

数学の過去問は有志の方々が公開されているものがあるので、それを一つの目安として以下の参考書に取り組みました。試験一週間前になるまで出題範囲を勘違いしていたので、実質的な勉強時間はあまりありませんでした。受験される方は、お気をつけ下さい(?)

ちなみに微分積分は大学一年生のときに勉強した程度で、完全に忘れていたので結構ピンチでした。

基本的にはやさしいシリーズをざっと解いて、友人に教えてもらいつつ大学院への数学で出題範囲の演習をしていました。

やさしく学べるシリーズは1日あれば一周できるので本当に役に立ちます。

やさしく学べる微分積分

やさしく学べる微分積分

やさしく学べる微分方程式

やさしく学べる微分方程式

やさしく学べる線形代数

やさしく学べる線形代数

プログラミングのための線形代数

プログラミングのための線形代数

詳解 大学院への数学―理学工学系入試問題集

詳解 大学院への数学―理学工学系入試問題集

TOEICは875点だったので、あんまり心配はしていなかったです。

友人たちにおんぶにだっこな人間性がかいま見える大学院受験となりましたが、これから精進していきたいと思います、うんぬんかんぬん。

Clojure内部のメソッド定義について

最近Clojureのコード読んでたんですが、いたるところ(このへんとか)に

public Object invoke() ;

public Object invoke(Object arg1) ;

public Object invoke(Object arg1, Object arg2) ;

public Object invoke(Object arg1, Object arg2, Object arg3) ;

public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4) ;

...といった調子でメソッドが定義されててギョェ〜〜ってなってた。

なんで可変長引数使わないのかよくわからなかったのでIRCに投げてみたところ、可変長引数はコストが大きいんだそうで。だからJVMの速度的な問題でこのような実装になっているとのこと。

うえのinvokeメソッドはClojureの関数を引数に適用するメソッドなわけなのですが、なるほど確かに関数に引数1000個とか渡さないわ。

だったら上の実装が現実的なのね。