じゅぎのんの徒然日記

勉強したこと、趣味のこと。

VOYAGE GROUPのTreasureに参加しました

またお久しぶりになってしまいました、じゅぎのんです。

8月上旬は授業が佳境に入り、テストがあったり提出物があったりで忙しく、研究も実験をちょっとだけやったりと忙しい日々が続いていました。

そんな8月下旬、ついにVOYAGE GROUPの夏のインターンであるTreasureが始まり、二週間+αの戦いの末無事生還して戻ってきたので、今日はその報告をしようかなと思います。

Treasureとは?

このブログを見ている人は大体みんな知ってそうなので特にかしこまって書く必要があるかは分かりませんが。。

Treasureとは、VOYAGE GROUPって会社が開催してる夏のインターンシップのことです。去年のレポートとか会社ブログ、そしてすでに今年の参加報告もちらほら上がってきているので、是非そちらも確認してみてください(きっと僕なんかよりいい文章書いてる)

うちのチームにいた人事のなみさんのテックブログ

techlog.voyagegroup.com

今年、共にTreasureに参加した人たち

hirocky86.hatenablog.com

https://blog.takurinton.com/17

昨年のTreasureに参加した人たち(TAとして今年参加していただいてる人もいます)

kitchen-py.hatenablog.com

denden-seven.hatenablog.com

今年は例に漏れずコロナウイルスの影響ですべてオンラインで、8/1, 8, 15の土曜日と8/17~28の計13日間(表記上は)の開催となりました。

去年までのTreasureのレポートをみて「オフィスきれいそうだし、お酒もタダで飲めるし、お菓子も食べ放題みたいでいいな〜」と思っていたので、そこがなかったのは少し(かなり)残念でした。。

でも、前回の記事でも書いた通り自分は普通だったらこの時期部活の大会・練習でこんなに時間がとれていなかったはずなので、このインターンに参加できただけで嬉しかったです。

あ、お菓子に関しては安心してください(?)、今も食べ切れていないほどのお菓子他の詰め合わせが段ボール二箱分配送されてきました。

f:id:ogijunchang:20200902234836j:plain
一箱目(Tシャツも送られてきました)

f:id:ogijunchang:20200902234932j:plain
二箱目(発売したばかりのVOYAGE対談本も送られてきました)

そんなわけで、お菓子も気持ちも用意完了!いざTreasureへ :muscle:

前半戦(講義)

8/1, 8, 15、そして8/17はVOYAGE GROUPの方がフロント・バック・DB・インフラ・アイデアについて講義をしてくれました。

フロントエンドはJavaScriptの歴史からJSのtips(function関数とarrow関数の違いとか、bindについてとか)を学びました。

意外とずっと書いてきたのに知らなかったこととかがあって、フロントエンド講義も学びが多くあったなぁと感じます。

バックエンドはTreasure-voiceという1対1の通話サービス的なものを作りながらGolangを学びました。

Repository, Service, Controllerの役割やAPIのエンドポイント設計、WebSocket、WebRTCなどバックエンド経験ほぼ皆無な自分にとってはすべてが初めて聞く単語で、完全にコンフォートゾーンから外れた状態(むしろ体半分パニックゾーンに入ってる)でしたが、TAのらぴおさんが講義のあとに1対1で画面共有をしながら丁寧に教えてくださり僕は感涙にむせび泣きました。本当にありがとうございました…!

DB講義では実際にdbdiagramというDB設計ツールを使いながら、発表されたチームごとに実際の運用のことを考えながらDB設計をしていきました。

dbdiagram.io

DBも僕にとっては初めての領域で、わからないながらも設計に関しては自分の考えをもって発言することができたんじゃないかなぁと思います。

インフラ講義では、今回チーム開発時にベースとなるTreasure-appのインフラ周りの部分についての解説を聞きました。

正直ここはまだあまり理解できてない…(しょうたさん、ともかつさんすみません)AWSむずすぎです。解説スライドをいただいたので、がっしりと読み返して学んでいこうと思っています。

最後にアイデア講義。僕たちのチーム開発は後述するようにアイデア出しでありえん時間がかかったので、今回のインターンで一番学びになったと言っても過言でもないのはアイデア講義で得たことでした。

フロントエンド・バックエンド共にわからないことがあったときは補講を開催してくださったり、個別に質問を受け付けていただけてとてもやりやすい環境でした。

ヤンウェイさん、バックエンドがわからなさすぎて初心者みたいな質問ばっかしてすみませんでした。僕もっと強くなります。

後半戦(チーム開発)

決起!

講義が無事に終わると、ついにチーム開発がスタートします。今回のTreasure参加者数は全部で24名、4名×6チームに別れてアイデア出しから始まります。

僕は大学院のテストの関係でチーム発表の場に居合わせることができませんでしたが、チーム名が無事ヱビスと決まり、サポーターさんにれぞさん、ちゅうこさん、なみさんがついてくれました。

チーム名の由来は「時間がなくなったからみんなの共通点ぱっと出したときにみんなヱビスビールが好きだったから」だそうです。

ごめん、僕お酒そんなに好きなわけじゃないんだ…

無事にチームが発表になった日の夜は決起会という名の飲み会がありました。

今回のインターンで得たいことを各々語り、チームとしてはこんな感じの目標が立ちました。

  • DevopsとかCI/CDに興味があるから、テストを頑張りたい
  • Treasure期間で作り終わってはいおしまい、じゃなくて、その先も作っていけるようなものが作りたい
  • UI/UXに興味があるから、できればデザインも頑張りたい(僕)
  • とりたい賞はいっぱいあるけど、やっぱりグランプリを目指したい

目標は高く、グランプリを目指せるような、将来性のあるサービス。

それを目指すためにみんなで決めたことは、「妥協しない」ことでした。きっとこの"妥協しない"があったからこそ、今回いいサービスが作れたんじゃないかなと思います。

そして、地獄みたいなアイデア出しが始まります。

イデア出し前半

まず、僕たちヱビスチームのいっっちばん最初の目標日程を見てみましょう。

f:id:ogijunchang:20200903002704p:plain
一番最初に計画した日程

そして、次に23日(チーム開発残り5日)に変更された目標日程を見てみましょう。

f:id:ogijunchang:20200903002807p:plain
日曜日に改めて計画した日程

おかしいなぁ…8/23までの4日間が消滅しているのはなぜだ…?

はい、アイデア出しで計4日間かかりました。今改めて最初の目標をみると鼻で笑えますね。

去年のレポートとかみても、どこにも「アイデア出しがつらかった」と書かれていないのでみんな記憶をどこかに置いていってしまったのでしょうか?

僕は絶対に忘れたくないし、多くの学びがこの4日間にはあったのでアイデア出しがどれだけ大変だったかをレポートしちゃいます。

f:id:ogijunchang:20200903003549p:plain
一目でわかる、4日間の苦労

イデア出しと言っても、どうすれば価値のあるアイデアが出せるのか? ただ単純に自分たちが使いたいから作る、というだけでは価値のあるプロダクトにはならないとアイデア講師のわーみーさんから教えられ、こんな手順でアイデアを出していくのがいいと言われました。

  1. 最近、社会に起きている「時流」を書き出す

  2. ディスカッションをしながら内容を整理する

  3. 考える領域(市場)を決める

  4. 決めた市場にいるプレイヤーを書き出す

  5. 決めた市場と組み合わせて、面白いプロダクト案が思いつきやすそうな時流を選ぶ

  6. 選んだ時流に対して、今後発生していきそうな事象を書き出していく

  7. 実際に具体的なアイデアを考えていく

文字にすると簡単なんですけどね、これエゲツなく難しいんですよ。

まず時流がわからん。え、運動不足の人が増えたのは時流じゃないの?外出が減ったことも時流じゃないの?

どんなに自分で「これが時流だろう」と思ったことを書いても、「じゃあこれは何が原因で起こったの?」と言われる。

なんやかんやしながらも捻り出した時流たちがこれ。

f:id:ogijunchang:20200903004822p:plain

時流を出したら、次は市場選び。「チーム開発なら自分がユーザーになれそうだし、意見もいっぱい出そうだからチーム開発を選んでみよう」

f:id:ogijunchang:20200903004957p:plain

…え、ちょっとまってなんか全然アイデア出てこないんだけど

まず出てきたアイデア全然チーム開発関係ないし…(今振り返ると) 社会のゆらぎに「電子書籍が増えた」っていうちょっと意味不明なゆらぎを選んでみたことで面白いアイデアがでるかも、と期待したものの、意味不明なアイデアを量産する始末。

ちなみに先に言っておくと、全部でこのサイクルを3回やりました。

「やっぱり時流が足りないからゆらぎがでないんじゃない?」「じゃあちょっと一番最初に戻って時流考え直してようか」

これを3回。最初に見せた時流は完成形で、それまではもっと雑な時流が並んでいました。

市場選びもコロコロ変えながら、だんだんと「市場はオンライン趣味教室が良さそう」というところに落ち着いてきました。

イデア出し後半

オンライン趣味教室に市場を決定した。そこまでは比較的スムーズに進みました。でも地獄はここからでした。

