×
Copy
Open
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
思いつきで推しの 誕生日記念コンテンツを 2日で作る技術 八雲アナグラ(@AnaTofuZ) 2025/04/27 甲斐国もくもく会 x 山梨WordPress Meetup 〜春のLT大会〜
Slide 2
Slide 2 text
● 八雲アナグラ(@AnaTofuZ) ● 株式会社コードタクトでバックエンドエンジニア ○ Rubyメインで趣味でPerl ● 今年の1月から甲府からフルリモート勤務 ○ 山梨出身ですが10年ぶりに帰ってきました 自己紹介
Slide 3
Slide 3 text
技術なんでも OKイベント Houtou.pmやります!!きてくれ!!
Slide 4
Slide 4 text
推し
Slide 5
Slide 5 text
No content
Slide 6
Slide 6 text
● ほうとうももじる ● 山梨ご当地VTuber ● 今日からおいしい学校で コラボベント中 宝灯桃汁
Slide 7
Slide 7 text
No content
Slide 8
Slide 8 text
誕生日 4月12日
Slide 9
Slide 9 text
2日前に 思い出す
Slide 10
Slide 10 text
突然の 開発機運
Slide 11
Slide 11 text
4月10日にgit init
Slide 12
Slide 12 text
https://anatofuz.net/momojiruslot202504/ ※音がでます!!
Slide 13
Slide 13 text
● 宝灯桃汁を揃えるスロットマシーン ● スタートと同時に動画が再生 ● 4つ停止すると結果をツイートできる ○ 作られた名前がツイッター上で画像と して表示される 宝灯桃汁スロットマシーン
Slide 14
Slide 14 text
No content
Slide 15
Slide 15 text
● うまい ● やすい ● はやい 技術選定
Slide 16
Slide 16 text
● うまい ○ 見た目がそこそこ良い ○ ちゃんとコンテンツとして楽しめる ● やすい ○ 金がかからない ● はやい ○ 今回は2日でリリースまで持っていきたい ■ 自分がシュッと実装できるものを選択 技術選定
Slide 17
Slide 17 text
● Next.js(React)を使ってブラウザで動作させる ○ 素早く作るとしたら非常に手慣れている技術で... ● ホスティングはGitHubPagesを使う ○ HTMLさえあれば無料で配信可能 ○ GitHubActionsと組み合わせるとデプロイの手間もない ● Next.jsはSSG(予めHTMLを生成するモード)を採用 ○ サーバーを動かすと金がかかる ○ Next.jsだといっぱいページを作るみたいなのがはやい 基本戦略
Slide 18
Slide 18 text
● スロットマシーン本体 ○ 多分JavaScriptで十分表現できる ● リザルトのページと画像 ○ GitHubPagesでホストするので予め作成する必要がある ○ 予め画像を生成して、それぞれの結果を予めog:imageに設定した ページを作れば実現できる ○ スロットマシーンの結果を予め作成するには...? 今回作るページ
Slide 19
Slide 19 text
自分で作るスロットマシーンなので有限状態 宝 灯 桃 汁
Slide 20
Slide 20 text
漢字URLだとバレるので一文字ずつ idを付与 宝 灯 桃 汁 a1B3c u2Vwx o2Pqr d2CeF
Slide 21
Slide 21 text
ハイフンでつなげるとスロットの URLにできる 宝 灯 桃 汁 a1B3c u2Vwx o2Pqr d2CeF - - -
Slide 22
Slide 22 text
● スロットの盤面の全パターン的に今回は1470通り ○ 手でつくるのはつらい.... ● Next.jsだとURL上の動的に変わる部分を予めパターン指定すると自動 的にHTMLを作ってくれる機能がある ○ 盤面パターンからURLの変換を全部作る関数を元に生成可能 スロットリザルト画面 export async function generateStaticParams() { return combinations.map( (combo) => ({ id: generateURLFromJoinReel(combo) })); }
Slide 23
Slide 23 text
● vercel/satoriを使うとJSXを元にSVGが生成できる ● さらにそのSVGをNode.jsでpngに変換 ● 生成する画像のパターンも同様に作れるので... ○ ビルド時にこれを事前に行うといい感じに生成できる ● 結果ツイートするURLのページのog:imageを生成した画像を指定してお くことでツイート時に画像がでるようになる 画像生成方法
Slide 24
Slide 24 text
こんな感じのコードが const generateOgpImage = async (title: string) => { const font = fs.readFileSync("public/font/yuji_syuku.ttf"); const svg = await satori(
山梨ご当地VTuber
{title}
, ); return await sharp(Buffer.from(svg)).png().toBuffer(); };
Slide 25
Slide 25 text
No content
Slide 26
Slide 26 text
No content
Slide 27
Slide 27 text
● あとは楽をしたいところ(CSSの設定とか)をChatGPTくんと一緒につくって いくと2日でも完成する ● 1ページくらいのそこまで込み入ってないページであるなら70点 くらいのコードをまぁまぁ生成してくれる ○ 今回だとスロットが揃ったときの挙動がおかしいとか ● 自分がある程度書ける技術スタックでスタートダッシュを決めてもらうのに はとてもよかった ここまで決まったら
Slide 28
Slide 28 text
No content
Slide 29
Slide 29 text
● 思いつきでもAIを使いつつ慣れたWeb技術だとそれっぽい推しのコンテン ツが作れた ● 無料でコンテンツするときはSSG系の技術がわりと便利 まとめ