Skip to content

Commit 699962f

Browse files
committed
Merge branch 'develop'
2 parents 47420ff + 458b17c commit 699962f

19 files changed

Lines changed: 145 additions & 133 deletions

WebSite/assets/data/blogList.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
[
22
{
3-
"id": "blog_00016",
4-
"title": "ZedのRuleの追加について",
5-
"date": "2025-11-30T00:00:00.000Z",
3+
"id": "blog_00017",
4+
"title": "ZedのAI機能活用術:Text Threadとスラッシュコマンド徹底解説",
5+
"date": "2025-12-01T00:00:00.000Z",
66
"category": "IDE",
77
"description": "ZedのRuleの使い方をまとめました",
88
"tags": [
99
"zed",
1010
"ai"
1111
],
1212
"thumbnail": "assets/img/zed_icon.png",
13-
"contentPath": "blog/blog_00016.html",
13+
"contentPath": "blog/blog_00017.html",
1414
"recommended": true
1515
},
1616
{
17-
"id": "blog_00017",
18-
"title": "ZedのAI機能活用術:Text Threadとスラッシュコマンド徹底解説",
17+
"id": "blog_00016",
18+
"title": "ZedのRuleの追加について",
1919
"date": "2025-11-30T00:00:00.000Z",
2020
"category": "IDE",
2121
"description": "ZedのRuleの使い方をまとめました",
@@ -24,7 +24,7 @@
2424
"ai"
2525
],
2626
"thumbnail": "assets/img/zed_icon.png",
27-
"contentPath": "blog/blog_00017.html",
27+
"contentPath": "blog/blog_00016.html",
2828
"recommended": true
2929
},
3030
{

WebSite/assets/data/blogList_en.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@
1515
},
1616
{
1717
"id": "blog_00017",
18-
"title": "ZedのAI機能活用術:Text Threadとスラッシュコマンド徹底解説",
18+
"title": "## Mastering Zed's AI Features: A Comprehensive Guide to Text Threads and Slash Commands",
1919
"date": "2025-11-30T00:00:00.000Z",
2020
"category": "IDE",
21-
"description": "ZedのRuleの使い方をまとめました",
21+
"description": "Here's a summary of how to use Zed's Rules.",
2222
"tags": [
2323
"zed",
2424
"ai"

WebSite/blog/blog_00001.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ <h1 class="post-detail__title">ブログはじめました</h1>
9797
</ul>
9898
</div>
9999
</header>
100-
<section class="post-detail__body markdown-body"><h2 id="自己紹介">自己紹介</h2><p>こんにちはパン君です。</p>
100+
<section class="post-detail__body markdown-body"><h2 id="自己紹介">自己紹介</h2><p>こんにちは!パン君です。</p>
101101
<p>私はとあるゲーム会社で働きながら、インディーズや個人制作でも活動しているゲームエンジニアです。</p>
102102
<p>社会人2年目ということもあり、インディーズやプライベートで制作した作品などを整理して<br>今後の活動に役立つような「まとめの場所」が欲しいと思いこのサイトを作りました。</p>
103103
<p>本当はサーバーを借りたり、常駐用のミニPCを用意して1から環境構築して……という方法も考えましたが、<br>まずは <strong>「早く出す」ことを優先</strong> して、今回は GitHub Pages を使っています。 </p>

WebSite/blog/blog_00008.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ <h1 class="post-detail__title">Discord Bot のアーキテクチャを見直し
9797
</ul>
9898
</div>
9999
</header>
100-
<section class="post-detail__body markdown-body"><p>こんにちはパン君です。</p>
100+
<section class="post-detail__body markdown-body"><p>こんにちは!パン君です。</p>
101101
<p>この記事では、個人で運用している <strong>Discord Bot のアーキテクチャをどう組み直したか</strong> をまとめます。</p>
102102
<p>やりたかったことはざっくりいうと、</p>
103103
<ul>

WebSite/blog/blog_00011.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ <h1 class="post-detail__title">自作Discord Botを公開したらスパムに
9797
</ul>
9898
</div>
9999
</header>
100-
<section class="post-detail__body markdown-body"><p>こんにちはパン君です。</p>
100+
<section class="post-detail__body markdown-body"><p>こんにちは!パン君です。</p>
101101
<p>今回は個人で運用していた <strong>Discord Botを公開したら大失敗した</strong> という話になります。</p>
102102
<p>先日、僕が運営しているゲーム開発サーバーで事件が起きました。<br>なんと自作ボットが乗っ取られたかのように、 <strong>全く関係ないDiscordサーバーの招待URLをひたすら連投し始めた</strong> んです。<br>原因は僕が作ったボットの <strong>アーキテクチャに潜んでいた致命的な設計ミス</strong> でした。 </p>
103103
<p>今回は自戒を込めて、僕がやらかしたミスとその対策を全部ここに書き残しておこうと思います。</p>

WebSite/blog/blog_00012.html

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ <h1 class="post-detail__title">静的サイトにお問い合わせフォーム
100100
<section class="post-detail__body markdown-body"><p>こんにちは!パン君です。</p>
101101
<p>このポートフォリオサイトは GitHub Pages でホスティングしている静的なWebサイトです。 </p>
102102
<p>そしてお問い合わせを実装するにはメールに送信するための仕組みがいります。<br>API実装を常駐サーバーでトンネル通信をPlayit.ggを利用して行っていますが、数週間前からトンネルの作成が出来ずに困っています...<br>(公式には連絡したのですが...)</p>
103-
<p>そこで今回は <strong>Google Apps Script (GAS)</strong> を簡易的なバックエンドAPIとして利用し、完全無料でメール送信機能を実装しました。 </p>
103+
<p>そこで今回は <strong>Google Apps Script (GAS)</strong> を簡易的なバックエンドAPIとして利用し、完全無料でメール送信機能を実装しました。 </p>
104104
<h2 id="なぜ-gas-google-apps-script-なのか">なぜ GAS (Google Apps Script) なのか</h2><p>静的サイトでフォームを実装する方法はいくつかあります。 </p>
105105
<ol>
106106
<li><strong>Formspree などの外部サービスを使う</strong><ul>
@@ -174,9 +174,9 @@ <h3 id="ポイント">ポイント</h3><ul>
174174
</code></pre>
175175
<p>これを「ウェブアプリ」としてデプロイし、アクセス権限を「全員 (Anyone)」に設定することで、外部から叩ける API URL が発行されます。 </p>
176176
<hr>
177-
<h2 id="フロントエンド実装-javascript">フロントエンド実装 (JavaScript)</h2><p>次に、この API を叩くフロントエンド側の処理です。<br><code>fetch</code> API を使って非同期送信を行います。</p>
177+
<h2 id="フロントエンド実装-javascript">フロントエンド実装 (JavaScript)</h2><p>次にこの API を叩くフロントエンド側の処理です。<br><code>fetch</code> API を使って非同期送信を行います。</p>
178178
<h3 id="corsのエラーを回避するコツ">CORSのエラーを回避するコツ</h3><p>GAS に対して <code>application/json</code> で POST すると、CORS (Cross-Origin Resource Sharing) のプリフライトリクエスト (OPTIONS) が発生し、GAS がうまく返答できずにエラーになることがあります。</p>
179-
<p>これを回避するために、あえて <code>text/plain</code> としてデータを送信する方法を採用しました。</p>
179+
<p>これを回避するためにあえて <code>text/plain</code> としてデータを送信する方法を採用しました。</p>
180180
<pre><code class="language-javascript">const GAS_API_URL = &quot;https://script.google.com/macros/s/xxxx/exec&quot;;
181181

182182
form.addEventListener(&quot;submit&quot;, async (e) =&gt; {
@@ -208,19 +208,19 @@ <h3 id="corsのエラーを回避するコツ">CORSのエラーを回避する
208208
</code></pre>
209209
<p>GAS側では <code>JSON.parse(e.postData.contents)</code> で受け取ることで、問題なく JSON として扱えます。</p>
210210
<hr>
211-
<h2 id="デザインの調整">デザインの調整</h2><p>機能だけでなく、見た目もサイトのトーン&マナーに合わせました。</p>
211+
<h2 id="デザインの調整">デザインの調整</h2><p>機能だけでなく見た目もサイトのトーン&マナーに合わせました。</p>
212212
<ul>
213213
<li>必須項目のバッジ表示</li>
214214
<li>送信ボタンのローディングアニメーション</li>
215215
<li>スマホでの入力しやすさ(<code>input type=&quot;email&quot;</code><code>type=&quot;tel&quot;</code> の活用)</li>
216216
</ul>
217-
<p>特に送信ボタンは、押した後に「送信中...」であることが視覚的に分かるように、CSSアニメーションでスピナーを表示するようにしました。ユーザーが何度も連打してしまうのを防ぐ効果もあります。</p>
218-
<h2 id="まとめ">まとめ</h2><p>サーバーレスな環境でもGAS を組み合わせることで本格的なお問い合わせフォームが実装できました。</p>
217+
<p>特に送信ボタンは押した後に「送信中...」であることが視覚的に分かるように、CSSアニメーションでスピナーを表示するようにしました。<br>ユーザーが何度も連打してしまうのを防ぐ効果もあります。</p>
218+
<h2 id="まとめ">まとめ</h2><p>サーバーレスな環境でも GAS を組み合わせることで本格的なお問い合わせフォームが実装できました。</p>
219219
<ul>
220220
<li><strong>GAS</strong> は無料かつ手軽なバックエンドとして優秀。</li>
221221
<li><code>fetch</code><code>Content-Type</code> を工夫することで CORS 問題を回避できる。</li>
222222
</ul>
223-
<p>これで、ポートフォリオサイトから直接お仕事の相談を受け付ける準備が整いました</p>
223+
<p>これでポートフォリオサイトから直接お仕事の相談を受け付ける準備が整いました</p>
224224
</section>
225225
<div class="share-buttons">
226226
<p class="share-buttons__title">SHARE</p>

WebSite/blog/blog_00013.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ <h1 class="post-detail__title">ポートフォリオの詳細表示をモーダ
9999
</header>
100100
<section class="post-detail__body markdown-body"><p>こんにちは!パン君です。</p>
101101
<p>これまでこのサイトの「ポートフォリオ一覧」から作品をクリックすると詳細ページ(<code>portfolio/xxxx.html</code>)に遷移する仕様になっていました。</p>
102-
<p>しかし、ポートフォリオを見に来てくれた人は<strong>いろいろな作品をザッピングしたい</strong> 」はずです。<br>「クリックして詳細へ移動」→「ブラウザバックで戻る」→「またスクロールして次の作品へ...」という操作は、地味ながらストレスになります。 </p>
102+
<p>しかしポートフォリオを見に来てくれた人は<strong>いろいろな作品をザッピングしたい</strong> 」はずです。<br>「クリックして詳細へ移動」→「ブラウザバックで戻る」→「またスクロールして次の作品へ...」という操作は、地味ながらストレスになります。 </p>
103103
<p>そこで <strong>一覧ページを維持したまま、詳細情報をモーダルウィンドウで重ねて表示する</strong> 形に改修しました。</p>
104104
<hr>
105105
<h2 id="実装の方針">実装の方針</h2><p>このサイトはビルドツールを使ってMarkdownファイルから静的なHTMLファイルを生成しています。<br>ポートフォリオの詳細ページもすでに <code>portfolio/work_01.html</code> のような形で実ファイルとして存在しています。</p>

WebSite/blog/blog_00014.html

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -103,18 +103,18 @@ <h1 class="post-detail__title">CSSのリファクタリングを手軽にして
103103
<li>デザイン案Aで書いたけど、結局B案にしたから使わなくなったボタンのクラス</li>
104104
<li>共通化しようとして作ったけど、結局固有クラスを使ったから放置されたスタイル</li>
105105
</ul>
106-
<p>などなど。<br>放置しても動くのですが、ファイルサイズも無駄ですし何より精神衛生上よろしくありません</p>
107-
<p>そこで、今回はこれらをリファクタリングすることにしました</p>
106+
<p>などなど。<br>放置しても動くのですがファイルサイズも無駄ですし何より精神衛生上よろしくありません</p>
107+
<p>そこで今回はこれらをリファクタリングすることにしました</p>
108108
<hr>
109-
<h2 id="手動で探すのは無理">手動で探すのは無理</h2><p>とはいえ、CSSファイルに書かれているクラス名を一つずつ検索して「使用箇所ゼロ」を確認するのは苦行です。<br>世の中には <code>PurgeCSS</code> などの便利なツールもありますが、ビルドプロセスに組み込むのが少し大変だったり設定が複雑だったりします。</p>
109+
<h2 id="手動で探すのは無理">手動で探すのは無理</h2><p>とはいえCSSファイルに書かれているクラス名を一つずつ検索して「使用箇所ゼロ」を確認するのは苦行です。<br>世の中には <code>PurgeCSS</code> などの便利なツールもありますが、ビルドプロセスに組み込むのが少し大変だったり設定が複雑だったりします。</p>
110110
<p>今回は <strong>「もっと手軽に、ざっくりでいいから不要なものを消したい」</strong> というモチベーションだったので、Node.jsで簡単なスクリプトを書いて検出することにしました。</p>
111111
<h2 id="自作スクリプトの方針">自作スクリプトの方針</h2><ol>
112112
<li><code>assets/css/</code> フォルダ内のCSSファイルを全部読み込む。</li>
113113
<li>正規表現でクラス名(<code>.classname</code>)とID名(<code>#idname</code>)を抽出する。</li>
114114
<li>プロジェクト内の全ファイル(HTML, JS, MDなど)をスキャンする。</li>
115115
<li>「抽出したクラス名が、どのファイルにも一度も登場しない」場合、それを<strong>未使用候補</strong>として出力する。</li>
116116
</ol>
117-
<p>これだけです。厳密な構文解析(AST)などはせず、単純な文字列検索(<code>includes</code>)で判定します。<br>その分「クラス名と偶然同じ単語が文章中にあったら検知漏れする」という弱点はありますが、 <strong>「使っていないものを安全に削除する」</strong> という目的には十分です。 </p>
117+
<p>これだけです。厳密な構文解析(AST)などはせず、単純な文字列検索(<code>includes</code>)で判定します。<br>その分「クラス名と偶然同じ単語が文章中にあったら検知漏れする」という弱点はありますが、 <strong>「使っていないものを安全に削除する」</strong> という目的には十分です。 </p>
118118
<pre><code class="language-javascript">// tools/find-unused-css.js (抜粋)
119119

120120
const cssContent = fs.readFileSync(cssFile, &#39;utf8&#39;);
@@ -135,16 +135,16 @@ <h2 id="自作スクリプトの方針">自作スクリプトの方針</h2><ol>
135135
}
136136
});
137137
</code></pre>
138-
<h2 id="実行結果">実行結果</h2><p>スクリプトを実行してみると、いくつかの未使用クラスが見つかりました</p>
138+
<h2 id="実行結果">実行結果</h2><p>スクリプトを実行してみるといくつかの未使用クラスが見つかりました</p>
139139
<pre><code>Checking assets\css\layout.css...
140140
[UNUSED] .section--soft
141141

142142
Checking assets\css\top.css...
143143
[UNUSED] .btn-outline
144144
</code></pre>
145-
<p>確認してみると<br><code>section--soft</code> は初期デザイン案で作ったカードのバリエーション<br><code>btn-outline</code> は枠線のみのボタンで、現在は塗りつぶしボタンしか使っていませんでした</p>
145+
<p>確認してみると<br><code>section--soft</code> は初期デザイン案で作ったカードのバリエーション<br><code>btn-outline</code> は枠線のみのボタンで現在は塗りつぶしボタンしか使っていませんでした</p>
146146
<p>これらは完全に不要なので迷わず削除!<br>CSSファイルが少しスリムになりました。</p>
147-
<h2 id="まとめ">まとめ</h2><p>リファクタリングというと大掛かりな作業をイメージしがちですが、<br><strong>「気になったら小さなスクリプトを書いてサクッと調べる」</strong><br>というアプローチなら、日常的にコードをきれいに保てそうです</p>
147+
<h2 id="まとめ">まとめ</h2><p>リファクタリングというと大掛かりな作業をイメージしがちですが、<br><strong>「気になったら小さなスクリプトを書いてサクッと調べる」</strong><br>というアプローチなら日常的にコードをきれいに保てそうです</p>
148148
<p>自分の手で作ったツールで自分のサイトを改善していくのは、エンジニアならではの楽しみですね。</p>
149149
</section>
150150
<div class="share-buttons">

0 commit comments

Comments
 (0)