市場が決まってから実際にアイデアを出していき、「SNS上の有名人になにかを教えてもらうときって、聞くのはレベルが高すぎるよね」という話から、だんだんと質問箱のような質問サービスを作ろうか、という流れになります。

f:id:ogijunchang:20200903005945p:plain

このときはまだアイデア出しは1日で終わらせなきゃいけない、早く実装を始めないと置いていかれるという焦りがあり、あまりアイデアとしてのまとまりがないまま決定しようとしていました(今振り返ると)

そしてなみさんから言われます。「ちょっと席外してて今までの流れわからなかったから、説明してもらってもいい?」

(えっと…なんでこういうアイデアになったんだっけ…)

サービスを使うユーザーは具体的にどんな人で、その具体的な人はどんな課題や欲求を持っていて、それに対してどんな解決をするのか。

それをちゃんと言えない限りはいいアイデアとは言えないし、このまま進んでも開発の途中で疑問が出てくる。ここから地獄のような「「「深掘り」」」が始まります。

イデア講師のわーみーさんに相談。「ユーザーの抽象度が高すぎてポイントを絞れないんじゃないかな」ユーザーの抽象度ってなんやねん…

ユーザーを固定してみる。固定したはいいけどユーザーの抽象度がよくわかってないから固定できたのかわかんねえ…

これってシステムで解決できる問題なのか…?

ペルソナってどうやって出せばいいの…?

このままペルソナ一つづつやってたら時間溶けまくらない…?

亀のような進行度で議論が進み、だいぶみんなの頭が沸騰してたと思います。

答えに近づいていっているのかわからない、でも今更もどったら確実に時間がない、でもこれ以上アイデアが出ない。

わーみーさんの「あとほんのちょっとでいいアイデアが出そう」という言葉を信じて、自分はあとちょっと同じテーマでがんばりたいとみんなに伝えました。多分ここら辺がいちばんしんどかった。

f:id:ogijunchang:20200903011549p:plain
これからどうするか?とかいう不穏すぎる見出し

全部立ち返るか、そのままのテーマで進むのかの選択はかなりの分岐点だったと思います。

そのままのテーマで進むことがきまり、具体的なペルソナを出すために身近な人にインタビューをし、改善点を探すもののシステムで改善できるような部分が見当たらない。

そこにれぞさんの「時間軸を変えて考えてみたらいいんじゃない?」という最強の言葉が投下され、今までの地獄が一変します。

f:id:ogijunchang:20200903012222p:plain

まってなんかこれいけそう、みたいな雰囲気が流れ始めて、ついに、とうとう、満を辞して、アイデアが固まります。

ここまで丸4日。どれだけつらかったか、みなさんわかっていただけましたか?

コーディング開始!とはいかない

イデアが無事出たら、うおおおおコード書くぞ!!!とはならないことはTreasure経験した皆さんならわかると思います。

  • イデアに最低限必要な機能のリストアップ
  • APIエンドポイント設計
  • DB設計
  • 技術選定
  • 担当分担 etc...

ここにきて初めて、アイデアを固めることの大切さに気付きました。アイデアがフワフワしているとサービスに必要な機能が定まらないし、そのあとの設計に移れない。

僕たちは事前にばっこりとMVPを固めたことで設計にはそこまで時間をかけずに終わらせることができました。しかし、残された時間はあとたった3日。

妥協しないと決めたものの、時間内に終わらせるためには設計に優先順位をつけて最低限の実装を終わらせなければいけません。

頑張ればここまでいける、というラインを決めて、1日の目標を決めてコーディングに入りました。

爆速コーディング

実際にコードを書き始めてからは、チームメンバーがエゲツないスピードで開発を進めていきました。

外部サービスとの接続、credential管理、各画面とのつなぎ合わせ… 自分が小さなところで詰まっている間に、みんなが各自頑張ってくれました。

一番最後の最後までサービスとして成立するのか(最低限の機能が備わり、動く状態になるのか)が不透明だったものの、最終日前夜の深夜1時ごろにすべてがつながり、本番環境で動作した時は「マジですげえ…」としか言いようがなかったです。

f:id:ogijunchang:20200903022247p:plain
無事完成!

結局最終日の朝6時までスタイルを当てたり実装が続き、なんとか見せられる形になって完成しました。1時間だけ寝て、発表資料を作って発表。

妥協せずに頑張ったかいがあり、無事にグランプリ・UI/UX賞・ニーズ賞というすべての目標を達成することができました。

Treasureで学んだこと

めちゃ長文になってすみません。ここからは個人的にTreasureに参加して、チーム開発を初めてしてみて勉強になったことを書いていきます。

「予定は往々にしてうまくいかないものなので」

これ最初に誰がいったのかもう覚えていないんですが、Treasure期間中に5回以上は言っていると思います。

最初のアイデア出しの日程もそう、設計の段階もそう、予定はつくったところで基本的には延びることになる。

その中でも本当に大切にしなきゃいけないものはなんなのか全体で共有しておかないと、すべてがうまくいかなくなる。

戻ることを提案する勇気

イデア出しを始めて2日目、チーム内に「早くアイデアを決めないといけない」という焦りのある中で、まとまりのないアイデアに対して一旦考え直すことを提案できたことはとてもよかったなと思っています。

そして、今までやってきたことを自分の一声で無に返すのではないかという恐怖がそこにはあること、それでも戻ることが提案できればさらによいアイデアが出せることがわかりました。

チームメンバーに本音で話そう、とここで思えたのもよかったです。

フロントだから、バックエンドのコードは見なくていいわけじゃない

今までフロントエンドエンジニアと自分で名乗ってきたけど、今回Treasureに参加して、フロントエンドはバックエンドがわかった上でこだわれる領域なんだということがわかりました。

APIを叩いてうまくいかないとき、データをバックエンド側に送ったとき、DBやバックエンドのコードを読むことは避けられません。

今までサーバーレスのシステムばっかり触ってきた自分にとっては、このプログラミング初心者みたいな気付きをやっとできました。

人をいい意味で待たずにどんどん自分から実装していく、そんな姿勢を持っているチームメンバーを見てとても意識が高まりました。

チーム開発では指示待ち人間にならない

「指示待ち人間になるなァ!」って中学校の部活でよく言われていたんですが、チーム開発でもそうだと感じました。

APIがバックエンド側でできておらず、データが取れない状態だったとしてもフロントエンド側で理想のデータを作って表示させることくらいはできる。

個人個人が最速の動きができていれば、時間がなくても実装はできるんだなぁと感じました。

自分の得意な領域

開発の面ではチームメンバーがすごくてあまり自分の得意というものが見つけられたかは曖昧ですが、「チームで開発をする」という点では、自分は他の人の意見を聞きながらもそれをまとめて自分で次に進もうとすることが得意なんだなと気づくことができました。

これはきっと誰しもが持っているものではないし、これにさらに技術力がつけば最強のエンジニアになれそう、と自分で勝手に思ってます。

みんなで一つのものに向かって全力で取り組むのはやっぱり楽しい

チーム開発の醍醐味ですね。僕は今までチーム開発と言えるものをやったことがなかったので、本当にいい経験になりました。

僕ももっと勉強して、みんなと肩を並べるくらいの技術力を持って、今回作ったサービスの続きを是非つくりたいと思っています。

総括

いかがだったでしょうか。他の方が書くようなレポートというよりかは感想文みたいな感じになってしまいましたが、この記事を見て少しでもTreasureに興味をもってくれたら、是非参加してみて欲しいです。

イデア出しではとても苦労しましたが、その分得られるものがとっても多くて、この1ヶ月でだいぶ成長することができたと思っています。

あと、僕の周りには高い技術を持った同年代の人が少な(特に研究室にはいない)かったので、参加するだけで刺激になりました。チームメンバーのみんな、ついていくことしかできなくてごめん。

僕は学会や部活の大会があるため他のインターンシップには参加予定はないので比較することはできませんが、Treasureは得るものだらけの間違いなくおすすめのインターンです。チームメンバーのみんな、サポーターのみなさん、一緒にTreasureに参加してくれたみんな、ありがとう!これからも頑張ります!

f:id:ogijunchang:20200903022057j:plain
俺のスターダムはこっから始まるんや!

サマーインターン選考奮闘記

こんにちは、6月にブログ更新したいな…と思っていたけど授業が忙しすぎて結局更新できなかったじゅぎのんです。

ブログに書きたい内容は山ほどあるんですが、如何せん時間がない!中途半端な文量だったり内容の薄い記事は書きたくないので、これからもできるだけ時間を見つけて書ければいいな。

さて、今回の記事は表題の通り「サマーインターン選考奮闘記」です。この時期になるとエンジニア志望の22卒はそわそわしているんじゃないでしょうか?

割とほとんどの名の知れた会社は選考が終わっているものの、まだ選考中やエントリーができる会社も多くあるし、まだ間に合う!

22卒だけじゃなくてそれ以降に就職をする人にも備忘録としてまとめます。

応募しようとしたきっかけ

まず、僕は学部3年のころからとあるスタートアップの会社でフロントエンド開発者として長期インターンに採用されていて、今も仕事は続けています(だんだん高度になってきた)。

なのでそもそもサマーインターン自体に関してはそこまで関心がなかったんですが、応募しよう、となったきっかけはサポーターズというサービスを知ったことでした。

corp.supporterz.jp

