2018年振り返り

1月

NLPに出す原稿を書いてたと思う。あんまり記憶がない

2月

卒業研究の発表準備などでごたごたしてた

3月

NLPの全国大会や引越し先を決めるなどのイベントがあった

4月

上京した。五反田のIT企業に入社した。
技術研修でのお題がTwitter Cloneを作るだったんだけど、DDDを勉強しつつ実装したのは楽しかった。またDDDちゃんと実践したい。
Gotanda.pmでLTした。

64GBという巨大なRead OnlyのKVSぽいものをS3上に構築することでサーバレス化に成功したって話 speakerdeck.com

5月

配属があった。ブロックチェーンをやることになった。

6月

Gotanda.pmでLTした。

会社には競技プログラミング部という部活があって、そこでPerl競技プログラミングするときに便利だなというライブラリを作ったという話 speakerdeck.com

7月

お仕事で作ってたサイトを公開した。html5やらcssやらOGPやらCloudFrontやら、知らないことばかりで勉強になった。

8月

お仕事してた。暑い。

9月

お仕事でサンプルアプリを公開した。vueやpythonとかを書いた。学生の頃からの貯金が役立った。

PyConでLTした。

パーティを文とみなすことでポケモンの役割ベクトルを計算する話 speakerdeck.com

10月

お仕事してた。難しい。

11月

お仕事してた。過ごしやすい。

NuxtMeetUpで登壇した。お仕事の内容について登壇することが夢だったので満足

nuxt-i18nというライブラリを使ってnuxt製のwebサイトを多言語化するという話 speakerdeck.com

12月

お仕事してた。寒い。

自炊について

上京して基本的に夕飯は自炊しています。

入社して1ヶ月時点で社内LTで話したスライドがこれ speakerdeck.com

ガス使った経験がなく初日は納豆ご飯だったり、パスタを茹でたら麺が燃えたりした人なんですが、8ヶ月も続けるとだいぶ慣れてきました。 大晦日なのでいちごのタルトを作ったりとか。

料理は自分のレベルアップが目に見えるところがプログラミングに通じていますし、食材を余らなさないために献立の最適化をするのが楽しいです。

まとめ

新卒入社した年でした。最初は新人気分だったけど今はもうそうは言ってられないよなーって感じです。
来年はもっとアウトプットを増やしていきたいです。今年のアウトプットは学生の頃の貯金を切り崩している部分があって、このままだと来年は何もないという状態になりかねないです。そのためにも、お仕事や趣味で手を動かしてネタを作りたいと考えています。

上京時や上京後に得た知見について

この記事は、OIT Advent Calendar 2018の3日目の記事です。

adventar.org

遅刻してしまい申し訳ありません...。

この記事では自分が奈良から就職のために上京した時の知見について紹介します

上京前

引越し先の決定

自分はいろいろな理由で3月中旬に東京に上京し物件を決めました。最初は敷金と礼金がない物件を探していましたが、時期が遅かったこともあり見つかりませんでした。良い物件を探そうとする方はもう少し早めに上京し物件を決めると良いです。 また、自分は物件を決めるときに保護者が必須だと思いこんでいましたが実は不要な場合があります。事前に仲介業者に確認しておきましょう。

物件の決めるポイント

住んでみてよかった物件の特徴を挙げます

駅チカ

言わずもがな

スーパーが近い

自炊するなら必須レベルです。今住んでいるところは徒歩3分圏内にスーパーがあるのですが、自炊が続いている理由の9割がこの近さです。

お風呂乾燥機

定期的なお風呂掃除からの開放 + 洗濯物が圧倒的な速さで乾きます。

広いキッチン

狭いキッチンだと料理が大変です。swap領域が洗濯機の上に生えたりします。 あと広いキッチンだと自ずと収納が広くなり、色んな種類の食器が収納できたりして便利です。

1K

料理するなら臭いのことを考えると必要になります。

家電

家電は家電量販店で購入した後に住居予定地に郵送すると良いです。重い物を持つ必要がなくなります。 また家電を購入したものの家に入らなかったというケースが最悪なので、物件の下見時には洗濯機や冷蔵庫を置くスペースのサイズを採寸しておきましょう。

