コードの裏側うらがわ:このパーソナルウェブサイトの構築こうちく

最初さいしょは、履歴書りれきしょせるためのウェブサイトをつくりたかっただけだ。そのほうがクールで便利べんりだとおもったからだ。しかし、チャットボットやトップページ、そしてこの技術紹介ぎじゅつしょうかいページを追加ついかしていくうちに、このサイトは本当ほんとう私自身わたしじしん能力のうりょくしめ作品さくひんへと進化しんかした!もっと重要じゅうようなのは、この過程かていおおくのことをまなんだということだ!

1. Astro SPAにおける状態管理じょうたいかんり

右下みぎしたのインタラクティブなちいさな生物せいぶつは、わたしがとても熱中ねっちゅうしたミニプロジェクトだ。アイトラッキング(視線追跡しせんついせき)のアルゴリズムと、なめらかな液体えきたい変形効果へんけいこうか完成かんせいさせるために数日間すうじつかんついやした。しかし、ユーザーがリンクをクリックするたびにページがリロードされ、これらの生物せいぶつがリセットされてしまい、本来ほんらい没入感ぼつにゅうかんこわれてしまった。この問題もんだい解決かいけつするために、このサイトをシングルページアプリケーション(SPA)に変換へんかんする必要ひつようがあった。

Astroは本質的ほんしつてきにはマルチページアプリケーション(MPA)のフレームワークであるため、Astroの <ViewTransitions />導入どうにゅうしたことで、ライフサイクル(lifecycle)に関連かんれんするバグが大量たいりょう発生はっせいした。クライアントがわのJavaScriptがあたらしいページで正常せいじょうにトリガーされない一方いっぽうで、これらのちいさな生物せいぶつは**絶対ぜったいに**リロードさせないようにする必要ひつようがあった。わたしは、2つのことなるAstroディレクティブを使つかってことなるコンポーネントのロジックを処理しょりすることで、この問題もんだい解決かいけつした。生物せいぶつについては persist タグを使用しようし、ページ遷移間せんいかんでそのHTMLノードをシームレスに保持ほじするようAstroに指示しじした。

Orange_Creature.astro
<div id="orange-creature" transition:persist>
</div>

標準的ひょうじゅんてきなページインタラクション(モーダルウィンドウやホバー効果こうかなど)の場合ばあい、ユーザーがあたらしいルートにはいるたびにスクリプトを再実行さいじっこうする必要ひつようがある。標準ひょうじゅんDOMContentLoaded はAstro SPAでは機能きのうしないため、Astroのカスタムライフサイクルフック(lifecycle hook)にロジックをラップして、ナビゲーションのたびに確実かくじつ実行じっこうされるようにした。

InteractiveCards.astro
// This ensures the logic re-runs every time a new page is injected into the DOM
document.addEventListener('astro:page-load', () => {
const interactiveCards = document.querySelectorAll('.interactive-card');
interactiveCards.forEach(card => initHoverLogic(card));
});

2. AIチャットボット:RAGとシステムプロンプトエンジニアリング

最初さいしょは、AIのバックエンドを構築こうちくするのがもっとむずかしい部分ぶぶんだとおもっていた。予想外よそうがいなことに、現代げんだいのAPIのおかげで統合とうごう非常ひじょうにスムーズにすすんだ。本当ほんとう課題かだいは、ボットに個性こせいあたえ、わたし実際じっさいのデータにもとづいて回答かいとうさせることだった。

わたし普通ふつうのチャットボットをつくるのではなく、検索拡張生成けんさくかくちょうせいせい(RAG)の原則げんそく厳密げんみつなシステムプロンプトエンジニアリングを活用かつようした。非常ひじょう具体的ぐたいてきなシステムプロンプトを設計せっけいし、わたし履歴書りれきしょデータ、プロジェクト経験けいけん、そして厳格げんかく行動規範こうどうきはんをAIにあたえ、わたし口調くちょうはなし、専門的せんもんてき背景はいけい関連かんれんする質問しつもんにのみこたえるようにした。フロントエンド部分ぶぶんでは、UIとUXに重点じゅうてんうつした。ストリーミングされるテキストブロックを処理しょりするためにカスタマイズされたタイプライター効果こうか作成さくせいし、ZAPSPLATからの正確せいかく効果音こうかおん統合とうごうして、チャットルームに物理的ぶつりてきなメカニカルキーボードのような感触かんしょくあたえた。