じゃあサポーターズをどこで知ったのかという話なんですが、それは研究室の先輩のおすすめでした。

卒研発表が終わって春休みに入り、一応進捗は出しておこうということで同期はいないけど先輩と一緒に研究室で進捗発表とかをやっていた時期があり、そのときに現M2の先輩と話しているときにおすすめされました。

最初は「なんか胡散臭そうなサービスだなぁ」みたいな感じに思ってたんですが、とりあえずプロフィール登録だけは別にしても損じゃないし一応しとくか、程度のノリで登録しました。

10社連続面談

サポーターズに登録したあと、正直そこから何したらいいのかわかんなかったので放置してたんですが、割とイベントやります!みたいなメールはちょくちょく来ていました。

そのとき偶然目についたのがこれでした。

f:id:ogijunchang:20200712210914p:plain

急に呼び捨てにされたメールが届いたので、最初「は?」って思ってたんですがよく読んでみると特別招待らしく、これ参加すると追加で5000円あげます!って言われていました。

イベントの内容は企業10社と30分ずつで連続に面談して、今後の就活に生かそう!あわよくば夏のインターンの選考スキップしよう!みたいな感じです。

昼前から夜ごろまでかかるイベントでしたが、15kもらえるんだったら時給換算してもそこまで損じゃないなー、という感じだったので受けてみることにしました。ポチッ。

このメールを見たのが3月末で、4月中旬にイベントがありました。イベントでは最初に各企業の会社説明と夏のインターンに関する情報を聞き、その後一人一人別れて面談が始まるという感じです。

そのときのメモ書きはこんな感じ。

f:id:ogijunchang:20200712211531p:plain
メモ書きのほんの一部

面談では、軽い自己紹介で今まで自分が何をやってきたのか概要に触れ、今後どうしていった方がいいのかとか、その会社のいいところとかを聞いていきました。

自分は学部3年からインターンをやっていますが、実際のところ真剣にプロダクト開発をしたのはReact Nativeによるネイティブアプリ開発だけだったので、そこを重点的に話し+今(面接時点)Reactでポートフォリオを作っています、という話をしました。

最初面談と聞いていたので、どこの企業も自分に対して柔らかい物言いをしてくれるんだろうな、とか思っていたんですがぜんぜんそんなことなく、割と辛辣な意見も多く来ました。

自分の主観なのでわからないですが、正直他の参加者よりかは圧倒的に自分の開発力は低く、このままだと置いていかれそうだな、と思ったのが本音です。

ちなみに一番エンジニアとしてきつかったのは、A社からの「決してじゅぎのんくんに技術力がないといっているわけではないからね」と、C社の「じゅぎのんくんはいい意味でエンジニアっぽくないので〜〜〜」でした。

どちらの企業さんもネガティブな言葉ではないのは理解できているんですが、やっぱり自分はまだまだだなぁと感じ、そこで「今のままでインターンやっていてもあんまり成長できないのでは?」と思ったことがサマーインターンに応募しようとしたきっかけになるかな。

ちなみに、そのイベントでは企業さんから面談後にフィードバックで数行の文章と一番よかった点みたいなので4つくらいのカテゴリーにわかれて評価されるんですが、

f:id:ogijunchang:20200712212512p:plain

こんな感じでした。

あと、自分が他の参加者に比べて最低レベルみたいなことを書いていましたが、一応このイベントは選考があったらしく、56人くらいから18人?選ばれていたみたいです。機会をくれたサポーターズに感謝。

サマーインターン選考スタート

無事イベントが終わり、今度は各企業のサマーインターンの選考フェーズに入っていきます。

結果から言うと、応募したのは5社、書類選考落ちが1社、面談で選考落ちが2社、自主辞退が1社、そして合格が1社でした。

予定的に自分は1社インターンに参加するのが限界で、もともとから1社受かった場合は他の選考を蹴ろうと思っていたので、自主辞退はその1社です。

選考が終わった企業に関してはもう大丈夫だと思うので、具体的にどの企業でどんなことが聞かれたのか覚えてるだけ書いておきます。

1社目 Sansan株式会社

Sansan株式会社は連続面談を受けたときにもとても印象がよく、インターンがあれば是非受けてみたいなと思っていました。

面談後にイベントに特別招待され、LT会にも参加させていただき、社員の方がどんな開発フローを採用しているのかとか、今の仕事をやっている経緯だとかを説明してくれました。

インターンの内容は基本的にバックエンド寄りで、それに付随してあるといい知識としてReactやSwift,Kotlinなど、と言う感じでした。

自分はバックエンドをその時はチュートリアルをやったくらいで正直知識が全くない状態だったので、それでも選考に進んで大丈夫なのかLT会のときに伺ったところ、キャッチアップが間に合えば問題ないとのことだったので選考に入ることにしました。

印象としては、Sansanが一番エントリーシートが長かったです。他の企業はESスキップでいきなり面談のところも多かったので。

書類選考を無事に通り、次に面談となり、面談では一人のエンジニアの方とお話しました。

その方は僕の通っている電気通信大学の学部卒で、結構話しやすくてよかったです。

でも、やっぱりバックエンドの知識がほぼ0に加え、インターンができる期間もそこまで長くない(自分の希望としては2週間だった)ので、もしかしたら厳しいかもね、という話をして終わりました。

Sansanの面談はそこまで技術的な面を聞かれるわけではなく、インターンに参加できる日程とかキャッチアップできそうか、みたいな話中心でした(あと自分がめちゃ質問してた)。

案の定落ちました。

2社目 株式会社DeNA

もともとDeNAは受ける予定がなかったんですが、部活の練習をしているときに急に電話がかかってきて、なんだと思ったらDeNAの人事の方で選考受けませんか、という内容でした。

受けるだけならタダだしと思って快諾、その週末に面談をしました。

結論、DeNAが一番技術的に強そうで自分には手が届きそうにありませんでした。

今まで面談しかやってこなかったので、とくに聞かれたことスラスラ答えれば問題ないでしょ、と言うイメージで面接に挑んだんですが、

  • 今開発しているプロダクトで大変だった場面、それをどうやって切り抜けたのか?
  • 今開発しているプロダクトはなぜその言語を使ったのか?技術選定のポイントは?
  • 自分で問題解決に向けて具体的にやったことは?
  • 今注目しているOSSは?なぜそのOSSに注目しているの?
  • もしインターンに採用されたらどんなことを得て終わりたい?

基本的にこんな感じのことを聞かれ、OSSは「えっ…とぉ……AR.jsですかね…僕は近い未来スマホってなくなると思っててー、ARの技術って今すごく注目されているじゃないですか…もし眼鏡型デバイスとかになったとき、ARは今より大事なものになると思うんですよ…AR.jsはウェブでARが表現できるんですけど、まだ発展途上な部分も多くて注目してます」

という切り抜け方をしました。スマホがなくなるとはあまり思っていません。

DeNAの面接が一番緊張しました。でもこれらの質問がうまく答えられるくらい開発をいっぱいすれば、DeNAも夢じゃないのかもな、という若干の希望も持てたので面接してよかったです。

まあ落ちました。

3社目 DMM.com

書類選考で落ちました。

4社目 レアゾン・ホールディングス

面談イベントのときに、ここの方にじゅぎのんさんはうちにぴったりだと思う、ということで、React Nativeでのアプリ開発を唯一10社のなかでやっている企業がレアゾンHDでした。

React Nativeのつらいところとか、逆にコストが低くていいこととか共感する話ができてとてもよく、インターンの選考もメールで進んでいきました。

その後人事の方と面談があり、そこで「今選考中の他のインターンにいきたかったらそっちを優先してもらってもかまわない、うちは時期にかかわらずいつでも受け付けているので他の企業にいった方がいい場合もある」という話をされ、ちょうどそのとき選考中(合格した企業)だったので、一旦止めておいてもらいました。

その後、無事に別の企業の方で合格がいただけたのでそこで連絡をして夏期間でのインターンは辞退、ということになりました。

人事の方との面接は技術的なことは全く聞かれず、日程のことや業務内容のこととかのみのお話だったのでスムーズに進んでいた印象です。

5社目 株式会社VOYAGE GROUP

こちらの企業はイベント後にES提出が免除になる期間があり、そこで選考に混ざろうかな〜〜とか思って他の企業の選考に頭を回していたら、いつの間にかES免除の期間が終わっており、やべえ!!と思いながらもワンチャンこれメールすれば免除で大丈夫じゃないか?と思い、期限がすぎた翌日にメールでオナシャス!と送ったところ、快くES免除を受け付けてくれました(この時点で選考は本気で挑むと決めた)。

選考としてはエンジニアの方・人事の方と面談があり、その後適性テスト?アンケート的なものに答え、その後参加の可否を聞かれると同時に合格の通知が渡されました。

エンジニアの方はとても柔らかい感じの方(DeNAとかに比べると)で、僕が今まで作ってきたものに対して的確なアドバイスをしてくれました。

個人的には面談イベント前から作っていたポートフォリオサイトが完成していたことがおおきかったと思います。

1人目のエンジニアの方とは長期インターンでやってきた内容(React Nativeでアプリ開発をしてきたこと)を中心に、難しかったことや大変だったこと、よかったことなどを聞かれ、flutterというのもあるからみてみるといいよ、というアドバイスをいただきました。お恥ずかしながら自分はflutterというものをそのときまで知りませんでした。

