チームラボの通年インターンに参加してきました
こんにちは、ぬまです。
今回は11月と12月にわたってチームラボ株式会社でインターン生として業務に参加しました。
もともと業務での経験がゼロだったためだいぶ貴重な経験をさせていただいたので、参加記録を残したいと思います。極秘事項が多いため、詳しいことは残せないが残念です。
インターン概要
日程:11月26日~12月23日
配属:ECサイトの案件
技術:Ruby on Rails, MySQL, Redis, Docker, AWS(ECS, ECR, CodePipeline)
応募背景
サマーインターンを通してある程度ハッカソンの開発経験を積んできましたが、業務経験がないので就業型に参加したい!つよつよエンジニアからレビューをもらいたい!!という思いがありました。あと、Rails書きたい!!ある日、Paiza経由でのスカウトをいただき、カジュアル面談という名の面接を申し込みました。(面接官がのちのメンバーでした)
応募理由や技術的な質問などをざっくばらんに話をして楽しく終わり、受かっても落ちてもチームラボ良さそうだなという印象を持った記憶があります。後日、プログラミング試験を受け、採用をいただきました。
そもそもチームラボ株式会社とは?
HPから引用させていただくと
TECHNOLOGY×CREATIVE
テクノロジーとクリエイティブの境界はすでに曖昧になりつつあり、今後のこの傾向はさらに加速していくでしょう。そんな情報社会において、サイエンス・テクノロジー・デザイン・アートなどの境界を曖昧にしながら、『実験と革新』をテーマにものを創ることによって、もしくは、創るプロセスを通して、ものごとのソリューションを提供します。(HP引用)
詳しくはHP見てみてください。かわいいです。
職種はテクノロジー、クリエイティブ、カタリストに分かれており、ざっくりいうと左からエンジニア、デザイナー、マネージャーという認識です。
僕は、テクノロジーの中のパッケージチーム、いわゆるWebエンジニアのチームの中のECチームに配属されました。
やったこと
参画した最初はi18nというgemの導入によりエラー文が英語表記になっていたためymlファイルをいじって日本語に直すような比較的簡単なタスクをこなす中で、アプリ全体をなんとなく理解していきました。その後はECサイトなため、さまざまなバリデーションやエラーハンドリングを実装しました。
初めての経験
・核となるアプリを拡張することで大きなECサイトを構築するという経験は今までしたことがなく、個人で実現できるわけでもなくかなり貴重な経験でした。その中で、モデル、コントローラ、ビューをそれぞれオーバーライドすることでアプリが完成していくのはなかなかに面白かったです。
・state_machineをつかった状態の管理。state_machineというgemを使うことでECサイトの各状態の遷移をみてバリデーションをかけたり、ある状態に移り変わる時になにかしたり、ある状態から移り変わる時になにかしたりと、融通が効くのでかなり面白かったです。
・ファイルインポート時のエラーメッセージをエラーの数だけ表示させる。エラーが起きた時にraiseすると処理が終わってしまうので、うまくエラー処理するのが難しかった印象があります。
・隣にメンターさんがいてくれたため、困った時に空いていればすぐに聞ける環境は初めてでかなりありがたく理解が数倍捗りました。
・そもそも業務に参画すること自体初めてでした。
・自分が書いたコードを実際のエンジニアの方にレビューを受け、それが実際のサービスの一部になる感覚。楽しすぎました。
・詰まった時に業務時間内に勉強できることは、飲食店や塾講師のアルバイトにはできない機会だと感じます。
ご飯(ここ重要←)
インターン期間中に連れてっていただいたご飯で特においしかったお店を紹介します。
・ポンチ軒:さくさくで口の中でお肉がとろけました。基本的に行列でたまたま一度だけいけました。
・つじ田:痺れの中のからさがあり、坦々麺うまい
・一頭:お肉がうまうまで2回もいってしまいました。メンターさん曰く、トングの先が細い焼肉店はおいしいらしい(?)
感想
実務での開発がどういう物なのか正直想像もついていない状態で参加させていただいて、実際の一人での開発と大きく違うこととして、自分以外のエンジニアが僕のコードを読むことだったり、仕様を理解することであったり、メンバー同士で話し合う環境があったり、人と関わる点で大きく違うなと実感しました。
また、チームラボではチームの仲が良く、Slackで業務と全然関係ない話で盛り上がったりミーティングでも楽しくお話しする時間があったり、開発する上でのチーム力がものすごく高かった印象です。
コロナ禍にもかかわらず、オンラインオフライン兼用でインターンシップに参加させていただきありがとうございました。コロナ禍で不安はあったものの、毎朝全フロアを消毒を徹底しており、扉の前にマスクが常備してあるので、外出て戻ったらマスクを変える制度ができており、社員さんのみでなくインターン生に対する受け入れ体制も充実していた印象です。このような状況下でも受け入れてくださりありがとうございました。
↑これはオフィス6階の共用スペースで外部の人とのミーティングなどはここで行われています。めちゃくちゃかわいいです。ぜひ一度足を運んでみてください
では〜
2020年振り返り
こんにちは、ぬまです。
12月31日ということで振り返り記事が多くなってきたので流れに乗ってみようと思います。
専攻を大きく変えた
私は学部で機械情報工学科というロボットをメインとし制御や情報まで幅広く学ぶ学科に所属していました。今年は心機一転し、CS専攻として大学院進学したのがついこの間のように思えます。研究では遺伝的アルゴリズムなどの進化計算に興味があり、最適化の研究をしたくて進学しました。実際には、授業や後述の開発に時間を取られ、まともにやっていませんが、2021年は学会出たり、修論を書き終えて終了したいと思います。
インターンシップ
大学院進学して将来を考えた時に自分は何がしたいのかさっぱりわからない状態でした。機械学習を使いたいと思ったり、アプリ開発をしたいと思ったり、はたまた研究職として研究でお金をもらったりも考えました。少なくともCS出身としてプログラミングで何か開発できなければ人権はない(個人の見解)と考えていたので、とりあえず何か作ってみようと思いました。そこで、Javaに触ったことがなく興味があったためJavaで何か作ろうと思い立ち、Udemyや書籍を買ってTodoアプリを作りました。SpringBootというフレームワークに触れ、よくわからない言葉だらけで正直写しただけのようなものでした。これは2020年の3月のことでしたねぇ。ここからProgateでいろいろな言語を学んでいきました。エンジニアとして就職したいという熱い思いはありませんでしたが、様々なインターンシップを経験して見定めたいと思うようになりました。なので、とりあえず、インターンに申し込むことにしました。しかし現実は甘くはありませんでした。そう。「インターンに行くためにはインターンに行った経験が必要」いやいや、矛盾でしかないやん。
多く見積もって6月くらいから申し込んで15社以上面接したかなと思います。参加したインターンシップは・・・
・株式会社GATechnologies(6月末)
これは2日間のハッカソンで3人1チーム+メンターさんで日々の課題を解決するテーマでプロトタイプを開発するというものでした。Railsでアプリを作り、フロントはBootStrapで開発をして、3人中2人が未経験で、1人がつよつよでした。ほとんどが彼の手で完成し、僕はhtmlやCSSを整えるくらいのことしかできず、悔しい反面、こんなにアプリ作れる人になりたいと思うようになりました。
サマーインターン
ここからサマーインターンの参加した企業です。6月にインターン経験が活きたのか、魔法のスプレッドシートやPaizaでいくつか申し込み、参加できました。
・株式会社いい生活
不動産業界の物件検索サイトを4人1チームで開発していくものでした。ここで初めてVue.jsに触れたり、APIを叩くということをしたり、様々な技術を知ったり、Gitを理解してきたり多くの学びがありました。また、チームメンバーに年下にも関わらず、情報系でないのにつよつよであったり、院試とインターン選考を並行したつよつよだったり、Webエンジニアになるかわからないけどめちゃくちゃ吸収力のあるつよつよがいたりメンバーにかなり刺激をもらえて楽しかったです。
・楽天株式会社
「人と人をオンラインでつなぐ」というテーマのもと6人で2週間程度で設計から開発するものでした。初めてまともにインターンでRailsを触れRailsAPIを初めて作り、さらにはReactでフロントを書いて、どうやって設計して各機能に落とし込むのか経験できたのはかなり充実しました。結果として3位/7チーム中という結果で手に汗握りましたが、チーム力がどのチームよりもダントツで優っていた点でかなりメンバーにも恵まれて楽しい2週間でした。
二子玉川夏の陣に参加してきました - numa7pu’s diary
通年インターン
・チームラボ株式会社
ハッカソンを経験して、業務に参加してみたい!!レビューを受けたい!!レベルアップしたいという思いから、業務に参加できるインターンを探していたところ、Paiza経由でスカウトを受けたので、これだ!と思い、申し込み参加しました。
チームラボの通年インターンに参加してきました - numa7pu’s diary
就活
なんやかんやでインターンを経験するうちにいつしかWeb開発が楽しくなり仕事としてやっていきたいと思い本選考をいくつか申し込んだり、インターンからの早期選考の機会をいただけたりし、いきたいと思う企業さんで働くことになりました。
就活の軸はグローバルと多様性。将来的に、スキルを突き詰めて働くというよりチームを引っ張るような仕事がしたいと考えているので、さまざまな視点から物事を考えつつエンジニア力を高められると思い決めました。
競プロ
プログラミングに慣れたいという思いからはじめてみましたが、普段のアルバイトが土曜日の朝から夜まであるので、コンテストに全然出れず、最近ではあまりできていませんが、来年は積極的に着手する予定です。まずは目指せ緑!
二子玉川夏の陣に参加してきました
こんにちは。ぬまです。
今回は楽天株式会社のサマーインターンでおなじみ、「二子玉川夏の陣」に参加してきました!
インターンシップの詳細はこちら 二子玉川 夏の陣2020 楽天 インターン オンライン開催
概要
- 期間:9/1~9/11のB日程
- 待遇:時給1300円
- オンライン開催
- 内容:5人1チームで2週間かけて新規サービスの開発
- テーマ:オンラインで人と人をつなぐ
やったこと
2週間あり、最初の1週間弱は企画・設計、詳細設計に関するレビューをもとに改修し、残りの時間を実装と発表準備に割り当てられました。設計の段階では、実際のマネジャーやエンジニアの方からレビューがもらえると言う非常にレアな体験ができました。では、各フェーズごとにやったことをまとめていきます。
メンバー6人
フロントエンド2人
バックエンド4人
※フロントのUI部分はバックエンドのフロント若干かける人たちでサポート
企画
まず、オンラインで人と人をつなぐ点で現在の問題点を洗い出します。ここで、ブレインストーミングを使ってひたすら書いていきます。だいぶ話し合いをした気がします。問題点とともに簡単な解決策を絞り出します。
結果として、動画を使って趣味を共有できればコロナ禍でも寂しくないという結論になりました。
設計
ここでは、どんな機能があると問題点を克服できるのか、深く洗い出します。今回も同様にブレインストーミングから案を出し、グループ分けをおこないました。そのグループの中でランク付をします。
①最も優先順位の高い機能
②必要な機能
③無くてもいいかなぁという機能
それぞれ、P1、P2、P3という名前で機能を分類(P = Priority)し、その機能をコーディングに落とし込めるレベルで設計しました。例えば、その機能からどんなモデルが必要でDB設計はどうするのか、その機能からどんなデータがどんな形式でやりとりされるのか、、、
このあたりはだいぶ知識がなかったので、学びながら、エンジニアのメンターの方に多少のサポートをいただきながら進めました。メンバーもみんな強くて互いの知恵を共有できた点でかなり質が高いように感じました。
実装
使用技術:Docker, RubyOnRails, React+Redux, MySQL, Github, (CircleCI), Material UI
各機能のメソッドレベルでタスクを分割し、メンバーに割り当て実装開始
まぁ、設計通りにはいきません。
発表
発表は、基本英語で行うため準備に丸一日かけて協力しながら原稿やスライドを仕上げました。
結果は4位/7チームという真ん中の成績でしたが、チームワークはダントツ一位だったので強みが出たなと言う印象で盛り上がりました。
つくったサービス
結論から言うと、動画で人と人をつなぐSNSサービス「TheaTalk」を開発しました。
YouTube動画のURLから動画を共有できるルームを作成し、ユーザが各動画部屋で動画をリアルタイムで同じ場面を見てチャットができるというサービスです。
ユーザは趣味のタグをフォローしていて、ルームを作る時にルームにタグをつけられます。他のユーザはタグで検索ができ、気になるルームに入ってルーム内のユーザ同士でチャットができます。それによって共通の趣味で繋がることができます。
YouTubeではリアルタイムでのチャットが必要になりますが、このサービスによって、配信のリアルタイムでは無く部屋単位のリアルタイムをもつことで一緒に見ていると言う感覚から人と関われない寂しさを解決できます。
スキーマ定理を頭のすきーまに置いておきたい
スキーマ定理
こんにちは。ぬまです。今回は遺伝的アルゴリズム(GA)での探索をする際の基本原理であるスキーマ定理についてまとめたいと思います。
そもそもGAとはなんぞやという方はこちらを参照ください。
サルでもわかる遺伝的アルゴリズム - numa7pu’s diary
スキーマ定理とは
遺伝アルゴリズムにおいてある遺伝子の特徴がどのように次の世代に遺伝していくかを示した定理. 遺伝子の部分列をスキーマといい, このスキーマをもつ遺伝子の数が遺伝演算によって次世代でどのように変化するかを確率的に示す事ができる.
わかりやすいですね。簡潔です。私もここまでまとめたいのですが、説明しがちなので、どゆこと?という人向けに説明します。
そもそもスキーマってなんやねん
スキーマとはGAにおける遺伝子の集団に保持される部分構造で0, 1, * で表される。*は0,1どちらでもよいという意味でワイルドカード記号ともdon't careとも呼ばれる。
具体的には、
H = * * 1 1
のスキーマについて考えると各個体0 0 1 1, 0 1 1 1, 1 0 1 1, 1 1 1 1がスキーマHに属するという。
すなわち、スキーマHがわかると集団の特徴がわかるということになる。
さらに、スキーマについて語るのに外せないのがスキーマの定義長とオーダーという概念。
スキーマの定義長
のように書き、左から見て最初の*以外の文字と最後の*以外の文字との距離である。
例えば
変数
集団のサイズ | |
---|---|
各個体(遺伝子コード)の適応度 | |
文字列の適応度 | |
スキーマの適応度 | |
集団の平均適応度 | |
世代におけるスキーマに含まれる文字列の数 | |
遺伝子の長さ | |
スキーマの定義長 | |
スキーマのオーダ | |
交叉確率 | |
突然変異確率 |
これらを用いて、次世代のスキーマHの数を交叉も突然変異もない場合、交叉のみ起こす場合、突然変異と交叉を起こす場合の3通りを考える。
スキーマ定理(メイン)
スキーマ定理を3通りから導出する。遺伝的アルゴリズムは遺伝子操作に交叉と突然変異があるため、スキーマの定理は最後の式となる。
交叉・突然変異がない場合
個体は全個体の適応度の中に占める適応度の割合で次世代に残るので
となる。
交叉のみの場合
定義長が長いと交叉が起きたときにスキーマが破壊されやすくなる。さらに、交叉点がの中にあるときに破壊される。よって
となる。
まとめ
いかがだったでしょうか?
難しかった人も簡単に理解ができた人もみなさんの頭のすきーまに残ってくれると嬉しいです。
今回はGAを語る上で大切な基本定理スキーマの定理を紹介しまとめた。面白い定理です。
それではまた。
参考文献
スキーマ定理とは何? Weblio辞書
http://mikilab.doshisha.ac.jp/dia/monthly/monthly03/20030602/personal/GA/01_mori.pdf
AtcoderBeginnerContest174 C問題の考察
ABC174Cの考察
こんにちは。numaです.
今回は前回のABC174がどうして解けなかったのか。どういう風に考えれば解けるのか。分析して自分の脳内を整理したいと思います.
筆者自身、まだまだ茶色の端くれで理解が甘いところがあると思うのでご指摘や別解等があると嬉しいです.
ABC174での出題問題
A: Air Conditioner
B: Distance
C: Respect
D: Alter Alter
E: Logs
F: Range Set Query
今回はCのRespectに着目します.
C: Respect
問題文
高橋君は K の倍数と 7 が好きです。
7,77,777,… という数列の中に初めて K の倍数が登場するのは何項目ですか?存在しない場合は代わりに -1 を出力してください。
制約
1≤K≤
K は整数である。
僕はこの問題を解いてて1週間は7が嫌いになりました.
むずかしくないか??
とりあえず、num=7; num*=10; num+=7; するんだろうけど、、
明らかにオーバーフローするからどう対処するの、、、
longlongでやるにも18桁後にはオーバーフローを起こすしなぁ、、、
私はこのとき、modに着目しあまり理解をしていないフェルマーの小定理やmod逆元などについて調べてました.いけそうだけどいけない(心の声...)
では、解説に移りましょう.
と、その前にmodについてまとめます.
modとは
modとは余りを求める演算子のことでプログラミング言語ではしばしば「%」という演算子で求められます.Atcoderなどの競技プログラミングをしたことのある人は使ったことのない人はいないと思います.
例えば 20 (mod 3)を考えてみましょう.20を3で割った余りなので2となり
20 % 3 = 2
と計算してくれます.
これは 20 ≡ 2 (mod 3) と書きます.
解説
まず、アプローチとして
7, 77, 777, 7777, ...
の中でKの倍数となるのは何番目?という問題なので順番にmodを取ることで余りが0となるときに初めてKの倍数になることがわかります.
すなわち、modの世界で倍数判定を行えばうまくいくことがわかるでしょう.
例えば、入力例1を考えます.
input: 101, output: 4
なので、7777は101の倍数であることがわかるので、4番目の4が答えとなります.
これをmod 101 の世界で考えます.
ans = 1 のとき n = 7 ≡ 7 (mod 101)
↓ n = n*10 + 7
ans = 2 のとき n = 77 ≡ 77 (mod 101)
↓ n = n*10 + 7
ans = 3 のとき n = 777 ≡ 70 (mod 101)
↓ n = n*10 + 7
ans = 4 のとき n=7777 ≡ 707 ≡ 0 (mod 101)
↓ n = n*10 + 7
…
というように7, 77, 70, 0, 7, 77, 70, 0, ...というようなグラフ構造になることがわかります.よって、最初に余りが0になる、すなわち101の倍数となるのは4番目の7777が答えとなります.また、サンプルにもあるように入力が2の時は奇数である77...の倍数にはなり得ないことに注意してください.
これで解けました.プログラムは以下のようになります.
#include<bits/stdc++.h> using namespace std; #define fast_io ios_base::sync_with_stdio(false) ; cin.tie(0); cout.tie(0); int main(){ fast_io ll k; cin>>k; if(k == 2){ cout << -1 << endl; return 0; } ll num=0; for(int i=1;i<2e6;i++){ num *= 10; num += 7; num %= k; if(num==0){ cout << i << endl; return 0; } } cout << -1 << endl; return 0; }
サルでもわかる遺伝的アルゴリズム
サルでもわかる遺伝的アルゴリズム
こんにちわ。numaです。
基本的な遺伝的アルゴリズムについてまとめたいと思いたちました。
サルでもわかるようにまとめるつもりですので、温かく読んでいただけると幸いです。
(ウキウキーーウキーーー)
サルでもわかるはそういうわけではないです、、笑
ご指摘や改善案、感想などは絶賛募集中です。(たたくのだけはやめてください笑)
遺伝的アルゴリズム(Genetic Algorithm:通称GA)
遺伝的アルゴリズムとは生物の進化から着想を得た人工知能です。これは1975年にミシガン大学のJohn Hollandが考案しました。
人工知能と言えば数年前から有名なDeepLearningや機械学習といったワードがが思い浮かぶと思います。DeepLearningは人間の脳を模倣したモデルですが、遺伝的アルゴリズムは生物の進化を模倣してその時の環境(評価関数)に対して最適な解(なるべく良い答え)を求めることが可能な手法です。
雑に言うと、たまたま良いものが出たら後世に伝えていこう、といったイメージです。
(伝われ!!!雑、、)
では、実際のアルゴリズムです。
基本的なアルゴリズム
①初期集団生成
プログラマが決めた集団数個の個体をランダムに生成します。
②評価
集団内のそれぞれの個体に評価値をつけます。
③選択
評価値の高い個体を選択します。
④交叉
選択された個体同士を交叉させて新たな個体を生みます。
⑤突然変異
ある一定の確率で突然変異を起こします。これは良い方向や悪い方向さまざまです。
⑥条件を満たしていれば終了、満たしていなければ②~⑤を繰り返す。
試行回数がプログラマが指定した回数に達していたり、最良の評価値が最適解に達したりしたら終了します。
(http://home.interlink.or.jp/~kumagai/genealg.htm から引用)
逆上がりを例にイメージしてみる
ここでは小難しい話や複雑な話は割愛します。実際とは多少異なることがあるかもしれないですがわかりやすさを重視するためご了承ください。逆上がりの習得を例に考えてみましょう。
①初期集団生成
わかりやすく言うと何百人の子供が鉄棒に初めて触れて坂上がりのやり方を知らずに1回やってみる感覚に近いと思います。
②評価
逆上がりを知っている教師がそれぞれの子供たちに決められたルールに従って点数をつけていく作業です。
③選択
点数の高い子供を選びます。
④交叉
本来は交叉させて新たな個体を生みますが、例が下手なため表現を変えます。
選択された子供が他の子供たちにどうやったら点数が上がったのか口頭で一回教えるイメージです。つまり子供たちがレベルアップしたのです。これで多少はより高い評価がもらえるかもしれません。
⑤突然変異
突然子供がコツを掴んだり感覚が狂ったりするイメージに近いですかね。
⑥終了条件判断
子供たちの逆上がりチャレンジ回数やきれいに成功した人がいたら終了です。満たしていなければ繰り返します。
これにより、何も知らない子供たちが先生の評価に従って最適な逆上がりを探索できました。
研究例
・スケジューリング問題
・巡回セールスマン問題
・実数値関数最適化
・ナップザック問題
等さまざまな複雑な問題に対して最適化の研究が行われています。
GAで生まれた実際の例
・新幹線N700系
詳しくはこちら https://plaza.rakuten.co.jp/sugowaza/diary/200707060000/
まとめ
GAはまるで自分でサンプルを生成して学習しているような挙動が興味深く感じてきませんか?そうでしょう。そうであってほしいです。
GAのイメージの手助けになっていると嬉しいです。また、ここで得られる最適解はいままでの最適解とは一味違った見たこともない結果が出てくる可能性があるので面白いですね。
参考資料
楽天ブログhttps://plaza.rakuten.co.jp/sugowaza/diary/200707060000/
Kumagai's PAGE~GAとは~ http://home.interlink.or.jp/~kumagai/genealg.htm