🏷️
ZennのPublicationの技術スタックを可視化して検索できるサイトを作りました
ZennのPublicationの技術スタックを可視化して検索できるサイトを作りました。
作った理由
ZennのPublication一覧ページには、各Publicationの記事数しか表示されていません。そのため、どのような技術が使われているかを確認するには、各Publicationの詳細ページを見る必要があります。
技術スタックを参考にして企業を探すことはよくあると思うので、それをZennのPublicationに対して簡単にできるようにしてみました。
また、技術スタックだけでなく、各種統計データやリモートワークに関する記事があるかどうかなども可視化しています。

構成

処理の流れ
- Cloud Run JobsでZennを定期的にスクレイピング[1]して、集計したデータをSupabaseのDBに保存する
- VercelのDeploy hookをトリガーする
- 保存したデータを使って、SSGでVercelでデプロイが実行される
使用した技術
SaaS
-
Vercel
- Next.jsのSSGを使用する想定だったので、Next.jsとの相性を考慮して採用
- 後述のTurborepoを導入することで、モノレポも自動で判定して設定不要でビルド可能
-
Supabase
- PostgreSQLのみを利用
- クライアントからの接続はないので、単に使いやすそうという観点で採用
- Supabase CLIが用意されており、開発環境がout of the boxで利用できて好印象
- Cloud Run Jobs
ライブラリやツール
フロントエンド
-
Next.js
- 現状のデファクトスタンダード[4]
-
shadcn/ui (TailwindCSS)
- 過去に使用したことがあるため採用
-
Lucide React
- アイコンの表示
-
twemoji
- アイコンの表示
-
React-Select
- 複数トピックの検索のために採用
-
nivo
- Tech記事とIdea記事の円グラフの描画に利用
- Canvasを利用した描画
-
Motion
- リストの更新時のアニメーションに利用
ジョブ
使用言語はTypeScript(Node.js)でフロントエンドと統一しています。
-
Cheerio
- スクレイピング用
共通
-
pnpm
- 高速
- 最近はデファクトスタンダードになっている印象
-
Drizzle
- シンプル
- 以前に利用したこともあるので採用
-
Vitest
- 新規プロジェクトなので採用
-
Biome
- 設定が楽
- 少なくとも個人開発で使う分には問題なし
-
Turborepo
- 主にVercelでのデプロイ時のビルドをするために採用
- モノレポにすることで、DBのスキーマをフロントエンドとジョブの両方から参照する
その他
-
GitHub Copilot
- Gemini 3 Pro をChatで使用
- 通常の実装補助だけでなく、hooksやコンポーネントへのリファクタリングや苦手なUIの調整にも利用[5]
工夫した点
トピックの表記ゆれへの対応
Zennで使われているトピックの表記ゆれを吸収して、同じトピックとして扱うようにしています。
- 表示名がCase違い: typescriptとTypeScriptなど
- 同じ表示名に対して異なる識別名: 表示名がGo、識別名がgo、golangなど
思ったよりも処理が面倒だったのですが、テストコードを書き、AIの力を借りることで、比較的素早く実装することができたように思います。
jsonb型の利用
内部実装的な観点になりますが、PostgreSQLのjsonb型のカラムを利用して、トピック周りの処理をシンプルにしました。基本的には利用しないのですが、今回のような集計用のデータに使うのはよさそうでした。
今後の展望
実は、QiitaのOrganizationの情報も一緒に載せたかったのですが、
- Qiitaではスクレイピングが禁止されている
- 利用可能なAPIであるQiita API v2では、Organizationの一覧を取得することができない
という状況であり、残念ながら現状は実現できませんでした。
QiitaのGitHub Discussionで要望は出しているので、Organization一覧が取得できるようになった場合は対応しようと思っています。
おわりに
機能の要望や不具合の報告などあれば、問い合わせしてもらえると喜びます。
Discussion