3. CI/CD、国際化こくさいか(i18n)とAIペアプログラミング

英語えいご日本語にほんご中国語ちゅうごくご翻訳ほんやく手動しゅどう管理かんりするのは、アーキテクチャじょう悪夢あくむだった。コードベースをモジュールし、コンテンツとコードを完全かんぜん分離ぶんりする必要ひつようがあったが、ファイルツリー全体ぜんたい手動しゅどうでリファクタリングするには何日なんにちもかかる可能性かのうせいがあった。

この問題もんだい解決かいけつするために、わたしはローカルのAI CLIエージェントツールにたよった。厳密げんみつなアーキテクチャのブループリントをき、エージェントにターミナルで直接ちょくせつ大規模だいきぼ複数ふくすうファイルにまたがるリファクタリングを実行じっこうするよう指示しじした。AIにファイルシステムの自律的じりつてき権限けんげんあたえるのは非常ひじょうにリスクがたかいため、安全あんぜんなDockerコンテナを構築こうちくし、そのなかにAIを「め」た。このサンドボックスにより、エージェントはわたしのプロジェクトファイルにしかアクセスできないようになり、これがDockerベースの開発環境かいはつかんきょうまなぶきっかけにもなった。

4. なめらかなアニメーションとユーザーエクスペリエンス(UX)

現代げんだいのウェブアプリケーションには、すぐれた触覚的しょっかくてきフィードバックがもとめられる。ページをスクロールするさいすべるような感覚かんかくがあり、要素ようそ自然しぜんあらわれるようにしたかった。そこで、数学的すうがくてき計算けいさんによるスムーズなスクロールを実現じつげんするためにLenisを実装じっそうし、複雑ふくざつなスクロールトリガーアニメーションを処理しょりするためにGSAP(GreenSock)を使用しようした。これらのライブラリを使つかうのははじめてだったので、わたしにとってはまさに短期集中たんきしゅうちゅうコースのようだった。ドキュメントをみ、タイムラインの状態じょうたい管理かんりし、Astroのビュートランジションちゅうにアンマウントされたコンポーネントでメモリリーク(memory leaks)が発生はっせいするのをふせ必要ひつようがあった。

5. コードとキャンバスをつな架け橋かけはし

著作権問題ちょさくけんもんだいけるため、視覚的しかくてきなアセットは自分じぶん制作せいさくすることにめた。一時的いちじてき生成せいせいAIの使用しようかんがえたが、最終的さいしゅうてきにはピクセルアート(Pixel Art)をまなぶことをえらんだ。しかし、そのむずかしさを完全かんぜんくびっていた!開発者かいはつしゃとして、純粋じゅんすいなロジックから視覚的しかくてきなUIデザインへの移行いこうは、わたし経験けいけんしたなかもっとけわしい学習曲線がくしゅうきょくせんだった。

わたしはAsepriteを使つかい、苦労くろうしながら1フレームずつピクセルアートのアセットを設計せっけいし、アニメーションを作成さくせいした。これにより、スプライトシート(sprite sheets)とCSSキーフレーム(keyframe)の統合とうごうについておおくをまなぶことができた。全体ぜんたいとして、自分じぶん技術的ぎじゅつてき背景はいけい視覚的しかくてき一貫性いっかんせいのあるUIに変換へんかんすること――flexboxの制限せいげん、タイポグラフィ、そして余白よはくのバランスをとること――は、構築こうちくプロセス全体ぜんたいもっと挑戦的ちょうせんてきであり、同時どうじもっと達成感たっせいかんのある部分ぶぶんだった。



効果音こうかおん(SFX)はどこかられたのか?

効果音こうかおん大部分だいぶぶんZAPSPLAT から取得しゅとくしたものだ!

特別とくべつ感謝かんしゃささげる技術ぎじゅつ

Astro LogoAstro.js
Google LogoGoogle Gemini & CLI
Docker LogoDocker
Docker LogoDocker
GitHub LogoGitHub
Aseprite LogoAseprite
Zapsplat LogoZAPSPLAT
GSAP LogoGSAP
Lenis