引っ越し業者

布団や家具家電を住居予定地に郵送し洋服をキャリーバッグに詰め込んで上京することで、自分は引越し業者を使わずに上京しました。実家から上京する人はこれが可能かと思います。

引っ越し当日

お金があったので新幹線を使って上京しました。節約するなら18切符を使うのも手です。 遅刻しそうになるとキャリーバッグを担いでダッシュすることになるので、時間には余裕を持って家を出ると良いです。

上京後

日用品

基本的にCan Doなどの100円均一のお店に行くことで揃います。自分はCan Doでお皿や菜箸や文房具などを買いました。

調理道具

Can Doで購入できなかったフライパンや包丁は近所のスーパーで揃えました。キッチンペーパーやティッシュなども揃います。 ただ、ゴミ袋を買う時は注意が必要です。間違って大きなサイズ(45L)のゴミ袋を買ってしまうと、中身が埋まらず悲しい想いをします。

終わりに

思ったよりも知見が少なかったです...。 今後上京される方の参考になれば幸いです。

第2回 Cpaw AI competitionに参加しました

Cpaw AI competitionが何かとか、Cpawとは?みたいは話は下のリンクを見て下さい

connpass.com

雑に説明すると競プロ(ハーフマラソン系)+機械学習コンペです。当日はさくらインターネットさんからCPU 12Core,メモリ96GBのマシンが貸し出されており、その上で競技に取り組みました。問題は合計4問用意されており、正解率の合計で総合順位が決定する形式でした。 ただし4問のうち1問はとても難しいらしく正解率を8倍した値が合計する時に使われる仕様でした(300+800=1100点満点)。

環境構築

クリーンインストールされたUbuntuが与えられただけだったので、まず自力で環境構築をする必要がありました。 zshをインストールしてGitHub - odanado/dotfilesをcloneすることで手軽に開発環境を作りました。 Pythonを実行する環境にはDockerとMinicondaのどちらを使うか少し考えましたが、Minicondaを選びました。Minicondaは env.yml ファイルに必要なパッケージを書いておけば、 conda env create -f env.yml で仮想環境を構築できるのでとても便利です。

Programming

この問題は6種類のいずれかのプログラミング言語で書かれたプログラムが与えられるので、そのプログラムの言語を予測する問題でした。 研究で自然言語処理をやっていたこともあってまずこの問題に手をつけました。 直感でそんなに難しくないだろうと考え、sklearnのCountVectorizerでBoWを構築、xgboostで分類しました。 精度はおおよそ97%程度で、この時点(1時間経過)では暫定1位で嬉しくなりました。

omniglot

この問題は実際のomniglotのデータセットから40種類のハングル文字を取ってきて、画像分類を行う問題でした。 この問題の難しい点は学習データが各クラス1枚しか用意されていない点でした(いわゆるone-shot learning)。 自分は最近画像の類似度計算について勉強していたこともあって、次にこの問題に取り組みました。 AKAZE特徴量を抽出して特徴点のマッチングや、テンプレートマッチングを行うコードを実装しても、ほぼチャンスレートの正解率しか得ることが出来ませんでした。

実は4問のうち特に難しいために正解率が8倍される問題はこの問題でした。

一度この問題は諦めて他の問題に移りましたが、最終的にはIMSATを使った手法を提出しました。 omniglotはMNISTと同じく手書き文字認識っぽいデータであることと、IMSATのchainer実装を運営のshunk031さんがgithubに公開していることを知っていたため、この方針を採用しました。 この選択は結果的に正解で、提出したところ8倍された正解率で31%を記録しました。

hand-RPS

この問題は真上からの手の甲の画像から、じゃんけんのグーチョキパーのどれに分類されるか予測する問題でした。 環境として提供されていたサーバにはGPUが搭載されておらず、取り組むのにためらっていましたが、CNNによる手法を試しました。 ネットワークは keras/cifar10_cnn.py at master · keras-team/keras · GitHub を使いました。
ネットワークが小さいことや学習データが多くないこともあって、数十分で10epochの学習が終わり、提出した結果98%の正解率が得られました。

cifar-100