2人目のエンジニアの方は、1人目の人と違う話をしていいよ、といっていたのでせっかくならと思いポートフォリオサイトを一緒にみながら自己紹介をしました。そのとき、自分はES免除だったものの多分サポーターズの自己紹介欄のところがまんまESとして渡されていて、当時開発中だったURLを向こうに送っていて、面談をやるまでは向こうのURLでは真っ白の画面が表示されていたっぽく、

「あ、ちゃんと表示されるように完成しているんだね!もしなにかしらエラーで表示できていなかったら今ここでペアプログラミングしようと思ってたんだよ」

と言われました。それはそれで面白かったかもしれないけど、完成したものを見せることができてよかったです(ポートフォリオに関してもブログ書いていないので書きたい)。

あと、自分が採用される決め手になったのか?と思う点は、「今まである程度複雑な開発をしてきているものの、チーム開発を経験したことがない」という点です。

ここのインターンでは講義と開発に別れていて、開発ではチーム開発が行われます。なので、結構チーム開発の経験が聞かれるんですが僕はそれがありませんでした。

そこを逆にアピールして、「このインターンだと今まで経験できなかったチーム開発が経験できるのでここがいい」といったところ、なるほどね〜、という感じで納得してもらえました。

2名のエンジニアの方と面談した後は人事の方と面接がありました。今までの他の企業とは少し違った質問をされました。例えば

  • 今までで一番情熱を注いだものは?
  • 今一番はまっているものは?
  • 他人からみた時、あなたの短所はなんですか?
  • なにかのリーダーになって動いたことはありますか?

など。幸いにも僕は陸上競技部で主将をやっていたし、陸上に情熱を割と注いでいたし、プリパラにはまっていたし(これはガチで人事にプリパラにはまってるんですよっていった)、比較的スラスラと答えられてこっちも楽しかったです。

プリパラの話をしたとき、あっやべぇこれはドン引きされたか!?と思いましたが、「え〜!すごい、そんな深いストーリーなんですね!みたくなりました!」(お世辞)といってもらえて嬉しかったです。

その後、適性テストというかなんか心理テストみたいな紙に記入してください!みたいなのがきて、その数日後に電話がかかってきました。

日程に確実に参加できるか確認された後、ではじゅぎのんさん、合格です!とテンション高めで言われ、僕もテンション高めでまじっすか!ありがとうございます!と返しました。

そのあと数時間(いや数日)はテンション高めでした。

総括

そんな感じで今にいたります。ということで、8月はサマーインターンに参加してきます!そこでは自分がまだ触れたことのない言語やチーム開発が経験できるので、確実に自分の糧になると思っています。

もしコロナウイルスのこの状況じゃなかったら、部活で夏のインターンには行けていませんでした。そのことを考えると、ポートフォリオを作れたことやインターンの選考に入れたこと、採用されたことはやっぱり巡り合わせだなと感じます。

今できることを全力でやっていくので、部活も研究も仕事も一切手を抜かずにこれからも頑張ります!

インターンが終わった後はきっと報告記事があがるので、乞うご期待です。長くなりましたが、応援よろしくお願いします!

f:id:ogijunchang:20200712222014j:plain
楽しみですわ〜〜!

【くどすぎる解説】深さ優先探索・幅優先探索【python】

こんにちは!お久しぶりです、毎月月末になると「あっ、ブログそろそろ更新しないと…」と思いギリギリで更新しているじゅぎのんです。

最近(4月から)AtCoderを始め、現在もう少しで茶色に到達できそうな僕です。

就活を始めるまでにはある程度の色に、アルゴリズムについては一通り大丈夫と言えるようになりたい!

AtCoder強者の友人達にいろいろと教えてもらいながら頑張っています(友人たち本当にありがとう)。

友人達の解説はすごくわかりやすいのに、ネットで調べるとあまりにも意味不明な解説とコードが多い(自分の読解力が足りなさすぎる)ので、

今回から【くどすぎる解説】シリーズということで完全に自分のための備忘録として復習がてらいろんなアルゴリズムのコードをクッソくどい解説文を入れながら書いていきたいと思います。

使用言語はpythonです。おそらく強者から見ると「なんでそこそんなコードで実装してんの」とか思われるかもしれないですが自分の備忘録なので指摘するなら優しくしてください(心が弱いので)。

第一回の解説は深さ優先探索幅優先探索です。

深さ優先探索

DFSですね。くどすぎると言っても深さ優先探索がどんなものかはさすがに知っているので割愛します。深さを優先して探索するやつです。

具体的な問題だと、AtCoder Typical Contest 001 A - 深さ優先探索

atcoder.jp

ですね。これ解説付きなのでこれ見ろよって話なんですが(ていうかこっちの方が多分わかりやすい)。

入力

4 5
s####
....#
#####
#...g

"4"が縦の長さ、"5"が横の長さ。"s"はスタートで、"g"はゴール。"#"は壁で進むことができず、"."は道で進むことができます。道を通ってsからgまで行くことができれば"Yes"を返し、gまでたどり着けない場合は"No"を返します。

回答と解説

import sys
sys.setrecursionlimit(10 ** 9)
HW = input().split()
H,W = int(HW[0]), int(HW[1])
S = [input() for _ in range(H)]
 
reached = [[False] * W for i in range(H)]
 
def search(x,y):
    #迷路の外か壁の場合は何もしない
    if(x < 0 or H <= x or y < 0 or W <= y or S[x][y] == "#"):
        return
    #以前に到達していたら何もしない
    if(reached[x][y]):
        return
    
    #到達した
    reached[x][y] = True
    
    #4方向を試す
    search(x+1,y)
    search(x-1,y)
    search(x,y+1)
    search(x,y-1)

for i in range(H):
    for j in range(W):
        if(S[i][j] == "s"):
            StartX = i
            StartY = j
        if(S[i][j] == "g"):
            GoalX = i
            GoalY = j
 
search(StartX,StartY)
if(reached[GoalX][GoalY] == True):
    print("Yes")
else:
    print("No")

まず

import sys
sys.setrecursionlimit(10 ** 9)

これですね。深さ優先探索をするときは再帰を使うんですが、なんかpythonだと再帰の回数が多くなるとエラーがでてしまうようで、それを回避するためにこのコードを入れています。sys.setrecursionlimit()再帰回数の上限を変更することができます。まあとりあえず10の9乗にしとけば大丈夫だろ…ってやったら通りました。ここの数字は特に何も考えてません。

HW = input().split()
H,W = int(HW[0]), int(HW[1])
S = [input() for _ in range(H)]

reached = [[False] * W for i in range(H)]

入力です。"H"を縦、"W"を横の長さ。Sは二次元配列でH行読み込んでます。 reachedは探索を終えたか終えていないかをboolでいれておく二次元配列。

一旦関数の def search(x,y): を飛ばして、実行順で進んでいきます。

for i in range(H):
    for j in range(W):
        if(S[i][j] == "s"):
            StartX = i
            StartY = j
        if(S[i][j] == "g"):
            GoalX = i
            GoalY = j

ここは単純にスタートの位置とゴールの位置を見つけるためのコードです。"i"が行、"j"が列で、二次元配列Sに"s"があればStartX,Yにi,jを入れる。同様に"g"があればGoalX.Yにi,jを入れる。

search(StartX,StartY) ここでsearch関数が呼び出され、先ほど飛ばした部分に入ります。

def search(x,y):
    #迷路の外か壁の場合は何もしない
    if(x < 0 or H <= x or y < 0 or W <= y or S[x][y] == "#"):
        return

xにはStartXが、yにはStartYが入ってきます。コメントに書いてありますがここのif文は迷路の外か壁かを判定しています。

  • 「迷路の外」… x < 0 or H <= x or y < 0 or W <= y
  • 「壁」… S[x][y] == "#"

ですね。ここで自分でもは?ってなったのが、xは縦軸、yは横軸となっている部分です。自分で実装してて意味わからなくなるのほんとバカなんですが、x軸は横でy軸が縦だから H <= y or W <= x じゃね?って思ってしまったんですが、さきほどのStartX,Yを見ると

"i"が行、"j"が列で、二次元配列Sに"s"があればStartX,Yにi,jを入れる。

としているのでxが縦でyが横で合っていますね。縦横とxyを合わせたい場合はStartXにj,StartYにiを入れるのがいいのかも(それだとこっちのコードがは?ってなってしまいそうですが)。

続きます。

 #以前に到達していたら何もしない
    if(reached[x][y]):
        return

 #到達した
    reached[x][y] = True

コメントの通りですね。reachedは探索を終えたか終えていないかをboolでいれておく二次元配列なので、一番最初は全部Falseです。探索を行った部分は後ろのコードでTrueになるので、以前に到達していたらreturnされて終わりです。

#4方向を試す
    search(x+1,y)
    search(x-1,y)
    search(x,y+1)
    search(x,y-1)

4方向を試します。ここでやっていることは、例えば"s"が2行目3列目にあったとすると、

  • 3行目3列目を探す
  • 1行目3列目を探す
  • 2行目4列目を探す
  • 2行目2列目を探す

