こんにちは,id:w_tl00です.
9/7から9/11のはてなサマーインターン2020に参加してきました. 普段からはてなさんのサービスにはお世話になっていますし,過去のインターン生の参加記を見ているとめちゃめちゃいい体験ができると感じたのが応募したきっかけです. 5日間という短い期間でしたが,講義や課題を通じて様々なことを学ぶことができました.
本ブログの目次は以下となっています.日毎に振り返っていきたいと思います.
はてなサマーインターン2020について
今年は2つ日程(それぞれ5日間)があり,私は後半の日程の方に参加しました. 今年はリモート開催ということで,お家からはてなさんのインターンに参加させていただきました.
詳しくは以下を参照ください.
1日目
1日目が講義でした.2日目からの課題に必要になる知識を一通り学びます. 講義の内容としては4つあってWEB API,コンテナ,Kubernetes,マイクロサービスでした. 聞いたことはあるけど実際に開発でまともに使ったことがない技術が色々あって,ハンズオンもあり手を動かして学習できてよかったです. 恐ろしく丁寧にスライドが作り込まれていて準備が大変だったことがわかり,気持ちが引き締まったのを覚えています. また,講義を復習しておきます.
コンテナの講義のときに突如開催されたCTFが面白かったです*1.ぜひやってみてください.最後の問題がかなり難しいですが,勉強になります.
2-4日目
2-4日目で1日目の講義の内容をもとに,ブログサービスを題材とした課題をやっていきます. 以下のレポジトリを使います.
基本課題の内容は以下です.
- ブログを書くときに基本的な記法が使えるようにする
- 見出し記法,リンク記法,リスト記法が使えるようにする
- markdown記法の導入ですね
- リンク記法を使うときに,タイトルをURLから自動的に取得できるようにする
- たとえば https://example.com だったら,Example Domainを取得するということです
発展課題はブログサービスとしてよりよいものにしていくという感じの内容でした.
markdown記法の導入
1つ目の課題に対してマイクロサービスとして実装されているrenderer-goサービスに,goldmarkを導入をしました.goldmarkはCommonMark準拠のmarkdownパーサで,拡張性に富んでいます(これめっちゃすごい). goldmarkを導入するだけで基本的な記法(見出し記法,リンク記法,リスト記法)が使えるようになります.
簡単に1つ目の課題が終わってしまったので独自記法であるコメントアウト記法を作りました.ブログにTODOとかのコメントが残っていると残念な気持ちになるので,コメントアウトしてやればいいのではという発想です. この動機に共感していただけて嬉しかった.やっぱり"TODO: 後でやる"みたいなことやりがちですよね...w
#hatenaintern2020
— hatenatech@はてなの技術情報アカウント (@hatenatech) 2020年9月11日
はてなリモートインターン成果発表会、プレゼンもとうとう最後になりました!下書きにTODOなどのコメントを書くことがよくあるから、というコメントアウト記法を思いついた動機に、「わかる~~!」の共感の声が。AST操作しているのも素晴らしいです!
コメントアウト記法は //TODO: something// のようなコメントをHTMLのコメントアウトとしてのように置き換える記法です.コメントアウト記法はgoldmarkのextensionとして実装しました. https://github.com/wt-l00/goldmark-commentoutに実装があるので良ければ見てください(Readmeがまだ書けていなくてごめんなさい). 実装の主な内容としては以下です.
- "/"をトリガーにしてcommentout Nodeの作成
- enter Node: 文字列 "<!-- "を挿入
- leave Node: 文字列 " -->"を挿入
- p tag以下にコメントアウト用のNodeがあると少し微妙な感じがあったのでASTのTrasformerの作成
- commentout Nodeをparagraph Nodeの親Nodeに付け替える.このとき付け替えるときの順番も考慮しないと,コメントとparagraphの順番が逆になってしまうので注意が必要
- paragraph Node以下に子Nodeがなくなると,paragraph Nodeを消去
AST Nodeを生やしたり,ASTをTransformしたりごにょごにょして結構楽しんで作ることができました.
タイトルをURLから自動的に取得
リンク記法をタイトルが空欄のまま書いたときに,URLのタイトル要素が自動的に補完されるという機能を作ります.URLからスクレイピングをしてタイトルを抜き出す実装は課題の指定どおりにマイクロサービスとして切り出して作りました.このサービスを作ったおかげでどうサービスをgRPCでつなぎこむかという部分がクリアになりました.
発展課題として以下の2つを実装(途中のものもある)しました.
- 複数のURLがあるときに,平行にリクエストを行う仕組みを作る
- robots.txtのルールを守ったスクレイピングをする
- https://github.com/temoto/robotstxt https://github.com/temoto/robotstxt を使いました.robots.txtのパースなどいかにも自分で書くとミスしやすい処理だったので...
- あとgoのhttpクライアントはリダイレクト先のURLを見に行くのを知りました
5日目
最終日の5日目はインターン生10人による成果発表会がありました.同じ課題に対してそれぞれが違うアプローチを取っていたり,独自記法や独自のサービスを作ってたりしていて面白かったです.アイコン記法やOGPの画像取得などなど...がありました. 発想がすごいし,それを実装するだけの技術力があってこれまたすごいとなりました.また,私の発表にもコメントやフィードバックをくださって嬉しかったです.
終わりに
実はまだ5日目の途中で全日程が終わったわけではないんですが,5日間が技術的にも会社の文化や雰囲気を感じるという面でも充実していたなと感じています. はてなさんはインターンのことをとても大事にされていて,講義やメンターの方によるアドバイスが丁寧かつ質が高いです.本当にいい体験でした. メンターのid:yigarashiさんにはとても感謝しています.コード,テスト,設計に的確なアドバイスをいただけて開発が捗りました.(PRをたくさん褒めてくださって嬉しかったです!) また,同室のid:uyutakaさんもありがとうございました.
最後になりましたが,はてなの皆様,インターン同期の皆様,一週間ありがとうございました!!!
*1:$ docker run --rm -i hatena/intern-2020-docker-quiz