この問題は問題名の通りデータセットにcifar-100を使った問題でした。ただ、データはcifar-100そのままではなく、クラス名は00,01,...,98,99のように連番の数字で匿名化されていました。 cifar-100に対しては様々なネットワークが提案されていますが、今回GPUがない環境でいかに精度を上げるかという点が重要だったようです。

自分はまず最初にcifar-100の学習済みモデルを探しました。学習済みモデルがあれば多数決により匿名化されたクラスを特定することができると考えたからです。30分程度探しましたが、見つからず普通に1からCNNを学習することにしました。

hand-RPSと同じネットワークを20epochほど学習させ提出したところ9%程度の正解率を得ました。これを見て自分はこの方針は良くないと思い込み、他の問題に時間を使い、これ以上の改善はできませんでした。

結果

f:id:odan3240:20180402235644p:plain 結果は3位でした。1,2位は商品が用意されていたのですごい悔しいです。

懇親会で他の方の話を聞いた結果、1位になれなかったのはcifar-100の学習epochを20で打ち切ったことだと結論付けました。これはomniglotでよい正解率を出していたことと、cifar-10,cifar-100ではモデルを数千epoch学習させることがあり、最初20epochでは良い解が得られないと考えられるからです。結果論ですが、他の問題に取り組んでいる時間に裏でcifar-100の学習を回し続けていれば十分1位が狙えたのかなと思いました。

感想

普通のコンペは競プロのマラソンマッチのように長い期間行われるのに対して、ハーフマラソンのように短い時間でコーディングが忙しいコンペでした。 コードを書いてる時や、提出した時に良い精度が出た時はとても楽しく勉強になるので、次回も開催されるなら参加したいと思いました。

kaggleやるやる詐欺辞めないとなあ

RUPC2018 参加記

今年も参加しました

1日目

自己紹介フェーズではうくさんの生なりきりを見ることが出来て感動しました
チーム分けではdiv1,div2,div3という3つのクラスで参加者を分類してて、去年より細かくていい感じ 結果的に次のようなチームになりました

btkさんに認識されていてちょっと嬉しかった。 チーム名は「オンサイトチームはチーム名に rupc という接頭辞を付けて下さい」という運営のアナウンスが流れた瞬間に、btkさんがチーム名を回文にしようと提案したため

コンテスト

B問題を担当する事になったのでB問題を読みました。しかし何度読んでも題意が頭に入ってこなくて困ったので、btkさんにサブミットデバッグすることを伝え、40分後ぐらいにACしました。その瞬間に題意がわかり、問題本文をもう一度読むと確かにACしたコードと辻褄が合っていました。すごい
B問題に手こずっている間にbtkさんがF問題のFAとD問題を通していて完全にプロでした。
G問題はbtkさんとペアプログラミングをしました。ずっと「最悪〜」と言いながらコーディングしている割にはバグなくスッとACをしていて暖色コーダーとの差を感じました。
最終的にF問題を通すことが出来ず、6完14位でした。

懇親会

去年と同じく生協で立食パーティーでした。フォロワーだけど会ったことがない人々と初めましてなどをしていました。

2日目

寝坊+満員でバスを逃したせいでチーム分けをTLEしそうになりました。結果的に人数調整の関係で4人チームになりました。

コンテスト

C問題を担当しました。見るからに貪欲でチームメンバーに相談してもそれで問題ないということで、実装→ACしました。これは証明のない貪欲で、解説陣に良くないよと後の解説で怒られました。
コンテストの終盤はnaanさんとI問題を考えていました。半径を二分探索すればいいという話は出ていて、判定部分は乱択で誤魔化せば通りそう?という方針だったんですが、サンプル2以降が一致せず、時間を溶かし続けてコンテストが終了しました。
チームとしては4完でした。E問題は想定解に近いアルゴリズムを実装している途中だったこと、I問題で文字列ソートを高速化する必要がある時にSAの話をちゃんと詰められなかったこと、I問題のバグなど、うまくいけば+1,2完はできたかなあという感じでした。

懇親会

焼肉食べ放題でした。どうして人はしんどくなるまでご飯を食べ続けてしまうんでしょうね。めっちゃしんどくなりました。

3日目

コンテスト

