<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title/><link>https://fehac.dev/ja/</link><atom:link href="https://fehac.dev/ja/index.xml" rel="self" type="application/rss+xml"/><description/><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>ja-jp</language><lastBuildDate>Sat, 08 Aug 2026 00:00:00 +0000</lastBuildDate><image><url>https://fehac.dev/media/icon.svg</url><title/><link>https://fehac.dev/ja/</link></image><item><title>このブログで使える記法</title><link>https://fehac.dev/ja/blog/capabilities/</link><pubDate>Sat, 08 Aug 2026 00:00:00 +0000</pubDate><guid>https://fehac.dev/ja/blog/capabilities/</guid><description>&lt;p&gt;将来の自分のためのリファレンスです。以下はすべてドキュメントからの推測ではなく、
テーマのソースコードで確認したものです。各セクションで記法とその出力を示します。&lt;/p&gt;
&lt;h2 id="コールアウト"&gt;コールアウト&lt;/h2&gt;
&lt;p&gt;GitHub / Obsidian のアラート記法です。種類は &lt;code&gt;NOTE&lt;/code&gt;、&lt;code&gt;TIP&lt;/code&gt;、&lt;code&gt;IMPORTANT&lt;/code&gt;、
&lt;code&gt;WARNING&lt;/code&gt;、&lt;code&gt;CAUTION&lt;/code&gt; の5つ。&lt;code&gt;+ タイトル&lt;/code&gt; で見出しを指定できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;&amp;gt; &lt;/span&gt;&lt;span class="ge"&gt;[!NOTE]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;&amp;gt; &lt;/span&gt;&lt;span class="ge"&gt;Plain note.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;&amp;gt; &lt;/span&gt;&lt;span class="ge"&gt;[!WARNING] これは注意
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;&amp;gt; &lt;/span&gt;&lt;span class="ge"&gt;タイトル付きの警告です。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-blue-100 dark:bg-blue-900 border-blue-500"
data-callout="note"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-blue-600 dark:text-blue-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8l.8-2.685a4.5 4.5 0 0 1 1.13-1.897zm0 0L19.5 7.125"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;Nota&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;普通のノートです。&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-emerald-100 dark:bg-emerald-900 border-emerald-500"
data-callout="tip"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-emerald-600 dark:text-emerald-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M12 18v-5.25m0 0a6 6 0 0 0 1.5-.189m-1.5.189a6 6 0 0 1-1.5-.189m3.75 7.478a12.1 12.1 0 0 1-4.5 0m3.75 2.383a14.4 14.4 0 0 1-3 0M14.25 18v-.192c0-.983.658-1.823 1.508-2.316a7.5 7.5 0 1 0-7.517 0c.85.493 1.509 1.333 1.509 2.316V18"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;Dica&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;ヒントはこう表示されます。&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-orange-100 dark:bg-orange-900 border-orange-500"
data-callout="warning"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-orange-600 dark:text-orange-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0zM12 15.75h.007v.008H12z"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;これは注意&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;タイトル付きの警告です。&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-red-100 dark:bg-red-900 border-red-500"
data-callout="caution"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-red-600 dark:text-red-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0zM12 15.75h.007v.008H12z"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;Cuidado&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;最も強い警告です。&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;{{&amp;lt; callout &amp;gt;}}&lt;/code&gt; ショートコードもありますが、テーマ側で上の記法を推奨する
&lt;strong&gt;非推奨&lt;/strong&gt;扱いになっています。使わないこと。&lt;/p&gt;
&lt;h2 id="mermaid"&gt;Mermaid&lt;/h2&gt;
&lt;p&gt;言語に &lt;code&gt;mermaid&lt;/code&gt; を指定したコードブロックです。スクリプトは実際に図がある
ページでのみ読み込まれます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;```mermaid
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sequenceDiagram
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Browser-&amp;gt;&amp;gt;Pages: GET /en/blog/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Pages--&amp;gt;&amp;gt;Browser: static HTML
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Browser-&amp;gt;&amp;gt;Remark42: GET /api/v1/find
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;```&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="mermaid"&gt;sequenceDiagram
autonumber
participant B as Browser
participant P as Cloudflare Pages
participant R as Remark42 (VPS)
B-&gt;&gt;P: GET /en/blog/capabilities/
P--&gt;&gt;B: static HTML + embed.js
B-&gt;&gt;R: GET /api/v1/find?site=blog
R--&gt;&gt;B: comments JSON
Note over B,R: 匿名、アカウント不要
&lt;/div&gt;
&lt;p&gt;フローチャートも使えます:&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
A[git push] --&gt; B{branch?}
B --&gt;|main| C[production build]
B --&gt;|other| D[preview deploy]
C --&gt; E[fehac.dev]
D --&gt; F[*.pages.dev]
&lt;/div&gt;
&lt;h2 id="markmap"&gt;Markmap&lt;/h2&gt;
&lt;p&gt;ネストしたリストからマインドマップを作ります。&lt;code&gt;height&lt;/code&gt; 属性を指定できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;``&lt;span class="sb"&gt;`markmap {height=&amp;#34;300px&amp;#34;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sb"&gt;- Root
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sb"&gt; - Branch
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sb"&gt; - Leaf
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sb"&gt;`&lt;/span&gt;``
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="markmap" style="height: 420px;"&gt;
&lt;pre&gt;- Backend
- Services
- APIs
- Event-driven
- Data
- PostgreSQL
- MongoDB
- Infrastructure
- AWS
- CDK
- CloudFormation
- Azure
- Terraform
- Practice
- CI/CD
- Observability
- Incident response&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 id="数式"&gt;数式&lt;/h2&gt;
&lt;p&gt;KaTeX を使います。フロントマターの &lt;code&gt;math: true&lt;/code&gt;、&lt;code&gt;math&lt;/code&gt; ショートコード、
またはサイト全体の設定で読み込まれます。インラインは &lt;code&gt;$...$&lt;/code&gt;、ブロックは &lt;code&gt;$$...$$&lt;/code&gt;。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Inline: $O(n \log n)$
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$$
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;p_{99} = \inf\{x : F(x) \ge 0.99\}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$$
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;インライン: 計算量は $O(n \log n)$ です。&lt;/p&gt;
$$
p_{99} = \inf\{x : F(x) \ge 0.99\}
$$&lt;h2 id="コード"&gt;コード&lt;/h2&gt;
&lt;p&gt;通常のコードブロックで、Hugo 内蔵の Chroma がハイライトします。行番号はサイト
全体では無効ですが、ブロック単位で有効にできます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;``&lt;span class="sb"&gt;`python {linenos=true, hl_lines=[2]}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sb"&gt;def charge(rate_kw: float) -&amp;gt; float:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sb"&gt; return min(rate_kw, MAX_KW)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sb"&gt;`&lt;/span&gt;``
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;charge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rate_kw&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rate_kw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MAX_KW&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# clamp to the connector limit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ステップ"&gt;ステップ&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;###&lt;/code&gt; 見出しを囲むと、それぞれが番号付きのステップになります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{&amp;lt; steps &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;### 最初の手順
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;これをします。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;### 次の手順
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;次にこれをします。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{&amp;lt; /steps &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hb-steps"&gt;
### DNS を設定する
`A` レコードが解決できないと certbot は証明書を発行しません。
### 証明書を発行する
`certbot certonly --webroot` を実行し、TLS 版の vhost に差し替えます。
### restart ではなく reload
まず `nginx -t`。不正な設定は拒否されるので、サーバーを落とさずに済みます。
&lt;/div&gt;
&lt;h2 id="折りたたみ"&gt;折りたたみ&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{&amp;lt; spoiler text=&amp;#34;クリックで展開&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;隠れている内容。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{&amp;lt; /spoiler &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;details class="spoiler " id="spoiler-1"&gt;
&lt;summary class="cursor-pointer"&gt;コメントサーバーを Cloudflare に置かない理由&lt;/summary&gt;
&lt;div class="rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2"&gt;
Pages は静的ホスティングです。Remark42 は BoltDB を内蔵した状態を持つ Go の
プロセスなので、実際のホストが必要です。自分の VPS 上で nginx の背後、
ループバックのみにバインドして動かしています。
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="ボタン"&gt;ボタン&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{&amp;lt; button url=&amp;#34;/ja/about/&amp;#34; &amp;gt;}}プロフィール{{&amp;lt; /button &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="text-left"&gt;
&lt;a
id="button-db7ad9c7301f40597206b33fcdb455e1"
href="https://fehac.dev/ja/about/"
class="inline-flex items-center gap-2 font-medium no-underline transition-all duration-300 ease-out transform-gpu focus:outline-none focus:ring-4 focus:ring-offset-2 focus:ring-offset-white dark:focus:ring-offset-zinc-900 disabled:opacity-50 disabled:cursor-not-allowed disabled:pointer-events-none bg-gradient-to-br from-primary-500 to-primary-600 hover:from-primary-600 hover:to-primary-700 active:from-primary-700 active:to-primary-800 text-white shadow-lg shadow-primary-500/25 hover:shadow-xl hover:shadow-primary-500/30 hover:-translate-y-0.5 hover:scale-[1.02] active:scale-[0.98] focus:ring-primary-500/50 px-4 py-2 text-base rounded-lg"
role="button"
aria-label="プロフィール"
&gt;
&lt;span&gt;プロフィール&lt;/span&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;h2 id="charts"&gt;Charts&lt;/h2&gt;
&lt;p&gt;Plotly を使います。&lt;code&gt;data&lt;/code&gt; にはページフォルダ内の JSON ファイルを拡張子なしで
指定します。ここでは &lt;code&gt;demo-chart.json&lt;/code&gt; がこの &lt;code&gt;index.md&lt;/code&gt; の隣にあります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{&amp;lt; chart data=&amp;#34;demo-chart&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div id="chart-129587643" class="chart"&gt;&lt;/div&gt;
&lt;script&gt;
(function() {
async function fetchChartJSON() {
console.debug('Hugo Blox fetching chart JSON...')
const response = await fetch('.\/demo-chart.json');
return await response.json();
}
let a = setInterval( function() {
if ( typeof window.Plotly === 'undefined' ) {
console.debug('Plotly not loaded yet...')
return;
}
clearInterval( a );
fetchChartJSON().then(chart =&gt; {
console.debug('Plotting chart...')
window.Plotly.newPlot('chart-129587643', chart.data, chart.layout, {responsive: true});
});
}, 500 );
})();
&lt;/script&gt;
&lt;h2 id="csv-テーブル"&gt;CSV テーブル&lt;/h2&gt;
&lt;p&gt;同じ要領で、ページフォルダ内の &lt;code&gt;.csv&lt;/code&gt; を指定します。注意点として、パラメータは
&lt;code&gt;src&lt;/code&gt; ではなく &lt;code&gt;path&lt;/code&gt; です。ショートコード自身のコメントには &lt;code&gt;src&lt;/code&gt; と書かれて
いますが、コードは &lt;code&gt;.Get &amp;quot;path&amp;quot;&lt;/code&gt; を読んでいます。&lt;code&gt;src&lt;/code&gt; を使うとビルドが
nil ポインタエラーで失敗します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{&amp;lt; table path=&amp;#34;demo-table.csv&amp;#34; caption=&amp;#34;サービス別レイテンシ&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;table class="table-auto w-full"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td data-table-dtype="text" class="border-b border-slate-100 dark:border-slate-700 p-4 text-slate-500 dark:text-slate-400"&gt;service&lt;/td&gt;
&lt;td data-table-dtype="text" class="border-b border-slate-100 dark:border-slate-700 p-4 text-slate-500 dark:text-slate-400"&gt;language&lt;/td&gt;
&lt;td data-table-dtype="text" class="border-b border-slate-100 dark:border-slate-700 p-4 text-slate-500 dark:text-slate-400"&gt;p99_ms&lt;/td&gt;
&lt;td data-table-dtype="text" class="border-b border-slate-100 dark:border-slate-700 p-4 text-slate-500 dark:text-slate-400"&gt;error_rate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td data-table-dtype="text" class="border-b border-slate-100 dark:border-slate-700 p-4 text-slate-500 dark:text-slate-400"&gt;charging-engine&lt;/td&gt;
&lt;td data-table-dtype="text" class="border-b border-slate-100 dark:border-slate-700 p-4 text-slate-500 dark:text-slate-400"&gt;Python&lt;/td&gt;
&lt;td data-table-dtype="number" class="border-b border-slate-100 dark:border-slate-700 p-4 text-slate-500 dark:text-slate-400"&gt;63&lt;/td&gt;
&lt;td data-table-dtype="text" class="border-b border-slate-100 dark:border-slate-700 p-4 text-slate-500 dark:text-slate-400"&gt;0.02&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td data-table-dtype="text" class="border-b border-slate-100 dark:border-slate-700 p-4 text-slate-500 dark:text-slate-400"&gt;telemetry-ingest&lt;/td&gt;
&lt;td data-table-dtype="text" class="border-b border-slate-100 dark:border-slate-700 p-4 text-slate-500 dark:text-slate-400"&gt;Python&lt;/td&gt;
&lt;td data-table-dtype="number" class="border-b border-slate-100 dark:border-slate-700 p-4 text-slate-500 dark:text-slate-400"&gt;148&lt;/td&gt;
&lt;td data-table-dtype="text" class="border-b border-slate-100 dark:border-slate-700 p-4 text-slate-500 dark:text-slate-400"&gt;0.11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td data-table-dtype="text" class="border-b border-slate-100 dark:border-slate-700 p-4 text-slate-500 dark:text-slate-400"&gt;fleet-api&lt;/td&gt;
&lt;td data-table-dtype="text" class="border-b border-slate-100 dark:border-slate-700 p-4 text-slate-500 dark:text-slate-400"&gt;TypeScript&lt;/td&gt;
&lt;td data-table-dtype="number" class="border-b border-slate-100 dark:border-slate-700 p-4 text-slate-500 dark:text-slate-400"&gt;41&lt;/td&gt;
&lt;td data-table-dtype="text" class="border-b border-slate-100 dark:border-slate-700 p-4 text-slate-500 dark:text-slate-400"&gt;0.01&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;caption class="table-caption"&gt;サービス別レイテンシ&lt;/caption&gt;
&lt;/table&gt;
&lt;p&gt;通常の Markdown テーブルも使えます:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;機能&lt;/th&gt;
&lt;th&gt;対応&lt;/th&gt;
&lt;th&gt;備考&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mermaid&lt;/td&gt;
&lt;td&gt;対応&lt;/td&gt;
&lt;td&gt;ページ単位で遅延読み込み&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Markmap&lt;/td&gt;
&lt;td&gt;対応&lt;/td&gt;
&lt;td&gt;&lt;code&gt;height&lt;/code&gt; 属性&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PlantUML&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;非対応&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;下記参照&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="画像"&gt;画像&lt;/h2&gt;
&lt;p&gt;通常の Markdown です。レンダーフックがまずページフォルダを探し、次に
&lt;code&gt;assets/media/&lt;/code&gt; を探して、複数サイズのレスポンシブな &lt;code&gt;srcset&lt;/code&gt; を出力します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;![&lt;span class="nt"&gt;代替テキスト&lt;/span&gt;](&lt;span class="na"&gt;authors/me.webp&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="動画と音声"&gt;動画と音声&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{&amp;lt; video src=&amp;#34;clip.mp4&amp;#34; controls=&amp;#34;yes&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{&amp;lt; audio src=&amp;#34;episode.mp3&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;どちらもページフォルダ、&lt;code&gt;assets/media/&lt;/code&gt;、リモート URL の順に解決します。&lt;/p&gt;
&lt;h2 id="アイコン"&gt;アイコン&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{&amp;lt; icon name=&amp;#34;brands/github&amp;#34; &amp;gt;}} のように文中に置けます。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;
&lt;span class="inline-block pr-1"&gt;
&lt;svg style="height: 1em; transform: translateY(0.1em);" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/&gt;&lt;/svg&gt;
&lt;/span&gt; のように文中に置けます。&lt;/p&gt;
&lt;h2 id="jupyter-ノートブック"&gt;Jupyter ノートブック&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{&amp;lt; notebook path=&amp;#34;analysis.ipynb&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;.ipynb&lt;/code&gt; をそのまま描画します。データ中心の記事に便利です。&lt;/p&gt;
&lt;h2 id="インクルード"&gt;インクルード&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{&amp;lt; include &amp;#34;snippets/shared-warning.md&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;別の Markdown ファイルを取り込みます。パスは &lt;code&gt;content/&lt;/code&gt; からの相対です。&lt;/p&gt;
&lt;h2 id="サポートされていないもの"&gt;サポートされていないもの&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;PlantUML&lt;/strong&gt;。このテーマには PlantUML のレンダーフックもスクリプトも存在しません。
レイアウトと JS バンドルを確認済みです。必要になった場合の選択肢:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Mermaid を使う。シーケンス、フローチャート、クラス、ステート、ER、ガントを
カバーしており、PlantUML の用途の大半を満たします。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.puml&lt;/code&gt; をオフラインで SVG に変換してコミットし、通常の画像として埋め込む。
ビルド時の依存も外部サーバーも不要です。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PlantUML のレンダーフック自体は &lt;code&gt;layouts/_markup/render-codeblock-plantuml.html&lt;/code&gt;
に20行ほどで書けますが、ビルド時にレンダリングサーバーを呼ぶ必要があるため、
避けたいところです。&lt;/p&gt;
&lt;h2 id="重要なフロントマター"&gt;重要なフロントマター&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nn"&gt;---&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;記事タイトル&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;一覧と meta description に表示されます。&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ld"&gt;2026-08-08&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;translationKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;some-key &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# pt/en/ja 版を相互にリンクする&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;authors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;me]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;meta, markdown]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;math&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# このページで KaTeX を読み込む&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;commentable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# blog/_index.md から継承済み&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;draft&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nn"&gt;---&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最も重要なのは &lt;code&gt;translationKey&lt;/code&gt; です。これがあるおかげで言語切り替えがトップ
ページではなく同じ記事に移動します。&lt;/p&gt;</description></item><item><title>プロフィール</title><link>https://fehac.dev/ja/about/</link><pubDate>Sat, 08 Aug 2026 00:00:00 +0000</pubDate><guid>https://fehac.dev/ja/about/</guid><description>&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Felipe Cardoso"
srcset="https://fehac.dev/media/authors/me_hu_366adc2a9fb5980a.webp 320w, https://fehac.dev/media/authors/me_hu_4906c0d8c548a729.webp 480w, https://fehac.dev/media/authors/me_hu_104d08bb37dec6e0.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://fehac.dev/media/authors/me_hu_366adc2a9fb5980a.webp"
width="760"
height="760"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;フェリペ・カルドーゾ（Felipe Cardoso）&lt;/strong&gt; です。ブラジル出身のソフトウェア
エンジニアで、東京に住んでいます。2018年からバックエンド、クラウドインフラ、
分散システムに携わり、銀行、コンサルティング会社、グローバルなビール会社を
経て、いまは電動モビリティのスタートアップにいます。&lt;/p&gt;
&lt;p&gt;システムを丸ごと引き受けるのが好きです。問題を理解し、アーキテクチャを決め、
コードを書き、本番に出し、壊れたら自分で責任を持って対応する。言語や
データベースやクラウドは問題のあとに選ぶものであって、先に決めるものでは
ないと考えています。&lt;/p&gt;
&lt;h2 id="このブログについて"&gt;このブログについて&lt;/h2&gt;
&lt;p&gt;ソフトウェアエンジニアリングと技術について、学んだことと考えていることを
共有するための場所です。技術記事は、いま実際につくっているものから生まれて
います。うまくいった結果だけをまとめた記事では省かれがちな、失敗した部分も
含めて書くつもりです。残りは意見です。ソフトウェアをどうつくるか、何に価値が
あって、何がただの流行なのか。&lt;/p&gt;
&lt;p&gt;ポルトガル語、英語、日本語で書いています。コメントは既定で匿名です。私に
反対するのに、どこかへの登録が必要であるべきではないからです。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ここに書かれている意見はすべて個人のものです。&lt;/strong&gt; 現在または過去に所属した
企業、およびその顧客の立場を代表するものでも、必ずしも反映するものでも
ありません。&lt;/p&gt;
&lt;h2 id="いまやっていること"&gt;いまやっていること&lt;/h2&gt;
&lt;p&gt;東京のスタートアップ &lt;strong&gt;eMotion Fleet&lt;/strong&gt; で、バックエンドとインフラの
エンジニアをしています。西鉄や長崎バスをはじめとする日本の電気バス事業者
向けに、フリートとエネルギーの管理ソフトウェアをつくっている会社です。&lt;/p&gt;
&lt;p&gt;プロダクトの中心にあるのは、リアルタイムの意思決定問題です。車庫に
つながれた各バスにどれだけの電力を送るか。契約電力の上限を超えず、すべての
車両が十分な充電で定刻に出庫できるように、です。入社1か月目にこの問題を
解く AI モデルを提案し、プロトタイプを実装しました。それはそのまま
プラットフォームの中核となる意思決定エンジンになり、初の顧客受入テストの
通過と、2025年9月の初の本番稼働を支えました。&lt;/p&gt;
&lt;p&gt;エンジンのほかには、AWS プラットフォームを預かり、設計から提供までの製品
ストリームをリードし、本番のインシデント対応もしています。&lt;/p&gt;
&lt;h2 id="これまでの経歴"&gt;これまでの経歴&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;AB InBev、2022年から2024年。&lt;/strong&gt; 150万人以上が使い、年間490億ドルが動く
B2B コマースプラットフォーム BEES を担当しました。230万人が参加して
NPS +64 を記録したリワードプログラムのマイクロサービスを構築し、全社的な
AWS から Azure への移行を支える Terraform と Terragrunt の再利用可能な
インフラを整備しました。南アフリカ市場のローンチ直前には、日程を脅かして
いた本番障害を解消しました。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Itaú Unibanco、2019年から2022年。&lt;/strong&gt; 最後は価格プラットフォームのテック
リードとして、開発者3名をリードしました。表計算ファイル頼みで数時間
かかっていた法人顧客との価格交渉は、C# と ASP.NET Core による計算と収益性
分析の自動化、Angular の画面によって数分で終わるようになりました。その前は
不正防止の部門で、Python、SAS、Power BI で過去のパターンを分析し、T-SQL の
検知ルールを実装して、デビットカード不正の約12%削減に貢献しました。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SAS、2018年から2019年。&lt;/strong&gt; データエンジニアリングのコンサルティングです。
Vale 向けには法人カードの汚職対策アナリティクスを、Raízen 向けには全国の
給油所ネットワークを対象にした燃料の需給予測を担当しました。&lt;/p&gt;
&lt;h2 id="学歴"&gt;学歴&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PUC Minas&lt;/strong&gt;、分散ソフトウェアアーキテクチャ 大学院課程（2024年-2025年）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ABC連邦大学&lt;/strong&gt;、コンピュータ科学 学士（2018年-2023年）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ABC連邦大学&lt;/strong&gt;、科学技術 学士（2018年-2023年）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="連絡先"&gt;連絡先&lt;/h2&gt;
&lt;p&gt;世界中に分散したチームでのリモート勤務に関心があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;メール:
&lt;/li&gt;
&lt;li&gt;LinkedIn:
&lt;/li&gt;
&lt;li&gt;GitHub:
&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>