ですね。ここの順番は特に関係ありません(今回の問題は)。再帰なのでここで4つのルートに分岐して、また分岐した先で4つのルートに分岐して…と続きます。

ただ、再帰元の場所は少なくともすでに探索済みなので、reachedにTrueが入っておりなにも起こらないので、実質3つの分岐ということになります。

これで関数部分終了。最後に、

if(reached[GoalX][GoalY] == True):
    print("Yes")
else:
    print("No")

"g"が書いてあった部分がTrueになっていれば、探索し終わった=そこまで進むことができるということになり、"Yes"を返す。もしFalseだったら"No"を返す。

簡単ですね。さすがに書いてて「くどすぎるだろ…」と思いました。まだまだくどくいきます。

幅優先探索

BFSですね。くどすぎると言っても幅優先探索がどんなものかはさすがに知っているので割愛します。同じ階層を優先して探索するやつです。

具体的な問題だと、AtCoder Beginner Contest 168 D - ..(Double Dots)が最近で幅優先を使いました。

atcoder.jp

入力

4 4
1 2
2 3
3 4
4 2

一行目の左側の"4"が部屋の数、右側の"4"が通路の数。二行目以降は通路が繋ぐ部屋を指します。

つまり、この入力だと

f:id:ogijunchang:20200530204135p:plain

こうなりますね。そして、部屋1以外のすべての部屋から、最短で部屋1に行く時、通るべき部屋の番号を各部屋に道しるべとして置きます。

つまり、上の入力例でいうと、

  • 部屋2から1に行く時 : 直接1に行けるから、"1"を置く。
  • 部屋3から1に行く時 : 3 -> 2 -> 1と行くのが最短なので、"2"を置く。
  • 部屋4から1に行く時 : 4 -> 2 -> 1と行くのが最短なので、"2"を置く。

よって、出力は

Yes
1
2
2

となります(1にたどり着ける場合はYesを出力)。

回答と解説

N, M = map(int, input().split())
link = [[] for i in range(N)]
for i in range(M):
    A, B = map(int, input().split())
    link[A-1].append(B-1)
    link[B-1].append(A-1)
visited = [False for i in range(N)]
result = [0] * N
Q = [0]
visited[0] = True
#Qに要素がなくなるまで
while Q:
    #一番上の要素をpop
    v = Q.pop(0)
    for i in link[v]:
        if visited[i] == False:
            visited[i] = True
            result[i] = v
            Q.append(i)
print("Yes")
for i in range(1, N):
    print(result[i] + 1)
N, M = map(int, input().split())

最初の行の入力。Nは部屋の数、Mは道の数。

link = [[] for i in range(N)]

この配列はすぐ下で解説します。

for i in range(M):
    A, B = map(int, input().split())
    link[A-1].append(B-1)
    link[B-1].append(A-1)

ここでは入力と操作を一度に行っています。

M行を1行ずつfor文で読み込んでいきながら、入力の左の数字と右の数字をそれぞれA,Bにいれます。

先ほど作成したlink配列の、A-1番に要素B-1を、B-1番に要素A-1をいれています。

つまりどういうことかというと、道によって繋がっている部屋を添字番号によって管理しているということです(説明が下手)。

上の入力例では、link配列はこのようになります。

link = [[1],[0],[1,3],[1,2]]

  • 部屋1(0番)は部屋2(1番)とのみ繋がっているので、link[0]には1が入る
  • 部屋2(1番)は部屋1(0番)とのみ繋がっているので、link[1]には0が入る
  • 部屋3(2番)は部屋2(1番)と部屋4(3番)に繋がっているので、link[2]には1と3が入る
  • 部屋4(3番)は部屋2(1番)と部屋3(2番)に繋がっているので、link[3]には1と2が入る

といった感じです。番号が-1になっているのは単純に配列の添字が0から始まるからです。

visited = [False for i in range(N)]
result = [0] * N

visitedは深さ優先探索の時と同じように、すでに探索し終わった場所をboolで保存しておく配列です。

resultは今回の出力(各部屋に置く道しるべの数)を保存しておく配列です。問題が変わればこの部分も変わります。

Q = [0]
visited[0] = True

ここから幅優先探索のスタートです。まず、QはFIFOの動作をするいわゆる「キュー」で、探索する添字番号を指します。最初は0番(部屋1)からなので、Qに0をいれます。

visitedは先ほど言ったようにすでに探索した場所の情報を保存するもの。現在0番(部屋1)を探索したので、visited[0]にTrueをいれます。

#Qに要素がなくなるまで
while Q:
    #一番上の要素をpop
    v = Q.pop(0)

if文に配列を入れると、配列に要素がある場合はtrueを返すことを利用してQに要素がなくなるまでのループとして while Q を使用します。

pop(x)を使うと、xにある要素をpopすることができます。キューなので、先頭の要素を出し、vに代入します。ここでは、Q=0しか入っていないので0がvに代入されます。

 for i in link[v]:
        if visited[i] == False:
            visited[i] = True
            result[i] = v
            Q.append(i)

v=0の状態で、for文に入ります。link[0]には、部屋1(番号0)に繋がっている部屋の番号([1])が入っているはずです。よって、iには1が入ります。

次に、探索を行ったか判定します。今回はvisited[0]以外はFalseになっているはずなので、if文の中に入ります。

visited[i] = True で探索済みとマーク。

result[i] = v とすることで、「部屋番号iから直接繋がっている部屋番号はv」という情報をいれることができます。つまり、「部屋2(1番)から直接繋がっているのは部屋1(0番)」ということになります。

Q.append(i) で、現在空になっているQ(キュー)にi(1)をappendします。こうすることで、今度は部屋2(1番)から直接繋がっている部屋を探索することができます。

ここまでくるとわかると思いますが、「直接繋がっている部屋」ごとに探索が行われているということは、各階層ごとに探索が行われるということです。

各階層ごとに探索ができるということは、探索する部屋の深さを知ることができるということです。こんな感じに書けば階層がわかります。

result = [-1] * N
result[0] = 0
#Qに要素がなくなるまで
while Q:
    #一番上の要素をpop
    v = Q.pop(0)
    for i in link[v]:
        if result[i] == -1:
            result[i] = result[v] + 1
            Q.append(i)

サイズNの配列すべてに-1をいれたものをresultとし、先ほどのvisitedと同じ役目を果たすようにします。

もし探索されていない(-1)だったら、そこにresult[v]+1を入れることで、先ほど探索された階層+1が現在の階層のノードに入ることになり、深さを調べることができます。

print("Yes")
for i in range(1, N):
    print(result[i] + 1)

そして、最後に結果を出力します。問題文には「どの2部屋間も、通路をいくつか通って行き来できます」とあるので、道しるべが置けない部屋というのは存在しないので必ずYesを出力します。

最後に道しるべをいれたresult配列をprintすることで回答できます。

おわりに

いかがだったでしょうか。(というかここまで読んでくれる人はいるんでしょうか) 文字で起こすとやっぱり自分で理解できていない部分をもう一回確認できるのでとてもいいですね。これからもちょくちょくくどすぎる解説シリーズを更新してみようかなと思います。明日のABC頑張るぞ!

React Native v0.62.2でGoogle AdMobを設定する

Qiitaにも同様の内容の記事を載せています。LGTMヨロシク

qiita.com

AdMob難しすぎだろ問題

3月末くらいに、じゃあ次のタスクはということで渡されたのが「React Nativeで作成しているアプリにバナー広告を出したい」というものでした。とっても実務的ですね。

これを参考に進めてくれと言われ渡されたページを読んでも 何も理解できない 。大抵こういう全く触ったこともないものに触れる時は何も理解できなくて最初の数時間は本当につらいんですよね。。

React Nativeあるあるだと思うんですが、とりあえず新しい課題ができたら「React Native ○○」でググって特になにも出てこずに結局わからない。

今回は幸いいくつかの手段で実装している記事が存在したので、そちらを参考にしながら進めていました。

しかし、如何せんメジャーバージョンが未だリリースされていないReact Native。

バージョン0.5xと0.6xで全然挙動が違ったり、エラーコードがえぐい量きたりもう大変です。そろそろメジャーアップデートきてくれない…?

最初にv0.59.1で実装を進めており、iOSの方は無事表示することができました。

やったー!と思ったのもつかの間、長らくシミュレーターを起動していなかったAndroidを起動させようとするも、つかない。

エラーメッセージをとりあえず全部超スゴイ先輩に見せると、

Android studioのgradleのバージョンが上がってしまい、依存関係がおかしくなって起動しなくなっている。 ここから一個ずつ依存関係をみていくのは時間がかかるから、新しいReact Nativeのプロジェクトを作り直して設定とかコンポーネントを全部写した方がいい

と言われてしまいました。

そんなこんなで広告を追加しようとしたらReact Nativeのバージョンをあげることになっていたんですが、0.59.1から最新の0.62.2にあげるのにどれだけ苦労したか。永遠に現れる真っ赤な画面をため息つきながら直していく作業は全然楽しくなかったです。

なんとか中身を写し終えて、iPhoneAndroid両方で起動が確認できてから、いざAdMobに取り掛かる。

が、しかし…!

