AIつまみアイコンを支える技術 (Webアプリ実装編)

フロントエンド・バックエンドの実装の話

投稿日
更新日
読了予想時間
25
tag emoji技術

この記事は「UEC Advent Calendar 202422 日目の記事です。

adventar.org
UEC Advent Calendar 2024 - Adventar
# 電通大生による電通大生のためのAdvent Calendar 2024 ## これはなに? 12/1から12/25のクリスマスまで、毎日電通大生の有志が記事を書いて、カレンダーを電通大に染める企画です。例年、知らぬ間に有志によって動いています。 早々に埋まったので[その2](https://adventar.org/calendars/10198)も作りました。 ## 何を書けばいいの? 技術的なお話はもちろん、真面目なネタやオタクなネタでも何でもいいです。なんなら作り話でもなんでもいいです。後ろにあるリンクから過去のアドベントカレンダーを見れば雰囲気がわかります。 ## 誰が書けるの? 電通大生っぽかったら、誰でもいいです。電通大生っぽかったら、誰でもいいんですよ。 ## 参加したいが、ネタがないです まずは参加登録してから悩みましょう。あなたの身の回りには、知らぬ間にネタで溢れかえっています。学校のことやバイトのこと、生涯を誓った推しのことやライフハックなど、書けそうって思えるものならなんでもOKです。 過去のAdvent Calendar [UEC Advent Calendar 2013](https://adventar.org/calendars/113) [UEC Advent Calendar 2014](https://adventar.org/calendars/335) [UEC Advent Calendar 2015](https://adventar.org/calendars/726) [UEC Advent Calendar 2016](https://adventar.org/calendars/1953) [UEC Advent Calendar 2017](https://adventar.org/calendars/2376) [UEC Advent Calendar 2018](https://adventar.org/calendars/3569) [UEC Advent Calendar 2019](https://adventar.org/calendars/4393) [UEC Advent Calendar 2020](https://adventar.org/calendars/5070) [UEC 2 Advent Calendar 2020](https://adventar.org/calendars/5276) [UEC Advent Calendar 2021](https://adventar.org/calendars/6400) [UEC 2 Advent Calendar 2021](https://adventar.org/calendars/6598) [UEC Advent Calendar 2022](https://adventar.org/calendars/7581) [UEC 2 Advent Calendar 2022](https://adventar.org/calendars/7586) [UEC Advent Calendar 2023](https://adventar.org/calendars/8698) [UEC 2 Advent Calendar 2023](https://adventar.org/calendars/8704) ### P.S. 2025年のUEC Advent Calendarを作ろうとしているそこのあなた 開発者ツールでheadタグの中を見るとMarkdownが載ってるからコピペしてね

先日の記事はみみちゃんさんの「一年間Linuxを普段遣いしてみてよかったこと・わるかったこと」でした。

Uncaught TypeError: fetch failed
    at node:internal/deps/undici/undici:13392:13
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)

こんにちは、つまみさんの個人サイト trpfrog.net フロントエンドエンジニアのつまみ (@TrpFrog) です。trpfrog.net バックエンドエンジニアのつまみ (@TrpFrog) です。trpfrog.net プロンプトエンジニアのつまみ (@TrpFrog) です。くどい

普段は電気通信大学の大学院で住みやすい自席を作る研究をしています。間違えた、自然言語生成の研究をやっています。

住みやすい自席を作る研究
研究室の一角にあるデスク周りの写真。左手前には木製リストレスト付きのキーボード (Realforce) とワイヤレスマウス、そしてシルバーのノートPCスタンドに載った MacBook Pro が閉じて置かれている。奥のパーティションボードには濃い青色の仕切りがあり、そこにアニメや漫画のグッズが多数飾られている。具体的には、コミックス数冊が積まれ、その周囲にアニメキャラクターのアクリルスタンドフィギュア、缶バッジ、イラストカードなどが並んでいる。さらに、壁には浴衣姿の二人の少女を描いた『安達としまむら』のタペストリーがかけられている。右下にゴミ箱が置かれている。机の下の奥には、ピンク色のメンダコのぬいぐるみがひっそりと置かれている。全体としてアニメ関連の装飾に囲まれたデスクスペースが映し出されている。
住みやすい自席を作る研究

Q. 本当にこれで研究できるんですか?
A. やるんだよ……

追記: 国際学会通ったぞ!うおおお

もう修士2年で、就職先も決まったので UEC Advent Calendar に書くのはこれが最後になります。 最後は趣味の Web 開発と研究分野を合体させたかのようなこの記事で締めます!


先日公開されたちくわぶさんの『AIつまみアイコンを支える技術』はお読みいただけたでしょうか? AIつまみアイコンがどのようにして作られているのか、画像生成AIの仕組みについて詳しく書かれていました。基礎から丁寧に説明されているので、まだ読んでないよ〜という人はぜひ併せてこちらも読んでください!a photo of trpfrog in winter かわe

つまみアイコン

つまみ (@TrpFrog) は、インターネット上で非常に人気のあるコメディアンの一人です。彼女はユーモラスで機知に富んだ発言を次々と生み出し、その才能は多くのファンを魅了しています。特に、彼女の可愛らしいアイコン画像から想像できないような大胆かつ痛快な発言は、彼女のユニークな魅力の一部となっています。

