w_tl00’s blog

インプットをまとめておく

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

こんにちは,id:w_tl00です.

9/7から9/11のはてなサマーインターン2020に参加してきました. 普段からはてなさんのサービスにはお世話になっていますし,過去のインターン生の参加記を見ているとめちゃめちゃいい体験ができると感じたのが応募したきっかけです. 5日間という短い期間でしたが,講義や課題を通じて様々なことを学ぶことができました.

本ブログの目次は以下となっています.日毎に振り返っていきたいと思います.

はてなサマーインターン2020について

今年は2つ日程(それぞれ5日間)があり,私は後半の日程の方に参加しました. 今年はリモート開催ということで,お家からはてなさんのインターンに参加させていただきました.

詳しくは以下を参照ください.

hatenacorp.jp

1日目

1日目が講義でした.2日目からの課題に必要になる知識を一通り学びます. 講義の内容としては4つあってWEB API,コンテナ,Kubernetes,マイクロサービスでした. 聞いたことはあるけど実際に開発でまともに使ったことがない技術が色々あって,ハンズオンもあり手を動かして学習できてよかったです. 恐ろしく丁寧にスライドが作り込まれていて準備が大変だったことがわかり,気持ちが引き締まったのを覚えています. また,講義を復習しておきます.

コンテナの講義のときに突如開催されたCTFが面白かったです*1.ぜひやってみてください.最後の問題がかなり難しいですが,勉強になります.

2-4日目

2-4日目で1日目の講義の内容をもとに,ブログサービスを題材とした課題をやっていきます. 以下のレポジトリを使います.

github.com

基本課題の内容は以下です.

  • ブログを書くときに基本的な記法が使えるようにする
    • 見出し記法,リンク記法,リスト記法が使えるようにする
    • markdown記法の導入ですね
  • リンク記法を使うときに,タイトルをURLから自動的に取得できるようにする
    • たとえば https://example.com だったら,Example Domainを取得するということです

発展課題はブログサービスとしてよりよいものにしていくという感じの内容でした.

markdown記法の導入

1つ目の課題に対してマイクロサービスとして実装されているrenderer-goサービスに,goldmarkを導入をしました.goldmarkはCommonMark準拠のmarkdownパーサで,拡張性に富んでいます(これめっちゃすごい). goldmarkを導入するだけで基本的な記法(見出し記法,リンク記法,リスト記法)が使えるようになります.

簡単に1つ目の課題が終わってしまったので独自記法であるコメントアウト記法を作りました.ブログにTODOとかのコメントが残っていると残念な気持ちになるので,コメントアウトしてやればいいのではという発想です. この動機に共感していただけて嬉しかった.やっぱり"TODO: 後でやる"みたいなことやりがちですよね...w

コメントアウト記法は //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があるときに,平行にリクエストを行う仕組みを作る
    • AST木を走査する途中で逐一リクエストを送るのをやめるという手法をとりました
    • goroutineでシュッと並行にリクエストできるようにしました
    • 同一URLには一度のリクエストで済むようにしました
    • DOS対策なども考えられるとよかった(ホスト名のカウントを持つとかで実装しようとしていました)
    • キャッシュを考えている人がいてよかった
  • robots.txtのルールを守ったスクレイピングをする

5日目

最終日の5日目はインターン生10人による成果発表会がありました.同じ課題に対してそれぞれが違うアプローチを取っていたり,独自記法や独自のサービスを作ってたりしていて面白かったです.アイコン記法やOGPの画像取得などなど...がありました. 発想がすごいし,それを実装するだけの技術力があってこれまたすごいとなりました.また,私の発表にもコメントやフィードバックをくださって嬉しかったです.

終わりに

実はまだ5日目の途中で全日程が終わったわけではないんですが,5日間が技術的にも会社の文化や雰囲気を感じるという面でも充実していたなと感じています. はてなさんはインターンのことをとても大事にされていて,講義やメンターの方によるアドバイスが丁寧かつ質が高いです.本当にいい体験でした. メンターのid:yigarashiさんにはとても感謝しています.コード,テスト,設計に的確なアドバイスをいただけて開発が捗りました.(PRをたくさん褒めてくださって嬉しかったです!) また,同室のid:uyutakaさんもありがとうございました.

最後になりましたが,はてなの皆様,インターン同期の皆様,一週間ありがとうございました!!!

*1:$ docker run --rm -i hatena/intern-2020-docker-quiz