最初と同じ方法でやっても実装できず。ここで完全にやる気がなくなって他のことをやり始めました。(それが先週)

そして週を跨いだ今日、やる気が戻ってきてもう一回みてみるか…とちょいちょいっとやってみたら無事実装できました。

その方法がこれだ!!

React NativeにGoogle AdMobを導入する際、情報が古かったり同様の方法でやってもうまくいかないことが多かったので、詳細に導入方法をまとめてみます。

Google AdMobを利用する際には現時点で2つ方法があります。

  • react-native-admobを利用する方法
  • react-native-firebaseを利用する方法

今回はreact-native-admobを利用する方法について説明します。

導入した環境

React Native 0.62.2(2020年4月時点最新)

iOS 13.3 CocoaPods

Android 6.0

実装した広告: バナー広告

iOS

react-native-admobのREADMEと同様に進んでいきます。

  • npm or yarnでreact-native-admobをインストール

npm i --save react-native-admob@next もしくは yarn add react-native-admob@nextでインストールします。

今回はyarnを使いました(npmの方だとうまくいかない時があったので)

Google AdMob公式を参考に進んでいきます。

事前にAdMobアカウントを作成・アプリ登録を済ませたあと、対象のアプリケーションにMobile Ads SDKをインポートします。

pod 'Google-Mobile-Ads-SDK

iosファイルの中にあるPodfileに書き込み、

pod install --repo-update

  • Info.plistの更新

iosファイルの中にあるInfo.plistに GADApplicationIdentifier キーとAdMobアプリIDの文字列値を追加します。

<key>GADApplicationIdentifier</key>
<string>ca-app-pub- 
3940256099942544~1458002511</string>
  • AppDelegate.mの変更
//新しく追加するコード
@import GoogleMobileAds;

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application
       didFinishLaunchingWithOptions: (NSDictionary *)launchOptions {
       //新しく追加するコード
       [[GADMobileAds sharedInstance] startWithCompletionHandler:nil];
       return YES;
   }

@end

自分の場合、すでに何行かコードが書いてありましたが、 @implementation AppDelegate の直上に @import GoogleMobileAds; を入れ、

UIViewController *rootViewController = [UIViewController new];
//ここに新しく追加
[[GADMobileAds sharedInstance] startWithCompletionHandler:nil];
rootViewController.view = rootView;

このように追加しました。

import { AdMobBanner } from 'react-native-admob'; とし、下のように配置しました。

