はてなサマーインターン2020に参加しました

2020/9/7(月)~2020/9/11(金)に はてなサマーインターン2020に参加しました。時差が16時間あったため、体調管理、授業との両立が大変でした。

応募前

応募前、後半のタームだと秋学期とかぶってしまうので授業とインターンを同時に出来るか少し不安でした。

応募

今までの成果物、PCのスペック、ネットワークの環境などをフォームに入力しました。また課題としてDockerのインストール、起動、起動時のトークンを取得結果を入力しました。

面接(6月後半)

最初は人事の方とその後、エンジニアの方と面接を行いました。人事の方とは日程の事、時差に関していくつか質問がありました。秋学期と被るため、可能であれば前半のタームを希望していることをお伝えしました。エンジニアの方との面接では応募の時の提出した成果物に関する話がメインで事前に GitHub を見て頂いていました。後日、結果を頂き、9/7(月)~9/11(金)で参加をすることが決まりました。

参加きっかけ

普段から特にテクノロジー系の情報収集のために、はてなブックマークをほぼ毎日利用しています。そのはてなが完全オンラインでインターンシップを行うということ、また内容としても以前から興味のあったマイクロサービスに関してだったため早速応募をしました。

インターン前にしたこと

過去の参加者のブログや他の参加者のプロフィールを見て他のインターンの方より技術的に劣っているだろうと思っていました。また短い期間で最大限、多くのことを吸収したいと思っていたため事前にgo、docker、gRPCの基礎知識を以下の

等を利用して学習しました。そのお陰で後述するWeb APIの講義は復習のような形で受けることができました。

事前課題

  1. こちらのテンプレートを元に自分のプライベートレポジトリを作成しReadme.mdのセットアップに従ってローカルでアプリケーションを動かすこと

  2. コントリビューターに他のインターン生、関わってくださるはてなのエンジニアの方を追加

問題なく行うことが出来ました。

交流会(9月3日)

id:onishiさん id:motemenさんから言葉を頂き、その後それぞれ自己紹介を行いました。その後、いくつかのトピックに関してエンジニア2名とインターン2名のブレイクアウトルーム内でアイスブレイクをしました。事前にScrapboxの他の参加者の情報を見ることができ、オンラインではあるものの他のインターンの方の雰囲気を知ることができとても良かったです。

開発環境

インターン中(9/7(月)~9/11(金))

9/7 講義

全ての講義と資料はこちらで見ることが出来ます。以下の

に関する講義が1コマ45分でありました。全て丁寧に解説しており、濃縮された内容でした。知識が不足していたためWeb API以外の講義に関しては講義内で全てを理解することは難しかったです。

9/7-9/10 開発

課題はこちらに公開されています。メンターは id:yigarashiさんでid:w-tl00 さんと一緒に igarashi 部屋というチャンネルで作業をしました。質問・相談があればその都度、音声をオンにしてやりとりをしました。作業ログは Scrapbox に書き、コードの変更は毎回PRを作ってメンターのコードレビューを受けるというフローでした。部屋内で定期的に(約1時間半に一回程度)進捗報告をする時間がありアドバイス等を定期的にもらうことが出来ました。今までのインターンシップ(対面)と比べてもとても質問等がしやすい環境でした。

課題1: 記法変換サービス

開発言語として事前に学習をしていたgoを選び、Markdown記法に対応させるためにgoldmarkというライブラリを利用して実装しました。この課題を通してblogのマイクロサービスの理解が進み以後の課題に取り組む際に役立ちました。発展課題のどのような独自記法を作るかというので少し悩みましたが最終的にggle記法というものを実装することを決めました。これは任意の言葉のgoogle検索結果のURLを自動生成するものです。

例えば

(GG---はてな---LE)というものは[はてな🔎](https://www.google.com/search?q=はてな)というマークダウンに変換を行います。正規表現を利用して該当する箇所を特定し変換を行いました。

課題2: タイトルの自動取得サービス

他のサービスを参考にしながら、この課題のためにタイトル取得のためfetcherというマイクロサービスを作成しました。しかし、レンダリングをするblogサービスとの通信が上手く行かず最終的には完成せずに終わりました。

原因として開発環境移行とkubernatesのエラーのため時間をロスしたことがありました。

開発環境移行

課題1までWSLを使わない素のWindows環境で開発を行っていました。マイクロサービス追加等をする際、makeを動作させることが出来ない等があったためWSL2上で開発をすることにしました。WSL2を動かすためWindows 10 Version2004へのアップデート等で時間をだいぶ費やしてしまいました。またwsl2への切り替えで手こずりここで大きく時間をロスしました。

KubernatesのWaiting for deployments to stabilize..

これを解決するためにメンターのid:yigarashiさんの他にもう一人のエンジニアの方に手伝っていただきました。

ログから新たなマイクロサービス(Fetcher)追加後にしばしばaccountのデプロイが失敗することがわかりました。これを調べるため

$ kubectl get pods -w #全てのpodの状況を確認

これからaccountのpodがRunning->OOMKilled->CrashLoopBackOffを繰り返していた。

$ kubectl describe pod [pod name] #[pod name]の詳細を確認

Readiness probe failed, Liveness probe failedと出力

これらから、accountのメモリが少ないためOMMKilledが発生しヘルスチェックも落ちたと推測することが出来ました。

解決策として

k8s/account/app.yamlのlimitsを以下のように

#          limits:
#            cpu: 200m
#            memory: 10Mi

コメントアウトすることで無事にエラーがなくなりました。

最後に

オンラインでありながらコミュニケーションをとる場が多くあるなどとても良く考えられたインターンシップのプログラムでした。KubernetesやgRPCを初めて触れたため上手く行かないこともありましたが、特にメンターのid:yigarashiさんのサポートによって開発をスムーズに進めることができました。コードやテストをとても丁寧に見て頂きフィードバックを頂いたことで多くのことを学ぶ事ができました。同じ部屋だったid:w-t1000さんもありがとうございました。

最後になりましたが、関わった社員、インターン生の皆様ありがとうございました。