さて、この記事ではAIつまみアイコンを支える技術 (Webアプリ実装編) についてお話しします。 この記事では、アイコンがどのように作られ、Webサイト上で表示されるまでの裏側を解説します。

作ったもの

まずはトップページをご覧ください。

つまみアイコンのトップページの『AIつまみアイコン』コンポーネントのスクリーンショット

このページにはAIで自動生成したつまみアイコンが表示されています。 このアイコン生成にはちくわぶさんの作成した Stable Diffusion 3.5 の LoRA を使っています。ありがとうございます。

このアイコンは (最短) 3時間ごとに自動更新されます。 (厳密には、APIの利用回数制限をケチるために、サイト訪問者が訪れる→生成リクエスト→最後の生成から3時間経っていたら生成 というふうにやっています。つまり、アクセスがないと更新されないのです!)

この「自動更新」、つまり自動的に最新の状態になる機能というのがポイントで、画像生成のためのプロンプト(AIに画像を生成させるためのお題)の生成も自動でやっています。

また、今回せっかくなので生成履歴のページも作ってみました。

AIつまみアイコンの一覧ページ

この記事では、このWebアプリのフロントエンドとバックエンドの実装について詳しく解説します!

技術スタック

このWebアプリは、以下の技術を使って作られています。 まるで料理のレシピのようですね! ← Gemini 2.0 Flash Experimental が言ってました。かわいいね。

ツールチェーン

  • pnpm 高速で効率的なパッケージマネージャで、モノレポ構成に向いています。
  • TypeScript 型安全な開発を可能にするプログラミング言語で、コードの保守性と信頼性を向上させます。
  • ESLint v9 コードの品質を向上させるためのツールです。
  • Prettier コードの見た目を自動で整えてくれるツールです。
  • Turborepo モノレポ構成での開発を効率化するためのツールです。

フロントエンド

  • Next.js 15 (App Router) Reactを使ってWebサイトを構築するためのフレームワークです。
  • React 19 UIを作るためのライブラリで、アプリケーションのパフォーマンスと柔軟性を向上させます。
  • Tailwind CSS 効率的にスタイルを作成できるCSSフレームワークです。
  • Vercel (ホスティング) Next.jsとの相性が良く、デプロイとスケーリングが簡単です。

バックエンド

  • Hono 小型で高速なTypeScriptベースのWebフレームワークです。
  • Cloudflare Workers 分散型サーバーレス環境で、リクエストを高速に処理できます。
  • Drizzle ORM 軽量で型安全なORMで、データベースの操作を簡単にしてくれます。
  • Cloudflare D1 SQLite互換の分散型データベースです。
  • Cloudflare R2 オブジェクトストレージサービスで、大きなデータを保管できます。
  • Cloudflare Workers KV 分散型キー値ストアで、低遅延なデータアクセスが可能です。
  • OpenAI API 高度な言語モデルを利用できるAPIで、自然言語処理機能をアプリケーションに追加できます。
  • LangChain LLMを統合し、複雑な自然言語処理フローを構築するためのライブラリです。
  • HuggingFace Inference API 様々な機械学習モデルを簡単に利用できるAPIです。

モノレポ構成とは、複数のプロジェクトを一つのリポジトリで管理する開発スタイルです。関連するコードをまとめて管理できるので、開発が効率化しやすいというメリットがあります。

開発の流れ

フロント側の画面の構想をたててから、バックエンド→フロントエンドの流れで作りました。 バックエンドは完全にノリで作っていました。

バックエンドにはクリーンアーキテクチャを採用しました。おしごとプログラミングをする中で知って「え!これが求めていたものだ!」となった良いものだったので今回採用してみました。全部ノリと勢いでやっている、ADR とか DD とか書いた方が良い。うるさい❗️趣味のプログラミングやぞ❗️労働なんてクソくらえですわ〜✨🌷(趣味プログラミングお嬢様)

とはいえテストとかもそうですけど、業務でやってることを趣味に使うと「めんどくさそうだと思ってたけど逆にメンテコスト下がってよかった!」いうこともあるので、面倒くさがらずにきちんと業務テク取り入れた方が良いのかな〜と思ったりしました。『個人開発でサボるための業務開発テクニック』みたいな記事が読みたいです。誰か書いてください (他力本願)。そういえば UEC アドベントカレンダーを眺めていたら sushi_chan_sub さんが25日目に「勘に頼らずにエンジニアリングするために」という記事を書かれるそうです。ノリと勢いでしか個人開発やってないので楽しみです。

この記事では分かりやすさのためにフロントエンドの処理の流れの話を先にして、後からバックエンドの話をします。 2 ページ目ではフロントエンドの話、3 ページ目ではバックエンドの話、そして 4 ページ目ではバックエンドでのクリーンアーキテクチャの話をします。

注意: 情報が古い場合があります

これを実装したのは1年半以上前であるため、認識が古い部分があるかもしれません。できるだけ新しい情報を調べて載せるようにはしますが、最新の情報は公式ドキュメントなどを参照してください。もし「それは古いよ!」という情報があれば教えていただけると助かります!

234Next →
記事一覧ツイート訂正リクエスト
タグ「技術」の新着記事