render() {
   return (
   <AdMobBanner
      adSize="fullBanner"
      adUnitID="AdMobでアプリを登録した時に表示されるAppID"
      testDevices={[AdMobBanner.simulatorId]}
      onAdFailedToLoad={(error) => console.error(error)}
    />
...

iOS-Admob.png

このようにテスト広告が表示されれば成功です。

Android

  • npm or yarnでreact-native-admobをインストール

iOSと同様にインストールします。

android/build.gradleの中に

allprojects {
    repositories {
        google()
    }
}

があることを確認して、今度はandroid/app/build.gradleの中に以下のコードを追加します。

dependencies {
    //追加
    implementation 'com.google.android.gms:play-services-ads:19.1.0'
}

次に、android/src/main/AndroidManifest.xmlに以下のようにコードを追加します。

<manifest>
<application>
    <!-- Sample AdMob App ID: ca-app-pub-3940256099942544~3347511713 -->
    <!-- 追加 -->
    <meta-data
        android:name="com.google.android.gms.ads.APPLICATION_ID"
        android:value="ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy"/>
</application>
</manifest>

GoogleMobileAds公式ページにはまだ下に手順が書かれていますが、追加するのはここまでです。

  • react-native-admob/android/build.gradleのSDKバージョンを固定する

上記の方法でアプリをビルドしてみたものの失敗したので、解決策を探していたところこの方法で解決できました。

node_modules/react-native-admob/android/build.gradleを見ると、以下のように記述されていると思います。

...
dependencies {
    implementation 'com.facebook.react:react-native:+'
    implementation 'com.google.android.gms:play-services-ads:+'
}

こちらの下の段、admobのSDKが更新された影響で古いAPIと互換性が無いことでビルドが失敗していたようです。(参考)

現在の最新のadmobのSDKバージョンは19.1.0のようなので、以下のように書き直します。

implementation 'com.google.android.gms:play-services-ads:19.1.0'

iOSと同様の方法で配置します。

Android-admob.png

このように表示されれば成功です!

おわりに

ぱっと見そこまで複雑ではありませんが、自分はなぜか2週間くらい広告を表示させるのに手間取ってしまいました…

npmでreact-native-admobをインストールしたときに同時に古いバージョンのReactがインストールされてしまったり、podfileに記述することでライブラリをインストールしようとして失敗したり。

React Nativeで実装している記事が少なく、かつバージョンが変わるのがとても早いため、今回は備忘録としてまとめました。

現時点で最新のReact Nativeで導入する今回の記事が少しでもお役に立てれば幸いです。

電通大を卒業して電通大院に進学します

お久しぶりです、一応一月に一記事は更新しておきたいと思っているじゅぎのんです。

世間はコロナウイルスで色々と騒がしいですが、それと共に卒業シーズンでもあります。

前回の記事の後、無事卒論の修正が終わり、発表を無事終わらせることができ、卒業が確定しました。

ゴミみたいな同期の話は一旦おいておき、ひとまず電通大をストレートで卒業できることが決まり、とても嬉しい気持ちです。せっかくなので、2016年の入学から卒業までの4年間を学年ごとに大まかに振り返ってみようかなと思います。

2016年 学域1年生

学期毎GPA 前期: 2.5294 後期: 2.0870

某都立高校を卒業して入学。漠然とプログラミングの勉強がしたいと思いながらも特に授業以外のことをやることはなかった。

というかむしろ授業でそういうことするから自分では勉強しなくていいでしょ、という感じ。

入学前から陸上競技部に顔を出していた。入学してから新しいことしたいと思ってストリートダンス同好会に入ってみた。

1年生はとにかく授業が忙しすぎて他のことをやる余裕がなかった(今思うと一番余裕があったのでは?と思うが、当時はそう思っていた)。

入学祝いは一瞬でなくなり、アルバイトを始めるも最初の職場は1ヶ月で挫折。そこから秋まで派遣で食いつないでいた。

金がないと余裕がなくなり、余裕がないと成績が下がる。理系にあるまじき数学のできなさで後期は良と可を量産していた。

2017年 学域2年生 I類

学期毎GPA 前期: 2.0000 後期: 2.6957

1年生の成績でなんとかI類に進類することが決まり、ひとまずIII類に行かなくて大丈夫になったこと、自分の勉強したいことが学べそうで一安心した。

特に1年生のころと変わらないスケジュールを過ごしていた。授業をテキトーにうけて、バイトをするか部活に行ってた。

前期で遂に学期GPAが2.0000になってしまい、このままいくとさすがに成績がやばいことになると思い後期は割と授業を真面目に聞いて頑張った。

前期の授業であった「プログラミング通論」「複素関数論」「確率論」ここらへんは本当にちゃんとやっておけばよかったと後悔している。

プログラミングのことについては相変わらず特になにもしていない状態。部活が楽しい、ストダンも楽しい、バイトが大変(1年生の頃の借金返済もしていたため)。

プログラミングを使うような課題は友達にかなり質問しながら進めていた。あの時の友達、ありがとう。

2018年 学域3年生 I類メディア情報学

学期毎GPA 前期: 2.6250 後期: 2.6842

3年生になって専門的な科目が多くなってきて、勉強に対する意欲も上がり始める。

アルバイトも二年目に突入し、特に大変な思いをすることがなくなった(身体的には大変だった)。

3年生までの成績で大学院の推薦が決まると聞いて、3年生頑張ればワンチャンあるのでは?と思い3年生は勉強比較的頑張ったと思う。

ストダンにはあまり行かなくなり、陸上部に集中するようになる。おかげで陸上部では関東インカレに出場して賞をとれた。

後期の「ソフトウェア工学」でアルバイトを辞めてインターンを始めることを決意、その数週間でインターンの面接に行きインターン先を決定。

プログラミングを真剣にやり出したのは実質ここから。

2019年 学域4年生 I類メディア情報学

学期毎GPA 前期: 3.0000 後期: 0.0000

4年生のGPAはほとんど関係ないので数字をみてもわからないと思うけど。

研究やプログラミングに関してはブログで書いた通りなので4年生は特に書くことはないかな。プリパラとアイカツにどハマりした。プリッカソンで技術力がすごい人に出会った。

2020年 電通大院 情報学専攻

そして大学院に入学します。最近就活のことを考えて震えて眠ることの多い夜です。

就活のためにポートフォリオを作ったり、資格の勉強をしていたり、いろいろなことを同時並行でやろうとしていて切羽詰まっているような感覚がします。

たしかに就活を始めるまでの1年間は短いかもしれないけど、毎日ちまちまやっておけば1年あれば確実に力はつけられるんじゃないかと思っています。

自分の許容量以上のことは無理をしてやらないで、でもできることは全部やる、そんな1年間にしたいなと思います。

f:id:ogijunchang:20200321214846j:plain
できるできるできる!

研究室同期への怒り

f:id:ogijunchang:20200202011512j:plain
それがあなたの研究に対する姿勢なんですの?

こんばんは、卒論提出を1週間前、卒研発表を2週間前に控えているじゅぎのんです。

さて、そんな切羽詰まっている状況でこんな物騒なタイトルのブログを書いているのは何故なのかというと、どうしても同研究室に所属している同期への怒り(というかここまでくると呆れ)が抑えられない状況であり、そんな怒りの感情をどこかに残しておかないときっと卒論提出・卒研発表後の幸福感でその怒りが消えてしまうのではないかという危惧があったためです。

今感じてる感情を忘れないことでいずれ訪れる修論発表の自分への戒めとして、そして同期はこういうやつしかいないんだという自分への鼓舞をするためにこの記事を書いています。

怒りの原因

僕が同研究室に所属している同期(以下、同期)に対して怒りの感情を抱いている原因はなんなのかというと、研究に対するモチベーションの低さとか、大学生のくせに考えが甘すぎることとかですかね…正直いろいろと複合された怒りなので原因を一言にまとめるのはすごく難しいので、順を追って経緯を説明します。

研究室配属直後

研究室配属が決定して、最初に呼ばれたのは研究室の歓迎パーティみたいなイベントでした。そこで初めて同期と会って直接話をしました。

とは言っても配属された同期3名(自分含めず)のうち2名は同じ学年で講義を受けてきたので、いくつかの授業で一緒に受けることがあり顔は知ってるけど話したことはない、と言った感じでした。残りの1名は過年次生で、本来は3枠の研究室に過年次枠として追加で入ってきました。

話した感じは全員比較的フレンドリーで、特にコミュニケーションに困るということはありませんでした。連絡先を交換して、これからよろしくねーという感じだったと思います。そのときは「コミュニケーションが取れないような人じゃなくてよかったな」と思っていました。

4年生に上がる前の春休みにキックオフミーティングという名前の少し研究室のことやプログラミングの勉強をする配属生だけのミーティングがあったのですが、僕は部活の合宿があったため数回休んでいました。なので配属されてから少しの間は僕が少し遅れるような感じで始まった気がします。

中間発表まで

4年生が始まって、さあ研究が始まるぞ、とはなりません。正直4年生に上がってばかりの時期は研究する前提となる基礎知識がなさすぎるため、その勉強に時間を費やします。他にも興味のある論文を読んで、それを発表するというようなことはやっていました。

僕も中間発表までは他の同期と同じく、なかなか研究のテーマがまとまらず、ぼんやりと「認知系の研究がしたいな」くらいしか考えておらず、やはり部活のシーズン真っ最中ということで部活にかなり力を入れていたような気がします(とはいえ骨折で走れはしなかったんですが)。

中間発表が大会の翌日ということを6,7月ごろに知り、「これは他の同期と同じような進捗だとまずい、発表練習は少なくとも発表日の前の週にできるようにしなければ」という焦りを感じながら、7月ごろに本当に大まかなテーマを決め、その先行研究を読み始めました。

中間発表は実験の結果がなくても今後の研究予定を少し大げさにいうことでとりあえずしのぐことはできます。同期は全員実験することなく、研究予定を無難にまとめて発表となりました。

終わってからはとりあえず終わったね、これから頑張らないといけないね、という話をしたと思います。実際、研究予定的には切羽詰まっている状況で、本格的に研究に取り組まないといけないという不安と焦りを感じ始めていました。

お正月まで

中間発表が9月末にあり、そこからすぐに文化祭があり、文化祭後はもう実験しないと、という感じの予定になってきます。

そこからだんだんと同期に不穏な動きが見られるようになります。

まず、ゼミを欠席する回数が多過ぎる。僕の研究室は週2日(4年後期)で3種類のゼミで、他の研究室に比べると断然少ない方です。

ゼミの種類は

  • 人工知能や認知インタフェースなどの研究室が主に行なっている研究の基礎知識を学ぶテキストゼミ

  • 1週間でプログラミング関連でやったことや作ったものを公開(任意)するプログラミングゼミ

  • 進捗報告と論文発表を1週ごと、交互に行う論文・進捗ゼミ

の3種類です。

すべてのゼミにおいて同期は確実に5回以上は休んでいると思います。それも理由がバイトだったり体調不良(笑)だったり。

ここで言いたいのは、ゼミの日にバイト入れんなや

なんというか、僕と他の同期とでゼミの重要度が違うみたいなんですよね。僕は授業(研究室)が第一、それから部活、インターンという感じだと思っているのですが、多分同期は研究がかなり下位の優先度になっている気がします。

体調不良も何週間も続けてだったり、明らかに行きたくないから休んでるだろ、という言動も見られました。

例えば、ゼミの前日に某大型テーマパークに行っていて、明日私論文紹介しないといけないんだけど全然つくってない〜〜(笑)とかいうクソほどにもどうでもいいLINEを送りつけられた挙句、次の日に「熱出ちゃった笑 ごめんゼミ休む!」ですよ??普通にイライラしますよね??

そして、その欠席連絡を全体に向けてしない。僕はこれがどうしても許せません。

よく体育系が上下関係が厳しい云々で批判されることが多いですが、僕は体育会系の部活に所属していてよかったと思っています。それは一人の大人として、他人に対するルールやマナー、礼儀を身をもって学ぶことができるからです。

欠席連絡なんてSlackに「すみません、◯◯なので今日のゼミは休みます」と送るだけでいいんです。それでみんな納得するのに、なぜか同期は送りません。その代わりに閉ざされた同期内のLINEで「ごめんやっぱ今日休む!」と言ってくるんですよ?

なんでこっちが間接的に休みの連絡しなきゃいけねえんだよ。こっちはちゃんと来てんだからお前自分で言えよ。

これって体育会系の部活にいるいないとかそういう問題じゃないですよね? 同期がいないだけで論文ゼミは予定が狂うんだぞ? その埋め合わせはどうするんだよ?

加えてとてもモヤモヤするのは、論文ゼミで発表を欠席によってスキップしようとすることです。

論文ゼミは先ほども言ったように2週に一回のペースで論文紹介と進捗報告を交互に行います。そのため、例えば進捗の次の週(論文紹介)に休めば、次の週はもう一度進捗報告するだけでよい、というシステムになっていました。

僕はこれがどうしても許せなかった。きちんとゼミに参加する人は論文紹介のスライドを作って、制限時間に合わせて原稿を作る作業をしてるんですよ? 休む人が休む理由関係なしにスキップってずるくないですか?

先生もそこに関しては同じことを感じていたようで、スキップに関して異議を唱え、自分も便乗してスキップは不可能になりました(翌週は休んだ担当になる)。

ただ僕以外の先輩や同期は特になにも思っていない、別にどっちでもいいですという感じでした。僕がおかしいんでしょうか?

そしてゼミについては最後に、任意の発表を一回もしないことです。

プログラミングゼミはやることが決まっておらず、M1は論文ゼミの投票システムの作成を全員でしていたり、M2の先輩はPythonの高速化するコードの紹介とかをしていました。

僕はもともと少しバックエンドの勉強をしたいと思っていたので、Node.jsの勉強をした成果を発表したりだとか、新しく作ったツールを紹介したりだとか、毎週ではないですが発表はしていました。

なんですが、同期は現時点で1回も発表をしていません

5月ごろから一回もですよ?? なんというか意識が低いどころの問題じゃないというか、ちょっとくらいやらないとな、と思ったりしないんでしょうか? 他の発表ヘラヘラ笑いながら聞いてて何も思わないんでしょうか??

というような感じで、同期に対するほんの少しのイライラが募るようになってきます。

そして12月になり、もう実験をそろそろ始めないと終わらないような時期に差し掛かります。僕はなんとか研究予定を決定して、1月から実験開始します、というところまで進捗をしました。

この頃から同期はほとんど進捗報告に来ないようになってしまい、B4は自分だけでゼミということも少なくなかったと思います。

年明けから今日まで

年明け、僕はとてつもなく不安に襲われます。年末に言った予定が絶対に終わらない、下方修正するしかない。不安に苛まれながらも卒論の背景と関連研究だけ書いて、どうしよう…と考えていました。

孤独が辛すぎて、年明けにあけおめ、と同期にLINEしました。返ってきたのは3名中2名で、どちらも研究やばいよー、と言っていました。そのときにどれだけやばいのかはわかりませんでしたが、僕よりも圧倒的にやばかったということを後から知ることになります。

学校の授業が始まる時期と同時に、僕は先生に相談に行って研究の下方修正(というか若干目的の変更)をしました。そのシステムを1週間以内に実装して今からでも実験すればまだ間に合う、というかなりギリギリのラインでした。

そのとき、僕は先生に「全然関係ないんですが、他の同期はどんな進捗ですか?」と聞きました。

「ん? 知らない。」と言われました。

年明け最初の進捗報告、僕はなんとか実験システムを作成し、実験をしますという宣言と1ヶ月死ぬ気で頑張ります、というように発表しました。同期は2人来ませんでした。

次の進捗はまた同期が2人休み、その次の週にも2人休みました。この辺りで僕のフラストレーションが最高潮に達するLINEの投稿がされます。

f:id:ogijunchang:20200202005925j:plain

これ、甘え以外のなにものでもないと思うんですよね。

これって要するに「みんなの前で今まで研究しなかったことに対して恥をかきたくないけど、都合よく卒業はしたいから、先生と個別で相談するわ!」

ってことですよね? 僕はどうしてもこういう人が許せない。頑張ってる人が学校にたくさん、身近にいるのにその人に対してなんの敬意も感じられない。

これを見たときに、教授という仕事も大変だな、と思いました。僕なら即卒業は来年ね、と最後通告をすると思うんですが、そういうことをすると教授の監督責任がないとして先生の評判が落ちるそうです。

こいつと一緒に大学院で一緒に勉強したくない。一緒に卒業したくない。本気でそう思ってます。

ちなみにおとといの進捗報告も、この投稿をしたやつは来ませんでした。

他の同期は、まだ結果が出ていない・これから実験を行う・卒論は1mmも書いていないという状況です。この忙しい時期に実験に手伝わされるM1やM2の先輩、先生、とてもいたたまれないです。

卒論の提出はあと一週間を切り、卒研発表は二週間を切りました。僕は卒論の第一稿を提出して、修正したものを月曜日中に再提出します。

僕と、同期が、卒業審査合格として一緒の評価を受けることがどうしても嫌だ。修論もこんな思いはしたくないな・・・

総括

という僕の研究室に対する愚痴でした。イライラしてることは同期には隠しているけど、もしこの記事がバレたとしたら思いっきりブチギレてやりたいですね。

といっても僕がすごく研究できるというわけではありません。もっと勉強します。

2019年の反省、2020年の抱負

こんばんは、今年も残り少なくなりました、じゅぎのんです。

研究でまあまあ忙しい冬休みを過ごしていますが、今年も終わりということで今年の反省と来年の抱負を記しておきます。

2019年やったこと

今年のはじめに、2019年の抱負の記事を残していました。

ogijunchang.hatenablog.com

さて、ここで書いていた目標は無事達成できたのでしょうか。

陸上競技

陸上競技は今年も僕の生活のかなり高い割合を占めていました。今年は主将を務めたことで今までとは一味違う一年になりました。

目標では、「楽しい部活を目指す」、「競技にも手を抜かない」と言っていました。

楽しい部活を目指すという面では、間違いなく去年よりも今年の方が楽しい部活が作れたと思っています(主観ですが)。

しかし、残念ながら今年も退部者を出してしまいました。退部の理由に関しては退部者個人の問題でしたが、やっぱり退部者を出したくないと思っていたので自分の中ではとてもショックで、どうにかできないんだろうかと色々悩みました…

退部する人って相談してくれないんですよね。退部する人は大体負のスパイラルに巻き込まれて学校生活もまともに送れない人がいがちなので、退部後の生活が少しでもよくなるように祈るしかないですね。

新歓(風邪引いたけど)、入部式、夏合宿、各種大会、文化祭、納会まで突っ走りましたがどれも楽しかったです。途中結構切羽詰まってイライラすることもありましたが、無事に乗り越えられたのはみんながいたおかげだなと思っていますよ。本当です

競技にも手を抜かないという目標は残念ながら達成できたとは言えませんね…

理由はもちろん腰椎分離症です。

ogijunchang.hatenablog.com

春季に怪我をすると本当にすべてが終わりになることが身にしみてわかりました。

それでも秋シーズンでは少しだけPBを出すことができたり、狙っていた大会で去年と変わらない順位が取れたことは不幸中の幸い、怪我までの努力のおかげだったと思います。

プログラミング

インターン先で少しでも使える人材になりたい、というのが今年の目標でした。

使える人材になったのかと言われると自分ではどう言ったらいいのかわからないですが、間違いなく一年前よりかはプログラミングができるようになったと実感しています。

一年で2つの自社アプリ開発に携わったり、外からの仕事のお手伝いをしたり、イベントにも複数参加することができました。

会社の上司からはすごい成長したと褒められましたが、実際のところまだまだな感じはします(まあ週2勤務だから仕方ないというのもありますが)。

1年前に採用されたインターンに加え、実は先月新しいインターンにも採用されました。大企業のとあるプロジェクトの機能開発のお手伝いという感じです。

プログラミングに関しては初学者から経験者にレベルアップはできたと思っています。

また、もう一つの目標にしていたプログラミング関係のイベントに参加するというのも達成できました。

プリッカソンはプリティーシリーズ好きと関われるとてもいい場でした。次回は参加したいと思っています!卒論が終わった後なら!

趣味

オタクですね。実績はこんな感じです。

  • 参加ライブ

    • Pripara Friendship Tour 2019 プロミス!リズム!パラダイス! 6公演
    • プリパラ&キラッとプリ☆チャン AUTUMN LIVE TOUR 2019 〜キラッと!アイドルはじめる時間だよ!〜 2公演
    • プリパラ&キラッとプリ☆チャン Winter Live 2019 2公演 計10公演
  • 参加イベント

    • プリズム☆ジャンプ 25(同人誌即売会
    • アイカツスターズ!感謝祭「We are STARS」ライブ配信視聴
    • KING OF PRISM -Shiny Seven Stars- 第Ⅰ章~第Ⅳ章 映画館視聴
    • スター☆トゥインクルプリキュア 星のうたに想いをこめて 映画館視聴
    • 劇場版プリパラ み~んなありがとう♪5周年記念上映会(オールナイト上映) 映画館視聴
    • プリ☆チャンコラボカフェ・POFコラボカフェ・ノンシュガーカフェ・プリパラ5周年コラボカフェなど
  • 四ツ星学園S4の制服を買った(小声)

いっぱいお金使いましたねー、でも世のオタクからしたら大したことないんでしょうね。

去年のプリパラWinter2018でどハマりしたプリティーシリーズ、1年たっても沼に浸かり続けています。ここまでハマったコンテンツって今までないので、よほどいいコンテンツなんでしょうね!

f:id:ogijunchang:20191231220708j:plain
研究室のオタクグッズ

グッズもいろいろ増えました。

2020年やりたいこと

研究

間違いなく一番最初にくるイベントはこれですね。卒論。

2月7日に原稿の締め切り、2月14日に卒研発表です。2ヶ月後は間違いなく修羅場です。

3ヶ月後にこの記事を見てあのときはな〜〜って早くなりたいです。もうお正月も気が休まらない…

ただ、卒論を書き上げても僕は電通大院に進学するので、研究が終わることはありません。正直学部での研究テーマが微妙すぎてできるならやり直したいと思っています…

ということで、M1で新しい研究テーマをちゃんと決めたいなと思います。先輩には気を抜いてると一瞬で1年終わると言われたので、気を抜きたくないですね(フラグ)

陸上競技

来年も陸上競技は僕の中で一番大きい柱にしておきたいと思っています。

5月の記録会で十種競技関東インカレ3部標準突破、そして9月の27大学対校戦にて十種競技で優勝を目標に掲げています。

そんなにうまく話が進まないのはわかっていますが、できなくはない目標だと思うので期待を持ちながら練習しようという感じです。

やっぱり今やらなきゃいけないのは棒高跳で、やっとのことで定期的な練習環境が整ったので苦手意識を克服して記録大幅アップを狙います。

今までの院生らしく、院生は黙って記録と金を出す。そんな存在になりたい。そのためにも卒論をやっている途中も冬季練には手を抜かない。これ大事。

プログラミング

フロントエンドに関してはかなり慣れてきたので、また次のレベルに行きたい(高度な仕事を任されたい)というのと、バックエンドも徐々に勉強していきたいという二つのモチベーションがあります。

そしてM1という学年は就活をしなければならない学年でもあるので、まずプログラミングに関する大きな目標として

基本情報技術者試験に合格

を必ず達成したいということと、納得できる会社に就職を決める・そのための勉強を頑張ることを目標にしたいと思っています。

就職に関しては今かなり迷っているところです。できることなら大企業にいきたいけど、それが本当にいい選択なのかわかりません…教えてエロい人

趣味

今年はプリティーシリーズ全般を追いかけ、アイカツシリーズにも手を出したという感じでした。

来年もプリティーシリーズを追いかけ続けることにかわりはありませんが、 新しいコンテンツを追いかけたい とも思っています。

新しいコンテンツとは何か具体的には決めていないんですが、

i☆RisRun Girls, Run!のライブに行ってみたいな〜とか、芹澤優ちゃん個人を追いかけてみたいな〜とか、完全に新しいアイドルを見つけて追いかけたいな〜とか、握手会とかの接近イベにも行ってみたいな〜〜とか思っています。

断言すると、 今年よりももっとお金をつぎ込みたい。

自分の好きなことにお金をかけるの楽しスギィ!!また、オタク趣味で知り合いをさらに増やしたいとも思っています。同期でオタクイベに一緒に行ける人が欲しいな〜〜。

総括

さて、こんな感じで今年も終わり、もうまもなく2020年が始まります。

2020年は東京五輪があったり、プリチャン3期があったり(?)、アイカツの新シリーズがありそうだったり、いろいろ世の中も動きそうですね!

成長したい、という今年の目標はそのままに、またさらに進化したじゅぎのんを来年末に見せられるように、来年も頑張っていきたいです!!

来年も仲良くしてくださいね!!では!!

f:id:ogijunchang:20191231223943j:plain
明日からね!