B問題を担当しました。数式中の s_i がどこにあるかわからなくてしばらく問題の意味がわかりませんでした。何回か問題を読み返して理解して、実装してACしました。
C問題までACし終えた後、D問題はチーム全員で考えてました。どんな解法でも素数判定は必要だなということで、エラトステネスの篩を空き時間に実装して、A問題に提出しました。最終的にこたつがめさんが2つ前まで見るDPを思いついて実装してACしました。
次の問題には多くのチームがACしているからという理由でF問題を考えることになりました。僕が嘘解法を生やすたびに即座に反例を挙げられて強い人は強いなあと思うなどしました。こたつがめさんが最小カット解を思いつき、きくちさんが最短経路に寄与している辺を簡単に見つける方法を提案し、僕が最大フローのライブラリをコピペしました。この問題はチームプレー感があってよかったです。
チームとしては、5完で25位でした。

全体の感想

ここ1年ぐらいは競プロで離れ気味で参加するか迷いましたが、チーム戦ならではのペアプロとか相談し合う雰囲気などを味わえて参加してよかったと思いました。

運営の方々ありがとうございました

2017年振り返り

自分もやりたくなりました

1月

  • 期末テストとか年次大会に出す原稿を書いてた
  • mixi git challengeに参加した

2月

  • 進学か就職か悩んでいたので就活をちょっとしていた
  • cookpadの画像認識にコンペに参加した
    • 最終的に14位

3月

  • 言語処理学会年次大会に参加した
  • 内定を得たが,年次大会が楽しくてもうちょっと研究をしていたいという気持ちになる
  • RUPC
  • ポケモンの画像認識をするwebアプリを開発した
  • ハッカソンに参加する

4月

  • 院試対策の勉強やTOEICを受けていた
  • サークルで新入生向けにC++講習会をやることになり,毎週スライドを作るのがしんどかった

5月

  • 院試に必要な小論文を書いていた(はず)
  • ↑の企業からの内定を承諾するか保留していたが,最終的に承諾しないことにした
  • JSAIの全国大会に参加する(たのしい)

6月

  • ユニクロの画像認識コンペに参加した
    • 9位で8月末に表彰された
  • ICPC国内予選に落ちる

7月

  • 院試に落ちる

8月

  • 就活を再開する

9月

  • 就活を継続するが内定を得られず困る
  • こどふぇすに落ちる
    • 競プロ全然やってなかったのでそれはそう

10月

  • ISUCON予選に参加するが落ちる
  • 就活が終わらず,研究熱が出て来る

11月

  • 色々あってある研究所に長期インターン的な感じで出入りできるようになる
  • そこでネタを考えては実験をするを繰り返していた
  • ずっと研究していた

12月

  • ようやく内定を得る
  • 研究の原稿を書く作業がつらくなる

