ふじしゃんです。
8/21 ~ 9/8 の3週間、はてなリモートインターンシップ2023に参加してきました。
hatena.co.jp
今回はインターン参加記を書いていこうと思います。
応募
はてなリモートインターンシップの存在自体はかなり前から知っていましたが、実際に応募するのは初めてでした。
応募するときに募集ページを見ていて「はてなは2008年からインターンシップをしていたのか!」とびっくりしたのを覚えています。
「10年後の自分を作る」というなんだかカッコいいキャッチフレーズと、いつもお世話になっているはてなブログと Mackerel などの開発を体験し、実際にリリースしてユーザーからのフィードバックを得ることができるところに惹かれて応募を決めました。
はてなリモートインターンシップでは応募する前に簡単なクイズが毎年出題されます。
これを解かないと応募ページにたどり着くことができません。
今年は「4桁のパスコードを入力して応募しよう!」というクイズで、ソースコードにパスコード書いてあるやろ〜とおもむろに F12 キーを押すとしっかりと暗号化されていたので、以下のようなコードを書いて無事正解することができました。
async function main() { for (let passcode = 1000; passcode <= 9999; passcode++) { try { const result = await unlock(passcode); return result; } catch (e) {} } } main()
面接
面接は Google Meet を通して1時間ほどで行われました。
気さくでとても話しやすいエンジニアの方と2対1の形式でした。
私は特に面接に向けて対策などは行っていなかったのですが、面接官がエンジニアということもあって、GitHub で公開されているソースコードや技術に関する話題で盛り上がりました。
ブロックチェーン, OAuth2, OIDC, Perl, ソフトウェアアーキテクチャの話は特に楽しかったです。
最後らへんは完全に雑談という感じでしたが、はてなの雰囲気や技術選定に関する質問などをさせていただきました。
面接という感じはしませんでしたが、あっという間に1時間は過ぎ去りました。
終わった直後に「はてなのエンジニアさんめちゃくちゃ ツヨツヨ 〜〜〜」とツイートしたのを覚えています。
ここからが驚きなんですが、合否が面接をしたその日に届きました。
一息つく間もなく「内定のお知らせ」というメールがきて動揺したのを覚えています。
スピード感がとんでもなかったです。
1週目: 講義パート
はてなリモートインターンシップの醍醐味とも言える Web に関連する技術を網羅的に取り扱う講義パートです。
かなり楽しみにしていました。
講義は 45~60 分ほどのものが、10個ほどありました。ということは合計で約600分 = 10時間ぐらいの講義ということですね!(凄い)
ちなみに、講義パートといいつつも、1週間で Go, TypeScript, gRPC, k8s などのモダンな技術スタックで小さなブログサービスを作るという課題とセットになっていて、実際に手を動かしながら学べたのは良かったです。
内容は以下のような感じでした。
Web/HTTP
Web の根幹である HTTP を学びました。
RFCをベースに仕組みを理解する流れで講義は進みましたが、特に HTTP/0.9 や Head of Line Blocking の話が面白かったです。
Web API
現代の Web には欠かせない API について学びました。
講義の中では、REST, GraphQL, gRPC が取り上げられていました。
実際に課題で gRPC を用いてサービス間の通信を実装したのですが、型が付いて脳汁ドバドバでした。
インフラ
Webサービスを開発運用するときのインフラについて学びました。
System - (Application + Data) = Infra という説明と、コストはシステムの生み出す価値と天秤に掛ける必要があるという言葉がとても印象に残っています。
また「計測できないものは制御できない」という名言やサイト信頼性エンジニアリングについても取り上げられていました!
コンテナ
Docker を始めとするコンテナ技術について学びました。
コンテナは、プロセスが利用できるリソースを制限する技術を組み合わせて実現されていて、Linux Kernel が持っている Namespace という機能が UID/GID の分離や CPU, メモリ使用量などを制限していることなどを教えていただきました。
コンテナイメージが階層化された tar アーカイブというのは初めて知ったのでびっくりしました!
コンテナオーケストレーション (k8s)
コンテナの講義をベースに、複数のコンテナを協調させ高い可用性を実現するための仕組みを学びました。
なんだかんだ k8s をまともに学んだことがなかったので、インターンが終わったあとにラズパイのクラスタを組んで遊んでみようと思いました。
ソフトウェアアーキテクチャ
ソフトウェアにおける設計の重要さを、建築をベースに学びました。
大規模工事でドデカイ建物を建てるためには構造設計が必須で、それはソフトウェアも同じであるということを教えていただきました。
また、システムの外形的アーキテクチャとしてモノリス, モジュラーモノリス, マイクロサービスなどの設計手法やレイヤー化アーキテクチャを通して依存関係逆転の原則について学びました。
RDBMS
この講義はブートキャンプの形式でした。
SQL の構文や RDB 入門をしたのちに、テーブル設計や INDEX や EXPLAIN を用いたクエリのパフォーマンスチューニングも学びました。
Slow Query をモニタリングして EXPLAIN してチューニングするの大事だなぁと思いました。
フロントエンド
この講義はブートキャンプの形式でした。
現代のフロントエンドとして React の話を聞いたり、JavaScript, TypeScript の構文について学びました。
JavaScript やフロントエンド周辺技術の標準化についても知ることができたので良かったです。
オフラインデー
今回のインターンでは、1日のみオフラインデーがありました。


東京オフィスに集合して、1週間でこなした課題の総評や交流会などを行いました。
また、翌週から始まる実践パートに向けての準備運動などもありました!
2~3週目: 実践パート
いよいよ、実践パートです!
私は「はてなブログチーム」の配属になったので、はてなブログの開発を担当することになりました。
はてなブログは私がプログラミングを始めた中学生の時から知っているので、感慨深いです。
さて、インターンで開発したのは「Mastodon と Misskey に記事をシェアする機能」です。

SNSが多様化する中で、Mastodon や Misskey などの利用も広がっています。
はてなブログに Mastodon と Misskey に記事をシェアする機能を実装することで、記事のシェアが促進されるのではないかと思い、実装をすることに決めました。
実装する中で工夫した点として、WebFinger を用いて Mastodon や Misskey がホストされているサーバーのドメインを取得するようにした部分が挙げられます。
ActivityPub におけるユーザーID は @test@example.com のような形式で表すことができますが、この example.com に Mastodon や Misskey が必ずしもホストされているわけではないのです。
例えば、Vivaldi Social ではユーザーID は @test@vivaldi.net であるが、サーバーは social.vivaldi.net という構成になっています。
これに対応するために、RFC7033 で標準化されている WebFinger という仕組みを用いました。
RFC7033 には、CORS への対応を MUST で行うように書かれているためフロントエンドから呼び出すこともできますが、ほとんど変わることのない値であることを考慮して、バックエンドで一定期間レスポンスをキャッシュするようにしています。
8/28 ~ 9/6 にかけて開発を行い、9/7 に本番環境に無事リリースすることができました!
リリース後の反響
Misskey の作者である Syuilo さんに機能をご紹介いただいたり、リリース記事のブックマークが 100users を超えるなど、大きな反響をいただきました!
また、はてなブックマークや SNS でのコメントもポジティブなものばかりで嬉しかったです。
(リリースした日の夜は、ひたすらエゴサをしていましたw)
b.hatena.ne.jp
misskey-hub.net
misskey.io
を130件も頂いてしまいました!