Hugo でコードブロックをコピペできるようにする&タイトルをつける

GitHub や Zenn などでは当たり前のようにできるコードブロックのコピーですが、 Hugo 上ではデフォルトでできません。さすがに不便すぎるので作っていきましょう。 ついでに、ファイルパスを表示できるようにしましょう。 こんな感じです これを markdown 上で表現するには以下のように書きます。 ```text {data-filename="ファイル名をつけられます"} こんな感じです ``` 変更・追加するファイルはそれぞれ以下になります。 コピーボタン追加 layout/partials/head.html static/css/code-copy.css static/js/code-copy.js ファイル名追加 layout/partials/head.html static/css/code-copy.css <link rel="stylesheet" href="/css/code-copy.css"> <link rel="stylesheet" href="/css/highlight.css"> .code-block { position: relative; } .copy-btn { position: absolute; top: 2px; right: 12px; padding: 4px 8px; font-size: 0.75rem; border-radius: 6px; background: #1e293b; color: #fff; border: none; cursor: pointer; opacity: 0.8; z-index: 10; } .copy-btn:hover { opacity: 1; } document.addEventListener("DOMContentLoaded", () => { const blocks = document.querySelectorAll("pre > code"); blocks.forEach((code) => { const pre = code.parentElement; // すでに処理済みならスキップ if (pre.parentElement.classList.contains("code-block")) return; const wrapper = document.createElement("div"); wrapper.className = "code-block"; // ファイル名要素の作成 const highlight = pre.closest(".highlight"); if (highlight && highlight.dataset.filename) { const filename = document.createElement("div"); filename.className = "code-filename"; filename.textContent = highlight.dataset.filename; wrapper.appendChild(filename); } const button = document.createElement("button"); button.className = "copy-btn"; button.textContent = "Copy"; button.addEventListener("click", async () => { await navigator.clipboard.writeText(code.textContent); button.textContent = "Copied!"; setTimeout(() => (button.textContent = "Copy"), 1500); }); pre.parentNode.insertBefore(wrapper, pre); wrapper.appendChild(button); wrapper.appendChild(pre); }); }); .highlight[data-filename] { position: relative; padding-top: 0; } .code-filename { position: relative; padding: 6px 12px; font-size: 0.75rem; font-family: monospace; background: #0f172a; color: #e5e7eb; border-bottom-right-radius: 8px; user-select: text; cursor: text; }

January 17, 2026 · 1 min · Me

Hugoで利用できるブログカードを作った

Hugo 上で何かのリンクを貼ると↓のようになります。 https://github.com/a2-ito/cf-db-test これだと殺風景なので、Zenn などで自動作成されるブログカードのように装飾してみます。 実際に作ったものがこちら↓ a2-ito/cf-db-test This repository is a minimal and practical example of running Next.js App Router on Cloudflare Workers and using D1 Database with Drizzle ORM. - a2-ito/cf-db-test GitHub 基本的に AI に作ってもらったのですが、いくつか微調整しました。 OGP 画像は 160x120 の領域に拡大して収めています。(比率が違う画像の場合、引き伸ばされた感で微妙です、、、) GitHub リポジトリの場合、ogp:title にリポジトリ名と説明が含まれるようで、リポジトリ名だけを title として抽出・表示しています。 description が長い場合、カードが縦に伸びてしまうので、2行を超えないよう3行目以降は … と表示されるようにしています。 使い方としては、以下の2ファイルをコピペで配置してもらえればOKです。 assets/css/linkcard.css layouts/_shortcodes/linkcard.html a.link-card { box-shadow: none !important; } .link-card { display: flex; gap: 8px; border-radius: 12px; background: #0b2a4a; color: #fff; text-decoration: none; margin: 1.5em 0; } .link-card:hover { opacity: 0.9; } .link-card__body { flex: 1; min-width: 0; padding: 12px; } .link-card__title { font-weight: 700; font-size: 1.05rem; margin-bottom: 4px; } .link-card__desc { font-size: 0.9rem; opacity: 0.85; margin-bottom: 6px; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; } .link-card__site { font-size: 0.75rem; opacity: 0.6; } .link-card__image { width: 160px; height: 120px; overflow: hidden; flex-shrink: 0; background: #0a1e33; /* 余白用 */ display: flex; align-items: center; justify-content: center; } .link-card__image img { width: 100%; height: 100%; display: block; border-radius: 0px 8px 8px 0px; } layouts/_shortcodes/linkcard.html ...

January 17, 2026 · 2 min · Me

Cloudflare Workers でステージング環境を作ってみる

引き続き Cloudflare Workers を使用して、本番環境とはアプリ・DBの異なるステージング環境を作ってみます。 Environments があり、ステージング環境のような異なるバージョンのアプリをデプロイすることができます。 Environments · Cloudflare Workers docs Use environments to create different configurations for the same Worker application. Cloudflare Docs 今回もこちらのリポジトリを使います。 a2-ito/cf-db-test This repository is a minimal and practical example of running Next.js App Router on Cloudflare Workers and using D1 Database with Drizzle ORM. - a2-ito/cf-db-test GitHub まずは、本番用のDBとステージング用のDBを作成します。 ...

January 17, 2026 · 2 min · Me

Cloudflare Workers + Next.js + D1 + drizzle を試してみる

はじめに 最近よく Cloudflare を使っています。使いやすさ、無料枠の大きさにとても感動しています。 (こちらのブログも Cloudflare Pages で配信しています) また、普段の仕事ではよく Next.js を利用しており、Next.js on Cloudflare Workers が個人開発においては 今のところ最強なんじゃないかと思っています。 ということで、Cloudflare Workers + Next.js + D1 (とdrizzle)で開発する際の基本的な流れを紹介していきます。 今回紹介するサンプルコードの全量は以下にあります。 a2-ito/cf-db-test This repository is a minimal and practical example of running Next.js App Router on Cloudflare Workers and using D1 Database with Drizzle ORM. - a2-ito/cf-db-test GitHub テンプレートの準備 以下のコマンドを実行し、テンプレートを作成します。 wrangler は適当にインストールしておいてください。 wrangler init my-app カテゴリに Framework Starter を選択し、フレームワークとして Next.js を選択します。 ...

January 12, 2026 · 9 min · Me

コスパ最強のゲーミングPCを作ってみる

オーバーウォッチ、やっていますか? 僕は最近毎日やっています。面白いですね。普段 Switch でやっているんですが、PC でもやってみたくなったので人生初のゲーミングPCを自作してみたいと思います。(これまで PC 自作は数回経験していますが、ゲーミングPCという観点では初めてです。) コスパを重視して組んでみたので、同じようにゲーミングPCを作りたい人は参考にしてみてください。(作りたくない人は既製品買ってください。) 本記事のサマリ コスパ重視のゲーミングPCを自作した 13万弱で完成、パフォーマンス問題なし(FFベンチはフルHDで「とても快適」評価) 同程度の既製品と比較したが、コスパは若干勝っている or 同程度(すごく勝っている感じもないが、負けてはなさそう) コンセプト まずは今回の自作PCのコンセプトを整理します。 FPSが普通にいい感じにプレイできる オーバーウォッチのPC版をやるのが目的です。とはいえ相当高いFPSを求めているわけではないので、「普通にプレイできる」としています(エンジョイ勢向け) FPS以外はCPUを使うような用途はありません。ネットサーフィンするくらい。多分。 コスパがいい コスパが悪いものを目指す人はいないと思いますが、イメージ 10万~15万 くらいを目指します。 特にグラボは良いものを買うとそれ単品で15万とか軽く超えてくる感じなので、それなりの性能のものを選択しつつ、PC全体としてのコストは抑えていきます。 サイズは任意 大きさとか見た目にこだわるとパーツ選びも制約が出てきますが、今回はスタンダードなATX(一番でかいやつ)で気にせず作ります。 パーツ選定 買ったパーツと購入価格を記載しておきます。 選定前の注意事項 オーバーウォッチ(というかやりたいゲーム)が必要とするシステム要件はいうまでもなく確認しましょう。 どうでもいいですがオーバーウォッチは 2 が2022年10月にリリースで、ベータ版は6月時点で既にリリースされているので、そのベータ版の情報をベースにセットアップします。サクサクやりたいので(必要動作環境ではなく)推奨動作環境を基準にします。 OS は Windows 10 だけ プロセッサ Intel Core i7 または AMD Ryzen メモリ 8GB RAM NVIDIA GeForce GTX 1060または AMD R9 380 なお当初は(OS代けちって)Linux で組んで Wine で動かしたろ、って思っていたのですが、色々調べていくと Linux ユーザというだけで ban された(アカウントが凍結されること)人もいるようです。ちょっと怖いので素直に Windows でいきます。 選定ポイント 多くは Amazon で購入していますが、値段が張るものは価格コムで最低値を確認してそのサイトで購入しています。 こちらの動画を参考にさせてもらってます。 キーボードやディスプレイは今あるものを使いまわす想定なので、今回は購入していません。 選定結果 一覧で購入先リンクと共に載せておきます。 ...

June 26, 2022 · 2 min · Me