まとめ

  • 院試に落ちたのはほんときつかった
  • 今年は研究会なりYANSなりで発表したいと思っていたが,結局今年も年次大会だけ(国際会議はネタ的に通る気がしない
  • 国内のコンペだけど機械学習コンペに参加するようになった
    • 来年はkaggleも
  • 学生も終わりで悲しい(もうちょっと色々したかった)

競プロサークルの話

この記事は「競プロ!!」 競技プログラミング Advent Calendar 2017の8日目の記事です.投稿が遅れて申し訳ありません

adventar.org

この記事では弊学の競プロサークルで行っている活動について書きたいと思います.

新入生勧誘

2年前までは所謂新歓期にサークル員の勧誘は行っておらず,プログラミングや数学が得意そうな学生を直接スカウトする仕組みでした.しかし競プロサークルがあまり認知されていない*1こともあって,中々新しい人は入っていきませんでした.実際自分の1年下の学年は僕が2年生になるまで誰一人いませんでした.
そこで弊学で4月の新歓期にブースを構えてチラシを配布することにしました.これまでチラシ作りに関するノウハウがなかったので苦労しましたが以下のようなチラシを作って配布しました*2.100枚印刷していましたが,50枚も配布できなかったのでもっと少なくていいと思います.配布枚数とサークル員のコミュ力には正の相関があると思うので来年以降は見定めてください.

この効果もあって2016年度は10人以上,2017年度は7人ぐらいが興味を示してくれました.2016年度当初の2年生以上のサークル員の数は5人だったので急に増えて驚きました.このことが前期の活動内容に大きく影響します.

前期

前に書いた通りたくさんの1年生が入ってくれました.その1年生の殆どはプログラミングについて知らず,サークルとしてプログラミングとはなんぞやということを教える必要に迫られました.しかしこれまでは,優秀そうな学生をスカウトするという方針だったため,チラシ同様にプログラミングを教えるというノウハウがありませんでした.
2016年度は幸いにも自分の同期が,他の部活で1年生にC言語を教えていた経験があり彼に頼むことにしました.内容としてはC言語の基本的な文法などを抑えた後,C++の便利な機能を紹介するというものでした.人数が多くなったためパソコンの数も足りなくなり部室*3で活動を行うことを諦めて,大学の演習室を借りて行いました.
2017年度は自分がC++を1年生に教えました.1人で毎週勉強会用のパワポを1から作るのは大変だったので,なんとかして分業する or 手を抜く方法を考えたほうがいいです.日程は以下の通りでした. f:id:odan3240:20171213232158p:plain

1回の勉強会の流れは,その日扱うトピックについて紹介→バチャコンでそのトピックに関する問題を解いてもらうでした.バチャコンを使うことで誰がどの問題にハマってるか確認しやすかったです.バチャコンに使う問題はRiPProの方からABCのAB問題に対して,C++のどの文法の知識を使えばいいかタグ付けされた問題リストを頂いていたので,それを参照して選びました.
一応ACM-ICPCの国内予選のA問題は解けるようになって欲しいと思っていましたが,1年生に国内予選の感想を聞くと難しかったようです*4.どうすればプログラミング未経験者を数ヶ月でA問題を解けるようになってもらうかも今後の課題です.
C++勉強会用に作ったスライドはクオリティの高いものではないので,一般公開する予定はないのですが,同じようにサークルで1年生向けに勉強会を開く時に使いたいという人がいれば差し上げます.

これまでは週1の活動だったので,1年生向けにプログラミングの講習会を開くと自分たちの勉強会が消えてしまいました.そこで上級生向けの勉強会を別の日に行うことにしました.この勉強会はバチャコンを開催し問題に取り組み,その後問題をどう解いたかを話し合う形式です.

後期

まず,前期にたくさんいた1年生はほとんど来なくなりました.これはある程度は仕方ないと考えています.

2016年度より後期は週ごとにアルゴリズムかデータ構造と担当を決めて,輪講形式の勉強会を開きました.これはせっかく集団で競プロをやっているので何かしらの知見を共有したいとの理由で始めました.2017年度のスケジュールは以下の通りです.

f:id:odan3240:20171213233738p:plain

しかしこれも難しいなあと感じます.

それと前期同様に皆で集まってバチャコンの問題を解く勉強会も別の日にやっています.

最近

もうちょっとサークルらしくしようという声が上がり,その一つとしてロゴを作りました.作成には Build a Website - Squarespace を使いました.

f:id:odan3240:20171213234424p:plain

このアイコンは皆でコンペした結果wheson氏が作ったものが採用されました.

twitter.com

他にもロゴのステッカーも作る話や,外部向けのサークル紹介サイトを作る話が挙がっています.続報があればここに追記するかもしれません.

おわりに

弊学の競プロサークルの活動についての紹介をしました.自分が認識している問題点とはしては以下の通りです.

  • 数ヶ月でICPC国内予選A問題を解けるようになるには
  • 1年生から4年生まで全ての人が嬉しい輪講形式の勉強会の方法

いつか改善されてほしいですね.

ここまで書いていてあれですが,実は弊学には競技プログラミングサークルはありません.どういうことかというと,自分の所属している競技プログラミングをする団体はサークルや部活ではなく,学生プロジェクトというものに分類されているため厳密にはサークルとは異なります.やってる内容自体はサークルと変わりないのですが,部費がタダだったりRUPC,JAG夏合宿などに参加するために大学から金銭的な援助が得られるので色々お得だなあと思いながら活動しています.ただ,他の人に紹介する時に手間なのでいつもサークルだと言い張っています.

*1:大学の掲示板にチラシが貼ってあるだけ

*2:2017年度版,2016年度のはどっかいった

*3:厳密には違う

*4:それはそう

bashからzshに乗り換えた話

この記事は、 OIT Advent Calendar 2017の2日目の記事です。

前置き

元々OIT Advent Calendarに弊学の梅田キャンパスを「がっこうたんけんした話」を書くつもりでしたが外が寒くてダメでした.何か記事を書くネタを考えたところ最近zshを使い始めたのでそのことを書くことにしました(偶然にも2日連続シェル環境の記事になった).

dotfiles

最初に貼っておくとdotfilesは以下にあります

github.com

Docker

また以下のコマンド群をコピペするだけで僕のzshを試せます!

docker run --rm -it odanado/zsh zsh
./install.sh && ./deploy.sh
source ~/.zshenv && source ~/.zshrc

動機

周りに影響されてfishを触ってみたところ,デフォルトで入っているauto suggestion機能がとても便利に感じました.ほぼ何もカスタマイズされてないbashで作業をするのは目に見えない時間を失っているようで嫌だったので,bashを辞めることを決意しました.
乗り換えるshellを選ぶ上で前から気になっていたzshと,周りの人が使っているfishで悩みましたが,zshの方が色々カスタマイズできてネット上に情報が多そうだったので,zshを選びました.

プラグインマネージャ

まず最初にプラグインマネージャを選びました. Preztooh-my-zshAntigen などもありましたが, zplug がいいとの情報が多かったので zplug を選択しました.後述しますが実際使ってみて最高でした

インストールしたプラグイン

zsh-users系

目についたやつを入れていきました

peco

pecoはリアルタイムgrepみたいなコマンドです.GO言語で実装されていて厳密にはzshプラグインというわけではないんですが, zplug だとこういったものも zplug "peco/peco", as:command, from:gh-r でインストールすることが可能です.この柔軟性が最高だと思いました.

ghq

これまでは ~/git 以下にひたすらgit cloneしたリポジトリを集めてましたが,ghqを使えば管理が楽になります.これも zplug を使って zplug "motemen/ghq", as:command, from:gh-r でインストールできます.

anyframe

pecoと連携するためのプラグインです.ほしい関数が用意されているので使うのにキーバインドやaliasを設定するだけで使えるようになって便利.

powerline

ターミナルのステータスバー?をかっこよくするやつ. zplug は他人のzshファイルを読み込むこともできて, zplug "powerline/powerline", use:"powerline/bindings/zsh/powerline.zsh" でインストール可能です(ほんと最高). デフォルトのconfigだとかっこいい三角形を表示するためにpowerline用のフォントをインストールする必要があります.しかし三角形を表示するためにフォントをインストールのは大げさだと思い,configで"default_top_theme": "ascii" としています.他にも設定を弄って最終的にこんな表示になりました. f:id:odan3240:20171202222956p:plain

その他設定

ヒストリ

どうやらデフォルトではヒストリを保存しないぽいので設定しました

export HISTFILE=${HOME}/.zsh_history
export HISTSIZE=1000
export SAVEHIST=500000
setopt hist_ignore_all_dups # 同じコマンドをヒストリに保存しない
setopt hist_reduce_blanks # 無駄なスペースを消してヒストリに保存する
setopt share_history # ヒストリを共有

ssh-agent関係

tmux内でもssh-agentが使えるように以下の記事の設定をコピペしました

qiita.com

CIとか

TravisCIとDockerを使ってgithubにpushされるたびに,zplugでのプラグインのインストールが成功することと,zshenv及びzshrcの読み込みが成功することをテストするようにしました.本当はちゃんど動作するところまでテストしたいと思っていましたが方法がわからず,ないよりマシの精神でインストールとロードまでをテストしています.この辺の知識がある方がいれば教えていただきたいです(あとneovimの起動もテストしたい).

おわりに

bashからzshに乗り換えてインストールしたプラグインや設定を紹介しました.今回zshに乗り換えたことでシェル環境の快適度が増して個人的にとても満足しています. zshにはこんな便利なプラグインがあるよ!とかこの設定書くと便利だよ!などの情報をお持ちの方はぜひ教えてください.