<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>NakuRei's Notes</title><link>https://notes.nakurei.com/</link><description>Recent content on NakuRei's Notes</description><generator>Hugo -- gohugo.io</generator><language>ja</language><copyright>NakuRei</copyright><atom:link href="https://notes.nakurei.com/index.xml" rel="self" type="application/rss+xml"/><item><title>Claude Code で doctor を実行すると Warning: Running native installation but config install method is 'global' と警告されるのを直したときの備忘録</title><link>https://notes.nakurei.com/post/claude-code-doctor-install-method-warning-fix/</link><pubDate>Thu, 09 Apr 2026 08:26:18 +0900</pubDate><guid>https://notes.nakurei.com/post/claude-code-doctor-install-method-warning-fix/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Claude Codeで&lt;code&gt;/doctor&lt;/code&gt;を実行すると&amp;quot;Warning: Running native installation but config install method is &amp;lsquo;global&amp;rsquo;&amp;ldquo;と警告されたのを直したときのメモ。&lt;/p&gt;
&lt;h2 id="再現手順"&gt;
再現手順&lt;a href="#%e5%86%8d%e7%8f%be%e6%89%8b%e9%a0%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;claude doctor&lt;/code&gt;を実行する。あるいは&lt;code&gt;claude&lt;/code&gt;コマンドでClaude Codeを起動したあと&lt;code&gt;/doctor&lt;/code&gt;コマンドを実行する。&lt;/p&gt;
&lt;h2 id="原因"&gt;
原因&lt;a href="#%e5%8e%9f%e5%9b%a0"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;実行中のClaude Codeのインストール方式と、Claude Codeが保持しているinstallMethod設定が一致していないことが原因。&lt;/p&gt;
&lt;p&gt;以前Claude Codeをnpmでグローバルインストールしていたことがあり、あとからNative Installへ切り替えた場合に発生しうる。
きちんとnpmからClaude Codeをアンインストールできていない場合、あるいはアンインストールたあとにClaude Codeの設定が更新されていない場合に起こる。&lt;/p&gt;
&lt;h2 id="対処法"&gt;
対処法&lt;a href="#%e5%af%be%e5%87%a6%e6%b3%95"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Claude Codeをnpmで入れている場合は、アンインストールする
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm uninstall -g @anthropic-ai/claude-code&lt;/code&gt;など&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;claude install&lt;/code&gt;を実行して、Claude Codeを再インストールする。これにより、Claude Codeの設定も更新される。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;which -a claude&lt;/code&gt;を実行して、システムに複数のclaudeコマンドが存在しないことを確認する。複数存在する場合は、古いほうを削除する。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;claude doctor&lt;/code&gt;を実行して、警告が消えていることを確認する。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;以上で解決した。&lt;/p&gt;</description></item><item><title>Windowsにjqをインストールしたときに取った手順のメモ</title><link>https://notes.nakurei.com/post/how-to-install-jq-to-windows/</link><pubDate>Sat, 28 Mar 2026 14:09:12 +0900</pubDate><guid>https://notes.nakurei.com/post/how-to-install-jq-to-windows/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Windowsマシンに&lt;code&gt;jq&lt;/code&gt;をインストールしたときの手順のメモ。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://jqlang.org/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/677024e27e88891ba4a2cad1e26ca9f32be24a82_hu_116fca8bc6597fb7.webp"
alt="jq image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
jq
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;jq is a lightweight and flexible command-line JSON processor&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-a5ea7cf72abf2c6fa18c3b3a8c39e203264168cb.png"
style="margin-right: 2px;"
alt="jqlang.org favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
jqlang.org
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Windows 11 Pro 25H2 (26200.8037)&lt;/li&gt;
&lt;li&gt;jq 1.8.1&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="はじめに"&gt;
はじめに&lt;a href="#%e3%81%af%e3%81%98%e3%82%81%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;あとでこの記事を書くのに調べたらWingetでインストールできると知った。そのほうが手軽でいいかもしれない。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;winget&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;jqlang&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jq&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="手順"&gt;
手順&lt;a href="#%e6%89%8b%e9%a0%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;jq&lt;/code&gt;の公式サイトからWindows用のバイナリをダウンロード
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://jqlang.org/download/" target="_blank" rel="noopener"
&gt;https://jqlang.org/download/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Windows 64-bit版の&lt;code&gt;jq-windows-amd64.exe&lt;/code&gt;をダウンロード&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ダウンロードしたファイルを&lt;code&gt;jq.exe&lt;/code&gt;にリネーム&lt;/li&gt;
&lt;li&gt;&lt;code&gt;jq.exe&lt;/code&gt;を任意のディレクトリに移動（例: &lt;code&gt;C:\bins\jq\&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;環境変数&lt;code&gt;PATH&lt;/code&gt;に&lt;code&gt;jq.exe&lt;/code&gt;を配置したディレクトリを追加
&lt;ul&gt;
&lt;li&gt;「環境変数の編集」からユーザー環境変数の&lt;code&gt;Path&lt;/code&gt;を選択し、「編集」をクリック&lt;/li&gt;
&lt;li&gt;「新規」をクリックして、&lt;code&gt;C:\bins\jq\&lt;/code&gt;を追加&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;コマンドプロンプトやPowerShellを再起動して、&lt;code&gt;jq --version&lt;/code&gt;を実行してインストールが成功したことを確認&lt;/li&gt;
&lt;/ol&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;jqのバージョン確認&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;jq&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# jq-1.8.1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
:root {
--uni-warning-bg-color: #fae287;
--uni-warning-line-color: #544600;
}
:root[data-scheme='dark'] {
--uni-warning-bg-color: #544600;
--uni-warning-line-color: #fae287;
}
.block-highlight-warning {
display: flex;
align-items: center;
justify-content: first baseline;
height: 100%;
width: 100%;
padding: 1em;
margin: 1em 0;
border-left: 5px solid var(--uni-warning-line-color);
background-color: var(--uni-warning-bg-color);
border-radius: 0.5rem;
overflow: hidden;
color: var(--card-text-color-main);
line-height: 1.5;
}
.icon-warning {
display: inline-flex;
align-items: center;
vertical-align: middle;
}
.icon-warning svg {
vertical-align: baseline;
width: 1.5em;
height: 1.5em;
stroke-width: 1.5;
flex-shrink: 0;
}
&lt;/style&gt;
&lt;div class="block-highlight-warning"&gt;
&lt;span class="icon-warning"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-alert-triangle" width="44" height="44" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"&gt;
&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;
&lt;path d="M12 9v2m0 4v.01" /&gt;
&lt;path d="M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75" /&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span&gt;なお、Git Bashを使っている場合は、PCの再起動をしないとパスが反映されない。&lt;/span&gt;
&lt;/div&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://zenn.dev/easy_easy/articles/e47b37b04dd1153d5b29"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/4c8b1560ab41383f5c57eb6c60b829ef68769458_hu_29d0da9e2163dfa2.webp"
alt="Windowsでjqコマンドを導入してJSONレスポンスを整形・抽出する image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Windowsでjqコマンドを導入してJSONレスポンスを整形・抽出する
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-8299b9ca5170247061175f654bfc883ff1cc2440.png"
style="margin-right: 2px;"
alt="zenn.dev favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
zenn.dev
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>Claude Codeのステータスラインの設定を晒すだけ</title><link>https://notes.nakurei.com/post/my-claude-code-status-line/</link><pubDate>Fri, 27 Mar 2026 22:35:23 +0900</pubDate><guid>https://notes.nakurei.com/post/my-claude-code-status-line/</guid><description>&lt;img src="https://notes.nakurei.com/post/my-claude-code-status-line/20260327225115.png" alt="Featured image of post Claude Codeのステータスラインの設定を晒すだけ" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Claude Codeのステータスラインの設定を残しておくためのメモ。&lt;/p&gt;
&lt;p&gt;下記のようになる。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/my-claude-code-status-line/20260327225115.png"
width="578"
height="198"
srcset="https://notes.nakurei.com/post/my-claude-code-status-line/20260327225115_hu_bdefe1a8220b4b5f.png 480w, https://notes.nakurei.com/post/my-claude-code-status-line/20260327225115_hu_229002356d8a57e7.png 1024w"
loading="lazy"
alt="Claude Codeのステータスライン"
class="gallery-image"
data-flex-grow="291"
data-flex-basis="700px"
&gt;&lt;/p&gt;
&lt;h2 id="はじめに"&gt;
はじめに&lt;a href="#%e3%81%af%e3%81%98%e3%82%81%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;諸事情により、ステータスラインのスクリプトはシェルスクリプトで書いている。ほんとうはPythonなどで書いたほうがグラデーションなど使えてよいかも。&lt;/p&gt;
&lt;h2 id="前提条件"&gt;
前提条件&lt;a href="#%e5%89%8d%e6%8f%90%e6%9d%a1%e4%bb%b6"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://jqlang.org/" target="_blank" rel="noopener"
&gt;&lt;code&gt;jq&lt;/code&gt;&lt;/a&gt;が使えること&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ステータスラインの設定"&gt;
ステータスラインの設定&lt;a href="#%e3%82%b9%e3%83%86%e3%83%bc%e3%82%bf%e3%82%b9%e3%83%a9%e3%82%a4%e3%83%b3%e3%81%ae%e8%a8%ad%e5%ae%9a"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;下記を&lt;code&gt;~/.claude/statusline.sh&lt;/code&gt;などのファイルに保存する。&lt;/li&gt;
&lt;/ol&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;statusline.sh&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;cat&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;readonly&lt;/span&gt; &lt;span class="nv"&gt;CYAN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;\033[0;36m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;readonly&lt;/span&gt; &lt;span class="nv"&gt;GREEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;\033[0;32m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;readonly&lt;/span&gt; &lt;span class="nv"&gt;YELLOW&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;\033[0;33m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;readonly&lt;/span&gt; &lt;span class="nv"&gt;RED&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;\033[0;31m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;readonly&lt;/span&gt; &lt;span class="nv"&gt;RESET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;\033[0m&amp;#39;&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="nb"&gt;readonly&lt;/span&gt; &lt;span class="nv"&gt;MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$input&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; jq -r &lt;span class="s1"&gt;&amp;#39;.model.display_name&amp;#39;&lt;/span&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="nb"&gt;readonly&lt;/span&gt; &lt;span class="nv"&gt;DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$input&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; jq -r &lt;span class="s1"&gt;&amp;#39;.workspace.current_dir&amp;#39;&lt;/span&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="c1"&gt;# The &amp;#34;// 0&amp;#34; provides a fallback if the field is null&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;readonly&lt;/span&gt; &lt;span class="nv"&gt;PCT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$input&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; jq -r &lt;span class="s1"&gt;&amp;#39;.context_window.used_percentage // 0&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; cut -d. -f1&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="nb"&gt;readonly&lt;/span&gt; &lt;span class="nv"&gt;HOUR_LIMIT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$input&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; jq -r &lt;span class="s1"&gt;&amp;#39;.rate_limits.five_hour.used_percentage // 0&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; cut -d. -f1&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="nb"&gt;readonly&lt;/span&gt; &lt;span class="nv"&gt;WEEK_LIMIT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$input&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; jq -r &lt;span class="s1"&gt;&amp;#39;.rate_limits.seven_day.used_percentage // 0&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; cut -d. -f1&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&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="c1"&gt;# ${DIR##*/} extracts just the folder name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;[&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MODEL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;] 📁 &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DIR&lt;/span&gt;&lt;span class="p"&gt;##*/&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&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="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PCT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; -lt &lt;span class="m"&gt;40&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;PCT_COLOR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$GREEN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PCT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; -ge &lt;span class="m"&gt;80&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;PCT_COLOR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$RED&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;PCT_COLOR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$YELLOW&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&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="k"&gt;if&lt;/span&gt; git rev-parse --git-dir &amp;gt; /dev/null 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;1&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;readonly&lt;/span&gt; &lt;span class="nv"&gt;BRANCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;git branch --show-current 2&amp;gt;/dev/null&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="nb"&gt;readonly&lt;/span&gt; &lt;span class="nv"&gt;STAGED&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;git diff --cached --numstat 2&amp;gt;/dev/null &lt;span class="p"&gt;|&lt;/span&gt; wc -l &lt;span class="p"&gt;|&lt;/span&gt; tr -d &lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&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="nb"&gt;readonly&lt;/span&gt; &lt;span class="nv"&gt;MODIFIED&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;git diff --numstat 2&amp;gt;/dev/null &lt;span class="p"&gt;|&lt;/span&gt; wc -l &lt;span class="p"&gt;|&lt;/span&gt; tr -d &lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;GIT_STATUS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$STAGED&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; -gt &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;GIT_STATUS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GREEN&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;+&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;STAGED&lt;/span&gt;&lt;span class="si"&gt;}${&lt;/span&gt;&lt;span class="nv"&gt;RESET&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$MODIFIED&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; -gt &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;GIT_STATUS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GIT_STATUS&lt;/span&gt;&lt;span class="si"&gt;}${&lt;/span&gt;&lt;span class="nv"&gt;YELLOW&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;~&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MODIFIED&lt;/span&gt;&lt;span class="si"&gt;}${&lt;/span&gt;&lt;span class="nv"&gt;RESET&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&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="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PCT_COLOR&lt;/span&gt;&lt;span class="si"&gt;}${&lt;/span&gt;&lt;span class="nv"&gt;PCT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;%&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RESET&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; | 🌿 &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BRANCH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GIT_STATUS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PCT_COLOR&lt;/span&gt;&lt;span class="si"&gt;}${&lt;/span&gt;&lt;span class="nv"&gt;PCT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;%&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RESET&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&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="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOUR_LIMIT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;%/5hr &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WEEK_LIMIT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;%/wk&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol start="2"&gt;
&lt;li&gt;実行権限を付与する&lt;/li&gt;
&lt;/ol&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod +x ~/.claude/statusline.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol start="3"&gt;
&lt;li&gt;Claude Codeの設定で、ステータスラインのコマンドに上記のファイルを指定する&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Windowsの場合は次のようにする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;~/.claude/settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;statusLine&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;bash -c \&amp;#34;~/.claude/statusline.sh\&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Linux, WSLの場合は以下のようにする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;~/.claude/settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;statusLine&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;~/.claude/statusline.sh&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://code.claude.com/docs/en/statusline"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/36ef6130213d8e411af71b909078a94f04c54dad_hu_c09b76568405ecf2.webp"
alt="Customize your status line - Claude Code Docs image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Customize your status line - Claude Code Docs
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Configure a custom status bar to monitor context window usage, costs, and git status in Claude Code&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-9f2f3b9524b21296beaf4979cee9df74f0f5a918.png"
style="margin-right: 2px;"
alt="code.claude.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
code.claude.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://nyosegawa.com/posts/claude-code-statusline-rate-limits/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/1579888e2ff2deb379f1d503657a795f69241ebd_hu_cd3c900ffe7e855b.webp"
alt="Claude Codeの使用率がステータスラインに表示できるようになったので表示用のスクリプトを作った話 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Claude Codeの使用率がステータスラインに表示できるようになったので表示用のスクリプトを作った話
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Claude Code v2.1.80で追加されたrate_limitsフィールドを使って、5時間/7日間の使用量をステータスラインにかわいく表示する4つのパターンを紹介します&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-2e3f6babe4cc8b8c01b0bf39ecc6426512fee712.png"
style="margin-right: 2px;"
alt="nyosegawa.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
nyosegawa.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;/p&gt;</description></item><item><title>OpenClawを初めて触ってみたときのメモ</title><link>https://notes.nakurei.com/post/openclaw-first-notes/</link><pubDate>Sun, 08 Mar 2026 00:53:14 +0900</pubDate><guid>https://notes.nakurei.com/post/openclaw-first-notes/</guid><description>&lt;style&gt;
:root {
--uni-warning-bg-color: #fae287;
--uni-warning-line-color: #544600;
}
:root[data-scheme='dark'] {
--uni-warning-bg-color: #544600;
--uni-warning-line-color: #fae287;
}
.block-highlight-warning {
display: flex;
align-items: center;
justify-content: first baseline;
height: 100%;
width: 100%;
padding: 1em;
margin: 1em 0;
border-left: 5px solid var(--uni-warning-line-color);
background-color: var(--uni-warning-bg-color);
border-radius: 0.5rem;
overflow: hidden;
color: var(--card-text-color-main);
line-height: 1.5;
}
.icon-warning {
display: inline-flex;
align-items: center;
vertical-align: middle;
}
.icon-warning svg {
vertical-align: baseline;
width: 1.5em;
height: 1.5em;
stroke-width: 1.5;
flex-shrink: 0;
}
&lt;/style&gt;
&lt;div class="block-highlight-warning"&gt;
&lt;span class="icon-warning"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-alert-triangle" width="44" height="44" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"&gt;
&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;
&lt;path d="M12 9v2m0 4v.01" /&gt;
&lt;path d="M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75" /&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span&gt;&lt;p&gt;なんかこの流れだといろいろバグっていたらしく、きちんと最後まで設定ができていない。間違って環境を消してしまって再度試したらログとか流れとかが変わってしまった。&lt;/p&gt;
&lt;p&gt;一応当時試したとおりの間違ったことは書いていないはずなので、記録ということで残しておく。&lt;/p&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;OpenClawを初めて触ったときにやったことのメモ。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://docs.openclaw.ai/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/70c994f860482ebc428f5631237f7a07b0539874_hu_92fd460899f1d1af.webp"
alt="OpenClaw - OpenClaw image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
OpenClaw - OpenClaw
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-82ac1aea3f132e19cd22320d4d7d6f99c1e13682.png"
style="margin-right: 2px;"
alt="docs.openclaw.ai favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
docs.openclaw.ai
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;本当は専用のマシンがあればよかったのだが、昨今はPCが高騰しており、かつ余っているPCはラップトップしかなかった。とはいえ、最近はWindowsのデスクトップPCを24時間稼働しっぱなしなので、そのPCにOpenClaw用の環境を構築することにした。隔離された環境にするため、WSLで仮想環境を構築することとした。ちなみに当時は、WindowsではWSL2環境下で実行することを公式が強く推奨していた。&lt;/p&gt;
&lt;p&gt;WSLの環境は下記のとおり。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;wsl&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;WSL&lt;/span&gt; &lt;span class="n"&gt;バージョン&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;2.6&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;カーネル&lt;/span&gt; &lt;span class="n"&gt;バージョン&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;6.6&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;87&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;WSLg&lt;/span&gt; &lt;span class="n"&gt;バージョン&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;71&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;MSRDC&lt;/span&gt; &lt;span class="n"&gt;バージョン&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;6353&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Direct3D&lt;/span&gt; &lt;span class="n"&gt;バージョン&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.611&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;81528511&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;DXCore&lt;/span&gt; &lt;span class="n"&gt;バージョン&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;26100&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;240331&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1435&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;ge-release&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Windows&lt;/span&gt; &lt;span class="n"&gt;バージョン&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;26200&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;7840&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;OpenClaw用にディストリビューションを新規に作成した。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;wsl&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-install&lt;/span&gt; &lt;span class="n"&gt;-d&lt;/span&gt; &lt;span class="n"&gt;Ubuntu&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;24.04&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-name&lt;/span&gt; &lt;span class="n"&gt;OpenClaw&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;作成されているかどうかは、&lt;code&gt;wsl -l -v&lt;/code&gt;で確認できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;wsl&lt;/span&gt; &lt;span class="n"&gt;-l&lt;/span&gt; &lt;span class="n"&gt;-v&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;NAME&lt;/span&gt; &lt;span class="n"&gt;STATE&lt;/span&gt; &lt;span class="n"&gt;VERSION&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="n"&gt;Ubuntu&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;22.04&lt;/span&gt; &lt;span class="n"&gt;Running&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;docker-desktop&lt;/span&gt; &lt;span class="n"&gt;Running&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Ubuntu&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;24.04&lt;/span&gt; &lt;span class="n"&gt;Running&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;OpenClaw&lt;/span&gt; &lt;span class="n"&gt;Stopped&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;wsl -d OpenClaw&lt;/code&gt;で仮想環境に入れる。&lt;code&gt;apt update&lt;/code&gt;と&lt;code&gt;apt upgrade&lt;/code&gt;をしておく。&lt;/p&gt;
&lt;h2 id="openclawの初回セットアップ"&gt;
OpenClawの初回セットアップ&lt;a href="#openclaw%e3%81%ae%e5%88%9d%e5%9b%9e%e3%82%bb%e3%83%83%e3%83%88%e3%82%a2%e3%83%83%e3%83%97"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;初回セットアップ手順は公式サイトにあるとおり実行した。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://docs.openclaw.ai/ja-JP/start/getting-started"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/df430aff1f6f6ea2bcd228e03cebc7614ffbbfbf_hu_2aba4da683dc276b.webp"
alt="はじめに - OpenClaw image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
はじめに - OpenClaw
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-82ac1aea3f132e19cd22320d4d7d6f99c1e13682.png"
style="margin-right: 2px;"
alt="docs.openclaw.ai favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
docs.openclaw.ai
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;以下は実行したコマンドのメモ。なお、公式の手順は更新されうるので、あくまで参考程度に記録を残す。&lt;/p&gt;
&lt;p&gt;まず、必要要件を確認する。実行時はNode 22+のみ必須だった。&lt;/p&gt;
&lt;p&gt;Nodeをインストールする。&lt;code&gt;apt&lt;/code&gt;だとNode 18が入るため、NodeSourceを利用してNode 24をインストールした。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -fsSL https://deb.nodesource.com/setup_24.x &lt;span class="p"&gt;|&lt;/span&gt; sudo -E bash -
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install nodejs -y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;確認する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;node -v &lt;span class="c1"&gt;# v24.14.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm -v &lt;span class="c1"&gt;# 11.9.0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これで事前要件は満たした。次に、OpenClawをインストールする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -fsSL https://openclaw.ai/install.sh &lt;span class="p"&gt;|&lt;/span&gt; bash&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;利用承諾とか、AIサービスの設定とかを進める。設定はQuickStartで進めた。&lt;/p&gt;
&lt;p&gt;当時はOpenAI CodexのProプランにお試しで入っていたので、その利用枠を使った。本当はAPIキーを使ったほうがOpenAIのモデルが使えて良いのかも。まあモデルは使ってみて不満になったら考えればいい。&lt;/p&gt;
&lt;p&gt;モデルはいったんGPT-5.3-Codex-Sparkを使うことにした。全然利用枠を使っていなかったし、応答が速いなら適していそうだなと思ったので。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;当時のログ&lt;/summary&gt;
&lt;p&gt;&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl -fsSL https://openclaw.ai/install.sh &lt;span class="p"&gt;|&lt;/span&gt; bash
&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; 🦞 OpenClaw Installer
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; WhatsApp automation without the &lt;span class="s2"&gt;&amp;#34;please accept our new privacy policy&amp;#34;&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;✓ Detected: linux
&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;Install plan
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;OS: linux
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Install method: npm
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Requested version: latest
&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="o"&gt;[&lt;/span&gt;1/3&lt;span class="o"&gt;]&lt;/span&gt; Preparing environment
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✓ Node.js v24.14.0 found
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;· Active Node.js: v24.14.0 &lt;span class="o"&gt;(&lt;/span&gt;/usr/bin/node&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;· Active npm: 11.9.0 &lt;span class="o"&gt;(&lt;/span&gt;/usr/bin/npm&lt;span class="o"&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="o"&gt;[&lt;/span&gt;2/3&lt;span class="o"&gt;]&lt;/span&gt; Installing OpenClaw
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✓ Git already installed
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;· Configuring npm &lt;span class="k"&gt;for&lt;/span&gt; user-local installs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✓ npm configured &lt;span class="k"&gt;for&lt;/span&gt; user installs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;· Installing OpenClaw v2026.3.2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✓ OpenClaw npm package installed
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✓ OpenClaw installed
&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="o"&gt;[&lt;/span&gt;3/3&lt;span class="o"&gt;]&lt;/span&gt; Finalizing setup
&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;! PATH missing npm global bin dir: /home/nakurei/.npm-global/bin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; This can make openclaw show as &lt;span class="s2"&gt;&amp;#34;command not found&amp;#34;&lt;/span&gt; in new terminals.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Fix &lt;span class="o"&gt;(&lt;/span&gt;zsh: ~/.zshrc, bash: ~/.bashrc&lt;span class="o"&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/home/nakurei/.npm-global/bin:&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&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;🦞 OpenClaw installed successfully &lt;span class="o"&gt;(&lt;/span&gt;2026.3.2&lt;span class="o"&gt;)&lt;/span&gt;!
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I&lt;span class="s1"&gt;&amp;#39;m in. Let&amp;#39;&lt;/span&gt;s cause some responsible chaos.
&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;· Starting setup
&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;🦞 OpenClaw 2026.3.2 &lt;span class="o"&gt;(&lt;/span&gt;85377a2&lt;span class="o"&gt;)&lt;/span&gt; — Greetings, Professor Falken
&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;██░▄▄▄░██░▄▄░██░▄▄▄██░▀██░██░▄▄▀██░████░▄▄▀██░███░██
&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;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🦞 OPENCLAW 🦞
&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;┌ OpenClaw onboarding
&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;◇ Security ─────────────────────────────────────────────────────────────────────────────────╮
&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;│ Security warning — please read. │
&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;│ OpenClaw is a hobby project and still in beta. Expect sharp edges. │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ By default, OpenClaw is a personal agent: one trusted operator boundary. │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ This bot can &lt;span class="nb"&gt;read&lt;/span&gt; files and run actions &lt;span class="k"&gt;if&lt;/span&gt; tools are enabled. │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ A bad prompt can trick it into doing unsafe things. │
&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;│ OpenClaw is not a hostile multi-tenant boundary by default. │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ If multiple users can message one tool-enabled agent, they share that delegated tool │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ authority. │
&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;│ If you’re not comfortable with security hardening and access control, don’t run │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ OpenClaw. │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Ask someone experienced to &lt;span class="nb"&gt;help&lt;/span&gt; before enabling tools or exposing it to the internet. │
&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;│ Recommended baseline: │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ - Pairing/allowlists + mention gating. │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ - Multi-user/shared inbox: split trust boundaries &lt;span class="o"&gt;(&lt;/span&gt;separate gateway/credentials, ideally │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ separate OS users/hosts&lt;span class="o"&gt;)&lt;/span&gt;. │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ - Sandbox + least-privilege tools. │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ - Shared inboxes: isolate DM sessions &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;session.dmScope: per-channel-peer&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; and keep │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ tool access minimal. │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ - Keep secrets out of the agent’s reachable filesystem. │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ - Use the strongest available model &lt;span class="k"&gt;for&lt;/span&gt; any bot with tools or untrusted inboxes. │
&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;│ Run regularly: │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ openclaw security audit --deep │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ openclaw security audit --fix │
&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;│ Must read: https://docs.openclaw.ai/gateway/security │
&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;│
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;◇ I understand this is personal-by-default and shared/multi-user use requires lock-down. Continue?
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Yes
&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;◇ Onboarding mode
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ QuickStart
&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;◇ QuickStart ─────────────────────────╮
&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;│ Gateway port: &lt;span class="m"&gt;18789&lt;/span&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Gateway bind: Loopback &lt;span class="o"&gt;(&lt;/span&gt;127.0.0.1&lt;span class="o"&gt;)&lt;/span&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Gateway auth: Token &lt;span class="o"&gt;(&lt;/span&gt;default&lt;span class="o"&gt;)&lt;/span&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Tailscale exposure: Off │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Direct to chat channels. │
&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;│
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;◇ Model/auth provider
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ OpenAI
&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;◇ OpenAI auth method
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ OpenAI Codex &lt;span class="o"&gt;(&lt;/span&gt;ChatGPT OAuth&lt;span class="o"&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;◇ OpenAI Codex OAuth ─────────────────────────────────────────────╮
&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;│ Browser will open &lt;span class="k"&gt;for&lt;/span&gt; OpenAI authentication. │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ If the callback doesn&lt;span class="s1"&gt;&amp;#39;t auto-complete, paste the redirect URL. │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ OpenAI OAuth uses localhost:1455 for the callback. │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;├──────────────────────────────────────────────────────────────────╯
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;Open: https://auth.openai.com/oauth/authorize?response_type=code&amp;amp;client_id=app_EMoamEEZ73f0CkXaXp7hrann&amp;amp;redirect_uri=http%3A%2F%2Flocalhost%3A1455%2Fauth%2Fcallback&amp;amp;scope=openid+profile+email+offline_access&amp;amp;code_challenge=CNjhpu1rTMn-lPrUFJbu3w-0V9RAqyd9nYj_41_PjOg&amp;amp;code_challenge_method=S256&amp;amp;state=9d04818bfb995cec805ca2968595702c&amp;amp;id_token_add_organizations=true&amp;amp;codex_cli_simplified_flow=true&amp;amp;originator=pi
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;◇ OpenAI OAuth complete
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;◇ Model configured ────────────────────────────────╮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Default model set to openai-codex/gpt-5.3-codex │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;├───────────────────────────────────────────────────╯
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;◇ Default model
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ openai-codex/gpt-5.3-codex-spark
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;◇ Channel status ────────────────────────────╮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Telegram: needs token │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ WhatsApp (default): not linked │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Discord: needs token │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Slack: needs tokens │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Signal: needs setup │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ signal-cli: missing (signal-cli) │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ iMessage: needs setup │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ imsg: missing (imsg) │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ IRC: not configured │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Google Chat: not configured │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Feishu: install plugin to enable │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Google Chat: install plugin to enable │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Nostr: install plugin to enable │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Microsoft Teams: install plugin to enable │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Mattermost: install plugin to enable │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Nextcloud Talk: install plugin to enable │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Matrix: install plugin to enable │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ BlueBubbles: install plugin to enable │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ LINE: install plugin to enable │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Zalo: install plugin to enable │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Zalo Personal: install plugin to enable │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Synology Chat: install plugin to enable │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Tlon: install plugin to enable │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;├─────────────────────────────────────────────╯
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;◇ How channels work ───────────────────────────────────────────────────────────────────────╮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ DM security: default is pairing; unknown DMs get a pairing code. │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Approve with: openclaw pairing approve &amp;lt;channel&amp;gt; &amp;lt;code&amp;gt; │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Public DMs require dmPolicy=&amp;#34;open&amp;#34; + allowFrom=[&amp;#34;*&amp;#34;]. │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Multi-user DMs: run: openclaw config set session.dmScope &amp;#34;per-channel-peer&amp;#34; (or │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ &amp;#34;per-account-channel-peer&amp;#34; for multi-account channels) to isolate sessions. │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Docs: channels/pairing │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Telegram: simplest way to get started — register a bot with @BotFather and get going. │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ WhatsApp: works with your own number; recommend a separate phone + eSIM. │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Discord: very well supported right now. │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ IRC: classic IRC networks with DM/channel routing and pairing controls. │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Google Chat: Google Workspace Chat app with HTTP webhook. │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Slack: supported (Socket Mode). │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Signal: signal-cli linked device; more setup (David Reagans: &amp;#34;Hop on Discord.&amp;#34;). │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ iMessage: this is still a work in progress. │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Feishu: 飞书/Lark enterprise messaging with doc/wiki/drive tools. │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Nostr: Decentralized protocol; encrypted DMs via NIP-04. │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Microsoft Teams: Bot Framework; enterprise support. │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Mattermost: self-hosted Slack-style chat; install the plugin to enable. │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Nextcloud Talk: Self-hosted chat via Nextcloud Talk webhook bots. │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Matrix: open protocol; install the plugin to enable. │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ BlueBubbles: iMessage via the BlueBubbles mac app + REST API. │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ LINE: LINE Messaging API bot for Japan/Taiwan/Thailand markets. │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Zalo: Vietnam-focused messaging platform with Bot API. │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Zalo Personal: Zalo personal account via QR code login. │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Synology Chat: Connect your Synology NAS Chat to OpenClaw with full agent capabilities. │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Tlon: decentralized messaging on Urbit; install the plugin to enable. │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;├───────────────────────────────────────────────────────────────────────────────────────────╯
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;◇ Select channel (QuickStart)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Discord (Bot API)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;◇ Discord bot token ──────────────────────────────────────────────────────────────────────╮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ 1) Discord Developer Portal → Applications → New Application │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ 2) Bot → Add Bot → Reset Token → copy token │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ 3) OAuth2 → URL Generator → scope &amp;#39;&lt;/span&gt;bot&lt;span class="s1"&gt;&amp;#39; → invite to your server │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Tip: enable Message Content Intent if you need message text. (Bot → Privileged Gateway │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Intents → Message Content Intent) │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Docs: discord │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;├──────────────────────────────────────────────────────────────────────────────────────────╯
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;◇ How do you want to provide this Discord bot token?
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Enter Discord bot token
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;◇ Enter Discord bot token
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;◇ Configure Discord channels access?
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Yes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;◇ Discord channels access
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Open (allow all channels)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;◇ Selected channels ────────────────────────────────────────────╮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Discord — very well supported right now. Docs: │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ discord │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;├────────────────────────────────────────────────────────────────╯
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;Updated ~/.openclaw/openclaw.json
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;Workspace OK: ~/.openclaw/workspace
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;Sessions OK: ~/.openclaw/agents/main/sessions
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;◇ Skills status ─────────────╮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Eligible: 6 │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Missing requirements: 38 │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Unsupported on this OS: 7 │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Blocked by allowlist: 0 │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;├─────────────────────────────╯
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;◇ Configure skills now? (recommended)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Yes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;◆ Install missing skill dependencies
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;◆ Install missing skill dependencies
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;◇ Install missing skill dependencies
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ 📰 blogwatcher, 🍌 nano-banana-pro, 💎 obsidian, 🧾 summarize, 🎞️ video-frames
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;◇ Homebrew recommended ──────────────────────────────────────────────────────────╮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Many skill dependencies are shipped via Homebrew. │
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;│ Without brew, you&amp;#39;&lt;/span&gt;ll need to build from &lt;span class="nb"&gt;source&lt;/span&gt; or download releases manually. │
&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;│
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;◇ Show Homebrew install command?
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Yes
&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;◇ Homebrew install ─────────────────────────────────────────────────────╮
&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;│ Run: │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ /bin/bash -c &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;curl -fsSL │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&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&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;◇ Install failed: summarize — brew not installed — Homebrew is not installed. Install it from https://brew.sh or install &lt;span class="s2"&gt;&amp;#34;steipete/tap/summarize&amp;#34;&lt;/span&gt; manually using your sys…
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Tip: run &lt;span class="sb"&gt;`&lt;/span&gt;openclaw doctor&lt;span class="sb"&gt;`&lt;/span&gt; to review skills + requirements.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docs: https://docs.openclaw.ai/skills
&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;◇ Install failed: obsidian — brew not installed — Homebrew is not installed. Install it from https://brew.sh or install &lt;span class="s2"&gt;&amp;#34;yakitrak/yakitrak/obsidian-cli&amp;#34;&lt;/span&gt; manually using …
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Tip: run &lt;span class="sb"&gt;`&lt;/span&gt;openclaw doctor&lt;span class="sb"&gt;`&lt;/span&gt; to review skills + requirements.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docs: https://docs.openclaw.ai/skills
&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;◇ Install failed: blogwatcher &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt; 1&lt;span class="o"&gt;)&lt;/span&gt; — go not installed — apt-get is available but sudo is not usable &lt;span class="o"&gt;(&lt;/span&gt;missing or requires a password&lt;span class="o"&gt;)&lt;/span&gt;. Install manually: https://go.dev/doc/insta…
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo: a password is required
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Tip: run &lt;span class="sb"&gt;`&lt;/span&gt;openclaw doctor&lt;span class="sb"&gt;`&lt;/span&gt; to review skills + requirements.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docs: https://docs.openclaw.ai/skills
&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;◇ Install failed: nano-banana-pro — brew not installed — Homebrew is not installed. Install it from https://brew.sh or install &lt;span class="s2"&gt;&amp;#34;uv&amp;#34;&lt;/span&gt; manually using your system package manager …
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Tip: run &lt;span class="sb"&gt;`&lt;/span&gt;openclaw doctor&lt;span class="sb"&gt;`&lt;/span&gt; to review skills + requirements.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docs: https://docs.openclaw.ai/skills
&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;◇ Install failed: video-frames — brew not installed — Homebrew is not installed. Install it from https://brew.sh or install &lt;span class="s2"&gt;&amp;#34;ffmpeg&amp;#34;&lt;/span&gt; manually using your system package mana…
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Tip: run &lt;span class="sb"&gt;`&lt;/span&gt;openclaw doctor&lt;span class="sb"&gt;`&lt;/span&gt; to review skills + requirements.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docs: https://docs.openclaw.ai/skills
&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;◇ Set GOOGLE_PLACES_API_KEY &lt;span class="k"&gt;for&lt;/span&gt; goplaces?
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ No
&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;◇ Set GEMINI_API_KEY &lt;span class="k"&gt;for&lt;/span&gt; nano-banana-pro?
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Yes
&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;◇ Enter GEMINI_API_KEY
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
&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;◇ Set NOTION_API_KEY &lt;span class="k"&gt;for&lt;/span&gt; notion?
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ No
&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;◇ Set OPENAI_API_KEY &lt;span class="k"&gt;for&lt;/span&gt; openai-image-gen?
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Yes
&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;◇ Enter OPENAI_API_KEY
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
&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;◇ Set OPENAI_API_KEY &lt;span class="k"&gt;for&lt;/span&gt; openai-whisper-api?
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Yes
&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;◇ Enter OPENAI_API_KEY
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
&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;◇ Set ELEVENLABS_API_KEY &lt;span class="k"&gt;for&lt;/span&gt; sag?
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ No
&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;◇ Hooks ──────────────────────────────────────────────────────────────────╮
&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;│ Hooks &lt;span class="nb"&gt;let&lt;/span&gt; you automate actions when agent commands are issued. │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Example: Save session context to memory when you issue /new or /reset. │
&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;│ Learn more: https://docs.openclaw.ai/automation/hooks │
&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;│
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;◇ Enable hooks?
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 💾 session-memory
&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;◇ Hooks Configured ─────────────────╮
&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;│ Enabled &lt;span class="m"&gt;1&lt;/span&gt; hook: session-memory │
&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;│ You can manage hooks later with: │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ openclaw hooks list │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ openclaw hooks &lt;span class="nb"&gt;enable&lt;/span&gt; &amp;lt;name&amp;gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ openclaw hooks disable &amp;lt;name&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;├────────────────────────────────────╯
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Config overwrite: /home/nakurei/.openclaw/openclaw.json &lt;span class="o"&gt;(&lt;/span&gt;sha256 XXXXXXXXXXXXXXXXXX -&amp;gt; XXXXXXXXXXXXXXX, &lt;span class="nv"&gt;backup&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/home/nakurei/.openclaw/openclaw.json.bak&lt;span class="o"&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;◇ Systemd ────────────────────────────────────────────────────────────────────────────────╮
&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;│ Linux installs use a systemd user service by default. Without lingering, systemd stops │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ the user session on logout/idle and kills the Gateway. │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Enabling lingering now &lt;span class="o"&gt;(&lt;/span&gt;may require sudo&lt;span class="p"&gt;;&lt;/span&gt; writes /var/lib/systemd/linger&lt;span class="o"&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&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;◇ Systemd ────────────────────────────────╮
&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;│ Enabled systemd lingering &lt;span class="k"&gt;for&lt;/span&gt; nakurei. │
&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;│
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;◇ Gateway service runtime ────────────────────────────────────────────╮
&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;│ QuickStart uses Node &lt;span class="k"&gt;for&lt;/span&gt; the Gateway service &lt;span class="o"&gt;(&lt;/span&gt;stable + supported&lt;span class="o"&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Error: systemctl is-enabled unavailable: Command failed: systemctl --user is-enabled openclaw-gateway.service&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="discordのサーバーとbotをつくる"&gt;
DiscordのサーバーとBotをつくる&lt;a href="#discord%e3%81%ae%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc%e3%81%a8bot%e3%82%92%e3%81%a4%e3%81%8f%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;クイックセットアップを途中まで進めていって、&lt;code&gt;Select channel&lt;/code&gt;になったタイミングで、そういややり取りの窓口が必要と気づいた。最初に考えておくべきだった。&lt;/p&gt;
&lt;p&gt;選択肢の中で一番使い慣れているのはDiscordだったので、Discordを使うことにした。Discordの場合、Botを作って追加し、トークン情報をOpenClawに渡す必要があるようだ。
Botを追加するということはサーバーも必要だ。&lt;/p&gt;
&lt;h3 id="discordのサーバーをつくる"&gt;
Discordのサーバーをつくる&lt;a href="#discord%e3%81%ae%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc%e3%82%92%e3%81%a4%e3%81%8f%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;まず、Botを招待するためのサーバーを作る。Discordをひらき、OpenClaw用のDiscordサーバーを新しく作り、適当にグループやチャンネルを作った。
各チャンネルの説明欄には、それぞれ何をする場なのかを適当に書いた。&lt;/p&gt;
&lt;h3 id="discordのbotをつくる"&gt;
DiscordのBotをつくる&lt;a href="#discord%e3%81%aebot%e3%82%92%e3%81%a4%e3%81%8f%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;次に、Botを作る。OpenClawのログに書かれているとおりに進める。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://discord.com/developers/home" target="_blank" rel="noopener"
&gt;Discord Developer Portal&lt;/a&gt;にアクセスし、Discordアカウントでログインする。
アプリケーションから「新しいアプリケーション」を選択して、新しいアプリケーションをつくる。名前は適当。&lt;/p&gt;
&lt;p&gt;新しくアプリケーションを作ったら、まず左のメニューからBotを選択する。&amp;ldquo;Privileged Gateway Intents&amp;quot;にある3つのトグル（Presence Intent, Server Members Intent, Message Content Intent）をすべてオンにして、Botに権限を与えた。あとで分かったが、これは最低限Message Content Intentをオンにすればよい。&lt;/p&gt;
&lt;p&gt;その後、「トークンをリセット」ボタンをクリック。リセットしてもいいか確認が出るので実行する。そうするとトークンとなる文字列が表示されるので、これをコピーして控えておく。&lt;/p&gt;
&lt;p&gt;最後に、左のメニューからOAuth2を選択肢、URLを作成する。&amp;ldquo;OAuth2 URLジェネレーター&amp;quot;にあるたくさんのチェックボックスから&lt;code&gt;bot&lt;/code&gt;にチェックを入れ、連携タイプを&lt;code&gt;サーバーのインストール&lt;/code&gt;にしたら、一番下に生成されるURLへアクセスする。すると、DiscordでどのサーバーにBotを追加するか聞かれるので、先程作ったサーバーを指定する。これでボットをサーバーに招待でき、メンバーリストにBotが追加される。&lt;/p&gt;
&lt;h2 id="セットアップを終わらせる"&gt;
セットアップを終わらせる&lt;a href="#%e3%82%bb%e3%83%83%e3%83%88%e3%82%a2%e3%83%83%e3%83%97%e3%82%92%e7%b5%82%e3%82%8f%e3%82%89%e3%81%9b%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ログを見る限り、なんか色々失敗しているので、セットアップが完了していない。失敗しているものを完了させる。&lt;/p&gt;
&lt;h3 id="パスを通す"&gt;
パスを通す&lt;a href="#%e3%83%91%e3%82%b9%e3%82%92%e9%80%9a%e3%81%99"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ログを見る限り、まずパスが通っていないようだ。&lt;code&gt;~/.npm-global/bin&lt;/code&gt;にパスを通す必要があるらしい。現に、&lt;code&gt;openclaw&lt;/code&gt;コマンドが見つからない。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ openclaw gateway install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openclaw: &lt;span class="nb"&gt;command&lt;/span&gt; not found&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;よって、パスを通す。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;export PATH=&amp;#34;$HOME/.npm-global/bin:$PATH&amp;#34;&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; ~/.bashrc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;hash&lt;/span&gt; -r&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;パスがっ通ったか確認。問題なさそうだ。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;which openclaw &lt;span class="c1"&gt;# /home/user/.npm-global/bin/openclaw&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openclaw --version &lt;span class="c1"&gt;# 2026.3.2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="gateway-service-の再セットアップ"&gt;
gateway service の再セットアップ&lt;a href="#gateway-service-%e3%81%ae%e5%86%8d%e3%82%bb%e3%83%83%e3%83%88%e3%82%a2%e3%83%83%e3%83%97"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;再度&lt;code&gt;openclaw gateway install&lt;/code&gt;を実行してみたが、まだだめらしい。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ openclaw gateway install
&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;🦞 OpenClaw 2026.3.2 &lt;span class="o"&gt;(&lt;/span&gt;85377a2&lt;span class="o"&gt;)&lt;/span&gt; — I &lt;span class="nb"&gt;read&lt;/span&gt; logs so you can keep pretending you don&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;t have to.
&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;Gateway service check failed: Error: systemctl is-enabled unavailable: Command failed: systemctl --user is-enabled openclaw-gateway.service&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;よって、&lt;code&gt;openclaw doctor&lt;/code&gt;を実行してみる。すると、gateway serviceが問題なく作成された。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;ログ&lt;/summary&gt;
&lt;p&gt;&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ openclaw doctor
&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;🦞 OpenClaw 2026.3.2 &lt;span class="o"&gt;(&lt;/span&gt;85377a2&lt;span class="o"&gt;)&lt;/span&gt; — If you&lt;span class="s1"&gt;&amp;#39;re lost, run doctor; if you&amp;#39;&lt;/span&gt;re brave, run prod&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; you&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;re wise, run tests.
&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;██░▄▄▄░██░▄▄░██░▄▄▄██░▀██░██░▄▄▀██░████░▄▄▀██░███░██
&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;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🦞 OPENCLAW 🦞
&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;┌ OpenClaw doctor
&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;◇ Update ──────────────────────────────────────────────────────────────────────────────────╮
&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;│ This install is not a git checkout. │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Run &lt;span class="sb"&gt;`&lt;/span&gt;openclaw update&lt;span class="sb"&gt;`&lt;/span&gt; to update via your package manager &lt;span class="o"&gt;(&lt;/span&gt;npm/pnpm&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;then&lt;/span&gt; rerun doctor. │
&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;│
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;◇ State integrity ───────────────────────────────────────────────────────────────╮
&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;│ - OAuth dir not present &lt;span class="o"&gt;(&lt;/span&gt;~/.openclaw/credentials&lt;span class="o"&gt;)&lt;/span&gt;. Skipping create because no │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ WhatsApp/pairing channel config is active. │
&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;│
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;◇ Security ─────────────────────────────────╮
&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;│ - No channel security warnings detected. │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ - Run: openclaw security audit --deep │
&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;│
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;◇ Skills status ────────────╮
&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;│ Eligible: &lt;span class="m"&gt;8&lt;/span&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Missing requirements: &lt;span class="m"&gt;43&lt;/span&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Blocked by allowlist: &lt;span class="m"&gt;0&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&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;◇ Plugins ──────╮
&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;│ Loaded: &lt;span class="m"&gt;5&lt;/span&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Disabled: &lt;span class="m"&gt;33&lt;/span&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Errors: &lt;span class="m"&gt;0&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&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;◇ Enable bash shell completion &lt;span class="k"&gt;for&lt;/span&gt; openclaw?
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Yes
&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;◇ Shell completion ────────────────────────────────────────────────────────╮
&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;│ Shell completion installed. Restart your shell or run: &lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc │
&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;│
&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;◇ Gateway ──────────────╮
&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;│ Gateway not running. │
&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;│
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;◇ Gateway connection ────────────────────────────╮
&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;│ Gateway target: ws://127.0.0.1:18789 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Source: &lt;span class="nb"&gt;local&lt;/span&gt; loopback │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Config: /home/nakurei/.openclaw/openclaw.json │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Bind: loopback │
&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;│
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;◇ Memory search ───────────────────────────────────────────────────────────────────────────╮
&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;│ Memory search is enabled but no embedding provider is configured. │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Semantic recall will not work without an embedding provider. │
&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;│ Fix &lt;span class="o"&gt;(&lt;/span&gt;pick one&lt;span class="o"&gt;)&lt;/span&gt;: │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ - Set OPENAI_API_KEY, GEMINI_API_KEY, VOYAGE_API_KEY, or MISTRAL_API_KEY in your │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ environment │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ - Configure credentials: openclaw configure --section model │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ - For &lt;span class="nb"&gt;local&lt;/span&gt; embeddings: configure agents.defaults.memorySearch.provider and &lt;span class="nb"&gt;local&lt;/span&gt; model │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ path │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ - To disable: openclaw config &lt;span class="nb"&gt;set&lt;/span&gt; agents.defaults.memorySearch.enabled &lt;span class="nb"&gt;false&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;│ Verify: openclaw memory status --deep │
&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;│
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;◇ Gateway ────────────────────────╮
&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;│ Gateway service not installed. │
&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;│
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;◇ Install gateway service now?
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Yes
&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;◇ Gateway service runtime
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Node &lt;span class="o"&gt;(&lt;/span&gt;recommended&lt;span class="o"&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;Installed systemd service: /home/nakurei/.config/systemd/user/openclaw-gateway.service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Run &lt;span class="s2"&gt;&amp;#34;openclaw doctor --fix&amp;#34;&lt;/span&gt; to apply changes.
&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;└ Doctor complete.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;サービスが作られたので、起動する。&lt;code&gt;active (running)&lt;/code&gt;になっていれば成功。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl --user daemon-reload
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl --user &lt;span class="nb"&gt;enable&lt;/span&gt; --now openclaw-gateway.service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl --user status openclaw-gateway.service --no-pager&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;openclaw gateway status&lt;/code&gt;も実行して、問題なく動いていると確認できた。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;openclaw gateway statusのログ&lt;/summary&gt;
&lt;p&gt;&lt;p&gt;下記ログから動いているとわかる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;systemd service有効&lt;/li&gt;
&lt;li&gt;Gateway稼働中&lt;/li&gt;
&lt;li&gt;RPC probe正常&lt;/li&gt;
&lt;li&gt;Discordログイン成功&lt;/li&gt;
&lt;li&gt;127.0.0.1:18789で待受中&lt;/li&gt;
&lt;/ul&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ openclaw gateway status
&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;🦞 OpenClaw 2026.3.2 &lt;span class="o"&gt;(&lt;/span&gt;85377a2&lt;span class="o"&gt;)&lt;/span&gt; — Alexa, but with taste.
&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;◇
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Service: systemd &lt;span class="o"&gt;(&lt;/span&gt;enabled&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;File logs: /tmp/openclaw/openclaw-2026-03-08.log
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Command: /usr/bin/node /home/nakurei/.npm-global/lib/node_modules/openclaw/dist/index.js gateway --port &lt;span class="m"&gt;18789&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Service file: ~/.config/systemd/user/openclaw-gateway.service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Service env: &lt;span class="nv"&gt;OPENCLAW_GATEWAY_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;18789&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;Config &lt;span class="o"&gt;(&lt;/span&gt;cli&lt;span class="o"&gt;)&lt;/span&gt;: ~/.openclaw/openclaw.json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Config &lt;span class="o"&gt;(&lt;/span&gt;service&lt;span class="o"&gt;)&lt;/span&gt;: ~/.openclaw/openclaw.json
&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;Gateway: &lt;span class="nv"&gt;bind&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;loopback &lt;span class="o"&gt;(&lt;/span&gt;127.0.0.1&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;18789&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;service args&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Probe target: ws://127.0.0.1:18789
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Dashboard: http://127.0.0.1:18789/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Probe note: Loopback-only gateway&lt;span class="p"&gt;;&lt;/span&gt; only &lt;span class="nb"&gt;local&lt;/span&gt; clients can connect.
&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;Runtime: running &lt;span class="o"&gt;(&lt;/span&gt;pid 2568, state active, sub running, last &lt;span class="nb"&gt;exit&lt;/span&gt; 0, reason 0&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RPC probe: ok
&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;Listening: 127.0.0.1:18789
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Troubles: run openclaw status
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Troubleshooting: https://docs.openclaw.ai/troubleshooting&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="スキルを入れる"&gt;
スキルを入れる&lt;a href="#%e3%82%b9%e3%82%ad%e3%83%ab%e3%82%92%e5%85%a5%e3%82%8c%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;セットアップ時のログを見るとわかるが、セットアップ中に入れようとしたスキルは色々足らず失敗している。よって入れ直した。&lt;/p&gt;
&lt;p&gt;スキル一覧と使えるかどうかの確認は、&lt;code&gt;openclaw skills check&lt;/code&gt;でできる。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;openclaw skills checkのログ&lt;/summary&gt;
&lt;p&gt;&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ openclaw skills check
&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;🦞 OpenClaw 2026.3.2 &lt;span class="o"&gt;(&lt;/span&gt;85377a2&lt;span class="o"&gt;)&lt;/span&gt; — Your config is valid, your assumptions are not.
&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;Skills Status Check
&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;Total: &lt;span class="m"&gt;51&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✓ Eligible: &lt;span class="m"&gt;11&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;⏸ Disabled: &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;🚫 Blocked by allowlist: &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✗ Missing requirements: &lt;span class="m"&gt;40&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;Ready to use:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🧩 coding-agent
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🎮 discord
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📦 healthcheck
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🍌 nano-banana-pro
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🖼️ openai-image-gen
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ☁️ openai-whisper-api
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📦 skill-creator
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🧾 summarize
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🧵 tmux
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🎞️ video-frames
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🌤️ weather
&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;Missing requirements:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🔐 1password &lt;span class="o"&gt;(&lt;/span&gt;bins: op&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📝 apple-notes &lt;span class="o"&gt;(&lt;/span&gt;bins: memo&lt;span class="p"&gt;;&lt;/span&gt; os: darwin&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ⏰ apple-reminders &lt;span class="o"&gt;(&lt;/span&gt;bins: remindctl&lt;span class="p"&gt;;&lt;/span&gt; os: darwin&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🐻 bear-notes &lt;span class="o"&gt;(&lt;/span&gt;bins: grizzly&lt;span class="p"&gt;;&lt;/span&gt; os: darwin&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📰 blogwatcher &lt;span class="o"&gt;(&lt;/span&gt;bins: blogwatcher&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🫐 blucli &lt;span class="o"&gt;(&lt;/span&gt;bins: blu&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🫧 bluebubbles &lt;span class="o"&gt;(&lt;/span&gt;config: channels.bluebubbles&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📸 camsnap &lt;span class="o"&gt;(&lt;/span&gt;bins: camsnap&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📦 clawhub &lt;span class="o"&gt;(&lt;/span&gt;bins: clawhub&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🎛️ eightctl &lt;span class="o"&gt;(&lt;/span&gt;bins: eightctl&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ♊️ gemini &lt;span class="o"&gt;(&lt;/span&gt;bins: gemini&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📦 gh-issues &lt;span class="o"&gt;(&lt;/span&gt;bins: gh&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🧲 gifgrep &lt;span class="o"&gt;(&lt;/span&gt;bins: gifgrep&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🐙 github &lt;span class="o"&gt;(&lt;/span&gt;bins: gh&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🎮 gog &lt;span class="o"&gt;(&lt;/span&gt;bins: gog&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📍 goplaces &lt;span class="o"&gt;(&lt;/span&gt;bins: goplaces&lt;span class="p"&gt;;&lt;/span&gt; env: GOOGLE_PLACES_API_KEY&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📧 himalaya &lt;span class="o"&gt;(&lt;/span&gt;bins: himalaya&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📨 imsg &lt;span class="o"&gt;(&lt;/span&gt;bins: imsg&lt;span class="p"&gt;;&lt;/span&gt; os: darwin&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📦 mcporter &lt;span class="o"&gt;(&lt;/span&gt;bins: mcporter&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📊 model-usage &lt;span class="o"&gt;(&lt;/span&gt;bins: codexbar&lt;span class="p"&gt;;&lt;/span&gt; os: darwin&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📄 nano-pdf &lt;span class="o"&gt;(&lt;/span&gt;bins: nano-pdf&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📝 notion &lt;span class="o"&gt;(&lt;/span&gt;env: NOTION_API_KEY&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 💎 obsidian &lt;span class="o"&gt;(&lt;/span&gt;bins: obsidian-cli&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🎙️ openai-whisper &lt;span class="o"&gt;(&lt;/span&gt;bins: whisper&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 💡 openhue &lt;span class="o"&gt;(&lt;/span&gt;bins: openhue&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🧿 oracle &lt;span class="o"&gt;(&lt;/span&gt;bins: oracle&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🛵 ordercli &lt;span class="o"&gt;(&lt;/span&gt;bins: ordercli&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 👀 peekaboo &lt;span class="o"&gt;(&lt;/span&gt;bins: peekaboo&lt;span class="p"&gt;;&lt;/span&gt; os: darwin&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🗣️ sag &lt;span class="o"&gt;(&lt;/span&gt;bins: sag&lt;span class="p"&gt;;&lt;/span&gt; env: ELEVENLABS_API_KEY&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📜 session-logs &lt;span class="o"&gt;(&lt;/span&gt;bins: jq, rg&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🗣️ sherpa-onnx-tts &lt;span class="o"&gt;(&lt;/span&gt;env: SHERPA_ONNX_RUNTIME_DIR, SHERPA_ONNX_MODEL_DIR&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 💬 slack &lt;span class="o"&gt;(&lt;/span&gt;config: channels.slack&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🌊 songsee &lt;span class="o"&gt;(&lt;/span&gt;bins: songsee&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🔊 sonoscli &lt;span class="o"&gt;(&lt;/span&gt;bins: sonos&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🎵 spotify-player &lt;span class="o"&gt;(&lt;/span&gt;anyBins: spogo, spotify_player&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ✅ things-mac &lt;span class="o"&gt;(&lt;/span&gt;bins: things&lt;span class="p"&gt;;&lt;/span&gt; os: darwin&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📋 trello &lt;span class="o"&gt;(&lt;/span&gt;bins: jq&lt;span class="p"&gt;;&lt;/span&gt; env: TRELLO_API_KEY, TRELLO_TOKEN&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📞 voice-call &lt;span class="o"&gt;(&lt;/span&gt;config: plugins.entries.voice-call.enabled&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📱 wacli &lt;span class="o"&gt;(&lt;/span&gt;bins: wacli&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 𝕏 xurl &lt;span class="o"&gt;(&lt;/span&gt;bins: xurl&lt;span class="o"&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;Tip: use &lt;span class="sb"&gt;`&lt;/span&gt;npx clawhub&lt;span class="sb"&gt;`&lt;/span&gt; to search, install, and sync skills.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;Ready to useに入っているスキルは使える。入っていなければ使えない。&lt;/p&gt;
&lt;p&gt;なぜ使えないのかは、スキルごとに&lt;code&gt;openclaw skills info&lt;/code&gt;で確認できる。たとえばobsidianスキルを確認してみる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;openclaw skills infoでobsidianスキルを確認&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ openclaw skills info obsidian
&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;🦞 OpenClaw 2026.3.2 &lt;span class="o"&gt;(&lt;/span&gt;85377a2&lt;span class="o"&gt;)&lt;/span&gt; — If something&lt;span class="s1"&gt;&amp;#39;s on fire, I can&amp;#39;&lt;/span&gt;t extinguish it—but I can write a beautiful postmortem.
&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;💎 obsidian ✗ Missing requirements
&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;Work with Obsidian vaults &lt;span class="o"&gt;(&lt;/span&gt;plain Markdown notes&lt;span class="o"&gt;)&lt;/span&gt; and automate via obsidian-cli.
&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;Details:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Source: openclaw-bundled
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Path: ~/.npm-global/lib/node_modules/openclaw/skills/obsidian/SKILL.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Homepage: https://help.obsidian.md
&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 hl"&gt;&lt;span class="cl"&gt;Requirements:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt; Binaries: ✗ obsidian-cli
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;Install options:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt; → Install obsidian-cli &lt;span class="o"&gt;(&lt;/span&gt;brew&lt;span class="o"&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;Tip: use &lt;span class="sb"&gt;`&lt;/span&gt;npx clawhub&lt;span class="sb"&gt;`&lt;/span&gt; to search, install, and sync skills.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;Requirements&lt;/code&gt;のところに、何が足らないか書いてある。この場合は&lt;code&gt;obsidian-cli&lt;/code&gt;が足りていない。&lt;code&gt;Install options&lt;/code&gt;のところに、どうやって入れればいいか書いてある。この場合はHomebrewで入れればいい。&lt;/p&gt;
&lt;p&gt;きちんと必要要件を満たすと、下記のように&lt;code&gt;Ready&lt;/code&gt;になる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;obsidianスキルがReadyになった&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ openclaw skills info obsidian
&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;🦞 OpenClaw 2026.3.2 &lt;span class="o"&gt;(&lt;/span&gt;85377a2&lt;span class="o"&gt;)&lt;/span&gt; — I don&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;t have opinions about tabs vs spaces. I have opinions about everything &lt;span class="k"&gt;else&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 hl"&gt;&lt;span class="cl"&gt;💎 obsidian ✓ Ready
&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;Work with Obsidian vaults &lt;span class="o"&gt;(&lt;/span&gt;plain Markdown notes&lt;span class="o"&gt;)&lt;/span&gt; and automate via obsidian-cli.
&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;Details:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Source: openclaw-bundled
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Path: ~/.npm-global/lib/node_modules/openclaw/skills/obsidian/SKILL.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Homepage: https://help.obsidian.md
&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 hl"&gt;&lt;span class="cl"&gt;Requirements:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt; Binaries: ✓ obsidian-cli
&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;Tip: use &lt;span class="sb"&gt;`&lt;/span&gt;npx clawhub&lt;span class="sb"&gt;`&lt;/span&gt; to search, install, and sync skills.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;今回入れたかったスキルに対して、必要だったものは下記のとおり。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;今回入れたかったスキルに対して、必要だったものを入れたときに実行したコマンドたち&lt;/summary&gt;
&lt;p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://brew.sh/ja/" target="_blank" rel="noopener"
&gt;Homebrew&lt;/a&gt;: インストールコマンドを実行して、ログに出てくるパス追加やツールインストールのコマンド群を実行する
&lt;ul&gt;
&lt;li&gt;このとき実行したコマンドは次のとおり
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;echo &amp;gt;&amp;gt; /home/nakurei/.bashrc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;echo 'eval &amp;quot;$(/home/linuxbrew/.linuxbrew/bin/brew shellenv bash)&amp;quot;' &amp;gt;&amp;gt; /home/nakurei/.bashrc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;eval &amp;quot;$(/home/linuxbrew/.linuxbrew/bin/brew shellenv bash)&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo apt install build-essential&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;brew install gcc&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;確認: &lt;code&gt;brew --version&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Go: &lt;code&gt;sudo apt install -y golang-go&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;確認: &lt;code&gt;go version&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ffmpeg: &lt;code&gt;sudo apt install -y build-essential ffmpeg&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;確認: &lt;code&gt;ffmpeg -version&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;uv: &lt;code&gt;curl -LsSf https://astral.sh/uv/install.sh | sh&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;source &amp;quot;$HOME/.local/bin/env&amp;quot;&lt;/code&gt;でパスを通す&lt;/li&gt;
&lt;li&gt;確認: &lt;code&gt;uv --version&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Obisdian CLI: &lt;code&gt;brew install yakitrak/yakitrak/obsidian-cli&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;確認: &lt;code&gt;obsidian-cli --help&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;summarize: &lt;code&gt;npm install -g @steipete/summarize&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;確認: &lt;code&gt;summarize --help&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;blogwatcher: &lt;code&gt;go install github.com/Hyaxia/blogwatcher/cmd/blogwatcher@latest&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;インストール後、&lt;code&gt;source ~/.bashrc&lt;/code&gt;して、パスを通す&lt;/li&gt;
&lt;li&gt;確認: &lt;code&gt;blogwatcher --help&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;必要なものを入れ終えたら、再度&lt;code&gt;openclaw skills check&lt;/code&gt;を実行して、Ready to useに使いたいスキルが入っていることを確認する。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;入れたいスキルをすべて入れ終えたときの、openclaw skills checkのログ&lt;/summary&gt;
&lt;p&gt;&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ openclaw skills check
&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;🦞 OpenClaw 2026.3.2 &lt;span class="o"&gt;(&lt;/span&gt;85377a2&lt;span class="o"&gt;)&lt;/span&gt; — Your task has been queued&lt;span class="p"&gt;;&lt;/span&gt; your dignity has been deprecated.
&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;Skills Status Check
&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;Total: &lt;span class="m"&gt;51&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✓ Eligible: &lt;span class="m"&gt;13&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;⏸ Disabled: &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;🚫 Blocked by allowlist: &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✗ Missing requirements: &lt;span class="m"&gt;38&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;Ready to use:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📰 blogwatcher
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🧩 coding-agent
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🎮 discord
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📦 healthcheck
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🍌 nano-banana-pro
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 💎 obsidian
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🖼️ openai-image-gen
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ☁️ openai-whisper-api
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📦 skill-creator
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🧾 summarize
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🧵 tmux
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🎞️ video-frames
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🌤️ weather
&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;Missing requirements:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🔐 1password &lt;span class="o"&gt;(&lt;/span&gt;bins: op&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📝 apple-notes &lt;span class="o"&gt;(&lt;/span&gt;bins: memo&lt;span class="p"&gt;;&lt;/span&gt; os: darwin&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ⏰ apple-reminders &lt;span class="o"&gt;(&lt;/span&gt;bins: remindctl&lt;span class="p"&gt;;&lt;/span&gt; os: darwin&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🐻 bear-notes &lt;span class="o"&gt;(&lt;/span&gt;bins: grizzly&lt;span class="p"&gt;;&lt;/span&gt; os: darwin&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🫐 blucli &lt;span class="o"&gt;(&lt;/span&gt;bins: blu&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🫧 bluebubbles &lt;span class="o"&gt;(&lt;/span&gt;config: channels.bluebubbles&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📸 camsnap &lt;span class="o"&gt;(&lt;/span&gt;bins: camsnap&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📦 clawhub &lt;span class="o"&gt;(&lt;/span&gt;bins: clawhub&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🎛️ eightctl &lt;span class="o"&gt;(&lt;/span&gt;bins: eightctl&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ♊️ gemini &lt;span class="o"&gt;(&lt;/span&gt;bins: gemini&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📦 gh-issues &lt;span class="o"&gt;(&lt;/span&gt;bins: gh&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🧲 gifgrep &lt;span class="o"&gt;(&lt;/span&gt;bins: gifgrep&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🐙 github &lt;span class="o"&gt;(&lt;/span&gt;bins: gh&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🎮 gog &lt;span class="o"&gt;(&lt;/span&gt;bins: gog&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📍 goplaces &lt;span class="o"&gt;(&lt;/span&gt;bins: goplaces&lt;span class="p"&gt;;&lt;/span&gt; env: GOOGLE_PLACES_API_KEY&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📧 himalaya &lt;span class="o"&gt;(&lt;/span&gt;bins: himalaya&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📨 imsg &lt;span class="o"&gt;(&lt;/span&gt;bins: imsg&lt;span class="p"&gt;;&lt;/span&gt; os: darwin&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📦 mcporter &lt;span class="o"&gt;(&lt;/span&gt;bins: mcporter&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📊 model-usage &lt;span class="o"&gt;(&lt;/span&gt;bins: codexbar&lt;span class="p"&gt;;&lt;/span&gt; os: darwin&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📄 nano-pdf &lt;span class="o"&gt;(&lt;/span&gt;bins: nano-pdf&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📝 notion &lt;span class="o"&gt;(&lt;/span&gt;env: NOTION_API_KEY&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🎙️ openai-whisper &lt;span class="o"&gt;(&lt;/span&gt;bins: whisper&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 💡 openhue &lt;span class="o"&gt;(&lt;/span&gt;bins: openhue&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🧿 oracle &lt;span class="o"&gt;(&lt;/span&gt;bins: oracle&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🛵 ordercli &lt;span class="o"&gt;(&lt;/span&gt;bins: ordercli&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 👀 peekaboo &lt;span class="o"&gt;(&lt;/span&gt;bins: peekaboo&lt;span class="p"&gt;;&lt;/span&gt; os: darwin&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🗣️ sag &lt;span class="o"&gt;(&lt;/span&gt;bins: sag&lt;span class="p"&gt;;&lt;/span&gt; env: ELEVENLABS_API_KEY&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📜 session-logs &lt;span class="o"&gt;(&lt;/span&gt;bins: jq, rg&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🗣️ sherpa-onnx-tts &lt;span class="o"&gt;(&lt;/span&gt;env: SHERPA_ONNX_RUNTIME_DIR, SHERPA_ONNX_MODEL_DIR&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 💬 slack &lt;span class="o"&gt;(&lt;/span&gt;config: channels.slack&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🌊 songsee &lt;span class="o"&gt;(&lt;/span&gt;bins: songsee&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🔊 sonoscli &lt;span class="o"&gt;(&lt;/span&gt;bins: sonos&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 🎵 spotify-player &lt;span class="o"&gt;(&lt;/span&gt;anyBins: spogo, spotify_player&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ✅ things-mac &lt;span class="o"&gt;(&lt;/span&gt;bins: things&lt;span class="p"&gt;;&lt;/span&gt; os: darwin&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📋 trello &lt;span class="o"&gt;(&lt;/span&gt;bins: jq&lt;span class="p"&gt;;&lt;/span&gt; env: TRELLO_API_KEY, TRELLO_TOKEN&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📞 voice-call &lt;span class="o"&gt;(&lt;/span&gt;config: plugins.entries.voice-call.enabled&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 📱 wacli &lt;span class="o"&gt;(&lt;/span&gt;bins: wacli&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 𝕏 xurl &lt;span class="o"&gt;(&lt;/span&gt;bins: xurl&lt;span class="o"&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;Tip: use &lt;span class="sb"&gt;`&lt;/span&gt;npx clawhub&lt;span class="sb"&gt;`&lt;/span&gt; to search, install, and sync skills.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="長期メモリを有効化する"&gt;
長期メモリを有効化する&lt;a href="#%e9%95%b7%e6%9c%9f%e3%83%a1%e3%83%a2%e3%83%aa%e3%82%92%e6%9c%89%e5%8a%b9%e5%8c%96%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;embedding providerを設定すると、memory searchが有効化され、長期メモリが使えるようになる。メモリの様子は&lt;code&gt;openclaw memory status&lt;/code&gt;で確認できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openclaw memory status --deep&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;details&gt;
&lt;summary&gt;うまくいっていないときのログ&lt;/summary&gt;
&lt;p&gt;&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ openclaw memory status --deep
&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;🦞 OpenClaw 2026.3.2 &lt;span class="o"&gt;(&lt;/span&gt;85377a2&lt;span class="o"&gt;)&lt;/span&gt; — I autocomplete your thoughts—just slower and with more API calls.
&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;◇
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Memory Search &lt;span class="o"&gt;(&lt;/span&gt;main&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Provider: none &lt;span class="o"&gt;(&lt;/span&gt;requested: auto&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Model: none
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Sources: memory
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Indexed: 0/0 files · &lt;span class="m"&gt;0&lt;/span&gt; chunks
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Dirty: yes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Store: ~/.openclaw/memory/main.sqlite
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Workspace: ~/.openclaw/workspace
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Embeddings: unavailable
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Embeddings error: No API key found &lt;span class="k"&gt;for&lt;/span&gt; provider &lt;span class="s2"&gt;&amp;#34;openai&amp;#34;&lt;/span&gt;. You are authenticated with OpenAI Codex OAuth. Use openai-codex/gpt-5.3-codex &lt;span class="o"&gt;(&lt;/span&gt;OAuth&lt;span class="o"&gt;)&lt;/span&gt; or &lt;span class="nb"&gt;set&lt;/span&gt; OPENAI_API_KEY to use openai/gpt-5.1-codex.
&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;No API key found &lt;span class="k"&gt;for&lt;/span&gt; provider &lt;span class="s2"&gt;&amp;#34;google&amp;#34;&lt;/span&gt;. Auth store: /home/nakurei/.openclaw/agents/main/agent/auth-profiles.json &lt;span class="o"&gt;(&lt;/span&gt;agentDir: /home/nakurei/.openclaw/agents/main/agent&lt;span class="o"&gt;)&lt;/span&gt;. Configure auth &lt;span class="k"&gt;for&lt;/span&gt; this agent &lt;span class="o"&gt;(&lt;/span&gt;openclaw agents add &amp;lt;id&amp;gt;&lt;span class="o"&gt;)&lt;/span&gt; or copy auth-profiles.json from the main agentDir.
&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;No API key found &lt;span class="k"&gt;for&lt;/span&gt; provider &lt;span class="s2"&gt;&amp;#34;voyage&amp;#34;&lt;/span&gt;. Auth store: /home/nakurei/.openclaw/agents/main/agent/auth-profiles.json &lt;span class="o"&gt;(&lt;/span&gt;agentDir: /home/nakurei/.openclaw/agents/main/agent&lt;span class="o"&gt;)&lt;/span&gt;. Configure auth &lt;span class="k"&gt;for&lt;/span&gt; this agent &lt;span class="o"&gt;(&lt;/span&gt;openclaw agents add &amp;lt;id&amp;gt;&lt;span class="o"&gt;)&lt;/span&gt; or copy auth-profiles.json from the main agentDir.
&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;No API key found &lt;span class="k"&gt;for&lt;/span&gt; provider &lt;span class="s2"&gt;&amp;#34;mistral&amp;#34;&lt;/span&gt;. Auth store: /home/nakurei/.openclaw/agents/main/agent/auth-profiles.json &lt;span class="o"&gt;(&lt;/span&gt;agentDir: /home/nakurei/.openclaw/agents/main/agent&lt;span class="o"&gt;)&lt;/span&gt;. Configure auth &lt;span class="k"&gt;for&lt;/span&gt; this agent &lt;span class="o"&gt;(&lt;/span&gt;openclaw agents add &amp;lt;id&amp;gt;&lt;span class="o"&gt;)&lt;/span&gt; or copy auth-profiles.json from the main agentDir.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;By source:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; memory · 0/0 files · &lt;span class="m"&gt;0&lt;/span&gt; chunks
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Vector: unknown
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FTS: ready
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Embedding cache: enabled &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt; entries&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Batch: disabled &lt;span class="o"&gt;(&lt;/span&gt;failures 0/2&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Issues:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; no memory files found in ~/.openclaw/workspace&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;まず、メモリ用のフォルダを作る。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p ~/.openclaw/memory&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;次に、Provider用のAPIキーを設定する。今回はOpenAIのAPI keyを設定した。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;OPENAI_API_KEY=APIキー\n&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; ~/.openclaw/.env&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;そして、ProviderをOpenAIに設定する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openclaw config &lt;span class="nb"&gt;set&lt;/span&gt; agents.defaults.memorySearch.provider openai&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;details&gt;
&lt;summary&gt;ログ&lt;/summary&gt;
&lt;p&gt;&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ openclaw config &lt;span class="nb"&gt;set&lt;/span&gt; agents.defaults.memorySearch.provider openai
&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;🦞 OpenClaw 2026.3.2 &lt;span class="o"&gt;(&lt;/span&gt;85377a2&lt;span class="o"&gt;)&lt;/span&gt; — Greetings, Professor Falken
&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;Config overwrite: /home/nakurei/.openclaw/openclaw.json &lt;span class="o"&gt;(&lt;/span&gt;sha256 XXXXXXXXXXXXXXXXXXXXXXXXX -&amp;gt; XXXXXXXXXXXXXXXXXXXXXXXXX, &lt;span class="nv"&gt;backup&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/home/nakurei/.openclaw/openclaw.json.bak&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Updated agents.defaults.memorySearch.provider. Restart the gateway to apply.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;すると、サービスのリスタートを求めあれるので、リスタートする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl --user restart openclaw-gateway.service&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;インデックスを貼り、再度確認する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openclaw memory index
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openclaw memory status --deep&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;details&gt;
&lt;summary&gt;有効になったときのログ&lt;/summary&gt;
&lt;p&gt;&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ openclaw memory status --deep
&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;🦞 OpenClaw 2026.3.2 &lt;span class="o"&gt;(&lt;/span&gt;85377a2&lt;span class="o"&gt;)&lt;/span&gt; — I&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;m the assistant your terminal demanded, not the one your sleep schedule requested.
&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;◇
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Memory Search &lt;span class="o"&gt;(&lt;/span&gt;main&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Provider: openai &lt;span class="o"&gt;(&lt;/span&gt;requested: openai&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Model: text-embedding-3-small
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Sources: memory
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Indexed: 0/0 files · &lt;span class="m"&gt;0&lt;/span&gt; chunks
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Dirty: no
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Store: ~/.openclaw/memory/main.sqlite
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Workspace: ~/.openclaw/workspace
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Embeddings: ready
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;By source:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; memory · 0/0 files · &lt;span class="m"&gt;0&lt;/span&gt; chunks
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Vector: ready
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Vector path: ~/.npm-global/lib/node_modules/openclaw/node_modules/sqlite-vec-linux-x64/vec0.so
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FTS: ready
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Embedding cache: enabled &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt; entries&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Batch: disabled &lt;span class="o"&gt;(&lt;/span&gt;failures 0/2&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Issues:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; no memory files found in ~/.openclaw/workspace&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="メンションをなくす"&gt;
メンションをなくす&lt;a href="#%e3%83%a1%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%92%e3%81%aa%e3%81%8f%e3%81%99"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;自分とボットしかいないのに毎回メンションをするのは面倒なので、メンションなしでも応答するようにする。
この設定は&lt;code&gt;openclaw.json&lt;/code&gt;を編集するとできる。&lt;code&gt;nano&lt;/code&gt;でも&lt;code&gt;vim&lt;/code&gt;でも好きなエディタで開いて、編集すればいい。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nano .openclaw/openclaw.json&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;DiscordからサーバーのIDを確認し、下記のように&lt;code&gt;requireMention&lt;/code&gt;を&lt;code&gt;false&lt;/code&gt;に設定する。&lt;/p&gt;
&lt;style&gt;
:root {
--uni-warning-bg-color: #fae287;
--uni-warning-line-color: #544600;
}
:root[data-scheme='dark'] {
--uni-warning-bg-color: #544600;
--uni-warning-line-color: #fae287;
}
.block-highlight-warning {
display: flex;
align-items: center;
justify-content: first baseline;
height: 100%;
width: 100%;
padding: 1em;
margin: 1em 0;
border-left: 5px solid var(--uni-warning-line-color);
background-color: var(--uni-warning-bg-color);
border-radius: 0.5rem;
overflow: hidden;
color: var(--card-text-color-main);
line-height: 1.5;
}
.icon-warning {
display: inline-flex;
align-items: center;
vertical-align: middle;
}
.icon-warning svg {
vertical-align: baseline;
width: 1.5em;
height: 1.5em;
stroke-width: 1.5;
flex-shrink: 0;
}
&lt;/style&gt;
&lt;div class="block-highlight-warning"&gt;
&lt;span class="icon-warning"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-alert-triangle" width="44" height="44" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"&gt;
&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;
&lt;path d="M12 9v2m0 4v.01" /&gt;
&lt;path d="M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75" /&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span&gt;&lt;code&gt;DiscrodサーバーのID&lt;/code&gt;の部分は、実際のサーバーIDに置き換えること。&lt;/span&gt;
&lt;/div&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;channels&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;discord&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;enabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;token&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;XXXXXXXX&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;groupPolicy&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;open&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;streaming&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;off&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;guilds&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;DiscrodサーバーのID&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;requireMention&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;反映させる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl --user restart openclaw-gateway.service&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="動いた"&gt;
動いた！&lt;a href="#%e5%8b%95%e3%81%84%e3%81%9f"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/openclaw-first-notes/20260308185521.png"
width="1385"
height="467"
srcset="https://notes.nakurei.com/post/openclaw-first-notes/20260308185521_hu_4701fc7c6e9ccaa0.png 480w, https://notes.nakurei.com/post/openclaw-first-notes/20260308185521_hu_6ab16ee246ae8351.png 1024w"
loading="lazy"
alt="うごいた！！！！！！！！！！！！！！！！"
class="gallery-image"
data-flex-grow="296"
data-flex-basis="711px"
&gt;&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://docs.openclaw.ai/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/70c994f860482ebc428f5631237f7a07b0539874_hu_92fd460899f1d1af.webp"
alt="OpenClaw - OpenClaw image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
OpenClaw - OpenClaw
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-82ac1aea3f132e19cd22320d4d7d6f99c1e13682.png"
style="margin-right: 2px;"
alt="docs.openclaw.ai favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
docs.openclaw.ai
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://note.com/kazuto1027/n/n3d9d871f14f1"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/c1c825c6cdc163d1c093a92823ea80399ff519f1_hu_4904f9a93ff5a451.webp"
alt="Discord × OpenClaw 実践セットアップ — 設定はAIとの対話で終わる｜Karry image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Discord × OpenClaw 実践セットアップ — 設定はAIとの対話で終わる｜Karry
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;前回、OpenClawの「家」をDiscordに建てた話を書いた。なぜDiscordなのか、チャンネル設計の思想、自治区という発想——あれは考え方の話だった。 今回は手を動かす。Bot作成からAgent Terms、Cron Jobsまで、実際にやった設定を全部書く。 先に結論だけ言っておくと、僕が自分でコードを書いたり設定ファイルをいじったりした場面は、ほぼなかった。 Discord Botを作る — 唯一の手作業 唯一の手作業がこれ。Discord Developer Portalに行って、Applicationを作って、BotページからTokenを取る。ここまではどのチ&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-f791ab80b1702b088132b15ae812f8da18242d6c.png"
style="margin-right: 2px;"
alt="note.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
note.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>はじめてtmuxを触ってみたときのメモ</title><link>https://notes.nakurei.com/post/tmux-first-notes/</link><pubDate>Mon, 23 Feb 2026 17:19:04 +0900</pubDate><guid>https://notes.nakurei.com/post/tmux-first-notes/</guid><description>&lt;img src="https://notes.nakurei.com/post/tmux-first-notes/20260223191906.png" alt="Featured image of post はじめてtmuxを触ってみたときのメモ" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;はじめてtmuxを触ってみたときにやったことのメモ。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://github.com/tmux/tmux?tab=readme-ov-file"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/c0df4b851f094037504b894f786dbbd8e97459fe_hu_11b233334fbfd2e2.webp"
alt="GitHub - tmux/tmux: tmux source code image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
GitHub - tmux/tmux: tmux source code
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;tmux source code. Contribute to tmux/tmux development by creating an account on GitHub.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-ffd1aa80239afc78c1628dfb5e08cff1205f22d5.png"
style="margin-right: 2px;"
alt="github.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
github.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Windows 11 WSL2 Ubuntu 24.04&lt;/li&gt;
&lt;li&gt;tmux 3.4&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="インストール"&gt;
インストール&lt;a href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;aptでインストールした。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install tmux&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;他のインストール方法は公式を参照してほしい。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://github.com/tmux/tmux/wiki/Installing"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/c0df4b851f094037504b894f786dbbd8e97459fe_hu_11b233334fbfd2e2.webp"
alt="Installing image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Installing
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;tmux source code. Contribute to tmux/tmux development by creating an account on GitHub.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-ffd1aa80239afc78c1628dfb5e08cff1205f22d5.png"
style="margin-right: 2px;"
alt="github.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
github.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;バージョンを確認できれば成功。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ tmux -V
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tmux 3.4&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="操作に慣れる"&gt;
操作に慣れる&lt;a href="#%e6%93%8d%e4%bd%9c%e3%81%ab%e6%85%a3%e3%82%8c%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="起動して閉じるだけ"&gt;
起動して閉じるだけ&lt;a href="#%e8%b5%b7%e5%8b%95%e3%81%97%e3%81%a6%e9%96%89%e3%81%98%e3%82%8b%e3%81%a0%e3%81%91"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;とりあえず起動してみる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tmux&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;すると新たにウィンドウが開く。これはtmuxセッションと呼ばれる。tmuxセッション内では、画像のように下部にステータスバーが表示される。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/tmux-first-notes/20260223191307.png"
width="583"
height="381"
srcset="https://notes.nakurei.com/post/tmux-first-notes/20260223191307_hu_99382537c58f5a4d.png 480w, https://notes.nakurei.com/post/tmux-first-notes/20260223191307_hu_9fd9872bf3071a7c.png 1024w"
loading="lazy"
alt="ステータスバーの例"
class="gallery-image"
data-flex-grow="153"
data-flex-basis="367px"
&gt;&lt;/p&gt;
&lt;p&gt;ステータスバーには、現在のセッション名やウィンドウ名、日時などが表示される。セッション名はデフォルトでは&lt;code&gt;0&lt;/code&gt;になっている。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Ctrl + d&lt;/code&gt;を押すか&lt;code&gt;exit&lt;/code&gt;コマンドを実行すると、tmuxセッションが終了する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;exit&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="ターミナルを分割してみる"&gt;
ターミナルを分割してみる&lt;a href="#%e3%82%bf%e3%83%bc%e3%83%9f%e3%83%8a%e3%83%ab%e3%82%92%e5%88%86%e5%89%b2%e3%81%97%e3%81%a6%e3%81%bf%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;再度起動する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tmux&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;tmuxではウィンドウを分割できる。分割したものはペインと呼ばれる。
上下の分割は&lt;code&gt;Ctrl + b&lt;/code&gt;を押してから&lt;code&gt;%&lt;/code&gt;を押す。左右の分割は&lt;code&gt;Ctrl + b&lt;/code&gt;を押してから&lt;code&gt;&amp;quot;&lt;/code&gt;を押す。&lt;/p&gt;
&lt;style&gt;
:root {
--uni-warning-bg-color: #fae287;
--uni-warning-line-color: #544600;
}
:root[data-scheme='dark'] {
--uni-warning-bg-color: #544600;
--uni-warning-line-color: #fae287;
}
.block-highlight-warning {
display: flex;
align-items: center;
justify-content: first baseline;
height: 100%;
width: 100%;
padding: 1em;
margin: 1em 0;
border-left: 5px solid var(--uni-warning-line-color);
background-color: var(--uni-warning-bg-color);
border-radius: 0.5rem;
overflow: hidden;
color: var(--card-text-color-main);
line-height: 1.5;
}
.icon-warning {
display: inline-flex;
align-items: center;
vertical-align: middle;
}
.icon-warning svg {
vertical-align: baseline;
width: 1.5em;
height: 1.5em;
stroke-width: 1.5;
flex-shrink: 0;
}
&lt;/style&gt;
&lt;div class="block-highlight-warning"&gt;
&lt;span class="icon-warning"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-alert-triangle" width="44" height="44" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"&gt;
&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;
&lt;path d="M12 9v2m0 4v.01" /&gt;
&lt;path d="M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75" /&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span&gt;JISキーボードの場合、&lt;code&gt;%&lt;/code&gt;は&lt;code&gt;Shift + 5&lt;/code&gt;なので、&lt;code&gt;Ctrl + b&lt;/code&gt;を押してから&lt;code&gt;Shift + 5&lt;/code&gt;を押す必要がある。&lt;code&gt;&amp;quot;&lt;/code&gt;も同様に、&lt;code&gt;Shift + 2&lt;/code&gt;なので、&lt;code&gt;Ctrl + b&lt;/code&gt;を押してから&lt;code&gt;Shift + 2&lt;/code&gt;を押す必要がある。&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/tmux-first-notes/20260223191410.png"
width="583"
height="381"
srcset="https://notes.nakurei.com/post/tmux-first-notes/20260223191410_hu_f4a19d7e720f944.png 480w, https://notes.nakurei.com/post/tmux-first-notes/20260223191410_hu_96aa19b1aaf6b57d.png 1024w"
loading="lazy"
alt="1回左右分割したのち、1回上下分割した場合"
class="gallery-image"
data-flex-grow="153"
data-flex-basis="367px"
&gt;&lt;/p&gt;
&lt;h3 id="ペインの切り替え"&gt;
ペインの切り替え&lt;a href="#%e3%83%9a%e3%82%a4%e3%83%b3%e3%81%ae%e5%88%87%e3%82%8a%e6%9b%bf%e3%81%88"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ペインの切り替えは、&lt;code&gt;Ctrl + b&lt;/code&gt;を押してから矢印キーを押す。例えば、右のペインに切り替える場合は、&lt;code&gt;Ctrl + b&lt;/code&gt;を押してから右矢印キーを押す。&lt;/p&gt;
&lt;p&gt;また、&lt;code&gt;Ctrl + b&lt;/code&gt;を押してから&lt;code&gt;o&lt;/code&gt;を押すと次のペインに移動、&lt;code&gt;Ctrl + b&lt;/code&gt;を押してから&lt;code&gt;;&lt;/code&gt;を押すと以前のペインに移動できる。&lt;/p&gt;
&lt;h3 id="ペインのサイズ変更"&gt;
ペインのサイズ変更&lt;a href="#%e3%83%9a%e3%82%a4%e3%83%b3%e3%81%ae%e3%82%b5%e3%82%a4%e3%82%ba%e5%a4%89%e6%9b%b4"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ペインのサイズ変更は、&lt;code&gt;Ctrl + b&lt;/code&gt;を押してから&lt;code&gt;Ctrl + 矢印キー&lt;/code&gt;を押す。例えば、右のペインを広げる場合は、&lt;code&gt;Ctrl + b&lt;/code&gt;を押してから&lt;code&gt;Ctrl + 右矢印キー&lt;/code&gt;を押す。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Ctrl + b&lt;/code&gt;を押してから&lt;code&gt;z&lt;/code&gt;を押すと、現在のペインを最大化できる。もう一度&lt;code&gt;Ctrl + b&lt;/code&gt;を押してから&lt;code&gt;z&lt;/code&gt;を押すと、元のサイズに戻る。&lt;/p&gt;
&lt;h3 id="ペインの移動"&gt;
ペインの移動&lt;a href="#%e3%83%9a%e3%82%a4%e3%83%b3%e3%81%ae%e7%a7%bb%e5%8b%95"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ペインの移動は、&lt;code&gt;Ctrl + b&lt;/code&gt;を押してから&lt;code&gt;{&lt;/code&gt;を押すと次に、&lt;code&gt;Ctrl + b&lt;/code&gt;を押してから&lt;code&gt;}&lt;/code&gt;を押すと前に移動できる。番号は&lt;code&gt;Ctrl + b&lt;/code&gt;を押してから&lt;code&gt;q&lt;/code&gt;を押すと表示される。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/tmux-first-notes/20260223191906.png"
width="583"
height="381"
srcset="https://notes.nakurei.com/post/tmux-first-notes/20260223191906_hu_ca6ab3f239985bc5.png 480w, https://notes.nakurei.com/post/tmux-first-notes/20260223191906_hu_a73a0cc9b07a6e15.png 1024w"
loading="lazy"
alt="ペインの番号が表示されている様子"
class="gallery-image"
data-flex-grow="153"
data-flex-basis="367px"
&gt;&lt;/p&gt;
&lt;h3 id="ペインの削除"&gt;
ペインの削除&lt;a href="#%e3%83%9a%e3%82%a4%e3%83%b3%e3%81%ae%e5%89%8a%e9%99%a4"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ペインの削除は、&lt;code&gt;Ctrl + b&lt;/code&gt;を押してから&lt;code&gt;x&lt;/code&gt;を押す。すると、削除するかどうかの確認が表示されるので、&lt;code&gt;y&lt;/code&gt;を押すと削除される。&lt;/p&gt;
&lt;p&gt;ペイン内で&lt;code&gt;Ctrl + d&lt;/code&gt;を押すか&lt;code&gt;exit&lt;/code&gt;コマンドを実行しても、ペインを削除できる。&lt;/p&gt;
&lt;h3 id="セッションの一時離脱"&gt;
セッションの一時離脱&lt;a href="#%e3%82%bb%e3%83%83%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e4%b8%80%e6%99%82%e9%9b%a2%e8%84%b1"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Ctrl + d&lt;/code&gt;ではなく、&lt;code&gt;Ctrl + b&lt;/code&gt;を押してから&lt;code&gt;d&lt;/code&gt;を押すと、セッションから一時的に離脱できる。
離脱したセッションはバックグラウンドで動いているので、再度アタッチすれば続きから作業できる。アタッチは以下のコマンドでできる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tmux a&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;どういうセッションがあるか確認したいときは、以下のコマンドを実行する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tmux ls&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;すると次のように確認できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ tmux ls
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0: &lt;span class="m"&gt;2&lt;/span&gt; windows &lt;span class="o"&gt;(&lt;/span&gt;created Mon Feb &lt;span class="m"&gt;23&lt;/span&gt; 00:59:32 2026&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;attached&lt;span class="o"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;原則として、終了時は&lt;code&gt;Ctrl + b&lt;/code&gt;を押してから&lt;code&gt;d&lt;/code&gt;を押して離脱し、再開時は&lt;code&gt;tmux a&lt;/code&gt;でアタッチするのが良さそう。&lt;/p&gt;
&lt;h2 id="ウィンドウを増やす"&gt;
ウィンドウを増やす&lt;a href="#%e3%82%a6%e3%82%a3%e3%83%b3%e3%83%89%e3%82%a6%e3%82%92%e5%a2%97%e3%82%84%e3%81%99"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ペインの組み合わせを新しく作りたい場合は、ウィンドウを新しく作る。ウィンドウはタブのようなもので、tmuxでは複数のウィンドウを切り替えて作業できる。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Ctrl + b&lt;/code&gt;を押してから&lt;code&gt;c&lt;/code&gt;を押すと、新しいウィンドウが作成される。&lt;/p&gt;
&lt;p&gt;ウィンドウの切り替えは、&lt;code&gt;Ctrl + b&lt;/code&gt;を押してから&lt;code&gt;n&lt;/code&gt;を押すと次のウィンドウ、&lt;code&gt;Ctrl + b&lt;/code&gt;を押してから&lt;code&gt;p&lt;/code&gt;を押すと前のウィンドウに切り替えられる。
あるいは、&lt;code&gt;Ctrl + b&lt;/code&gt;を押してからウィンドウ番号（e.g. 0, 1, 2, &amp;hellip;）を押すと、その番号のウィンドウに切り替えられる。&lt;/p&gt;
&lt;h2 id="カスタマイズ"&gt;
カスタマイズ&lt;a href="#%e3%82%ab%e3%82%b9%e3%82%bf%e3%83%9e%e3%82%a4%e3%82%ba"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="設定ファイルを作る"&gt;
設定ファイルを作る&lt;a href="#%e8%a8%ad%e5%ae%9a%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92%e4%bd%9c%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;tmuxはホームディレクトリにある&lt;code&gt;.tmux.conf&lt;/code&gt;ファイルでカスタマイズできる。例えば、以下のように記述すると、&lt;code&gt;Ctrl + b&lt;/code&gt;（プレフィックスキー）を&lt;code&gt;Ctrl + a&lt;/code&gt;に変更できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# プレフィックスキーをCtrl + aに変更&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;unbind C-b
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set-option -g prefix C-a
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;bind&lt;/span&gt; C-a send-prefix&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ウィンドウ内でマウス操作を有効にするには、以下のように記述する。マウス操作を有効にするとターミナルのスクロールが使えたり、クリックでペインを切り替えたりできるようになる。ただし、ターミナルの文字列を&lt;code&gt;Ctrl + Shift + c&lt;/code&gt;でコピーできなくなる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# マウス操作を有効にする&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -g mouse on&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;また、&lt;code&gt;ユーザー名@ホスト名: カレントディレクトリ&lt;/code&gt;の部分に色をつけるには、以下のように記述する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# tmux内でも同じ色が出るように設定&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set-option -g default-terminal screen-256color
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -g terminal-overrides &lt;span class="s1"&gt;&amp;#39;xterm:colors=256&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;クリップボードをtmuxとOSとで共有するには、以下のように記述する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# クリップボードをtmuxと共有する&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set-option -g set-clipboard on&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="設定を反映させる"&gt;
設定を反映させる&lt;a href="#%e8%a8%ad%e5%ae%9a%e3%82%92%e5%8f%8d%e6%98%a0%e3%81%95%e3%81%9b%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;設定を変更した後は、tmuxセッション内で以下のコマンドを実行して設定を反映させる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tmux source-file ~/.tmux.conf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="おわりに--感想"&gt;
おわりに | 感想&lt;a href="#%e3%81%8a%e3%82%8f%e3%82%8a%e3%81%ab--%e6%84%9f%e6%83%b3"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;きちんとショートカットキーを覚えないと使いにくいが、慣れれば便利そう。任意の形式で分割できたり、最大化できたりするのは便利だし、セッションを一時離脱できるというのも役立ちそう。使えるようになるぞ～。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://www.tohoho-web.com/ex/tmux.html"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="とほほのtmux入門 - とほほのWWW入門 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
とほほのtmux入門 - とほほのWWW入門
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-9da0fc0ed2ddf52d86c8ee5c05da01cc23949161.png"
style="margin-right: 2px;"
alt="www.tohoho-web.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
www.tohoho-web.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://zenn.dev/kimushun1101/articles/tmux-beginner"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/ac4309f753dde536f38b62a2b7c6aad9d3d80cb1_hu_2a50a5ac0dac8a9f.webp"
alt="ターミナル多重化ソフトウェアtmuxの始め方 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
ターミナル多重化ソフトウェアtmuxの始め方
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-8299b9ca5170247061175f654bfc883ff1cc2440.png"
style="margin-right: 2px;"
alt="zenn.dev favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
zenn.dev
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://qiita.com/koin3z/items/5d923b1cd7a3ce6ca32b"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/8f5db61a0af550b5a7750e17abcc2117a9447a26_hu_50b8482489c543ee.webp"
alt="tmux、これだけ知っておけばおｋ（用語・準備編） - Qiita image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
tmux、これだけ知っておけばおｋ（用語・準備編） - Qiita
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;1. tmuxとは tmuxとは一つのターミナルで複数のセッションやウィンドウを管理できるソフトウェアツールでTerminal Multiplexerの略です。tmux内で複数の仮想端末を切り替えることでTeratermやPutty、ターミナルなどを新規に立ち上げる手間を...&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7dfa4a32e8b8dd3b8a6b654e1cd55932c6a19262.png"
style="margin-right: 2px;"
alt="qiita.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
qiita.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;/p&gt;</description></item><item><title>GitHub で main ブランチを保護するときに何をすればいいかのメモ</title><link>https://notes.nakurei.com/post/github-main-branch-protection/</link><pubDate>Sun, 15 Feb 2026 17:34:07 +0900</pubDate><guid>https://notes.nakurei.com/post/github-main-branch-protection/</guid><description>&lt;img src="https://notes.nakurei.com/icons/brand-github.svg" alt="Featured image of post GitHub で main ブランチを保護するときに何をすればいいかのメモ" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;GitHubでmainブランチを保護するためのルール設定のメモ。&lt;/p&gt;
&lt;h2 id="前提"&gt;
前提&lt;a href="#%e5%89%8d%e6%8f%90"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;GitHubでは、ブランチ保護にルールを設定できる。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://docs.github.com/ja/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/managing-a-branch-protection-rule"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/9291c5895c60f68749774fbf3fc719163834727b_hu_6374f8e298a87eeb.webp"
alt="ブランチ保護ルールを管理する - GitHub ドキュメント image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
ブランチ保護ルールを管理する - GitHub ドキュメント
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;ブランチ保護ルールを作成して、1 つ以上のブランチに特定のワークフローを強制することができます。たとえば、承認レビューを要求したり、保護されたブランチにマージされるすべての pull request について状態チェックを渡したりすることができます。&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-93e8494b5705d47fd44472eac39f114eda44f780.png"
style="margin-right: 2px;"
alt="docs.github.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
docs.github.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;ここでは、メインブランチの保護にフォーカスし、上記の保護ルールをどのように設定すればいいのかを述べる。&lt;/p&gt;
&lt;h2 id="ルール集"&gt;
ルール集&lt;a href="#%e3%83%ab%e3%83%bc%e3%83%ab%e9%9b%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="mainっぽい名前のブランチの作成を禁止する"&gt;
&lt;code&gt;main&lt;/code&gt;っぽい名前のブランチの作成を禁止する&lt;a href="#main%e3%81%a3%e3%81%bd%e3%81%84%e5%90%8d%e5%89%8d%e3%81%ae%e3%83%96%e3%83%a9%e3%83%b3%e3%83%81%e3%81%ae%e4%bd%9c%e6%88%90%e3%82%92%e7%a6%81%e6%ad%a2%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;main*&lt;/code&gt;に&amp;quot;Restrict creations&amp;quot;を設定する。&lt;code&gt;*&lt;/code&gt;をつけるのが肝。&lt;/p&gt;
&lt;h3 id="mainブランチそのものの更新をすべて停止する"&gt;
&lt;code&gt;main&lt;/code&gt;ブランチそのものの更新をすべて停止する&lt;a href="#main%e3%83%96%e3%83%a9%e3%83%b3%e3%83%81%e3%81%9d%e3%81%ae%e3%82%82%e3%81%ae%e3%81%ae%e6%9b%b4%e6%96%b0%e3%82%92%e3%81%99%e3%81%b9%e3%81%a6%e5%81%9c%e6%ad%a2%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;main&lt;/code&gt;に&amp;quot;Restrict updates&amp;quot;を設定する。この設定を有効にすると、プッシュだけでなくリベースやマージなどすべての更新を阻止できる。&lt;/p&gt;
&lt;h3 id="mainブランチの削除を禁止する"&gt;
&lt;code&gt;main&lt;/code&gt;ブランチの削除を禁止する&lt;a href="#main%e3%83%96%e3%83%a9%e3%83%b3%e3%83%81%e3%81%ae%e5%89%8a%e9%99%a4%e3%82%92%e7%a6%81%e6%ad%a2%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;main&lt;/code&gt;に&amp;quot;Restrict deletions&amp;quot;を設定する。&lt;/p&gt;
&lt;h3 id="デプロイを保証する"&gt;
デプロイを保証する&lt;a href="#%e3%83%87%e3%83%97%e3%83%ad%e3%82%a4%e3%82%92%e4%bf%9d%e8%a8%bc%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;main&lt;/code&gt;に&amp;quot;Require deployments to succeed&amp;quot;を設定する。&lt;/p&gt;
&lt;h3 id="署名付きコミットを要求する"&gt;
署名付きコミットを要求する&lt;a href="#%e7%bd%b2%e5%90%8d%e4%bb%98%e3%81%8d%e3%82%b3%e3%83%9f%e3%83%83%e3%83%88%e3%82%92%e8%a6%81%e6%b1%82%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;main&lt;/code&gt;に&amp;quot;Require signed commits&amp;quot;を設定する。&lt;/p&gt;
&lt;h3 id="プルリクエストprを要求する"&gt;
プルリクエスト（PR）を要求する&lt;a href="#%e3%83%97%e3%83%ab%e3%83%aa%e3%82%af%e3%82%a8%e3%82%b9%e3%83%88pr%e3%82%92%e8%a6%81%e6%b1%82%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;main&lt;/code&gt;に&amp;quot;Require a pull request before merging&amp;quot;を設定する。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自分だけの開発なら、&amp;ldquo;Required approvals&amp;quot;は0にする。他者に必ずレビューしてもらいたいなら、&amp;ldquo;Required approvals&amp;quot;を1以上にする&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Dismiss stale pull request approvals when new commits are pushed&amp;quot;は、有効にするのがベター&lt;/li&gt;
&lt;li&gt;自分だけレビューなくマージして、ほかの人には自分のレビューを強制する場合、CODEOWNERSファイルを作成して、&amp;ldquo;Require review from Code Owners&amp;quot;を有効にするとよい&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Require conversation resolution before merging&amp;quot;は有効でもいいかも&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="cicdの通過を強制する"&gt;
CI/CDの通過を強制する&lt;a href="#cicd%e3%81%ae%e9%80%9a%e9%81%8e%e3%82%92%e5%bc%b7%e5%88%b6%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;main&lt;/code&gt;に&amp;quot;Require status checks to pass&amp;quot;を設定する。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;Require branches to be up to date before merging&amp;quot;は有効にするのがベスト&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="強制pushを禁止する"&gt;
強制pushを禁止する&lt;a href="#%e5%bc%b7%e5%88%b6push%e3%82%92%e7%a6%81%e6%ad%a2%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;main&lt;/code&gt;に&amp;quot;Block force pushes&amp;quot;を有効にする。&lt;/p&gt;
&lt;h2 id="リポジトリを公開している際のルール集"&gt;
リポジトリを公開している際のルール集&lt;a href="#%e3%83%aa%e3%83%9d%e3%82%b8%e3%83%88%e3%83%aa%e3%82%92%e5%85%ac%e9%96%8b%e3%81%97%e3%81%a6%e3%81%84%e3%82%8b%e9%9a%9b%e3%81%ae%e3%83%ab%e3%83%bc%e3%83%ab%e9%9b%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;デプロイしているブランチに&amp;quot;Require deployments to succeed&amp;quot;を設定する&lt;/li&gt;
&lt;li&gt;自分が署名付きコミットを使っているなら、保護したいブランチに&amp;quot;Require signed commits&amp;quot;を設定する&lt;/li&gt;
&lt;li&gt;保護したいブランチに&amp;quot;Require a pull request before merging&amp;quot;を設定する&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://docs.github.com/ja/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/managing-a-branch-protection-rule"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/9291c5895c60f68749774fbf3fc719163834727b_hu_6374f8e298a87eeb.webp"
alt="ブランチ保護ルールを管理する - GitHub ドキュメント image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
ブランチ保護ルールを管理する - GitHub ドキュメント
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;ブランチ保護ルールを作成して、1 つ以上のブランチに特定のワークフローを強制することができます。たとえば、承認レビューを要求したり、保護されたブランチにマージされるすべての pull request について状態チェックを渡したりすることができます。&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-93e8494b5705d47fd44472eac39f114eda44f780.png"
style="margin-right: 2px;"
alt="docs.github.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
docs.github.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://docs.github.com/ja/repositories/configuring-branches-and-merges-in-your-repository/managing-rulesets/available-rules-for-rulesets"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/9291c5895c60f68749774fbf3fc719163834727b_hu_6374f8e298a87eeb.webp"
alt="ルールセットで使用できるルール - GitHub ドキュメント image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
ルールセットで使用できるルール - GitHub ドキュメント
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;リポジトリ内の特定のブランチとタグを保護するためにルールセットに追加できるルールについて説明します。&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-93e8494b5705d47fd44472eac39f114eda44f780.png"
style="margin-right: 2px;"
alt="docs.github.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
docs.github.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>MATLABで図を保存するときは図のサイズに気を付けるべき</title><link>https://notes.nakurei.com/post/warn-figure-size-when-save-matlab-figure/</link><pubDate>Mon, 09 Feb 2026 20:29:33 +0900</pubDate><guid>https://notes.nakurei.com/post/warn-figure-size-when-save-matlab-figure/</guid><description>&lt;p&gt;MATLABで図を保存するとき、何も考えず保存すると、図によってはグラフが小さすぎて見れなかったり凡例が図に被ったりしてしまう。
&lt;code&gt;.fig&lt;/code&gt;で保存していれば、開いてから最大サイズにすればいいだけなのだが、これを毎回やっているとなかなかめんどい。&lt;code&gt;.png&lt;/code&gt;で保存していたら詰む。&lt;/p&gt;
&lt;p&gt;そこで、下記のように、保存する前に&lt;strong&gt;図のサイズを最大サイズにしてから保存&lt;/strong&gt;する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-matlab" data-lang="matlab"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;figH&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;figH&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WindowState&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;maximized&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;% fig&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;figH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &amp;#34;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&amp;#34;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;% png 2020a以降&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;exportgraphics&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;figH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;output.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;Resolution&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;% png 2020aより前&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;figH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;output.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;-dpng&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;-r300&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;こうすると、グラフが小さすぎて見れなかったり凡例が図に被ったりする事故を防げる。&lt;/p&gt;</description></item><item><title>C# の開発環境を VS Code で構築した際の構築手順メモ</title><link>https://notes.nakurei.com/post/csharp-vs-code-development-environment-setup/</link><pubDate>Fri, 06 Feb 2026 22:40:41 +0900</pubDate><guid>https://notes.nakurei.com/post/csharp-vs-code-development-environment-setup/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;C#の開発環境をVS Codeで構築した際に取った手順のメモ。&lt;/p&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Windows 11&lt;/li&gt;
&lt;li&gt;VS Code 1.108.2&lt;/li&gt;
&lt;li&gt;.NET SDK 10.0.102&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="手順"&gt;
手順&lt;a href="#%e6%89%8b%e9%a0%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-net-sdkのインストール"&gt;
1. .NET SDKのインストール&lt;a href="#1-net-sdk%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;.NET SDKをインストールする。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://dotnet.microsoft.com/ja-jp/download"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/03953902b41e573ae16febd57c1f5f5f8b16144d_hu_ff503af67be657ff.webp"
alt=".NET のダウンロード (Linux、macOS、Windows) | .NET image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
.NET のダウンロード (Linux、macOS、Windows) | .NET
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Linux、macOS、および Windows で .NET アプリケーションを構築し、実行するための無料ダウンロード。.NET Framework、.NET、および ASP.NET 用のランタイム、SDK、および開発者パック。&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-47ea4f75a08dd4a67ce8a468bb672f3af35ccd7e.jpeg"
style="margin-right: 2px;"
alt="dotnet.microsoft.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
dotnet.microsoft.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;Windowsの場合&lt;code&gt;winget&lt;/code&gt;で入れるのが楽。どのバージョンがインストールできるかは、&lt;code&gt;winget search&lt;/code&gt;で確認できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;winget&lt;/span&gt; &lt;span class="n"&gt;search&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;.NET SDK&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;実行例を以下に示す。ここから最新版を確認する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;winget&lt;/span&gt; &lt;span class="n"&gt;search&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;.NET SDK&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;名前&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="n"&gt;バージョン&lt;/span&gt; &lt;span class="n"&gt;ソース&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;--------------------------------------------------------------------------------------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Microsoft&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;NET&lt;/span&gt; &lt;span class="n"&gt;SDK&lt;/span&gt; &lt;span class="mf"&gt;10.0&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;DotNet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;SDK&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;10&lt;/span&gt; &lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;102&lt;/span&gt; &lt;span class="n"&gt;winget&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Microsoft&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;NET&lt;/span&gt; &lt;span class="n"&gt;SDK&lt;/span&gt; &lt;span class="mf"&gt;3.1&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;DotNet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;SDK&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;3_1&lt;/span&gt; &lt;span class="mf"&gt;3.1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;426&lt;/span&gt; &lt;span class="n"&gt;winget&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Microsoft&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;NET&lt;/span&gt; &lt;span class="n"&gt;SDK&lt;/span&gt; &lt;span class="mf"&gt;5.0&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;DotNet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;SDK&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;5&lt;/span&gt; &lt;span class="mf"&gt;5.0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;408&lt;/span&gt; &lt;span class="n"&gt;winget&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Microsoft&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;NET&lt;/span&gt; &lt;span class="n"&gt;SDK&lt;/span&gt; &lt;span class="mf"&gt;6.0&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;DotNet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;SDK&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;6&lt;/span&gt; &lt;span class="mf"&gt;6.0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;428&lt;/span&gt; &lt;span class="n"&gt;winget&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Microsoft&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;NET&lt;/span&gt; &lt;span class="n"&gt;SDK&lt;/span&gt; &lt;span class="mf"&gt;7.0&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;DotNet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;SDK&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;7&lt;/span&gt; &lt;span class="mf"&gt;7.0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;410&lt;/span&gt; &lt;span class="n"&gt;winget&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Microsoft&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;NET&lt;/span&gt; &lt;span class="n"&gt;SDK&lt;/span&gt; &lt;span class="mf"&gt;8.0&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;DotNet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;SDK&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;8&lt;/span&gt; &lt;span class="mf"&gt;8.0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;417&lt;/span&gt; &lt;span class="n"&gt;winget&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Microsoft&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;NET&lt;/span&gt; &lt;span class="n"&gt;SDK&lt;/span&gt; &lt;span class="mf"&gt;9.0&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;DotNet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;SDK&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;9&lt;/span&gt; &lt;span class="mf"&gt;9.0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;310&lt;/span&gt; &lt;span class="n"&gt;winget&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Microsoft&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;NET&lt;/span&gt; &lt;span class="n"&gt;SDK&lt;/span&gt; &lt;span class="mf"&gt;10.0&lt;/span&gt; &lt;span class="n"&gt;Preview&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;DotNet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;SDK&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Preview&lt;/span&gt; &lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;100&lt;/span&gt;&lt;span class="n"&gt;-rc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;25502&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;107&lt;/span&gt; &lt;span class="n"&gt;winget&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;当時は.NET 10が最新だったので、それを入れた。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;winget&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;DotNet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;SDK&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;10&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;インストールが終わったら、以下のコマンドできちんとインストールされたことを確認する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;winget&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="n"&gt;DotNet&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;実行例を以下に示す。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;winget&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="n"&gt;DotNet&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;名前&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="n"&gt;バージョン&lt;/span&gt; &lt;span class="n"&gt;ソース&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;----------------------------------------------------------------------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Microsoft&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;NET&lt;/span&gt; &lt;span class="n"&gt;SDK&lt;/span&gt; &lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;102&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;DotNet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;SDK&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;10&lt;/span&gt; &lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;102&lt;/span&gt; &lt;span class="n"&gt;winget&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;.NET SDKのインストールが終わったら、PCを再起動する。&lt;/p&gt;
&lt;h3 id="2-vs-codeのインストール"&gt;
2. VS Codeのインストール&lt;a href="#2-vs-code%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;VS Codeを入れる。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://code.visualstudio.com/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/792775d76cf6b179ec7ed08d618e21b20f8ec22f_hu_c22747fcb2d0b3c3.webp"
alt="Visual Studio Code - The open source AI code editor image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Visual Studio Code - The open source AI code editor
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-fc8d5f0f3d4721b622f091af1cbeff915162b97b.png"
style="margin-right: 2px;"
alt="code.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
code.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;これも&lt;code&gt;winget&lt;/code&gt;で入れられる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;winget&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VisualStudioCode&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;インストールが終わったら、以下のコマンドできちんとインストールされたことを確認する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;winget&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="n"&gt;VisualStudioCode&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;実行例を以下に示す。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;winget&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="n"&gt;VisualStudioCode&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;名前&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="n"&gt;バージョン&lt;/span&gt; &lt;span class="n"&gt;ソース&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;--------------------------------------------------------------------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Microsoft&lt;/span&gt; &lt;span class="n"&gt;Visual&lt;/span&gt; &lt;span class="n"&gt;Studio&lt;/span&gt; &lt;span class="n"&gt;Code&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;VisualStudioCode&lt;/span&gt; &lt;span class="mf"&gt;1.108&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;1&lt;/span&gt; &lt;span class="n"&gt;winget&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;入れ終わったら再起動する。&lt;/p&gt;
&lt;h3 id="3-vs-codeに拡張機能を入れる"&gt;
3. VS Codeに拡張機能を入れる&lt;a href="#3-vs-code%e3%81%ab%e6%8b%a1%e5%bc%b5%e6%a9%9f%e8%83%bd%e3%82%92%e5%85%a5%e3%82%8c%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;VS Codeを開いて、拡張機能C# Dev Kitを入れる。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csdevkit"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/95fb8579da12ed98fef9d32f82ae3956faf5b090_hu_30831197470e0b43.webp"
alt="C# Dev Kit - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
C# Dev Kit - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Official C# extension from Microsoft&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;h3 id="4-cプロジェクトの作成と実行"&gt;
4. C#プロジェクトの作成と実行&lt;a href="#4-c%e3%83%97%e3%83%ad%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%81%ae%e4%bd%9c%e6%88%90%e3%81%a8%e5%ae%9f%e8%a1%8c"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;VS Code上で&lt;code&gt;Ctrl + Shift + P&lt;/code&gt;を押しコマンドパレットを開く。&lt;code&gt;.NET: New Project&lt;/code&gt;を選択し、表示されるテンプレートから「コンソールアプリ」を選ぶ。アプリ名などは適当。&lt;/p&gt;
&lt;p&gt;作成されたプロジェクトで&lt;code&gt;Program.cs&lt;/code&gt;を開き、&lt;code&gt;F5&lt;/code&gt;キーを押してデバッグを実行する。選択ウィンドウが表示されたら&lt;code&gt;C#&lt;/code&gt;を選ぶ。コンソールに下記のように&lt;code&gt;Hello, World!&lt;/code&gt;と出れば成功。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&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;Microsoft Visual Studio .NET/C/C++ デバッガー &lt;span class="o"&gt;(&lt;/span&gt;vsdbg&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;は、アプリケーションの開発とテストに役立つ Visual Studio
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Code、Visual Studio、または Visual Studio &lt;span class="k"&gt;for&lt;/span&gt; Mac
&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;Hello, World!
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;プログラム &lt;span class="s1"&gt;&amp;#39;[20208] Program.exe&amp;#39;&lt;/span&gt; がコード &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;0x0&lt;span class="o"&gt;)&lt;/span&gt; で終了しました。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;おわり。あとは任意にC#の開発を進める。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://hirahira.blog/cs-dev-vsc/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/7aafce2dfb9c948003ab24315c8f602ce69ef209_hu_d22ac64d7f2a09ce.webp"
alt="Visual Studio Code (VSCode) でC#開発環境を構築する image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Visual Studio Code (VSCode) でC#開発環境を構築する
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Visual Studio Codeと.NET SDKのインストール手順から、VSCodeの日本語化やC# Dev Kit（拡張機能）の導入方法、C#プロジェクトの作成、デバッグ実行までを、画像付きでわかりやすく解説します。&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-387a0dde7db33c948b07f9330a6b19e48f7d7b79.png"
style="margin-right: 2px;"
alt="hirahira.blog favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
hirahira.blog
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>pywinautoで自動化するとき、クリック前はwaitメソッドで待とう</title><link>https://notes.nakurei.com/post/pywinauto-wait-before-click/</link><pubDate>Wed, 04 Feb 2026 21:08:26 +0900</pubDate><guid>https://notes.nakurei.com/post/pywinauto-wait-before-click/</guid><description>&lt;img src="https://notes.nakurei.com/img/header/python_img.webp" alt="Featured image of post pywinautoで自動化するとき、クリック前はwaitメソッドで待とう" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/pywinauto/pywinauto" target="_blank" rel="noopener"
&gt;pywinauto&lt;/a&gt;を用いた自動化のコツのメモ。&lt;/p&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Python 3.14&lt;/li&gt;
&lt;li&gt;pywinauto 0.6.9&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="クリック前はwaitメソッドで待とう"&gt;
クリック前はwaitメソッドで待とう&lt;a href="#%e3%82%af%e3%83%aa%e3%83%83%e3%82%af%e5%89%8d%e3%81%afwait%e3%83%a1%e3%82%bd%e3%83%83%e3%83%89%e3%81%a7%e5%be%85%e3%81%a8%e3%81%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;たとえば、検索欄をクリックする場合、下記のように&lt;code&gt;wait&lt;/code&gt;メソッドで待機してからクリックしよう。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;search_box&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;enabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;search_box&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;click_input&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;wait()&lt;/code&gt;メソッドは、第一引数&lt;code&gt;wait_for&lt;/code&gt;に以下5つの値をとれる&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;&lt;code&gt;wait_for&lt;/code&gt;&lt;/th&gt;
&lt;th style="text-align: left"&gt;意味&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&amp;ldquo;exists&amp;rdquo;&lt;/td&gt;
&lt;td style="text-align: left"&gt;有効な状態&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&amp;ldquo;visible&amp;rdquo;&lt;/td&gt;
&lt;td style="text-align: left"&gt;表示されている&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&amp;ldquo;enabled&amp;rdquo;&lt;/td&gt;
&lt;td style="text-align: left"&gt;操作可能&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&amp;ldquo;ready&amp;rdquo;&lt;/td&gt;
&lt;td style="text-align: left"&gt;表示されていて、かつ有効な状態&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&amp;ldquo;active&amp;rdquo;&lt;/td&gt;
&lt;td style="text-align: left"&gt;アクティブ状態&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;よって、基本的に&lt;code&gt;&amp;quot;enabled&amp;quot;&lt;/code&gt;まで待機すればクリックできる。不安定なら&lt;code&gt;&amp;quot;ready&amp;quot;&lt;/code&gt;を使うか、&lt;code&gt;wait()&lt;/code&gt;メソッド後に&lt;code&gt;time.sleep()&lt;/code&gt;で1,2秒待機するとよい。&lt;/p&gt;
&lt;p&gt;なお、&lt;code&gt;timeout&lt;/code&gt;は必ずつけること。&lt;code&gt;timeout&lt;/code&gt;を設定しないと、何らかの問題でクリックしたい対象そのものが描画されない場合に、無限待機になってしまう。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://note.com/dapper_pony2721/n/n3b9628ac54bc"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/68ea35968c1c46570e5f5697e4dab3d5f0ad68bf_hu_7d28553d52a581d2.webp"
alt="Pywinauto：「待機」の考え方と time.sleep との使い分け｜Hiroyuki Hayashi image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Pywinauto：「待機」の考え方と time.sleep との使い分け｜Hiroyuki Hayashi
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;はじめに WindowsのGUI自動化では、「いつ操作するか」が結果の安定性を大きく左右します。 pywinauto を使い始めた直後は、time.sleep() による固定時間待機で動かすことが多いですが、処理回数が増えたり、PC 環境が変わったりすると、動作が不安定になることがあります。 この記事では、pywinauto が提供する状態に基づく待機（wait）を中心に、time.sleep() との現実的な使い分けについて整理します。 1. 固定時間待機の問題点 time.sleep(指定時間) のような固定時間待機は、次のような性質を持ちます。 処理が想定より遅い&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-f791ab80b1702b088132b15ae812f8da18242d6c.png"
style="margin-right: 2px;"
alt="note.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
note.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://github.com/pywinauto/pywinauto"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/5fbd126195efe52031e0e08d8358d919cd7ca0f5_hu_6ae9a7dab71098bc.webp"
alt="GitHub - pywinauto/pywinauto: Windows GUI Automation with Python (based on text properties) image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
GitHub - pywinauto/pywinauto: Windows GUI Automation with Python (based on text properties)
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Windows GUI Automation with Python (based on text properties) - pywinauto/pywinauto&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-ffd1aa80239afc78c1628dfb5e08cff1205f22d5.png"
style="margin-right: 2px;"
alt="github.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
github.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;参考: &lt;a class="link" href="https://pywinauto.readthedocs.io/en/latest/code/pywinauto.application.html?highlight=wait#pywinauto.application.WindowSpecification.wait" target="_blank" rel="noopener"
&gt;pywinauto公式ドキュメントのwaitのページ&lt;/a&gt;&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>systemdサービスファイルの作成方法と設定手順メモ</title><link>https://notes.nakurei.com/post/systemd-service-file-creation-and-setup/</link><pubDate>Sun, 01 Feb 2026 17:57:58 +0900</pubDate><guid>https://notes.nakurei.com/post/systemd-service-file-creation-and-setup/</guid><description>&lt;img src="https://notes.nakurei.com/img/header/console.webp" alt="Featured image of post systemdサービスファイルの作成方法と設定手順メモ" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;systemdサービスファイルの作成方法と設定手順のメモ。いつも忘れるのでメモしておくだけ。&lt;/p&gt;
&lt;h2 id="手順"&gt;
手順&lt;a href="#%e6%89%8b%e9%a0%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-systemdサービスファイルを作成する"&gt;
1. systemdサービスファイルを作成する&lt;a href="#1-systemd%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;以下のコマンドを実行して、systemdサービスファイルを作成または編集する。&lt;/p&gt;
&lt;style&gt;
:root {
--uni-warning-bg-color: #fae287;
--uni-warning-line-color: #544600;
}
:root[data-scheme='dark'] {
--uni-warning-bg-color: #544600;
--uni-warning-line-color: #fae287;
}
.block-highlight-warning {
display: flex;
align-items: center;
justify-content: first baseline;
height: 100%;
width: 100%;
padding: 1em;
margin: 1em 0;
border-left: 5px solid var(--uni-warning-line-color);
background-color: var(--uni-warning-bg-color);
border-radius: 0.5rem;
overflow: hidden;
color: var(--card-text-color-main);
line-height: 1.5;
}
.icon-warning {
display: inline-flex;
align-items: center;
vertical-align: middle;
}
.icon-warning svg {
vertical-align: baseline;
width: 1.5em;
height: 1.5em;
stroke-width: 1.5;
flex-shrink: 0;
}
&lt;/style&gt;
&lt;div class="block-highlight-warning"&gt;
&lt;span class="icon-warning"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-alert-triangle" width="44" height="44" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"&gt;
&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;
&lt;path d="M12 9v2m0 4v.01" /&gt;
&lt;path d="M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75" /&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span&gt;&lt;code&gt;your-service-name&lt;/code&gt; は任意のサービス名に置き換えること。&lt;/span&gt;
&lt;/div&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo nano /etc/systemd/system/your-service-name.service&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;するとエディタが開くので、設定を記述する。例を以下に示す。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Cronitor Dashboard&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;After&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;network.target&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="k"&gt;[Service]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;simple&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;User&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;nakurei&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/bin/cronitor dash --port 9000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;Restart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;on-failure&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="k"&gt;[Install]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;multi-user.target&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;Unit&lt;/code&gt; セクションではサービスの説明や依存関係を設定する。&lt;code&gt;After=network.target&lt;/code&gt; はネットワークが利用可能になった後でサービスを起動することを意味する。他に &lt;code&gt;Requires=&lt;/code&gt; や &lt;code&gt;Wants=&lt;/code&gt; を使えば、依存関係を詳細に設定できる。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Service&lt;/code&gt; セクションではサービスの動作方法を定義する。&lt;code&gt;User=&lt;/code&gt; はサービスを実行するユーザーを指定し、&lt;code&gt;ExecStart=&lt;/code&gt; は実行するコマンドを指定する。終了時のコマンドは &lt;code&gt;ExecStop=&lt;/code&gt; で指定できる。&lt;code&gt;Restart=&lt;/code&gt; はサービスが失敗した場合の再起動ポリシーを設定する。
&lt;code&gt;Restert=on-failure&lt;/code&gt; はサービスが異常終了した場合に再起動することを意味する。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Install&lt;/code&gt; セクションではサービスのインストールに関する設定を定義する。&lt;code&gt;WantedBy=&lt;/code&gt; はサービスがどのターゲットに関連付けられるかを指定する。&lt;code&gt;multi-user.target&lt;/code&gt; は通常のマルチユーザーモードでサービスを起動することを意味する。&lt;/p&gt;
&lt;p&gt;以上を記述したら、保存してエディタを閉じる。&lt;/p&gt;
&lt;p&gt;ちなみに、このファイルは &lt;code&gt;/etc/systemd/system/&lt;/code&gt; ディレクトリに保存される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls /etc/systemd/system/your-service-name.service&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="2-systemdサービスをリロードする"&gt;
2. systemdサービスをリロードする&lt;a href="#2-systemd%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e3%82%92%e3%83%aa%e3%83%ad%e3%83%bc%e3%83%89%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;systemdサービスファイルを作成または編集した後、以下のコマンドを実行してsystemdをリロードする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl daemon-reload&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="3-systemdサービスを有効化して起動する"&gt;
3. systemdサービスを有効化して起動する&lt;a href="#3-systemd%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e3%82%92%e6%9c%89%e5%8a%b9%e5%8c%96%e3%81%97%e3%81%a6%e8%b5%b7%e5%8b%95%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;systemdサービスファイルを新規作成した場合は、以下のコマンドを実行する。&lt;/p&gt;
&lt;style&gt;
:root {
--uni-warning-bg-color: #fae287;
--uni-warning-line-color: #544600;
}
:root[data-scheme='dark'] {
--uni-warning-bg-color: #544600;
--uni-warning-line-color: #fae287;
}
.block-highlight-warning {
display: flex;
align-items: center;
justify-content: first baseline;
height: 100%;
width: 100%;
padding: 1em;
margin: 1em 0;
border-left: 5px solid var(--uni-warning-line-color);
background-color: var(--uni-warning-bg-color);
border-radius: 0.5rem;
overflow: hidden;
color: var(--card-text-color-main);
line-height: 1.5;
}
.icon-warning {
display: inline-flex;
align-items: center;
vertical-align: middle;
}
.icon-warning svg {
vertical-align: baseline;
width: 1.5em;
height: 1.5em;
stroke-width: 1.5;
flex-shrink: 0;
}
&lt;/style&gt;
&lt;div class="block-highlight-warning"&gt;
&lt;span class="icon-warning"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-alert-triangle" width="44" height="44" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"&gt;
&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;
&lt;path d="M12 9v2m0 4v.01" /&gt;
&lt;path d="M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75" /&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span&gt;&lt;code&gt;your-service-name&lt;/code&gt; は任意のサービス名に置き換えること。&lt;/span&gt;
&lt;/div&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; your-service-name
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl start your-service-name&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;新規作成ではなく編集した場合は、以下のコマンドを実行する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl restart your-service-name&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="4-systemdサービスの状態を確認する"&gt;
4. systemdサービスの状態を確認する&lt;a href="#4-systemd%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e3%81%ae%e7%8a%b6%e6%85%8b%e3%82%92%e7%a2%ba%e8%aa%8d%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;以下のコマンドで、実行状態を確認できる。&lt;/p&gt;
&lt;style&gt;
:root {
--uni-warning-bg-color: #fae287;
--uni-warning-line-color: #544600;
}
:root[data-scheme='dark'] {
--uni-warning-bg-color: #544600;
--uni-warning-line-color: #fae287;
}
.block-highlight-warning {
display: flex;
align-items: center;
justify-content: first baseline;
height: 100%;
width: 100%;
padding: 1em;
margin: 1em 0;
border-left: 5px solid var(--uni-warning-line-color);
background-color: var(--uni-warning-bg-color);
border-radius: 0.5rem;
overflow: hidden;
color: var(--card-text-color-main);
line-height: 1.5;
}
.icon-warning {
display: inline-flex;
align-items: center;
vertical-align: middle;
}
.icon-warning svg {
vertical-align: baseline;
width: 1.5em;
height: 1.5em;
stroke-width: 1.5;
flex-shrink: 0;
}
&lt;/style&gt;
&lt;div class="block-highlight-warning"&gt;
&lt;span class="icon-warning"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-alert-triangle" width="44" height="44" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"&gt;
&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;
&lt;path d="M12 9v2m0 4v.01" /&gt;
&lt;path d="M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75" /&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span&gt;&lt;code&gt;your-service-name&lt;/code&gt; は任意のサービス名に置き換えること。&lt;/span&gt;
&lt;/div&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl status your-service-name&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;正常に起動していれば、&lt;code&gt;active (running)&lt;/code&gt; と表示される。&lt;/p&gt;
&lt;h3 id="5-systemdサービスのログを確認する"&gt;
5. systemdサービスのログを確認する&lt;a href="#5-systemd%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e3%81%ae%e3%83%ad%e3%82%b0%e3%82%92%e7%a2%ba%e8%aa%8d%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;以下のコマンドで、サービスのログを確認できる。&lt;/p&gt;
&lt;style&gt;
:root {
--uni-warning-bg-color: #fae287;
--uni-warning-line-color: #544600;
}
:root[data-scheme='dark'] {
--uni-warning-bg-color: #544600;
--uni-warning-line-color: #fae287;
}
.block-highlight-warning {
display: flex;
align-items: center;
justify-content: first baseline;
height: 100%;
width: 100%;
padding: 1em;
margin: 1em 0;
border-left: 5px solid var(--uni-warning-line-color);
background-color: var(--uni-warning-bg-color);
border-radius: 0.5rem;
overflow: hidden;
color: var(--card-text-color-main);
line-height: 1.5;
}
.icon-warning {
display: inline-flex;
align-items: center;
vertical-align: middle;
}
.icon-warning svg {
vertical-align: baseline;
width: 1.5em;
height: 1.5em;
stroke-width: 1.5;
flex-shrink: 0;
}
&lt;/style&gt;
&lt;div class="block-highlight-warning"&gt;
&lt;span class="icon-warning"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-alert-triangle" width="44" height="44" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"&gt;
&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;
&lt;path d="M12 9v2m0 4v.01" /&gt;
&lt;path d="M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75" /&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span&gt;&lt;code&gt;your-service-name&lt;/code&gt; は任意のサービス名に置き換えること。&lt;/span&gt;
&lt;/div&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo journalctl -u your-service-name -f&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;-f&lt;/code&gt; オプションを付けると、リアルタイムでログを監視できる。&lt;/p&gt;</description></item><item><title>cronによる定期実行の設定方法</title><link>https://notes.nakurei.com/post/setting-up-cron-jobs-for-scheduled-tasks/</link><pubDate>Fri, 30 Jan 2026 21:03:53 +0900</pubDate><guid>https://notes.nakurei.com/post/setting-up-cron-jobs-for-scheduled-tasks/</guid><description>&lt;img src="https://notes.nakurei.com/img/header/console.webp" alt="Featured image of post cronによる定期実行の設定方法" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;cronで定期実行する方法を毎回調べているのでメモしておくだけ。&lt;/p&gt;
&lt;h2 id="手順"&gt;
手順&lt;a href="#%e6%89%8b%e9%a0%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-スクリプトに実行権限を付与"&gt;
1. スクリプトに実行権限を付与&lt;a href="#1-%e3%82%b9%e3%82%af%e3%83%aa%e3%83%97%e3%83%88%e3%81%ab%e5%ae%9f%e8%a1%8c%e6%a8%a9%e9%99%90%e3%82%92%e4%bb%98%e4%b8%8e"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod +x /path/to/your/script.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="2-crontabを編集する"&gt;
2. crontabを編集する&lt;a href="#2-crontab%e3%82%92%e7%b7%a8%e9%9b%86%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;crontab -e&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="3-cronジョブを追加"&gt;
3. cronジョブを追加&lt;a href="#3-cron%e3%82%b8%e3%83%a7%e3%83%96%e3%82%92%e8%bf%bd%e5%8a%a0"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;cronの書式は次のようになっている。これに従いcronジョブを追加する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&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;│ │ │ │ └─ 曜日 (0-7, 0と7は日曜日)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ │ └─── 月 (1-12)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ └───── 日 (1-31)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └─────── 時 (0-23)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└───────── 分 (0-59)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;cron式のオンラインジェネレーターもある。動作タイミングを確認しやすくて便利。オススメ。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://crontab.guru/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/13f2ba342ff246721746098ad51cdb0a1ed3e07b_hu_d5f2a1285908e29a.webp"
alt="Crontab.guru - The cron schedule expression generator image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Crontab.guru - The cron schedule expression generator
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;An easy to use editor for crontab schedules.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-e8f78b4d91ec8a234f75ea1f1b82ec1f7579b8ea.png"
style="margin-right: 2px;"
alt="crontab.guru favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
crontab.guru
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;例1: 毎日午前9時に実行。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0 9 * * * /path/to/your/script.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;例2: 5分ごとに実行。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;*/5 * * * * /path/to/your/script.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;例3: 毎週月曜日の午前3時に実行。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0 3 * * 1 /path/to/your/script.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="4-設定を確認"&gt;
4. 設定を確認&lt;a href="#4-%e8%a8%ad%e5%ae%9a%e3%82%92%e7%a2%ba%e8%aa%8d"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;crontab -l&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="5-cronサービスを再起動必要に応じて"&gt;
5. cronサービスを再起動（必要に応じて）&lt;a href="#5-cron%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e3%82%92%e5%86%8d%e8%b5%b7%e5%8b%95%e5%bf%85%e8%a6%81%e3%81%ab%e5%bf%9c%e3%81%98%e3%81%a6"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo service cron restart&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="6-ログの確認"&gt;
6. ログの確認&lt;a href="#6-%e3%83%ad%e3%82%b0%e3%81%ae%e7%a2%ba%e8%aa%8d"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;cronのログは通常&lt;code&gt;/var/log/syslog&lt;/code&gt;に記録される。以下のコマンドで確認できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep CRON /var/log/syslog&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="注意点"&gt;
注意点&lt;a href="#%e6%b3%a8%e6%84%8f%e7%82%b9"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;スクリプト内で使用するパスは、必ず絶対パスで指定する&lt;/li&gt;
&lt;li&gt;cron環境は通常のシェル環境と異なるため、必要な環境変数を設定する&lt;/li&gt;
&lt;li&gt;出力をログファイルにリダイレクトすることを検討する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;出力は以下のようにすればログファイルにリダイレクトできる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0 9 * * * /path/to/your/script.sh &amp;gt;&amp;gt; /path/to/your/logfile.log 2&amp;gt;&amp;amp;1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;あるいは、以下のようにすれば出力を捨てられる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0 9 * * * /path/to/your/script.sh &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;cronの詳細な使い方については、以下のリンクを参照。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://help.ubuntu.com/community/CronHowto"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="help.ubuntu.com image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
help.ubuntu.com
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7759878eaffdf7e86943dc14503aed823b9dc023.png"
style="margin-right: 2px;"
alt="help.ubuntu.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
help.ubuntu.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>継承以外の解決策</title><link>https://notes.nakurei.com/post/inheritance-alternatives/</link><pubDate>Sat, 06 Dec 2025 00:09:31 +0900</pubDate><guid>https://notes.nakurei.com/post/inheritance-alternatives/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;プログラミングにおいて、継承を使わずいい感じに実装するための解決策のメモ。&lt;/p&gt;
&lt;h2 id="継承すべきとき"&gt;
継承すべきとき&lt;a href="#%e7%b6%99%e6%89%bf%e3%81%99%e3%81%b9%e3%81%8d%e3%81%a8%e3%81%8d"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;is-aの関係が明確で、かつその振る舞いも共通化できるとき&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="継承以外の解決策"&gt;
継承以外の解決策&lt;a href="#%e7%b6%99%e6%89%bf%e4%bb%a5%e5%a4%96%e3%81%ae%e8%a7%a3%e6%b1%ba%e7%ad%96"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="新しく別のクラス関数を作る"&gt;
新しく別のクラス/関数を作る&lt;a href="#%e6%96%b0%e3%81%97%e3%81%8f%e5%88%a5%e3%81%ae%e3%82%af%e3%83%a9%e3%82%b9%e9%96%a2%e6%95%b0%e3%82%92%e4%bd%9c%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;思想: 似ているだけで別物なら、別で作るべき
&lt;ul&gt;
&lt;li&gt;「似ている」と「同じ」は違う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;cons : 重複コードが出る
&lt;ul&gt;
&lt;li&gt;管理が大変になる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="合成するコンポジション"&gt;
合成する（コンポジション）&lt;a href="#%e5%90%88%e6%88%90%e3%81%99%e3%82%8b%e3%82%b3%e3%83%b3%e3%83%9d%e3%82%b8%e3%82%b7%e3%83%a7%e3%83%b3"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;思想: has-aの関係にする
&lt;ul&gt;
&lt;li&gt;機能を内部に取り込んで利用するイメージ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;cons: 一部だけ利用したい場合でも、すべてを合成してしまう
&lt;ul&gt;
&lt;li&gt;なぜ合成したのか、意図が不明確になってしまう&lt;/li&gt;
&lt;li&gt;メソッドやプロパティが欲しいだけの場合は向かない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;使うとき
&lt;ul&gt;
&lt;li&gt;スーパータイプのすべてを利用したいとき
&lt;ul&gt;
&lt;li&gt;e.g. 依存性注入&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;使うのは一部だが、スーパータイプの概念が欲しいとき&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="共通化"&gt;
共通化&lt;a href="#%e5%85%b1%e9%80%9a%e5%8c%96"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;思想: 共通のロジックを関数として抽出する
&lt;ul&gt;
&lt;li&gt;いわゆるDRY原則の適用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;cons: ロジックが値と分離してしまうため、知る人ぞ知るコードが増えてしまう&lt;/li&gt;
&lt;li&gt;使うとき
&lt;ul&gt;
&lt;li&gt;値のカプセル化が不要なとき
&lt;ul&gt;
&lt;li&gt;単純にロジックとして共通化できる場合はとくに有効
&lt;ul&gt;
&lt;li&gt;ロジックが独立している場合に該当&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;クラスに依存しない実装は、クラスに依存させないほうが望ましい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="再設計-最小カプセル化"&gt;
再設計: 最小カプセル化&lt;a href="#%e5%86%8d%e8%a8%ad%e8%a8%88-%e6%9c%80%e5%b0%8f%e3%82%ab%e3%83%97%e3%82%bb%e3%83%ab%e5%8c%96"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;思想: 必要な値とロジックだけを抽出して、新しいクラス/関数を作る
&lt;ul&gt;
&lt;li&gt;値とロジックを1つにカプセル化できるため、もっとも理想的な解決策&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;cons: 抽出が難しいため、実装が難しい
&lt;ul&gt;
&lt;li&gt;たいてい再設計が必要になってしまうため、工数がかかる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>uvを初めて使ったときのメモ</title><link>https://notes.nakurei.com/post/uv-first-notes/</link><pubDate>Sun, 19 Oct 2025 10:17:12 +0900</pubDate><guid>https://notes.nakurei.com/post/uv-first-notes/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;uvを初めて使ったときのメモ。&lt;/p&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Windows 11 WSL2 Ubuntu 24.04&lt;/li&gt;
&lt;li&gt;uv 0.9.4&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="導入"&gt;
導入&lt;a href="#%e5%b0%8e%e5%85%a5"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Linuxなので下記コマンドで導入した。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -LsSf https://astral.sh/uv/install.sh &lt;span class="p"&gt;|&lt;/span&gt; sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;再起動後、&lt;code&gt;uv --version&lt;/code&gt;でバージョンが表示されれば成功。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uv --version
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uv 0.9.4&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;uv自体をアップグレードしておく。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uv self update&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;シェルの自動補完を有効にしておく。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;eval &amp;#34;$(uv generate-shell-completion bash)&amp;#34;&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; ~/.bashrc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="初期化"&gt;
初期化&lt;a href="#%e5%88%9d%e6%9c%9f%e5%8c%96"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;もともと使いたいプロジェクトのディレクトリがある場合、そこに移動してuvの初期化する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; my-project&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;アプリケーションプロジェクトなら&lt;code&gt;--app&lt;/code&gt;オプション、ライブラリプロジェクトなら&lt;code&gt;--lib&lt;/code&gt;オプションをつけて初期化する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# アプリケーションプロジェクト&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uv init --app my-app
&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="c1"&gt;# ライブラリプロジェクト&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uv init --lib my-lib&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;実行すると、いくつかファイルが生成される。アプリケーションとライブラリで生成されるファイルが異なる。
どちらでも最低限の&lt;code&gt;pyproject.toml&lt;/code&gt;が生成されるのは便利。&lt;/p&gt;
&lt;h2 id="pythonのインストール"&gt;
Pythonのインストール&lt;a href="#python%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;uvでは複数のPythonバージョンをインストールできる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uv python install 3.10 3.14&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;インストールされているPythonバージョンは下記で確認できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uv python list&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;こうやってコマンドひとつでインストールできるのは便利。&lt;/p&gt;
&lt;h2 id="プロジェクトで使うpythonバージョンの設定"&gt;
プロジェクトで使うPythonバージョンの設定&lt;a href="#%e3%83%97%e3%83%ad%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%81%a7%e4%bd%bf%e3%81%86python%e3%83%90%e3%83%bc%e3%82%b8%e3%83%a7%e3%83%b3%e3%81%ae%e8%a8%ad%e5%ae%9a"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;各プロジェクトで使うPythonバージョンは下記コマンドで設定できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uv python pin 3.10&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;設定されているPythonのバージョンは、&lt;code&gt;.python-version&lt;/code&gt;ファイルに保存される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.python-version&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3.10&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;pyproject.toml&lt;/code&gt;に書かれた最低バージョンよりも低いバージョンはピン留めできないので、&lt;code&gt;pyproject.toml&lt;/code&gt;を編集してからピン留めする必要がある。&lt;/p&gt;
&lt;h2 id="仮想環境の作成"&gt;
仮想環境の作成&lt;a href="#%e4%bb%ae%e6%83%b3%e7%92%b0%e5%a2%83%e3%81%ae%e4%bd%9c%e6%88%90"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;プロジェクトの仮想環境は下記コマンドで作成できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uv venv&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;実行すると、&lt;code&gt;.venv&lt;/code&gt;ディレクトリが作成される。作成速度が爆速ですごい。&lt;/p&gt;
&lt;p&gt;仮想環境のアクティベートは下記コマンドでできる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ただし、uvは仮想環境をアクティベートせずとも、&lt;code&gt;uv run&lt;/code&gt;を使えば仮想環境内で実行できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uv run main.py&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;VS Codeの場合は、Pythonの拡張機能が&lt;code&gt;.venv&lt;/code&gt;を自動で認識してアクティベートしてくれるので、特に意識しなくても良い。&lt;/p&gt;
&lt;h2 id="パッケージのインストール"&gt;
パッケージのインストール&lt;a href="#%e3%83%91%e3%83%83%e3%82%b1%e3%83%bc%e3%82%b8%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;uvでは&lt;code&gt;uv add&lt;/code&gt;コマンドでパッケージをインストールできる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uv add numpy&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;開発でのみ使うパッケージは&lt;code&gt;--dev&lt;/code&gt;オプションをつける。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uv add --dev pytest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;アンインストールは&lt;code&gt;uv remove&lt;/code&gt;コマンド。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uv remove numpy&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="環境の更新"&gt;
環境の更新&lt;a href="#%e7%92%b0%e5%a2%83%e3%81%ae%e6%9b%b4%e6%96%b0"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;uv sync&lt;/code&gt;で、最新の状態に環境を同期できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uv sync&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これを利用すると、Pythonのバージョンを簡単に変えられる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uv python pin 3.11
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uv sync&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;パッケージ作るときとか新しいバージョンで動作を見たいときとかに便利。
&lt;code&gt;venv&lt;/code&gt;の仮想環境も自動で再作成される。この再生性の速度が爆速ですごい。&lt;/p&gt;
&lt;h2 id="自作パッケージを入れる"&gt;
自作パッケージを入れる&lt;a href="#%e8%87%aa%e4%bd%9c%e3%83%91%e3%83%83%e3%82%b1%e3%83%bc%e3%82%b8%e3%82%92%e5%85%a5%e3%82%8c%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;自作パッケージを入れたい場合は、&lt;code&gt;uv add --editable&lt;/code&gt;コマンドを使う。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uv add --dev --editable .&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;.&lt;/code&gt;はカレントディレクトリを意味する。これで自作パッケージを開発モードでインストールできる。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://github.com/astral-sh/uv?tab=readme-ov-file"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/12ada04169179b8fb1d16f3ab5f0fad0697cd0dd_hu_62bb52620514e61c.webp"
alt="GitHub - astral-sh/uv: An extremely fast Python package and project manager, written in Rust. image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
GitHub - astral-sh/uv: An extremely fast Python package and project manager, written in Rust.
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;An extremely fast Python package and project manager, written in Rust. - astral-sh/uv&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-ffd1aa80239afc78c1628dfb5e08cff1205f22d5.png"
style="margin-right: 2px;"
alt="github.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
github.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://docs.astral.sh/uv/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="uv image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
uv
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;uv is an extremely fast Python package and project manager, written in Rust.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-9b694df6b88b5eb1b5b9f0ab590bb00ace66e779.png"
style="margin-right: 2px;"
alt="docs.astral.sh favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
docs.astral.sh
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://docs.astral.sh/uv/guides/install-python/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="Installing and managing Python | uv image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Installing and managing Python | uv
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;A guide to using uv to install Python, including requesting specific versions, automatic installation, viewing installed versions, and more.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-9b694df6b88b5eb1b5b9f0ab590bb00ace66e779.png"
style="margin-right: 2px;"
alt="docs.astral.sh favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
docs.astral.sh
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>Claude Codeを初めて試すときに調べたことのメモ</title><link>https://notes.nakurei.com/post/claude-code-cli-first-notes/</link><pubDate>Mon, 13 Oct 2025 14:28:36 +0900</pubDate><guid>https://notes.nakurei.com/post/claude-code-cli-first-notes/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Claude Code CLIを初めて試したときのメモ。&lt;/p&gt;
&lt;h2 id="インストール"&gt;
インストール&lt;a href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Node.js 18以上を入れる。&lt;/p&gt;
&lt;p&gt;Claude Code CLIをインストール。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install -g @anthropic-ai/claude-code&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="開始"&gt;
開始&lt;a href="#%e9%96%8b%e5%a7%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Claude Code CLIをインタラクティブに使う（Read-Eval-Print Loop）場合は、単に&lt;code&gt;claude&lt;/code&gt;コマンドを実行。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;claude&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;単一の指示だけ実行するOne-shot modeで使う場合は、&lt;code&gt;-p&lt;/code&gt;オプションで指示を与える。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;claude -p &lt;span class="s2"&gt;&amp;#34;Write a Python function that computes the Fibonacci sequence.&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;初回利用時はOAuth認証が必要。料金請求先のアカウントを指定する。&lt;/p&gt;
&lt;p&gt;最新の会話から再開したい場合は、&lt;code&gt;-c&lt;/code&gt;オプションで再開できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;claude -c&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="claude-code自体の設定"&gt;
Claude Code自体の設定&lt;a href="#claude-code%e8%87%aa%e4%bd%93%e3%81%ae%e8%a8%ad%e5%ae%9a"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;settings.json&lt;/code&gt;でClaude Code CLI自体の設定ができる。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://docs.claude.com/ja/docs/claude-code/settings"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/a6469ac662f80f1a257b93d60ee40c6e531a1f23_hu_28d81e3b2919531e.webp"
alt="Claude Code の設定 - Claude Code Docs image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Claude Code の設定 - Claude Code Docs
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Claude Code をグローバル設定とプロジェクトレベルの設定、および環境変数で構成します。&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-84343bd8586ef9b13c6ed67be9d41dba8b38a867.png"
style="margin-right: 2px;"
alt="docs.claude.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
docs.claude.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;&lt;code&gt;~/.claude/settings.json&lt;/code&gt;だとユーザー設定、&lt;code&gt;.claude/settings.json&lt;/code&gt;だとプロジェクト固有の設定になる。
また、&lt;code&gt;.claude/settings.local.json&lt;/code&gt;だとGitなどで共有されないローカル設定になる。&lt;/p&gt;
&lt;p&gt;たとえば、下記のように設定すると処理が終わった後に音を鳴らせる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;hooks&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;Stop&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;hooks&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;mpg123 -q -f 8192 ~/workspace/data/sounds/success001.mp3&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="設定の変更"&gt;
設定の変更&lt;a href="#%e8%a8%ad%e5%ae%9a%e3%81%ae%e5%a4%89%e6%9b%b4"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Claude Code CLIの設定は&lt;code&gt;config&lt;/code&gt;コマンドで行う。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;claude config&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;インタラクティブモードで設定を変える場合は、以下のようにする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/config&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="モデルの選択"&gt;
モデルの選択&lt;a href="#%e3%83%a2%e3%83%87%e3%83%ab%e3%81%ae%e9%81%b8%e6%8a%9e"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;モデルは切り替えられる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;claude --model claude-sonnet&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;インタラクティブモードでモデルを切り替える場合は、以下のようにする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/model&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="プロジェクトの設定をする"&gt;
プロジェクトの設定をする&lt;a href="#%e3%83%97%e3%83%ad%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%81%ae%e8%a8%ad%e5%ae%9a%e3%82%92%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="設定ファイルの作成"&gt;
設定ファイルの作成&lt;a href="#%e8%a8%ad%e5%ae%9a%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e4%bd%9c%e6%88%90"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;claude&lt;/code&gt;で起動し、&lt;code&gt;/init&lt;/code&gt;コマンドを実行すると、設定ファイル&lt;code&gt;CLAUDE.md&lt;/code&gt;を作成できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;claude
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/init&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これはプロジェクトの文脈をAIに伝える役割を持つ。コーディング規約やアーキテクチャの説明などを記述できる。
プロジェクトルートにあるとそのプロジェクトのみに適用される。&lt;code&gt;~/.claude/&lt;/code&gt;にあるとグローバルに適用される。&lt;/p&gt;
&lt;h3 id="その場限りのルールを追加する"&gt;
その場限りのルールを追加する&lt;a href="#%e3%81%9d%e3%81%ae%e5%a0%b4%e9%99%90%e3%82%8a%e3%81%ae%e3%83%ab%e3%83%bc%e3%83%ab%e3%82%92%e8%bf%bd%e5%8a%a0%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;インタラクティブモードのときは、&lt;code&gt;#&lt;/code&gt;を使うとその場限りのルールを追加できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Use snake_case for variable names.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="便利な使い方"&gt;
便利な使い方&lt;a href="#%e4%be%bf%e5%88%a9%e3%81%aa%e4%bd%bf%e3%81%84%e6%96%b9"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;あるファイルだけ使う場合は、以下のようにパイプで指定すると良い。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat example.py &lt;span class="p"&gt;|&lt;/span&gt; claude -p &lt;span class="s2"&gt;&amp;#34;Explain this code.&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;指示内でファイルを指定するときは、&lt;code&gt;@&lt;/code&gt;を使う。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;claude -p &lt;span class="s2"&gt;&amp;#34;Refactor the code in @example.py to improve readability.&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;コンテキストをリセットする場合は、&lt;code&gt;/clear&lt;/code&gt;コマンドを実行したあと、&lt;code&gt;@CLAUDE.md を読んで、プロジェクトのコンテキストを復元して&lt;/code&gt;と指示する。&lt;/p&gt;
&lt;p&gt;全体として、Anthropicのベストプラクティスに従うと良い。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://www.anthropic.com/engineering/claude-code-best-practices"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/3968cdc84be113b28cf7b196c76a6ab60080454f_hu_c6ea29288fcb3825.webp"
alt="Claude Code overview - Claude Code Docs image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Claude Code overview - Claude Code Docs
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Learn about Claude Code, Anthropic's agentic coding tool that works in your terminal, IDE, desktop app, and browser to help you turn ideas into code faster than ever before.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-bfd6453142dea405034c00773c95cb1066611506.png"
style="margin-right: 2px;"
alt="www.anthropic.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
www.anthropic.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;ワークフローとしては、上記ベストプラクティスにある「探索、計画、コード、コミット」に従うと良さそう。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;関連するファイル、画像、URLを読むよう依頼する&lt;/li&gt;
&lt;li&gt;特定の問題にどのようにアプローチするかを計画してもらう。決まったら計画をドキュメントにまとめてもらうとより良い&lt;/li&gt;
&lt;li&gt;その解決策をコードで実装するよう依頼する&lt;/li&gt;
&lt;li&gt;結果をコミットしてもらい、プルリクエストを作成してもらう。必要に応じてREADMEやドキュメントも更新してもらう&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://zenn.dev/aoyamadev/articles/079e8390a03d92"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/59ca21121463f6b444bf38ad42a7fc72f1d63d95_hu_d1af69ebd84dbf2b.webp"
alt="Claude Code CLIを使いこなす！基本〜便利コマンド紹介編 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Claude Code CLIを使いこなす！基本〜便利コマンド紹介編
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-8299b9ca5170247061175f654bfc883ff1cc2440.png"
style="margin-right: 2px;"
alt="zenn.dev favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
zenn.dev
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://note.com/npaka/n/n3d754c78f439"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/32b58ea4403c5f1479dce3782e9474683f070e27_hu_12b430506451153e.webp"
alt="Claude Code の使い方｜npaka image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Claude Code の使い方｜npaka
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;「Claude Code」の使い方をまとめました。 ・Claude Code 1. Claude Code 「Claude Code」は、Anthropicが開発したエージェントコーディングツールです。ターミナルに常駐し、コードベースを理解し、自然言語コマンドを通じてより速くコーディングできます。開発環境に直接統合することで、追加のサーバや複雑なセットアップなしにワークフローを合理化します。現在は研究プレビューとして提供されてます。 主な機能は次のとおりです。 ・コードベース全体のファイルの編集とバグの修正 ・コードのアーキテクチャとロジックに関する質問に回答 ・テス&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-f791ab80b1702b088132b15ae812f8da18242d6c.png"
style="margin-right: 2px;"
alt="note.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
note.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://syu-m-5151.hatenablog.com/entry/2025/06/06/190847"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/4685806033f075ed2561ed48e9047c7d9e43a7fe_hu_1b22c889d83f005.webp"
alt="Claude Code の CLAUDE.mdは設定した方がいい - じゃあ、おうちで学べる image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Claude Code の CLAUDE.mdは設定した方がいい - じゃあ、おうちで学べる
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;[社内共有版「Claude Code、どこまでも」] はじめに Claude Codeを使い始めて1週間。私の開発スタイルは完全に変わった。 きっかけは3ヶ月前に書いた「生成AIといっしょ: 動作するきれいなコードを生成AIとつくる」という記事だった。当時はAIとの協業について考察していたが、正直なところ、まだ私が「運転席」に座っているつもりでいた。AIはあくまで「副操縦士」だと。 syu-m-5151.hatenablog.com 現実は違った。 実際にClaude Codeを使ってみて最初に感じたのは、自分の開発スタイルとAIの特性のミスマッチだった。私は根っからの「とりあえずコード書いて…&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-1f4e3210c56ed2287ae94292abe7f1baeee0cdb8.png"
style="margin-right: 2px;"
alt="syu-m-5151.hatenablog.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
syu-m-5151.hatenablog.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>Ubuntu Server 24.04 をセットアップしたときのメモ</title><link>https://notes.nakurei.com/post/how-to-setup-ubuntu-server-24-04/</link><pubDate>Sat, 20 Sep 2025 14:49:18 +0900</pubDate><guid>https://notes.nakurei.com/post/how-to-setup-ubuntu-server-24-04/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ubuntu Server 24.04をセットアップしたときのメモ。本当にただのメモ。&lt;/p&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;インストール対象PC: &lt;a class="link" href="https://www.amazon.co.jp/dp/B0C6T2T4JH?ref_=ppx_hzsearch_conn_dt_b_fed_asin_title_1" target="_blank" rel="noopener"
&gt;GMKtec ミニpc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;その辺に転がっていた16GBのUSBメモリ&lt;/li&gt;
&lt;li&gt;インストーラ作成用PC: Windows 11&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="インストーラの作成"&gt;
インストーラの作成&lt;a href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%a9%e3%81%ae%e4%bd%9c%e6%88%90"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;USBメモリにisoイメージを書き込む。&lt;/p&gt;
&lt;p&gt;フォーマットしても問題ない8GB以上のUSBメモリが必要。加えて、USBメモリに書き込むためのPCが必要。今回はWindowsマシンを用意した。&lt;/p&gt;
&lt;p&gt;まず、&lt;a class="link" href="https://ubuntu.com/download/server" target="_blank" rel="noopener"
&gt;Ubuntuの公式サイト&lt;/a&gt;からisoイメージをダウンロードする。
ダウンロードしたら、それをUSBメモリに書き込む。
Windowsで書き込みをするなら&lt;a class="link" href="https://rufus.ie/ja/" target="_blank" rel="noopener"
&gt;Rufus&lt;/a&gt;が便利。インストールしないポータブル版だと使い捨てやすい。&lt;/p&gt;
&lt;p&gt;Rufusの使い方は過去に書いた下記記事を参考にした。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="http://notes.nakurei.com/post/formatting-hdd-to-xfs-in-windows/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="WindowsでHDDなどのデバイスやストレージをXFSにフォーマットする image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
WindowsでHDDなどのデバイスやストレージをXFSにフォーマットする
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
notes.nakurei.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;Rufusを用いてUSBメモリに書き込んだら完了。&lt;/p&gt;
&lt;h2 id="biosの設定"&gt;
BIOSの設定&lt;a href="#bios%e3%81%ae%e8%a8%ad%e5%ae%9a"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;インストール対象PCのBIOSで、USBメモリから起動するように設定する。ちなみに今回のミニPCはデフォルトの設定でUSBメモリから起動できた。&lt;/p&gt;
&lt;p&gt;先ほど作成したUSBメモリと、インストール対象のPCが必要。PCはUSBメモリを挿せる必要がある。&lt;/p&gt;
&lt;p&gt;USBを指して電源を入れ、ESCキーを連打してBIOS画面に入る。
BIOS画面でUSBメモリから起動するように設定し、保存して再起動する。
これにより、Ubuntuのインストーラが起動する。&lt;/p&gt;
&lt;h2 id="ubuntu-serverのインストール"&gt;
Ubuntu Serverのインストール&lt;a href="#ubuntu-server%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;最初に言語を選択する。この時点で日本語はない。英語にした。&lt;/li&gt;
&lt;li&gt;Ubuntuのバージョンが古い場合はアップデートするか聞かれる。&lt;code&gt;Continue without updating&lt;/code&gt;を選択。&lt;/li&gt;
&lt;li&gt;キーボードのレイアウトを聞かれる。デフォルトは英語。日本語キーボードを使う場合は、&lt;code&gt;Japanese&lt;/code&gt;を選択。&lt;/li&gt;
&lt;li&gt;インストールするベースを聞かれる。&lt;code&gt;Ubuntu Server&lt;/code&gt;を選ぶ。&lt;/li&gt;
&lt;li&gt;インターネット接続を聞かれる。きちんとインターネットに接続されていることを確認する。disabledの場合は接続できていない。
&lt;ul&gt;
&lt;li&gt;当時はここで結構ハマった。Wi-Fiの場合はWPA2なら接続できる。この時点ではWPA3は対応していなかった（2敗）。有線LANなら問題ない。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Proxyの設定を聞かれる。設定が必要なら設定する。必要ないなら空欄のまま進めて問題ない。&lt;/li&gt;
&lt;li&gt;Ubuntuを取得するMirrorサイトとの接続テストが始まるので少し待つ。&lt;code&gt;This mirror location passed tests&lt;/code&gt;と表示されれば問題ない。&lt;/li&gt;
&lt;li&gt;インストール時のストレージの設定を聞かれる。
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Use an entire disk&lt;/code&gt;を選択するとクリーンインストールになる。大抵はこれで問題ない。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Set up this disk as an LVM group&lt;/code&gt;を選択するとLVMでのインストールになる。LNMのインストールにすると、パーティションの設定ができる。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Encrypt the LVM groip with LUKS&lt;/code&gt;を選択すると暗号化される。これを設定すると必ずパスフレーズを聞かれるようになる。このときは設定しなかった。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;パーティションの設定を聞かれる。こだわりがなければそのままで問題ない。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Confirm destructive action&lt;/code&gt;が表示される。ここで&lt;code&gt;Continue&lt;/code&gt;を選択すると、ディスク内のデータがすべてフォーマットされ、インストールが実行されるという警告である。&lt;code&gt;Continue&lt;/code&gt;を選択する。&lt;/li&gt;
&lt;li&gt;名前・ユーザー名・パスワードを聞かれるので設定する。ここで設定したものがAdminユーザーとなる。ユーザー名とパスワードは後で使うので控えておくこと。&lt;/li&gt;
&lt;li&gt;Ubuntu Proへのアップグレードを聞かれる。&lt;code&gt;Skip for now&lt;/code&gt;を選択する。&lt;/li&gt;
&lt;li&gt;OpenSSH serverのインストールを聞かれる。リモートからSSHで接続する場合は、&lt;code&gt;Install OpenSSH server&lt;/code&gt;を選択する。鍵は後から作成し設定した。&lt;/li&gt;
&lt;li&gt;追加でインストールするパッケージを聞かれる。後から追加できるので、特に必要なければそのまま進める。他にあらかじめインストールしておきたいパッケージがあれば、ここで選択する。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ここまで設定するとインストールがはじまる。しばらく待つ。&lt;code&gt;Installation complete!&lt;/code&gt;と表示されれば完了である。
USBを外して、&lt;code&gt;Reboot Now&lt;/code&gt;を選択する。USBを外し忘れると外すように指示されるので、USBを外して&lt;code&gt;Enter&lt;/code&gt;を押す。&lt;/p&gt;
&lt;h2 id="初回起動"&gt;
初回起動&lt;a href="#%e5%88%9d%e5%9b%9e%e8%b5%b7%e5%8b%95"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;再起動するとログインプロンプトが表示される。先ほど設定したユーザー名とパスワードでログインする。&lt;/p&gt;
&lt;p&gt;システムのアップデートを行う。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt upgrade -y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://qiita.com/Shiori-Ikezoe/items/c059d79bfe07c90abfea"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/4dae6dd8726ef86cfeb52820da0327ae5ff36823_hu_a14a49e5b5abc9ce.webp"
alt="ミニPCにUbuntu Server 24.04 LTSをインストール - Qiita image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
ミニPCにUbuntu Server 24.04 LTSをインストール - Qiita
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;1. 必要なものを準備する サーバー機: Ubuntu Server 24.04 LTSをインストールするためのデバイス。 USBメモリ: インストールメディアを作成するための8GB以上の容量が推奨される。 別のPC: インストールメディアを作成するためのデバイス...&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7dfa4a32e8b8dd3b8a6b654e1cd55932c6a19262.png"
style="margin-right: 2px;"
alt="qiita.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
qiita.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>NavidromeのサーバをDockerで構築したときの手順メモ</title><link>https://notes.nakurei.com/post/building-navidrome-server-with-docker/</link><pubDate>Sun, 07 Sep 2025 21:45:19 +0900</pubDate><guid>https://notes.nakurei.com/post/building-navidrome-server-with-docker/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="link" href="https://www.navidrome.org/" target="_blank" rel="noopener"
&gt;Navidrome&lt;/a&gt;のサーバをDockerで構築したときの手順メモ。&lt;/p&gt;
&lt;p&gt;構築した環境は以下。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://github.com/NakuRei/navidrome-music-server-on-docker"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/63122c6e53fad632ac099103e1adb17b78f97bc0_hu_19a42ef2649be056.webp"
alt="GitHub - NakuRei/navidrome-music-server-on-docker: NavidromeのサーバをDockerで構築するためのリポジトリ。 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
GitHub - NakuRei/navidrome-music-server-on-docker: NavidromeのサーバをDockerで構築するためのリポジトリ。
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;NavidromeのサーバをDockerで構築するためのリポジトリ。. Contribute to NakuRei/navidrome-music-server-on-docker development by creating an account on GitHub.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-ffd1aa80239afc78c1628dfb5e08cff1205f22d5.png"
style="margin-right: 2px;"
alt="github.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
github.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;h2 id="navidromeとは"&gt;
Navidromeとは&lt;a href="#navidrome%e3%81%a8%e3%81%af"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;NavidromeはSubsonic APIを実装した軽量な音楽サーバである。OSSであり、無料で利用できる。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://www.navidrome.org/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/e630f1204b85c1828d787132f1e31c2d162ca433_hu_2cad65f20704de5c.webp"
alt="Navidrome image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Navidrome
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7b36254c6a43b034eadad612d41f908f4ea23467.png"
style="margin-right: 2px;"
alt="www.navidrome.org favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
www.navidrome.org
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;Subsonic APIをサポートするクライアントアプリを用いれば、スマートフォンやPCから音楽をストリーミング再生できる。&lt;/p&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;OS: Ubuntu Server 22.04&lt;/li&gt;
&lt;li&gt;Docker 28.3.3&lt;/li&gt;
&lt;li&gt;Docker Compose 2.39.1&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="サーバの構築手順"&gt;
サーバの構築手順&lt;a href="#%e3%82%b5%e3%83%bc%e3%83%90%e3%81%ae%e6%a7%8b%e7%af%89%e6%89%8b%e9%a0%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;まず、作業用ディレクトリを作成する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/workspace
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir navidrome
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; navidrome&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;次に、Docker Composeの設定ファイルを作成する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nano compose.yaml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;以下の内容を記述する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;compose.yaml&lt;/div&gt;
&lt;div class="code-block-content"&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="nt"&gt;services&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;navidrome&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;navidrome&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;deluan/navidrome:latest&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;unless-stopped&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;1000&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;45335:4533&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Navidromeのポート&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;/mnt/nas_buffalo:/music:ro &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# NASをマウントした音楽フォルダ（読み取り専用）&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="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./data:/data &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;ND_SCANINTERVAL=1h &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&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="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;ND_LOGLEVEL=info&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="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;ND_SESSIONTIMEOUT=24h&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="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;ND_MUSICFOLDER=/music&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="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;ND_BASEURL=&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ports&lt;/code&gt;では、コンテナの&lt;code&gt;4533&lt;/code&gt;ポートをホストの&lt;code&gt;45335&lt;/code&gt;ポートにマッピングしている。必要に応じて変更する。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;volumes&lt;/code&gt;で、コンテナの&lt;code&gt;/music&lt;/code&gt;にホストマシンの音楽データ置き場（例だと&lt;code&gt;/mnt/nas_buffalo/music&lt;/code&gt;）をマウントしている。これは環境に応じて変更する必要がある。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;volumes&lt;/code&gt;で、&lt;code&gt;/data&lt;/code&gt;にホストマシンの&lt;code&gt;./data&lt;/code&gt;をマウントしている。設定・再生履歴・プレイリストはここに保存される。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;environment&lt;/code&gt;では、Navidromeの各種設定を環境変数で指定している。
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ND_MUSICFOLDER&lt;/code&gt;には、音楽フォルダのパスを指定する。上記の例では&lt;code&gt;/music&lt;/code&gt;を指定している。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;上記の内容で&lt;code&gt;compose.yaml&lt;/code&gt;を作成した場合は、コンテナをビルドする前に、&lt;code&gt;data&lt;/code&gt;ディレクトリを作成しておく。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir data&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;最後に、以下のコマンドでコンテナを起動する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose up -d&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ログは以下で確認できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose logs&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;起動したら、&lt;code&gt;http://&amp;lt;サーバのIP&amp;gt;:&amp;lt;ポート番号&amp;gt;&lt;/code&gt;にアクセスする。例のとおりに設定した場合は、&lt;code&gt;http://&amp;lt;サーバのIP&amp;gt;:45335&lt;/code&gt;にアクセスする。
アクセスすると、管理者ユーザーの作成画面が表示されるので、ユーザー名とパスワードを設定する。&lt;/p&gt;
&lt;style&gt;
:root {
--uni-warning-bg-color: #fae287;
--uni-warning-line-color: #544600;
}
:root[data-scheme='dark'] {
--uni-warning-bg-color: #544600;
--uni-warning-line-color: #fae287;
}
.block-highlight-warning {
display: flex;
align-items: center;
justify-content: first baseline;
height: 100%;
width: 100%;
padding: 1em;
margin: 1em 0;
border-left: 5px solid var(--uni-warning-line-color);
background-color: var(--uni-warning-bg-color);
border-radius: 0.5rem;
overflow: hidden;
color: var(--card-text-color-main);
line-height: 1.5;
}
.icon-warning {
display: inline-flex;
align-items: center;
vertical-align: middle;
}
.icon-warning svg {
vertical-align: baseline;
width: 1.5em;
height: 1.5em;
stroke-width: 1.5;
flex-shrink: 0;
}
&lt;/style&gt;
&lt;div class="block-highlight-warning"&gt;
&lt;span class="icon-warning"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-alert-triangle" width="44" height="44" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"&gt;
&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;
&lt;path d="M12 9v2m0 4v.01" /&gt;
&lt;path d="M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75" /&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span&gt;管理者ユーザーのユーザー名とパスワードは忘れないように注意する。&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;次回以降はこれでログインする。&lt;/p&gt;
&lt;h2 id="クライアントからの接続"&gt;
クライアントからの接続&lt;a href="#%e3%82%af%e3%83%a9%e3%82%a4%e3%82%a2%e3%83%b3%e3%83%88%e3%81%8b%e3%82%89%e3%81%ae%e6%8e%a5%e7%b6%9a"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;NavidromeはSubsonic APIをサポートするクライアントアプリを用いて接続できる。このときはiOSでSubStreamerというアプリを利用した。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://apps.apple.com/jp/app/substreamer/id1012991665"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/38683b61e5fdb054ce5a0e640cbc90a8b10362ee_hu_44c9298d0c5cbe6.webp"
alt="SubStreamerアプリ - App Store image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
SubStreamerアプリ - App Store
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;App Store でGaven Henryの「SubStreamer」をダウンロード。スクリーンショット、評価とレビュー、ユーザのヒント、その他「SubStreamer」みたいなゲームを見ることができます。&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-433e031e5226ec38aa93e6bbf588d2d58bc723c0.png"
style="margin-right: 2px;"
alt="apps.apple.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
apps.apple.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;アプリを起動し、サーバのURL、ユーザー名、パスワードを入力して接続する。&lt;/p&gt;
&lt;p&gt;ちなみにPCからはブラウザで&lt;code&gt;http://&amp;lt;サーバのIP&amp;gt;:&amp;lt;ポート番号&amp;gt;&lt;/code&gt;にアクセスしてつかっている。PCのアプリを使っても良かったのだが、ブラウザで十分だったので。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://zenn.dev/alice37/articles/f81e1704056c4b"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/f35480d0968d5c78a76e965b3f7e458683e4c1d5_hu_f8e9465bdac205c2.webp"
alt="Subsonic APIサーバ（Navidrome）のススメ image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Subsonic APIサーバ（Navidrome）のススメ
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-8299b9ca5170247061175f654bfc883ff1cc2440.png"
style="margin-right: 2px;"
alt="zenn.dev favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
zenn.dev
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://www.navidrome.org/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/e630f1204b85c1828d787132f1e31c2d162ca433_hu_2cad65f20704de5c.webp"
alt="Navidrome image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Navidrome
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7b36254c6a43b034eadad612d41f908f4ea23467.png"
style="margin-right: 2px;"
alt="www.navidrome.org favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
www.navidrome.org
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://github.com/NakuRei/navidrome-music-server-on-docker"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/63122c6e53fad632ac099103e1adb17b78f97bc0_hu_19a42ef2649be056.webp"
alt="GitHub - NakuRei/navidrome-music-server-on-docker: NavidromeのサーバをDockerで構築するためのリポジトリ。 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
GitHub - NakuRei/navidrome-music-server-on-docker: NavidromeのサーバをDockerで構築するためのリポジトリ。
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;NavidromeのサーバをDockerで構築するためのリポジトリ。. Contribute to NakuRei/navidrome-music-server-on-docker development by creating an account on GitHub.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-ffd1aa80239afc78c1628dfb5e08cff1205f22d5.png"
style="margin-right: 2px;"
alt="github.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
github.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>WSLのディストリビューション間でファイル/ディレクトリを移動する</title><link>https://notes.nakurei.com/post/move-directory-between-wsl-distros/</link><pubDate>Sat, 06 Sep 2025 15:32:44 +0900</pubDate><guid>https://notes.nakurei.com/post/move-directory-between-wsl-distros/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;WindowsでWSLを使っている。使っているディストリビューションがUbuntu18.04だったのだが、サポートが切れるため、Ubuntu18.04から22.04に移行する必要が出てきた。
このときに取った方法を備忘録としてメモしておく。&lt;/p&gt;
&lt;h2 id="とった手順"&gt;
とった手順&lt;a href="#%e3%81%a8%e3%81%a3%e3%81%9f%e6%89%8b%e9%a0%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="失敗"&gt;
失敗&lt;a href="#%e5%a4%b1%e6%95%97"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;最初に取った方法は、Windowsのエクスプローラーで、&lt;code&gt;\\wsl$\{ディストリビューション名}\home\{ユーザ名}&lt;/code&gt;にアクセスして、ファイルをコピーする方法だった。
この方法は結構手軽でよさそうだったのだが、コピー先の方にのみ&lt;code&gt;XXX Zone.Identifier&lt;/code&gt;という謎のファイルが各ファイルごとにできてしまい、これが邪魔だった。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;XXX Zone.Identifier&lt;/code&gt;というファイルは、ChatGPT曰く、ファイルがどのゾーン（インターネット/イントラネット/ローカル）から来たかを記録するためのもの&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;らしい。
削除しても問題ないらしいが、面倒なので別の方法を取ることにした。&lt;/p&gt;
&lt;h3 id="成功"&gt;
成功&lt;a href="#%e6%88%90%e5%8a%9f"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;移動先のディストリビューションで&lt;code&gt;ssh&lt;/code&gt;サーバを立てて、移動元のディストリビューションから&lt;code&gt;scp&lt;/code&gt;でコピーする方法を取った。
結論を言えば、この方法でうまくいった。&lt;/p&gt;
&lt;p&gt;SSHサーバは以下のコマンドでインストールして起動した。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install openssh-server
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo service ssh start&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;その後、移動元のディストリビューションで、以下のようにしてコピーした。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;scp -r /home/&lt;span class="o"&gt;{&lt;/span&gt;ユーザ名&lt;span class="o"&gt;}&lt;/span&gt;/target-dir/ &lt;span class="o"&gt;{&lt;/span&gt;ユーザ名&lt;span class="o"&gt;}&lt;/span&gt;@localhost:/home/&lt;span class="o"&gt;{&lt;/span&gt;ユーザ名&lt;span class="o"&gt;}&lt;/span&gt;/workspace/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;-r&lt;/code&gt;オプションをつけることで、ディレクトリごとコピーできる。&lt;/p&gt;
&lt;style&gt;
:root {
--uni-warning-bg-color: #fae287;
--uni-warning-line-color: #544600;
}
:root[data-scheme='dark'] {
--uni-warning-bg-color: #544600;
--uni-warning-line-color: #fae287;
}
.block-highlight-warning {
display: flex;
align-items: center;
justify-content: first baseline;
height: 100%;
width: 100%;
padding: 1em;
margin: 1em 0;
border-left: 5px solid var(--uni-warning-line-color);
background-color: var(--uni-warning-bg-color);
border-radius: 0.5rem;
overflow: hidden;
color: var(--card-text-color-main);
line-height: 1.5;
}
.icon-warning {
display: inline-flex;
align-items: center;
vertical-align: middle;
}
.icon-warning svg {
vertical-align: baseline;
width: 1.5em;
height: 1.5em;
stroke-width: 1.5;
flex-shrink: 0;
}
&lt;/style&gt;
&lt;div class="block-highlight-warning"&gt;
&lt;span class="icon-warning"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-alert-triangle" width="44" height="44" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"&gt;
&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;
&lt;path d="M12 9v2m0 4v.01" /&gt;
&lt;path d="M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75" /&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span&gt;&lt;code&gt;{ユーザ名}&lt;/code&gt;は環境のユーザ名に置き換えること。&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;これで、&lt;code&gt;target-dir&lt;/code&gt;ディレクトリを、移動先のディストリビューションへコピーできた。
コピーした後に、移動前のディストリビューションで&lt;code&gt;target-dir&lt;/code&gt;を削除すれば、移動完了である。&lt;/p&gt;
&lt;h2 id="補足"&gt;
補足&lt;a href="#%e8%a3%9c%e8%b6%b3"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ちなみに、今回はSSHサーバが移動先のディストリビューションだけで立っていたため、ポート番号を指定しなくても&lt;code&gt;localhost&lt;/code&gt;で接続できた。
複数のSSHサーバを立てている場合は、移動先のディストリビューションのSSHサーバのポート番号を調べて、&lt;code&gt;-P {ポート番号}&lt;/code&gt;オプションをつける必要があるはずである。&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Windowsの代替データストリーム（Alternate Data Stream, ADS）に関連する。本来はNTFSの隠しADSだが、WSLはLinuxなので、ゴミファイルのように見えてしまうとのこと。&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Ubuntu Serverのタイムゾーンを日本時間（JST）に変更する</title><link>https://notes.nakurei.com/post/set-ubuntu-server-timezone-to-jst/</link><pubDate>Sun, 24 Aug 2025 17:48:05 +0900</pubDate><guid>https://notes.nakurei.com/post/set-ubuntu-server-timezone-to-jst/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ubuntu Serverのタイムゾーンを日本時間（JST）に変更する方法のメモ。&lt;/p&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Ubuntu Server 24.04.3 LTS&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="設定手順"&gt;
設定手順&lt;a href="#%e8%a8%ad%e5%ae%9a%e6%89%8b%e9%a0%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;現在のタイムゾーンは以下コマンドで確認できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;timedatectl&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;出力例は以下のとおり。初期設定ではUTCになっている。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ timedatectl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Local time: Thu 2025-08-14 03:35:56 UTC
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Universal time: Thu 2025-08-14 03:35:56 UTC
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; RTC time: Thu 2025-08-14 03:35:56
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Time zone: Etc/UTC &lt;span class="o"&gt;(&lt;/span&gt;UTC, +0000&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;System clock synchronized: yes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; NTP service: active
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; RTC in &lt;span class="nb"&gt;local&lt;/span&gt; TZ: no&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;日本時間（JST）に変更するには、以下のコマンドを実行する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo timedatectl set-timezone Asia/Tokyo&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;実行した後、設定されたかを以下のコマンドで確認する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;timedatectl&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;出力例は以下のとおり。きちんと日本時間（JST）になっている。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ timedatectl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Local time: Thu 2025-08-14 12:36:07 JST
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Universal time: Thu 2025-08-14 03:36:07 UTC
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; RTC time: Thu 2025-08-14 03:36:07
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Time zone: Asia/Tokyo &lt;span class="o"&gt;(&lt;/span&gt;JST, +0900&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;System clock synchronized: yes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; NTP service: active
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; RTC in &lt;span class="nb"&gt;local&lt;/span&gt; TZ: no&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>NASをLinux(Ubuntu)にマウントする手順まとめ | fstab設定から確認まで</title><link>https://notes.nakurei.com/post/ubuntu-nas-mount-fstab/</link><pubDate>Sat, 16 Aug 2025 23:40:48 +0900</pubDate><guid>https://notes.nakurei.com/post/ubuntu-nas-mount-fstab/</guid><description>&lt;img src="https://notes.nakurei.com/img/header/console.webp" alt="Featured image of post NASをLinux(Ubuntu)にマウントする手順まとめ | fstab設定から確認まで" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ubuntu ServerでNASをマウントしたときの手順をまとめたメモ。
またやることがあると思うので残しておく。&lt;/p&gt;
&lt;h2 id="nasのマウント手順"&gt;
NASのマウント手順&lt;a href="#nas%e3%81%ae%e3%83%9e%e3%82%a6%e3%83%b3%e3%83%88%e6%89%8b%e9%a0%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-マウントポイントを作成する"&gt;
1. マウントポイントを作成する&lt;a href="#1-%e3%83%9e%e3%82%a6%e3%83%b3%e3%83%88%e3%83%9d%e3%82%a4%e3%83%b3%e3%83%88%e3%82%92%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;マウントポイント（マウント先のディレクトリ）を作成する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mkdir -p /mnt/nas_buffalo&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="2-nasのipアドレスを確認する"&gt;
2. NASのIPアドレスを確認する&lt;a href="#2-nas%e3%81%aeip%e3%82%a2%e3%83%89%e3%83%ac%e3%82%b9%e3%82%92%e7%a2%ba%e8%aa%8d%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;NASのIPアドレスを確認する。これは、NASの管理画面やルーターのDHCPクライアントリストから確認できる。&lt;/p&gt;
&lt;h3 id="3-必要なパッケージを入れる"&gt;
3. 必要なパッケージを入れる&lt;a href="#3-%e5%bf%85%e8%a6%81%e3%81%aa%e3%83%91%e3%83%83%e3%82%b1%e3%83%bc%e3%82%b8%e3%82%92%e5%85%a5%e3%82%8c%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;必要なパッケージをインストールする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install cifs-utils&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="4-マウントを設定し実行する"&gt;
4. マウントを設定し実行する&lt;a href="#4-%e3%83%9e%e3%82%a6%e3%83%b3%e3%83%88%e3%82%92%e8%a8%ad%e5%ae%9a%e3%81%97%e5%ae%9f%e8%a1%8c%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;まず、マウントするための設定を&lt;code&gt;/etc/fstab&lt;/code&gt;に追加する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo nano /etc/fstab&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;/etc/fstab&lt;/code&gt;に以下の行を追加する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;/etc/fstab&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;//&amp;lt;NASのIPアドレス&amp;gt;/path/to/mount /mnt/nas_buffalo cifs username=&amp;lt;ユーザー名&amp;gt;,password=&amp;lt;パスワード&amp;gt;,uid=1000,gid=1000,_netdev,x-systemd.automount 0 0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ここで、&lt;code&gt;&amp;lt;NASのIPアドレス&amp;gt;&lt;/code&gt;はNASのIPアドレス、&lt;code&gt;&amp;lt;ユーザー名&amp;gt;&lt;/code&gt;と&lt;code&gt;&amp;lt;パスワード&amp;gt;&lt;/code&gt;はNASにアクセスするための認証情報に置き換える。
マウントポイントのパスは、先ほど作成した&lt;code&gt;/mnt/nas_buffalo&lt;/code&gt;を使用する。
例を以下に示す。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;/etc/fstab&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;//192.168.1.2/share /mnt/nas_buffalo cifs username=guest,password=,uid=1000,gid=1000,_netdev,x-systemd.automount 0 0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;(2026/02/04追記): ネットワークの起動を待ってからマウントするために、オプションに&lt;code&gt;_netdev&lt;/code&gt;を追加することを推奨する。また、システム起動時に自動マウントするため、&lt;code&gt;x-systemd.automount&lt;/code&gt;も追加している。&lt;/p&gt;
&lt;p&gt;設定を保存してエディタを終了する。&lt;/p&gt;
&lt;p&gt;設定を反映するために、以下のコマンドを実行して&lt;code&gt;fstab&lt;/code&gt;を再読み込みする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl daemon-reload&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;その後、以下のコマンドでマウントを実行する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mount -a&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ちなみに、マウントを解除したい場合は、下記を実行すると解除できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo umount /mnt/nas_buffalo&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="5-マウントを確認する"&gt;
5. マウントを確認する&lt;a href="#5-%e3%83%9e%e3%82%a6%e3%83%b3%e3%83%88%e3%82%92%e7%a2%ba%e8%aa%8d%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;マウントが成功したか確認するために、以下のコマンドを実行する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;df -h &lt;span class="p"&gt;|&lt;/span&gt; grep nas_buffalo&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;下記のように表示されれば成功である。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;//192.168.1.2/share 3.7T 2.3T 1.4T 64% /mnt/nas_buffalo&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>iPhoneで自宅PCをリモート起動する手順 | WoLと無線LANの設定</title><link>https://notes.nakurei.com/post/wol-wifi-iphone-remote-boot/</link><pubDate>Wed, 13 Aug 2025 10:10:12 +0900</pubDate><guid>https://notes.nakurei.com/post/wol-wifi-iphone-remote-boot/</guid><description>&lt;img src="https://notes.nakurei.com/post/wol-wifi-iphone-remote-boot/20250813102500.webp" alt="Featured image of post iPhoneで自宅PCをリモート起動する手順 | WoLと無線LANの設定" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;スマートフォンから自宅PCを遠隔起動できるようにしたとき設定した手順のメモ。&lt;/p&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;接続元: iPhone 13 Pro
&lt;ul&gt;
&lt;li&gt;OS: iOS 18.5&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;自宅サーバ: &lt;a class="link" href="https://raspberry-pi.ksyic.com/main/index/pdp.id/483,497,498,549,723,552,780/pdp.open/723/" target="_blank" rel="noopener"
&gt;Raspberry Pi 4 Model B 4GB&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;OS: Raspberry Pi OS&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;接続先（起動したいPC）: デスクトップPC
&lt;ul&gt;
&lt;li&gt;OS: Windows 11 Pro&lt;/li&gt;
&lt;li&gt;マザーボード: &lt;a class="link" href="https://www.asus.com/jp/motherboards-components/motherboards/tuf-gaming/tuf-gaming-z690-plus-wifi-d4/" target="_blank" rel="noopener"
&gt;TUF GAMING Z690-PLUS WIFI D4&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Wake on LAN（WoL）に対応していることが必須&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ネットワークアダプタ: Intel(R) Wi-Fi 6 AX201 160MHz
&lt;ul&gt;
&lt;li&gt;Wake on WLAN（WoWLAN）に対応していることが必須&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="前提"&gt;
前提&lt;a href="#%e5%89%8d%e6%8f%90"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;本稿では、起動したいPCおよび自宅サーバが両方ともWi-Fi接続であることを前提とする。&lt;/p&gt;
&lt;p&gt;ただし、本稿のように無線接続の場合は、スリープ（S3）状態からの起動はできても、シャットダウン状態からの起動はできないことに留意すること。&lt;/p&gt;
&lt;p&gt;なお、自宅サーバと対象PCを有線でつなげば、シャットダウン状態からの復帰も可能になる。&lt;/p&gt;
&lt;h2 id="手順"&gt;
手順&lt;a href="#%e6%89%8b%e9%a0%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-biosでwake-on-lanを有効にする"&gt;
1. BIOSでWake on LANを有効にする&lt;a href="#1-bios%e3%81%a7wake-on-lan%e3%82%92%e6%9c%89%e5%8a%b9%e3%81%ab%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;BIOS設定でWake on LANを有効にする。&lt;/p&gt;
&lt;p&gt;BIOSの設定方法はマザーボードによって異なる。たいてい調べれば出てくる。
TUF GAMING Z690-PLUS WIFI D4の場合は、下記サイトが非常に参考となる。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://www.asus.com/jp/support/faq/1045950/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="[マザーボード] BIOSでWOL (Wake On Lan) 機能を設定する方法 | サポート 公式 | ASUS 日本 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
[マザーボード] BIOSでWOL (Wake On Lan) 機能を設定する方法 | サポート 公式 | ASUS 日本
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-32e80a4935c9100f57534644b9c73006a04a7650.png"
style="margin-right: 2px;"
alt="www.asus.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
www.asus.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;h3 id="2-ネットワークアダプタの設定でwake-on-lanを有効にする"&gt;
2. ネットワークアダプタの設定でWake on LANを有効にする&lt;a href="#2-%e3%83%8d%e3%83%83%e3%83%88%e3%83%af%e3%83%bc%e3%82%af%e3%82%a2%e3%83%80%e3%83%97%e3%82%bf%e3%81%ae%e8%a8%ad%e5%ae%9a%e3%81%a7wake-on-lan%e3%82%92%e6%9c%89%e5%8a%b9%e3%81%ab%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;起動したいPCのネットワークアダプタの設定でWake on LANを有効にする。&lt;/p&gt;
&lt;p&gt;Windowsの場合、「デバイスマネージャー」からネットワークアダプタを選択し、プロパティを開く。無線前提なので、無線LANアダプタを選択している。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/wol-wifi-iphone-remote-boot/20250813102814.png"
width="1165"
height="850"
srcset="https://notes.nakurei.com/post/wol-wifi-iphone-remote-boot/20250813102814_hu_a635ebdfcd1e1520.png 480w, https://notes.nakurei.com/post/wol-wifi-iphone-remote-boot/20250813102814_hu_7ffe2756cbaf30db.png 1024w"
loading="lazy"
alt="デバイスマネージャーのネットワークアダプタで右クリックし、プロパティを選択する"
class="gallery-image"
data-flex-grow="137"
data-flex-basis="328px"
&gt;&lt;/p&gt;
&lt;p&gt;まず、「電源の管理」タブを開き、「このデバイスでコンピューターのスタンバイを解除できるようにする」と「Magic Packetでのみスタンバイを解除できるようにする」にチェックを入れる。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/wol-wifi-iphone-remote-boot/20250813103031.png"
width="691"
height="819"
srcset="https://notes.nakurei.com/post/wol-wifi-iphone-remote-boot/20250813103031_hu_36201370143264c.png 480w, https://notes.nakurei.com/post/wol-wifi-iphone-remote-boot/20250813103031_hu_d928c70173752207.png 1024w"
loading="lazy"
alt="「このデバイスでコンピューターのスタンバイを解除できるようにする」と「Magic Packetでのみスタンバイを解除できるようにする」にチェックを入れる"
class="gallery-image"
data-flex-grow="84"
data-flex-basis="202px"
&gt;&lt;/p&gt;
&lt;p&gt;次に、「詳細設定」タブを開き、「Wake on Magic Packet」を有効にする。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/wol-wifi-iphone-remote-boot/20250813102500.png"
width="691"
height="818"
srcset="https://notes.nakurei.com/post/wol-wifi-iphone-remote-boot/20250813102500_hu_6f7779839f147839.png 480w, https://notes.nakurei.com/post/wol-wifi-iphone-remote-boot/20250813102500_hu_31421a0b9b1dd1ed.png 1024w"
loading="lazy"
alt="「Wake on Magic Packet」を有効にする"
class="gallery-image"
data-flex-grow="84"
data-flex-basis="202px"
&gt;&lt;/p&gt;
&lt;h3 id="3-高速スタートアップを無効にする"&gt;
3. 高速スタートアップを無効にする&lt;a href="#3-%e9%ab%98%e9%80%9f%e3%82%b9%e3%82%bf%e3%83%bc%e3%83%88%e3%82%a2%e3%83%83%e3%83%97%e3%82%92%e7%84%a1%e5%8a%b9%e3%81%ab%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Windowsの場合は、高速スタートアップを無効にする必要がある。
コントロールパネルの「電源オプション」から「電源ボタンの動作を選択する」を開く。
その後、「現在利用できない設定を変更します」をクリックし、「高速スタートアップを有効にする」のチェックを外す。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/wol-wifi-iphone-remote-boot/2025-08-13-103337.png"
width="1246"
height="883"
srcset="https://notes.nakurei.com/post/wol-wifi-iphone-remote-boot/2025-08-13-103337_hu_96e7e946cc855ce3.png 480w, https://notes.nakurei.com/post/wol-wifi-iphone-remote-boot/2025-08-13-103337_hu_495ebfb53d2cbdbc.png 1024w"
loading="lazy"
alt="高速スタートアップを無効にする"
class="gallery-image"
data-flex-grow="141"
data-flex-basis="338px"
&gt;&lt;/p&gt;
&lt;h3 id="4-macアドレスを確認する"&gt;
4. MACアドレスを確認する&lt;a href="#4-mac%e3%82%a2%e3%83%89%e3%83%ac%e3%82%b9%e3%82%92%e7%a2%ba%e8%aa%8d%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;起動したいPCのMACアドレスを確認する。
PowerShellを開き、以下のコマンドを実行する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;PowerShell&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ipconfig /all&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;表示される結果から、利用するネットワークアダプタの「物理アドレス」を確認する。これがMACアドレスである。&lt;/p&gt;
&lt;p&gt;ちなみに、Windowsの場合は、PowerShellを使って下記のコマンドでも確認できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;PowerShell&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Get-NetAdapter&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Where-Object&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Status&lt;/span&gt; &lt;span class="o"&gt;-eq&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Up&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Format-Table&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MacAddress&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;この場合は、利用する接続方法に表示される文字列がMACアドレスである。本稿のように無線接続を前提とする場合は、Wi-Fi接続の欄に表示される。&lt;/p&gt;
&lt;h3 id="5-自宅サーバからwake-on-lanのパケットを送信できるようにする"&gt;
5. 自宅サーバからWake on LANのパケットを送信できるようにする&lt;a href="#5-%e8%87%aa%e5%ae%85%e3%82%b5%e3%83%bc%e3%83%90%e3%81%8b%e3%82%89wake-on-lan%e3%81%ae%e3%83%91%e3%82%b1%e3%83%83%e3%83%88%e3%82%92%e9%80%81%e4%bf%a1%e3%81%a7%e3%81%8d%e3%82%8b%e3%82%88%e3%81%86%e3%81%ab%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;自宅サーバから起動したいPCにWake on LANのパケットを送信できるようにする。
まず、自宅サーバにWake on LANを送信するためのツールをインストールする。Raspberry Pi OS（Debian）では、&lt;code&gt;wakeonlan&lt;/code&gt;パッケージを使用する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;自宅サーバ&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install wakeonlan&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これを利用すると、&lt;code&gt;wakeonlan XX:XX:XX:XX:XX:XX&lt;/code&gt;（&lt;code&gt;XX:XX...&lt;/code&gt;はMACアドレス）でWoLを実行できる。&lt;/p&gt;
&lt;p&gt;なお、MACアドレスはハイフン区切りだと動かない（1敗）。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ wakeonlan XX-XX-XX-XX-XX-XX
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;XX-XX-XX-XX-XX-XX is not a hardware address and I could not resolve it as to an IP address.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;カンマ区切りにすると動く。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ wakeonlan XX:XX:XX:XX:XX:XX
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Sending magic packet to 255.255.255.255:9 with XX:XX:XX:XX:XX:XX&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
:root {
--uni-warning-bg-color: #fae287;
--uni-warning-line-color: #544600;
}
:root[data-scheme='dark'] {
--uni-warning-bg-color: #544600;
--uni-warning-line-color: #fae287;
}
.block-highlight-warning {
display: flex;
align-items: center;
justify-content: first baseline;
height: 100%;
width: 100%;
padding: 1em;
margin: 1em 0;
border-left: 5px solid var(--uni-warning-line-color);
background-color: var(--uni-warning-bg-color);
border-radius: 0.5rem;
overflow: hidden;
color: var(--card-text-color-main);
line-height: 1.5;
}
.icon-warning {
display: inline-flex;
align-items: center;
vertical-align: middle;
}
.icon-warning svg {
vertical-align: baseline;
width: 1.5em;
height: 1.5em;
stroke-width: 1.5;
flex-shrink: 0;
}
&lt;/style&gt;
&lt;div class="block-highlight-warning"&gt;
&lt;span class="icon-warning"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-alert-triangle" width="44" height="44" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"&gt;
&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;
&lt;path d="M12 9v2m0 4v.01" /&gt;
&lt;path d="M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75" /&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span&gt;&lt;code&gt;XX:XX:XX:XX:XX:XX&lt;/code&gt;の部分は、起動したいPCのMACアドレスに置き換えること。&lt;/span&gt;
&lt;/div&gt;
&lt;h3 id="6-wolを実行するスクリプトを作る"&gt;
6. WoLを実行するスクリプトを作る&lt;a href="#6-wol%e3%82%92%e5%ae%9f%e8%a1%8c%e3%81%99%e3%82%8b%e3%82%b9%e3%82%af%e3%83%aa%e3%83%97%e3%83%88%e3%82%92%e4%bd%9c%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;毎回MACアドレスを入力するのは面倒なので、スクリプトを作成する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;自宅サーバ&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nano wake_pc.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;内容は以下のとおり。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;wake_pc.sh&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wakeonlan XX:XX:XX:XX:XX:XX&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
:root {
--uni-warning-bg-color: #fae287;
--uni-warning-line-color: #544600;
}
:root[data-scheme='dark'] {
--uni-warning-bg-color: #544600;
--uni-warning-line-color: #fae287;
}
.block-highlight-warning {
display: flex;
align-items: center;
justify-content: first baseline;
height: 100%;
width: 100%;
padding: 1em;
margin: 1em 0;
border-left: 5px solid var(--uni-warning-line-color);
background-color: var(--uni-warning-bg-color);
border-radius: 0.5rem;
overflow: hidden;
color: var(--card-text-color-main);
line-height: 1.5;
}
.icon-warning {
display: inline-flex;
align-items: center;
vertical-align: middle;
}
.icon-warning svg {
vertical-align: baseline;
width: 1.5em;
height: 1.5em;
stroke-width: 1.5;
flex-shrink: 0;
}
&lt;/style&gt;
&lt;div class="block-highlight-warning"&gt;
&lt;span class="icon-warning"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-alert-triangle" width="44" height="44" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"&gt;
&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;
&lt;path d="M12 9v2m0 4v.01" /&gt;
&lt;path d="M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75" /&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span&gt;&lt;code&gt;XX:XX:XX:XX:XX:XX&lt;/code&gt;の部分は、起動したいPCのMACアドレスに置き換えること。&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;保存して、実行権限を付与する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;自宅サーバ&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod +x wake_pc.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これにより、&lt;code&gt;./wake_pc.sh&lt;/code&gt;で起動したいPCを起動できるようになる。&lt;/p&gt;
&lt;h3 id="7-スマートフォンから自宅サーバにsshで接続する"&gt;
7. スマートフォンから自宅サーバにSSHで接続する&lt;a href="#7-%e3%82%b9%e3%83%9e%e3%83%bc%e3%83%88%e3%83%95%e3%82%a9%e3%83%b3%e3%81%8b%e3%82%89%e8%87%aa%e5%ae%85%e3%82%b5%e3%83%bc%e3%83%90%e3%81%abssh%e3%81%a7%e6%8e%a5%e7%b6%9a%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;スマートフォンから自宅サーバにSSHで接続できるようにする。
この場合、自宅サーバでSSHサーバを起動しておく必要がある。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://apps.apple.com/jp/app/termius-modern-ssh-client/id549039908" target="_blank" rel="noopener"
&gt;Termius&lt;/a&gt;などのSSHクライアントをスマートフォンにインストールする。
SSH鍵をスマートフォン側で作成して、公開鍵を自宅サーバへ転送する&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;
&lt;p&gt;自宅サーバに渡した公開鍵を&lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt;に張り付ける。&lt;code&gt;authorized_keys&lt;/code&gt;ファイルがない場合は新規に作成する。
例を以下に示す。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;authorized_keys&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh-ed25519 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これでスマートフォンから自宅サーバへSSH接続できるようになる。&lt;/p&gt;
&lt;h3 id="8-スマートフォンから自宅サーバにsshで接続しpcを起動する"&gt;
8. スマートフォンから自宅サーバにSSHで接続し、PCを起動する&lt;a href="#8-%e3%82%b9%e3%83%9e%e3%83%bc%e3%83%88%e3%83%95%e3%82%a9%e3%83%b3%e3%81%8b%e3%82%89%e8%87%aa%e5%ae%85%e3%82%b5%e3%83%bc%e3%83%90%e3%81%abssh%e3%81%a7%e6%8e%a5%e7%b6%9a%e3%81%97pc%e3%82%92%e8%b5%b7%e5%8b%95%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;スマートフォンから自宅サーバにSSHで接続し、先ほど作成したスクリプトを実行する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;自宅サーバ&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./wake_pc.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;対象のPCがスリープ状態から復帰すれば成功である。&lt;/p&gt;
&lt;h3 id="9-外部から自宅サーバに接続してwolを実行する"&gt;
9. 外部から自宅サーバに接続してWoLを実行する&lt;a href="#9-%e5%a4%96%e9%83%a8%e3%81%8b%e3%82%89%e8%87%aa%e5%ae%85%e3%82%b5%e3%83%bc%e3%83%90%e3%81%ab%e6%8e%a5%e7%b6%9a%e3%81%97%e3%81%a6wol%e3%82%92%e5%ae%9f%e8%a1%8c%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;外部から自宅サーバへ接続できるようにする。Tailscaleを利用してVPNを構築するのが無料かつ簡単である。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://notes.nakurei.com/post/tailscale-free-vpn-setup/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="Tailscaleで作る無料VPNの手順とルーティング設定 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Tailscaleで作る無料VPNの手順とルーティング設定
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-1eff5ad74ed7b442dfa6826d07982b3bff45afb2.png"
style="margin-right: 2px;"
alt="notes.nakurei.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
notes.nakurei.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;cloudflare tunnelでもできる。ただしちょっと設定が必要であるため、個人的にはTailscaleをオススメする。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://zenn.dev/nakurei/articles/rdp-from-outside-to-windows-using-cloudflare"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/24b54f023c023cd74486573721bba0709aea95de_hu_390b43d9ba185322.webp"
alt="Cloudflare Tunnelを利用して外部からWindows ProマシンへRDPする image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Cloudflare Tunnelを利用して外部からWindows ProマシンへRDPする
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-8299b9ca5170247061175f654bfc883ff1cc2440.png"
style="margin-right: 2px;"
alt="zenn.dev favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
zenn.dev
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://www.asus.com/jp/support/faq/1045950/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="[マザーボード] BIOSでWOL (Wake On Lan) 機能を設定する方法 | サポート 公式 | ASUS 日本 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
[マザーボード] BIOSでWOL (Wake On Lan) 機能を設定する方法 | サポート 公式 | ASUS 日本
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-32e80a4935c9100f57534644b9c73006a04a7650.png"
style="margin-right: 2px;"
alt="www.asus.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
www.asus.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://www.fmworld.net/cs/azbyclub/qanavi/jsp/qacontents.jsp?PID=2111-3152"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/7edda4a28d0d83f91602a2b5d5e0a4630f0b1769_hu_a90b8bfadb014efe.webp"
alt="FMV Q&amp;A - [Windows 11] 高速スタートアップを無効にする方法を教えてください。 - FMVサポート image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
FMV Q&amp;A - [Windows 11] 高速スタートアップを無効にする方法を教えてください。 - FMVサポート
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;富士通パソコンFMVのQ&amp;Aをご紹介しています。&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-4d154f58043a2cf1af0e68859bac395d74122fbf.png"
style="margin-right: 2px;"
alt="www.fmworld.net favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
www.fmworld.net
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://diynetbank.com/remotely-start-pc-with-smartphone.html"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/c879ad75f943de41f32783d54df2597039deecb6_hu_9139cc23154f3cda.webp"
alt="隣の部屋にあるPCをスマホWoLで遠隔起動する方法(Wifi＋LAN) image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
隣の部屋にあるPCをスマホWoLで遠隔起動する方法(Wifi＋LAN)
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;しゃおPCをスマホで起動したいけど、できる？D君宅内なら簡単だよ。しゃおおぉ！やってみたい。やり方はよ！こんにちは、自称節約家のしゃおです。この記事では、宅内環境（ご家庭のLAN内）でスマホから家の中にあ&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-37fd9a07fecc49d25284dd170e9633ac34cbca1b.png"
style="margin-right: 2px;"
alt="diynetbank.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
diynetbank.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://appleroid.com/tips/wowlan/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/b5879f5d70079038bcfb80ff08b7ff0be367944f_hu_64d2af25c612bf24.webp"
alt="WoWLAN（Wake on Wireless LAN）で、Wi-Fi接続の自宅マシンをネットから起動 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
WoWLAN（Wake on Wireless LAN）で、Wi-Fi接続の自宅マシンをネットから起動
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;遠隔地からリモートデスクトップ操作を行おうとする際に気になる「電源をON/OFF」したいというポイント。ホストPCが有線LANでつながっている際は簡単ですが、無線LANでネット接続していると一気にハードルが上がります。対処法などをまとめました&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-685a88fe25144d7dc1946ba3157cbe240d5c61bf.jpeg"
style="margin-right: 2px;"
alt="appleroid.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
appleroid.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;公開鍵はメールで送ったり下書きの保存したりなどの方法でWindows側に転送する。&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>iPhoneからWindows 11マシンへSSH接続したときに設定したことのメモ</title><link>https://notes.nakurei.com/post/ssh-from-iphone-to-windows-11/</link><pubDate>Tue, 12 Aug 2025 15:02:12 +0900</pubDate><guid>https://notes.nakurei.com/post/ssh-from-iphone-to-windows-11/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Windows 11に対して、スマートフォン（iPhone）からSSH接続できるようにしたときの設定したことのメモ。&lt;/p&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;サーバーの環境は以下のとおり。WindowsはProでなくても問題ないはず。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows 11 Pro 24H2 (26100.4652)&lt;/li&gt;
&lt;li&gt;PowerShell 5.1.26100.4652&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;クライアントの環境は以下のとおり。AndroidでもSSHクライアントアプリを使えば同様の手順で接続できる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;iPhone 13 Pro&lt;/li&gt;
&lt;li&gt;iOS 18.5&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://apps.apple.com/jp/app/termius-modern-ssh-client/id549039908" target="_blank" rel="noopener"
&gt;TermiusのiOSアプリ&lt;/a&gt; 6.2.0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ちなみにTermiusはAndroid版もある。&lt;/p&gt;
&lt;h2 id="設定手順"&gt;
設定手順&lt;a href="#%e8%a8%ad%e5%ae%9a%e6%89%8b%e9%a0%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-sshサーバーのインストール"&gt;
1. SSHサーバーのインストール&lt;a href="#1-ssh%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;WindowsマシンにSSHサーバーをインストールする。
Windows 11では、OpenSSH Serverを標準でインストールできる。&lt;/p&gt;
&lt;p&gt;まず、PowerShellを管理者権限で開き、PowerShellのバージョンを確認する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;PowerShell&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$PSVersionTable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PSVersion&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;実行すると以下のような出力が得られる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;実行結果&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$PSVersionTable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;PSVersion&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="n"&gt;Major&lt;/span&gt; &lt;span class="n"&gt;Minor&lt;/span&gt; &lt;span class="n"&gt;Build&lt;/span&gt; &lt;span class="n"&gt;Revision&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;-----&lt;/span&gt; &lt;span class="p"&gt;-----&lt;/span&gt; &lt;span class="p"&gt;-----&lt;/span&gt; &lt;span class="p"&gt;--------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;5&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt; &lt;span class="mf"&gt;26100&lt;/span&gt; &lt;span class="mf"&gt;4652&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Majorバージョンが5以上、Minorバージョンが1以上であればOK。&lt;/p&gt;
&lt;p&gt;次に、管理者権限を確認する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;PowerShell&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;New-Object&lt;/span&gt; &lt;span class="n"&gt;Security&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Principal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;WindowsPrincipal&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="no"&gt;Security.Principal.WindowsIdentity&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;GetCurrent&lt;/span&gt;&lt;span class="p"&gt;())).&lt;/span&gt;&lt;span class="py"&gt;IsInRole&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="no"&gt;Security.Principal.WindowsBuiltInRole&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;Administrator&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;実行すると以下のような出力が得られる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;実行結果&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;New-Object&lt;/span&gt; &lt;span class="n"&gt;Security&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Principal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;WindowsPrincipal&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="no"&gt;Security.Principal.WindowsIdentity&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;GetCurrent&lt;/span&gt;&lt;span class="p"&gt;())).&lt;/span&gt;&lt;span class="py"&gt;IsInRole&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="no"&gt;Security.Principal.WindowsBuiltInRole&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;Administrator&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;True&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;True&lt;/code&gt;が返ってくればOK。&lt;code&gt;False&lt;/code&gt;の場合は、PowerShellを管理者権限で実行していないので、管理者権限で実行しなおす。&lt;/p&gt;
&lt;p&gt;続いて、OpenSSH Serverがインストールされているか確認する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;PowerShell&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Get-WindowsCapability&lt;/span&gt; &lt;span class="n"&gt;-Online&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Where-Object&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="o"&gt;-like&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;OpenSSH.Server*&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;実行すると以下のような出力が得られる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;実行結果&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Get-WindowsCapability&lt;/span&gt; &lt;span class="n"&gt;-Online&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Where-Object&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="o"&gt;-like&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;OpenSSH.Server*&amp;#39;&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="n"&gt;OpenSSH&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;~~~~&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;State&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="n"&gt;NotPresent&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;Installed&lt;/code&gt;と表示されるならインストールされている。&lt;code&gt;NotPresent&lt;/code&gt;と表示されるならインストールされていない。&lt;/p&gt;
&lt;p&gt;インストールされていない場合は、以下のコマンドでインストールする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;PowerShell&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Add-WindowsCapability&lt;/span&gt; &lt;span class="n"&gt;-Online&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="n"&gt;OpenSSH&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;~~~~&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;下図のようなダイアログが出るので、完了まで待機する。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/ssh-from-iphone-to-windows-11/20250812150746.png"
width="1049"
height="102"
srcset="https://notes.nakurei.com/post/ssh-from-iphone-to-windows-11/20250812150746_hu_ee85cfce2e7507e7.png 480w, https://notes.nakurei.com/post/ssh-from-iphone-to-windows-11/20250812150746_hu_fa379f83178784e7.png 1024w"
loading="lazy"
alt="インストール中のダイアログ"
class="gallery-image"
data-flex-grow="1028"
data-flex-basis="2468px"
&gt;&lt;/p&gt;
&lt;p&gt;インストールが完了すると以下の出力が得られる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;実行結果&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Add-WindowsCapability&lt;/span&gt; &lt;span class="n"&gt;-Online&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="n"&gt;OpenSSH&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;~~~~&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;0&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Path&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Online&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="n"&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;RestartNeeded&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="n"&gt;False&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="2-sshサーバーの起動"&gt;
2. SSHサーバーの起動&lt;a href="#2-ssh%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc%e3%81%ae%e8%b5%b7%e5%8b%95"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;OpenSSH Serverをインストールしたら、次にSSHサーバーを起動する。&lt;/p&gt;
&lt;p&gt;まず、SSHサーバーのサービスがインストールされているか確認する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;PowerShell&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Get-Service&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="n"&gt;sshd&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;実行すると以下のような出力が得られる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;実行結果&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Get-Service&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="n"&gt;sshd&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="n"&gt;Status&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="n"&gt;DisplayName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;------&lt;/span&gt; &lt;span class="p"&gt;----&lt;/span&gt; &lt;span class="p"&gt;-----------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt; &lt;span class="n"&gt;sshd&lt;/span&gt; &lt;span class="n"&gt;OpenSSH&lt;/span&gt; &lt;span class="n"&gt;SSH&lt;/span&gt; &lt;span class="n"&gt;Server&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;Stopped&lt;/code&gt;と表示されているので、SSHサーバーは停止している。
停止している場合は、以下のコマンドでSSHサーバーを起動する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;PowerShell&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Start-Service&lt;/span&gt; &lt;span class="n"&gt;sshd&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;実行しても何もログが表示されないが、サービスは起動している。もう一度、サービスの状態を確認する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;PowerShell&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Get-Service&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="n"&gt;sshd&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;以下のように、状態が&lt;code&gt;Running&lt;/code&gt;に変わっていればOK。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;実行結果&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Get-Service&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="n"&gt;sshd&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="n"&gt;Status&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="n"&gt;DisplayName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;------&lt;/span&gt; &lt;span class="p"&gt;----&lt;/span&gt; &lt;span class="p"&gt;-----------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Running&lt;/span&gt; &lt;span class="n"&gt;sshd&lt;/span&gt; &lt;span class="n"&gt;OpenSSH&lt;/span&gt; &lt;span class="n"&gt;SSH&lt;/span&gt; &lt;span class="n"&gt;Server&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="3-sshサーバーの自動起動設定"&gt;
3. SSHサーバーの自動起動設定&lt;a href="#3-ssh%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc%e3%81%ae%e8%87%aa%e5%8b%95%e8%b5%b7%e5%8b%95%e8%a8%ad%e5%ae%9a"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;今の状態では、SSHサーバーは手動で起動しなければならない。これを、OS起動時に自動で起動するように設定する。
現在の起動の設定は以下のコマンドで確認できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;PowerShell&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Get-Service&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;sshd&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;StartType&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;実行すると以下のような出力が得られる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;実行結果&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Get-Service&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;sshd&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="py"&gt;StartType&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Manual&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;Manual&lt;/code&gt;と表示されている場合、手動起動の設定になっている。
これをOS起動時に自動で起動するように設定する。以下のコマンドを実行する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;PowerShell&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Set-Service&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="n"&gt;sshd&lt;/span&gt; &lt;span class="n"&gt;-StartupType&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Automatic&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;実行しても何もログが表示されないが、設定は変更されている。もう一度設定を確認する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;PowerShell&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Get-Service&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;sshd&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;StartType&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;実行すると以下のような出力が得られるはずである。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;実行結果&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Get-Service&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;sshd&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="py"&gt;StartType&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Automatic&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;このように&lt;code&gt;Automatic&lt;/code&gt;と表示されていれば、OS起動時に自動で起動するようになった。&lt;/p&gt;
&lt;h3 id="4-ファイアウォールの設定"&gt;
4. ファイアウォールの設定&lt;a href="#4-%e3%83%95%e3%82%a1%e3%82%a4%e3%82%a2%e3%82%a6%e3%82%a9%e3%83%bc%e3%83%ab%e3%81%ae%e8%a8%ad%e5%ae%9a"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;SSHサーバーはデフォルトで22番ポートを使用する。ファイアウォールで22番ポートが開いているか確認する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;PowerShell&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Get-NetTCPConnection&lt;/span&gt; &lt;span class="n"&gt;-LocalPort&lt;/span&gt; &lt;span class="mf"&gt;22&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;実行すると以下のような出力が得られる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;実行結果&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Get-NetTCPConnection&lt;/span&gt; &lt;span class="n"&gt;-LocalPort&lt;/span&gt; &lt;span class="mf"&gt;22&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="n"&gt;LocalAddress&lt;/span&gt; &lt;span class="n"&gt;LocalPort&lt;/span&gt; &lt;span class="n"&gt;RemoteAddress&lt;/span&gt; &lt;span class="n"&gt;RemotePort&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt; &lt;span class="n"&gt;AppliedSetting&lt;/span&gt; &lt;span class="n"&gt;OwningPro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cess&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;------------&lt;/span&gt; &lt;span class="p"&gt;---------&lt;/span&gt; &lt;span class="p"&gt;-------------&lt;/span&gt; &lt;span class="p"&gt;----------&lt;/span&gt; &lt;span class="p"&gt;-----&lt;/span&gt; &lt;span class="p"&gt;--------------&lt;/span&gt; &lt;span class="p"&gt;---------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;::&lt;/span&gt; &lt;span class="mf"&gt;22&lt;/span&gt; &lt;span class="p"&gt;::&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt; &lt;span class="n"&gt;Listen&lt;/span&gt; &lt;span class="mf"&gt;40100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;0&lt;/span&gt; &lt;span class="mf"&gt;22&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;0&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt; &lt;span class="n"&gt;Listen&lt;/span&gt; &lt;span class="mf"&gt;40100&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;Listen&lt;/code&gt;と表示されれば、22番ポートは開いている。&lt;/p&gt;
&lt;h3 id="5-ssh鍵の生成と登録"&gt;
5. SSH鍵の生成と登録&lt;a href="#5-ssh%e9%8d%b5%e3%81%ae%e7%94%9f%e6%88%90%e3%81%a8%e7%99%bb%e9%8c%b2"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;スマートフォンで、SSH接続するためのSSH鍵を生成する。
筆者は&lt;a class="link" href="https://apps.apple.com/jp/app/termius-modern-ssh-client/id549039908" target="_blank" rel="noopener"
&gt;TermiusのiOSアプリ&lt;/a&gt;を使用している。鍵を生成してSSH接続するだけなら無料で使える。
鍵を生成できるなら任意のSSHクライアントで問題ない。&lt;/p&gt;
&lt;p&gt;鍵を生成したら、公開鍵をWindowsマシンに登録する。公開鍵はメールで送るなどの方法&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;でWindows側に転送する。&lt;/p&gt;
&lt;p&gt;Windowsマシンに渡した公開鍵を&lt;code&gt;C:\Users\&amp;lt;ユーザー名&amp;gt;\.ssh\authorized_keys&lt;/code&gt;に登録する。&lt;code&gt;authorized_keys&lt;/code&gt;ファイルがない場合は新規に作成する。
例を以下に示す。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;authorized_keys&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh-ed25519 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="6-ssh接続の確認"&gt;
6. SSH接続の確認&lt;a href="#6-ssh%e6%8e%a5%e7%b6%9a%e3%81%ae%e7%a2%ba%e8%aa%8d"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ここまでの設定が完了したら、SSH接続を確認する。
スマートフォンのSSHクライアントアプリから、先ほど登録した公開鍵を使用して接続する。&lt;/p&gt;
&lt;p&gt;接続先のホスト名はWindowsマシンのIPアドレス、ポートは22を指定する。ユーザー名とパスワードは、Windowsのユーザー名とパスワードを指定する。
初回のみフィンガープリント確認が求められるので、確認して接続する。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://blog.jbs.co.jp/entry/2023/11/29/085601"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/3adcba351eb8a2e874db626fe858f4c38d30164e_hu_a20f4f18418cc39e.webp"
alt="Windows環境でSSHサーバーを有効化する - JBS Tech Blog image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Windows環境でSSHサーバーを有効化する - JBS Tech Blog
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;最新のWindows環境でSSHサーバー機能を有効化する手順です。&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-57822aa3c896e0756833c7b9bdceb160c1d66ae5.png"
style="margin-right: 2px;"
alt="blog.jbs.co.jp favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
blog.jbs.co.jp
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;筆者はGmailの下書きに保存して渡している。&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Tailscaleで作る無料VPNの手順とルーティング設定</title><link>https://notes.nakurei.com/post/tailscale-free-vpn-setup/</link><pubDate>Sun, 10 Aug 2025 04:25:36 +0900</pubDate><guid>https://notes.nakurei.com/post/tailscale-free-vpn-setup/</guid><description>&lt;img src="https://notes.nakurei.com/post/tailscale-free-vpn-setup/2025-08-10-045811.png" alt="Featured image of post Tailscaleで作る無料VPNの手順とルーティング設定" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Tailscaleを利用して無料でVPNを構築する手順と、Tailscale Routerを用いたローカルネットワークへのルーティング設定方法をまとめたメモ。&lt;/p&gt;
&lt;h2 id="tailscaleとは"&gt;
Tailscaleとは&lt;a href="#tailscale%e3%81%a8%e3%81%af"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Tailscaleは、同一アカウントで認証した端末同士を、インターネット越しに安全に接続できるVPNサービスである。
&lt;strong&gt;設定はアカウント作成とクライアントのインストールだけで、非常に簡単&lt;/strong&gt;である。&lt;strong&gt;ポート開放やルーターの設定も不要&lt;/strong&gt;で、NAT越しでも接続できる。
しかも、無料で100台までの端末を接続できる。神。個人利用には十分。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://tailscale.com/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/69fb91f31a355574352e65ed868c8f3234e9ae88_hu_aafd2cbfd99372f3.webp"
alt="Tailscale | Secure Connectivity for AI, IoT &amp; Multi-Cloud image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Tailscale | Secure Connectivity for AI, IoT &amp; Multi-Cloud
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;The connectivity platform for devs, IT, and security teams. Zero Trust identity-based access that deploys in minutes and scales to every resource. Start free.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-4cdfb0511b37c8d609a0322e3c50e811af8a4dfd.png"
style="margin-right: 2px;"
alt="tailscale.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
tailscale.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;h2 id="手順"&gt;
手順&lt;a href="#%e6%89%8b%e9%a0%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;全体の流れは次のとおりである。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Tailscaleアカウントを作成する&lt;/li&gt;
&lt;li&gt;Tailscaleクライアントをインストールする&lt;/li&gt;
&lt;li&gt;必要に応じてTailscale Routerを設定する&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="tailscaleアカウントを作成する"&gt;
Tailscaleアカウントを作成する&lt;a href="#tailscale%e3%82%a2%e3%82%ab%e3%82%a6%e3%83%b3%e3%83%88%e3%82%92%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Tailscaleの公式サイトにアクセスし、アカウントを作成する。GoogleアカウントやGitHubアカウントで簡単に登録できる。
&lt;strong&gt;すべての端末で同じようにログインする必要があることを考えて、アカウントを作ると良い&lt;/strong&gt;。
筆者はGoogleアカウントで登録した。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://login.tailscale.com/start"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="Tailscale image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Tailscale
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
login.tailscale.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;Tailscaleは同一アカウントで認証した端末同士を接続するため、&lt;strong&gt;アカウントを共有する必要がある&lt;/strong&gt;。アカウントの取り扱いには注意すること。&lt;/p&gt;
&lt;h3 id="tailscaleクライアントをインストールする"&gt;
Tailscaleクライアントをインストールする&lt;a href="#tailscale%e3%82%af%e3%83%a9%e3%82%a4%e3%82%a2%e3%83%b3%e3%83%88%e3%82%92%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;接続したい/されたい端末にTailscaleクライアントをインストールする&lt;/strong&gt;。
TailscaleはWindows、macOS、Linux、iOS、Androidなど、主要なプラットフォームに対応している。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://tailscale.com/download"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/b82cfef4335d2dd4b263bec84f30e29ba9475b7b_hu_ead700582097869f.webp"
alt="Download | Tailscale image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Download | Tailscale
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Tailscale is the zero configuration VPN that doesn't go through the public internet.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-4cdfb0511b37c8d609a0322e3c50e811af8a4dfd.png"
style="margin-right: 2px;"
alt="tailscale.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
tailscale.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;たとえば、Windowsならインストーラをダウンロードして実行する。
iOSやAndroidなら、App StoreやGoogle PlayからTailscaleアプリをインストールする。&lt;/p&gt;
&lt;p&gt;クライアントをインストールしたら、Tailscaleアカウントでログインする。
Linuxの場合は、インストールした後、&lt;code&gt;sudo tailscale up&lt;/code&gt;を実行してログインする。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ログインすると、その端末がTailscaleのネットワークに自動的に追加される&lt;/strong&gt;。とても簡単だ。&lt;/p&gt;
&lt;p&gt;GUIアプリなら、アプリから接続状態を確認できる。Linuxの場合、&lt;code&gt;tailscale status&lt;/code&gt;コマンドで接続状態を確認できる。
自動で&lt;code&gt;systemctl&lt;/code&gt;による起動が有効になっているので、再起動後も自動で接続される。&lt;/p&gt;
&lt;h3 id="必要に応じてtailscale-routerを設定する"&gt;
必要に応じてTailscale Routerを設定する&lt;a href="#%e5%bf%85%e8%a6%81%e3%81%ab%e5%bf%9c%e3%81%98%e3%81%a6tailscale-router%e3%82%92%e8%a8%ad%e5%ae%9a%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Tailscale Routerを使うと、&lt;strong&gt;TailscaleクライアントをインストールできないデバイスをTailscaleネットワークに接続&lt;/strong&gt;できる。
Tailscale Routerは、Tailscaleのサブネットルーティング機能を利用して、ローカルネットワーク内のデバイスへアクセスできるようにする機能である。&lt;/p&gt;
&lt;p&gt;たとえば、筆者の環境ではBuffaloのNAS（LinkStation LS720D）を使っていて、これにはTailscaleクライアントをインストールできない。
そこで、Raspberry Piに入れたTailscaleでTailscale Routerを設定し、NASをTailscaleネットワークに接続させた。&lt;/p&gt;
&lt;p&gt;Tailscale Routerを設定するには、Tailscaleクライアントをインストールした端末で次のコマンドを実行する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo tailscale &lt;span class="nb"&gt;set&lt;/span&gt; --advertise-routes&lt;span class="o"&gt;=&lt;/span&gt;XXX.XXX.XXX.X/XX&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ここで、&lt;strong&gt;&lt;code&gt;XXX.XXX.XXX.0/24&lt;/code&gt;は、ローカルネットワークのサブネットアドレスに置き換える&lt;/strong&gt;。
たとえば、ローカルネットワークが&lt;code&gt;192.168.1.1&lt;/code&gt;のようなアドレスを持つ場合、次のコマンドを実行する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo tailscale &lt;span class="nb"&gt;set&lt;/span&gt; --advertise-routes&lt;span class="o"&gt;=&lt;/span&gt;192.168.1.0/24&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Tailscale Routerの設定コマンドを実行した後、&lt;strong&gt;Tailscaleの管理画面にアクセスして、ルーティングを有効にする必要がある&lt;/strong&gt;。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://login.tailscale.com/admin/machines"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="Tailscale image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Tailscale
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
login.tailscale.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;管理画面の「Machines」を選択すると、接続されている端末の一覧が表示される。
Tailscale Routerとして設定した端末には、&lt;code&gt;Subnets&lt;/code&gt;のラベルが付いている。
この&lt;code&gt;Subnets&lt;/code&gt;のラベルに&lt;code&gt;!&lt;/code&gt;マークが出ている場合は、ルーティングが有効になっていないことを示している。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/tailscale-free-vpn-setup/2025-08-03-205304.png"
width="244"
height="126"
srcset="https://notes.nakurei.com/post/tailscale-free-vpn-setup/2025-08-03-205304_hu_54102bde51fb9d7.png 480w, https://notes.nakurei.com/post/tailscale-free-vpn-setup/2025-08-03-205304_hu_8889832f36719054.png 1024w"
loading="lazy"
alt="Subnetsのラベルに!マークがついている"
class="gallery-image"
data-flex-grow="193"
data-flex-basis="464px"
&gt;&lt;/p&gt;
&lt;p&gt;その場合は、Tailscale Routerとして設定した端末を選択し、右上の「&amp;hellip;」メニューから「Edit route settings&amp;hellip;」を選択する。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/tailscale-free-vpn-setup/2025-08-03-205018.png"
width="262"
height="280"
srcset="https://notes.nakurei.com/post/tailscale-free-vpn-setup/2025-08-03-205018_hu_d2fbb615cc82a5b3.png 480w, https://notes.nakurei.com/post/tailscale-free-vpn-setup/2025-08-03-205018_hu_d7f6ee7a66bc234e.png 1024w"
loading="lazy"
alt="Edit route settings…を選択"
class="gallery-image"
data-flex-grow="93"
data-flex-basis="224px"
&gt;&lt;/p&gt;
&lt;p&gt;すると、ルーティング設定の画面が表示される。この画面で「Subnet routes」のチェックボックスにチェックを入れる。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/tailscale-free-vpn-setup/2025-08-10-045811.png"
width="751"
height="676"
srcset="https://notes.nakurei.com/post/tailscale-free-vpn-setup/2025-08-10-045811_hu_f5c76e4ad9bd6cf6.png 480w, https://notes.nakurei.com/post/tailscale-free-vpn-setup/2025-08-10-045811_hu_136f70a97bfb074d.png 1024w"
loading="lazy"
alt="Subnet routesのチェックボックスにチェックを入れる"
class="gallery-image"
data-flex-grow="111"
data-flex-basis="266px"
&gt;&lt;/p&gt;
&lt;p&gt;これで設定は完了である。Tailscale Routerを設定した端末が起動していて、かつネットワークアドレスが間違っていなければ、Tailscaleネットワークからローカルネットワークのデバイスへアクセスできる。&lt;/p&gt;
&lt;p&gt;ちなみに、サブネットルーターとしているデバイスは、下記を参照して&lt;strong&gt;接続の再認証を無効にしておく&lt;/strong&gt;と良い。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://tailscale.com/kb/1028/key-expiry"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/2c62e3056d0f64b4d9c45bdf4d34b891446742e8_hu_aafd2cbfd99372f3.webp"
alt="Key expiry · Tailscale Docs image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Key expiry · Tailscale Docs
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Prevent unnecessary re-authentication when you disable key expiry. Avoid disruptions in network connectivity and still keep your Tailscale network secure.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-4cdfb0511b37c8d609a0322e3c50e811af8a4dfd.png"
style="margin-right: 2px;"
alt="tailscale.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
tailscale.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://tailscale.com/kb/1019/subnets"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/2c62e3056d0f64b4d9c45bdf4d34b891446742e8_hu_aafd2cbfd99372f3.webp"
alt="Subnet routers · Tailscale Docs image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Subnet routers · Tailscale Docs
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Use subnet routers to give devices outside your local network access to services within specific subnets. Extend your private network with Tailscale.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-4cdfb0511b37c8d609a0322e3c50e811af8a4dfd.png"
style="margin-right: 2px;"
alt="tailscale.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
tailscale.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://tailscale.com/kb/1028/key-expiry"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/2c62e3056d0f64b4d9c45bdf4d34b891446742e8_hu_aafd2cbfd99372f3.webp"
alt="Key expiry · Tailscale Docs image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Key expiry · Tailscale Docs
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Prevent unnecessary re-authentication when you disable key expiry. Avoid disruptions in network connectivity and still keep your Tailscale network secure.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-4cdfb0511b37c8d609a0322e3c50e811af8a4dfd.png"
style="margin-right: 2px;"
alt="tailscale.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
tailscale.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>Pythonスクリプトが例外で落ちた瞬間に対話デバッガを起動する</title><link>https://notes.nakurei.com/post/python-exception-auto-debug/</link><pubDate>Sun, 03 Aug 2025 22:11:27 +0900</pubDate><guid>https://notes.nakurei.com/post/python-exception-auto-debug/</guid><description>&lt;img src="https://notes.nakurei.com/img/header/python_img.webp" alt="Featured image of post Pythonスクリプトが例外で落ちた瞬間に対話デバッガを起動する" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="link" href="https://www.oreilly.co.jp/books/9784873119175/" target="_blank" rel="noopener"
&gt;Effective Python 第2版&lt;/a&gt;の項目80で紹介されている&lt;code&gt;pdb&lt;/code&gt;を使った方法が便利という話。&lt;/p&gt;
&lt;h2 id="コマンド"&gt;
コマンド&lt;a href="#%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;実行時に例外が発生するPythonスクリプトをデバッグする際に、下記のコマンドで実行すると、例外が発生した瞬間に自動で対話デバッガが起動する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python -m pdb -c &lt;span class="k"&gt;continue&lt;/span&gt; your_script.py&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;自動でデバッガが起動してくれるので、実行時にそのままバグの原因を調査できてとても便利。&lt;/p&gt;
&lt;p&gt;ちなみに、例外の発生するところがわかっているなら、組み込み関数の&lt;code&gt;breakpoint()&lt;/code&gt;を使うほうが簡単。&lt;/p&gt;
&lt;h2 id="エイリアス"&gt;
エイリアス&lt;a href="#%e3%82%a8%e3%82%a4%e3%83%aa%e3%82%a2%e3%82%b9"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;毎回コマンドを打つのは面倒なので、エイリアスを設定しておくと便利。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="nv"&gt;pydbg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;python -m pdb -c continue&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これで、&lt;code&gt;pydbg your_script.py&lt;/code&gt;と打つだけで、例外が発生した瞬間にデバッガが起動する。&lt;/p&gt;
&lt;p&gt;ファイル名補完も効くようにすると便利。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;complete&lt;/span&gt; -o default -o nospace -F _filedir pydbg&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これらを&lt;code&gt;~/.bashrc&lt;/code&gt;などに追加して、&lt;code&gt;source ~/.bashrc&lt;/code&gt;で反映させると、いつでも簡単にデバッグができるようになる。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://www.oreilly.co.jp/books/9784873119175/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="Effective Python 第2版 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Effective Python 第2版
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-72643c6404932233884fa590ffbad10ed5c4b878.png"
style="margin-right: 2px;"
alt="www.oreilly.co.jp favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
www.oreilly.co.jp
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>使わなくなったCloudflare Tunnelを廃止しWindowsからアンインストールしたときのメモ</title><link>https://notes.nakurei.com/post/uninstall-cloudflare-tunnel-from-windows/</link><pubDate>Sun, 03 Aug 2025 16:24:25 +0900</pubDate><guid>https://notes.nakurei.com/post/uninstall-cloudflare-tunnel-from-windows/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Cloudflare Tunnelを廃止してWindowsからアンインストールしたときに取った手順のメモ。&lt;/p&gt;
&lt;h2 id="手順"&gt;
手順&lt;a href="#%e6%89%8b%e9%a0%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;まず、cloudflare tunnelのサービスをアンインストールする。管理者権限でPowerShellを開き、以下のコマンドを実行する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cloudflared&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;uninstall&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;正常にアンインストールされれば、Cloudflare Tunnelの状態がHEALTHYからDOWNに変わる。&lt;/p&gt;
&lt;p&gt;次に、cloudflared自体を削除する。wingetを使っている場合は、以下のコマンドで削除できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;winget&lt;/span&gt; &lt;span class="n"&gt;uninstall&lt;/span&gt; &lt;span class="n"&gt;cloudflared&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;最後に、Cloudflare Tunnelの設定をWebから削除する。Cloudflareのダッシュボードにアクセスし、該当するトンネルを削除する。&lt;/p&gt;</description></item><item><title>GitHubで先に作成したリポジトリとローカルプロジェクトを同期する</title><link>https://notes.nakurei.com/post/sync-local-project-to-remote-with-license/</link><pubDate>Mon, 21 Jul 2025 21:07:09 +0900</pubDate><guid>https://notes.nakurei.com/post/sync-local-project-to-remote-with-license/</guid><description>&lt;img src="https://notes.nakurei.com/icons/brand-github.svg" alt="Featured image of post GitHubで先に作成したリポジトリとローカルプロジェクトを同期する" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ローカルでプロジェクトを作成したものの、ライセンスファイルはGitHubで作成したものを使いたいとなったときに、どうやって同期すればいいのか調べたときのメモ。&lt;/p&gt;
&lt;h2 id="前提"&gt;
前提&lt;a href="#%e5%89%8d%e6%8f%90"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ローカルにGitHubへ上げたいプロジェクトがある&lt;/li&gt;
&lt;li&gt;ローカルのプロジェクトではGitの初期化はしていない、あるいは初期化しているがコミットはしていない&lt;/li&gt;
&lt;li&gt;GitHub上にリポジトリを作成し、ライセンスファイルを追加している&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="手順"&gt;
手順&lt;a href="#%e6%89%8b%e9%a0%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;ローカルでGitの初期化をしていない場合は、初期化する&lt;/li&gt;
&lt;/ol&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git init&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol start="2"&gt;
&lt;li&gt;リモートリポジトリをローカルに追加する&lt;/li&gt;
&lt;/ol&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git remote add origin https://github.com/ユーザー名/リポジトリ名.git&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol start="3"&gt;
&lt;li&gt;リモートリポジトリの内容をローカルに取り込む（同期）&lt;/li&gt;
&lt;/ol&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git pull origin main --allow-unrelated-histories&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;--allow-unrelated-histories&lt;/code&gt;があると、異なる履歴を持つリポジトリ同士をマージできる。&lt;/p&gt;
&lt;style&gt;
:root {
--uni-warning-bg-color: #fae287;
--uni-warning-line-color: #544600;
}
:root[data-scheme='dark'] {
--uni-warning-bg-color: #544600;
--uni-warning-line-color: #fae287;
}
.block-highlight-warning {
display: flex;
align-items: center;
justify-content: first baseline;
height: 100%;
width: 100%;
padding: 1em;
margin: 1em 0;
border-left: 5px solid var(--uni-warning-line-color);
background-color: var(--uni-warning-bg-color);
border-radius: 0.5rem;
overflow: hidden;
color: var(--card-text-color-main);
line-height: 1.5;
}
.icon-warning {
display: inline-flex;
align-items: center;
vertical-align: middle;
}
.icon-warning svg {
vertical-align: baseline;
width: 1.5em;
height: 1.5em;
stroke-width: 1.5;
flex-shrink: 0;
}
&lt;/style&gt;
&lt;div class="block-highlight-warning"&gt;
&lt;span class="icon-warning"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-alert-triangle" width="44" height="44" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"&gt;
&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;
&lt;path d="M12 9v2m0 4v.01" /&gt;
&lt;path d="M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75" /&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span&gt;&lt;code&gt;git pull&lt;/code&gt;でコンフリクトが発生する場合は、手動で解決する必要がある。&lt;/span&gt;
&lt;/div&gt;
&lt;ol start="4"&gt;
&lt;li&gt;通常通りに運用する&lt;/li&gt;
&lt;/ol&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git add .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git commit -m &lt;span class="s2"&gt;&amp;#34;test&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git push -u origin main&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>compose.yamlにversionはもういらない</title><link>https://notes.nakurei.com/post/docker-compose-no-version/</link><pubDate>Sun, 20 Jul 2025 01:10:48 +0900</pubDate><guid>https://notes.nakurei.com/post/docker-compose-no-version/</guid><description>&lt;img src="https://notes.nakurei.com/icons/brand-docker.svg" alt="Featured image of post compose.yamlにversionはもういらない" /&gt;&lt;h2 id="メモ"&gt;
メモ&lt;a href="#%e3%83%a1%e3%83%a2"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ChatGPTなどで&lt;code&gt;compose.yaml&lt;/code&gt;の例を生成してもらうと、たいてい&lt;code&gt;version&lt;/code&gt;が書かれている。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;compose.yaml&lt;/div&gt;
&lt;div class="code-block-content"&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="nt"&gt;version&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;3.8&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;services&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;myapp&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;しかし、Docker compose v2.0以降では、&lt;code&gt;version&lt;/code&gt;は不要になった。そのため下記の書き方で良い。なんなら&lt;code&gt;version&lt;/code&gt;を指定しているとそれは非推奨である旨が表示される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;compose.yaml&lt;/div&gt;
&lt;div class="code-block-content"&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="nt"&gt;services&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;myapp&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;つまり、生成してもらった&lt;code&gt;compose.yaml&lt;/code&gt;に&lt;code&gt;version&lt;/code&gt;が書かれている場合は、削除しておくと良い。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://zenn.dev/harpseal/articles/8dc2602ffe3365"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/34840d671d05f2defea89b2ea68c55d1ba03f705_hu_ab101fefe9ddaa46.webp"
alt="【docker compose】警告`version` is obsoleteの解決法 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
【docker compose】警告`version` is obsoleteの解決法
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-8299b9ca5170247061175f654bfc883ff1cc2440.png"
style="margin-right: 2px;"
alt="zenn.dev favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
zenn.dev
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>Windows 11をメンテナンスするときにやることメモ</title><link>https://notes.nakurei.com/post/maintain-windows-11/</link><pubDate>Sat, 05 Jul 2025 20:22:27 +0900</pubDate><guid>https://notes.nakurei.com/post/maintain-windows-11/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Windows 11をメンテナンスするときにやることのメモ。&lt;/p&gt;
&lt;h2 id="1-dismを実行する"&gt;
1. DISMを実行する&lt;a href="#1-dism%e3%82%92%e5%ae%9f%e8%a1%8c%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;DISM（Deployment Image Servicing and Management）ツールを使用して、Windowsイメージのメンテナンスと修復をする。&lt;/p&gt;
&lt;p&gt;PowerShellを管理者権限で実行し、以下のコマンドを入力する。&lt;/p&gt;
&lt;style&gt;
:root {
--uni-warning-bg-color: #fae287;
--uni-warning-line-color: #544600;
}
:root[data-scheme='dark'] {
--uni-warning-bg-color: #544600;
--uni-warning-line-color: #fae287;
}
.block-highlight-warning {
display: flex;
align-items: center;
justify-content: first baseline;
height: 100%;
width: 100%;
padding: 1em;
margin: 1em 0;
border-left: 5px solid var(--uni-warning-line-color);
background-color: var(--uni-warning-bg-color);
border-radius: 0.5rem;
overflow: hidden;
color: var(--card-text-color-main);
line-height: 1.5;
}
.icon-warning {
display: inline-flex;
align-items: center;
vertical-align: middle;
}
.icon-warning svg {
vertical-align: baseline;
width: 1.5em;
height: 1.5em;
stroke-width: 1.5;
flex-shrink: 0;
}
&lt;/style&gt;
&lt;div class="block-highlight-warning"&gt;
&lt;span class="icon-warning"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-alert-triangle" width="44" height="44" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"&gt;
&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;
&lt;path d="M12 9v2m0 4v.01" /&gt;
&lt;path d="M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75" /&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span&gt;実行完了までに数分かかる。&lt;/span&gt;
&lt;/div&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;DISM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;exe&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Online&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;Cleanup-image&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Restorehealth&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="2-sfcを実行する"&gt;
2. SFCを実行する&lt;a href="#2-sfc%e3%82%92%e5%ae%9f%e8%a1%8c%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;SFC（System File Checker）ツールを使用して、システムファイルの整合性をチェックし、必要に応じて修復する。&lt;/p&gt;
&lt;p&gt;PowerShellを管理者権限で実行し、以下のコマンドを入力する。&lt;/p&gt;
&lt;style&gt;
:root {
--uni-warning-bg-color: #fae287;
--uni-warning-line-color: #544600;
}
:root[data-scheme='dark'] {
--uni-warning-bg-color: #544600;
--uni-warning-line-color: #fae287;
}
.block-highlight-warning {
display: flex;
align-items: center;
justify-content: first baseline;
height: 100%;
width: 100%;
padding: 1em;
margin: 1em 0;
border-left: 5px solid var(--uni-warning-line-color);
background-color: var(--uni-warning-bg-color);
border-radius: 0.5rem;
overflow: hidden;
color: var(--card-text-color-main);
line-height: 1.5;
}
.icon-warning {
display: inline-flex;
align-items: center;
vertical-align: middle;
}
.icon-warning svg {
vertical-align: baseline;
width: 1.5em;
height: 1.5em;
stroke-width: 1.5;
flex-shrink: 0;
}
&lt;/style&gt;
&lt;div class="block-highlight-warning"&gt;
&lt;span class="icon-warning"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-alert-triangle" width="44" height="44" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"&gt;
&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;
&lt;path d="M12 9v2m0 4v.01" /&gt;
&lt;path d="M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75" /&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span&gt;実行完了までに数分かかる。&lt;/span&gt;
&lt;/div&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sfc&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;scannow&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="3-windows-updateを実行する"&gt;
3. Windows Updateを実行する&lt;a href="#3-windows-update%e3%82%92%e5%ae%9f%e8%a1%8c%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Windows Updateを実行して、最新のセキュリティパッチや更新プログラムを適用する。&lt;/p&gt;
&lt;p&gt;設定から「Windows Update」を選択し、「更新プログラムのチェック」をクリックする。&lt;/p&gt;
&lt;h2 id="4-不要な一時ファイルを削除する"&gt;
4. 不要な一時ファイルを削除する&lt;a href="#4-%e4%b8%8d%e8%a6%81%e3%81%aa%e4%b8%80%e6%99%82%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92%e5%89%8a%e9%99%a4%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;不要な一時ファイルを削除して、ディスクスペースを確保する。&lt;/p&gt;
&lt;p&gt;設定を開き、「システム」から「ストレージ」を選択し、「一時ファイル」から不要な一時ファイルを削除する。&lt;/p&gt;
&lt;h2 id="5-ドライブを最適化する"&gt;
5. ドライブを最適化する&lt;a href="#5-%e3%83%89%e3%83%a9%e3%82%a4%e3%83%96%e3%82%92%e6%9c%80%e9%81%a9%e5%8c%96%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ドライブを最適化し、ハードディスクやSSDのパフォーマンスを向上させる。&lt;/p&gt;
&lt;p&gt;設定アプリを開き、「システム」から「ストレージ」を選択し、「ストレージの詳細設定」にある「ドライブの最適化」をクリックする。&lt;/p&gt;
&lt;h2 id="6-chkdskを実行する"&gt;
6. chkdskを実行する&lt;a href="#6-chkdsk%e3%82%92%e5%ae%9f%e8%a1%8c%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;chkdsk（Check Disk）ツールを使用して、ディスクのエラーをチェックし、修復する。&lt;/p&gt;
&lt;p&gt;PowerShellを管理者権限で実行し、以下のコマンドを入力する。&lt;/p&gt;
&lt;style&gt;
:root {
--uni-warning-bg-color: #fae287;
--uni-warning-line-color: #544600;
}
:root[data-scheme='dark'] {
--uni-warning-bg-color: #544600;
--uni-warning-line-color: #fae287;
}
.block-highlight-warning {
display: flex;
align-items: center;
justify-content: first baseline;
height: 100%;
width: 100%;
padding: 1em;
margin: 1em 0;
border-left: 5px solid var(--uni-warning-line-color);
background-color: var(--uni-warning-bg-color);
border-radius: 0.5rem;
overflow: hidden;
color: var(--card-text-color-main);
line-height: 1.5;
}
.icon-warning {
display: inline-flex;
align-items: center;
vertical-align: middle;
}
.icon-warning svg {
vertical-align: baseline;
width: 1.5em;
height: 1.5em;
stroke-width: 1.5;
flex-shrink: 0;
}
&lt;/style&gt;
&lt;div class="block-highlight-warning"&gt;
&lt;span class="icon-warning"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-alert-triangle" width="44" height="44" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"&gt;
&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;
&lt;path d="M12 9v2m0 4v.01" /&gt;
&lt;path d="M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75" /&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span&gt;chkdskは再起動後に実行されるため、実行後にPCを再起動する必要がある。&lt;/span&gt;
&lt;/div&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;chkdsk&lt;/span&gt; &lt;span class="n"&gt;C:&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これにより、Cドライブのエラーがチェックされる。&lt;/p&gt;
&lt;p&gt;2回目以降は修復する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;chkdsk&lt;/span&gt; &lt;span class="n"&gt;C:&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://support.microsoft.com/ja-jp/topic/%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB-%E3%83%81%E3%82%A7%E3%83%83%E3%82%AB%E3%83%BC-%E3%83%84%E3%83%BC%E3%83%AB%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E4%B8%8D%E8%B6%B3%E3%81%BE%E3%81%9F%E3%81%AF%E7%A0%B4%E6%90%8D%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%BF%AE%E5%BE%A9%E3%81%99%E3%82%8B-79aa86cb-ca52-166a-92a3-966e85d4094e"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="&amp;amp;#x30B7;&amp;amp;#x30B9;&amp;amp;#x30C6;&amp;amp;#x30E0; &amp;amp;#x30D5;&amp;amp;#x30A1;&amp;amp;#x30A4;&amp;amp;#x30EB; &amp;amp;#x30C1;&amp;amp;#x30A7;&amp;amp;#x30C3;&amp;amp;#x30AB;&amp;amp;#x30FC; &amp;amp;#x30C4;&amp;amp;#x30FC;&amp;amp;#x30EB;&amp;amp;#x3092;&amp;amp;#x4F7F;&amp;amp;#x7528;&amp;amp;#x3057;&amp;amp;#x3066;&amp;amp;#x4E0D;&amp;amp;#x8DB3;&amp;amp;#x307E;&amp;amp;#x305F;&amp;amp;#x306F;&amp;amp;#x7834;&amp;amp;#x640D;&amp;amp;#x3057;&amp;amp;#x3066;&amp;amp;#x3044;&amp;amp;#x308B;&amp;amp;#x30B7;&amp;amp;#x30B9;&amp;amp;#x30C6;&amp;amp;#x30E0; &amp;amp;#x30D5;&amp;amp;#x30A1;&amp;amp;#x30A4;&amp;amp;#x30EB;&amp;amp;#x3092;&amp;amp;#x4FEE;&amp;amp;#x5FA9;&amp;amp;#x3059;&amp;amp;#x308B; - Microsoft &amp;amp;#x30B5;&amp;amp;#x30DD;&amp;amp;#x30FC;&amp;amp;#x30C8; image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
&amp;amp;#x30B7;&amp;amp;#x30B9;&amp;amp;#x30C6;&amp;amp;#x30E0; &amp;amp;#x30D5;&amp;amp;#x30A1;&amp;amp;#x30A4;&amp;amp;#x30EB; &amp;amp;#x30C1;&amp;amp;#x30A7;&amp;amp;#x30C3;&amp;amp;#x30AB;&amp;amp;#x30FC; &amp;amp;#x30C4;&amp;amp;#x30FC;&amp;amp;#x30EB;&amp;amp;#x3092;&amp;amp;#x4F7F;&amp;amp;#x7528;&amp;amp;#x3057;&amp;amp;#x3066;&amp;amp;#x4E0D;&amp;amp;#x8DB3;&amp;amp;#x307E;&amp;amp;#x305F;&amp;amp;#x306F;&amp;amp;#x7834;&amp;amp;#x640D;&amp;amp;#x3057;&amp;amp;#x3066;&amp;amp;#x3044;&amp;amp;#x308B;&amp;amp;#x30B7;&amp;amp;#x30B9;&amp;amp;#x30C6;&amp;amp;#x30E0; &amp;amp;#x30D5;&amp;amp;#x30A1;&amp;amp;#x30A4;&amp;amp;#x30EB;&amp;amp;#x3092;&amp;amp;#x4FEE;&amp;amp;#x5FA9;&amp;amp;#x3059;&amp;amp;#x308B; - Microsoft &amp;amp;#x30B5;&amp;amp;#x30DD;&amp;amp;#x30FC;&amp;amp;#x30C8;
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;システム ファイル チェッカー ツールを使用して、Windows でシステム ファイルが見つからない、または破損している場合のトラブルシューティングを行う方法について説明します。&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-01c2902e367becf427fa87084b97508226e9c842.png"
style="margin-right: 2px;"
alt="support.microsoft.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
support.microsoft.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://www.maihamabreeze.com/chkdsk%E3%81%AE%E3%81%8B%E3%81%91%E6%96%B9%E3%81%A8%E7%B5%90%E6%9E%9C%E3%81%AE%E8%A6%8B%E6%96%B9/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/7e4a5ec446bb4fca17e13acd163c04e2c02fc5b5_hu_2fbe349a01b510fc.webp"
alt="CHKDSKのかけ方と結果の見方 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
CHKDSKのかけ方と結果の見方
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;CHKDSKコマンドを管理者権限で実行する方法と結果の所在と見方について記録します。 実施環境は、Windows10 21h2です。ＰＣの搭載ディスク環境は、ＣドライブにＳＳＤ,５１２ＧＢ,ＯＳ搭載、&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-0e0b8694dc1c5d12b1126e06ca71682044712bdb.png"
style="margin-right: 2px;"
alt="www.maihamabreeze.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
www.maihamabreeze.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://www.lifeboat.jp/support/db/013170802001.html"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="チェックディスクの実行方法(Windows10) image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
チェックディスクの実行方法(Windows10)
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;LIFEBOAT&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-aac96cf6916d8f8c7379d7dbc33e1c6d54a181c0.png"
style="margin-right: 2px;"
alt="www.lifeboat.jp favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
www.lifeboat.jp
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>WSLでSSH鍵を作るだけ</title><link>https://notes.nakurei.com/post/create-ssh-key-at-wsl/</link><pubDate>Wed, 21 May 2025 00:30:32 +0900</pubDate><guid>https://notes.nakurei.com/post/create-ssh-key-at-wsl/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;WSLでSSH鍵を作るときのコマンドのメモ。
いつも忘れていつもググっているのでメモっておく。&lt;/p&gt;
&lt;h2 id="いつものコマンド"&gt;
いつものコマンド&lt;a href="#%e3%81%84%e3%81%a4%e3%82%82%e3%81%ae%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh-keygen -t ed25519&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="オプション"&gt;
オプション&lt;a href="#%e3%82%aa%e3%83%97%e3%82%b7%e3%83%a7%e3%83%b3"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;オプション&lt;/th&gt;
&lt;th style="text-align: left"&gt;説明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;code&gt;-t&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;暗号化方法&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;code&gt;-c&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;鍵のコメント&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;code&gt;-f&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;鍵の保存名&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;</description></item><item><title>GASを使って無料でNetlifyのデプロイ通知をGmailへ送る</title><link>https://notes.nakurei.com/post/netlify-gas-gmail-notification/</link><pubDate>Thu, 08 May 2025 20:22:48 +0900</pubDate><guid>https://notes.nakurei.com/post/netlify-gas-gmail-notification/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;GAS（Google Apps Script）を使って、Netlifyのデプロイ通知をGmail等のメールへ送信する設定をしたときの手順記録。&lt;/p&gt;
&lt;h2 id="背景"&gt;
背景&lt;a href="#%e8%83%8c%e6%99%af"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Netlifyでは、&lt;strong&gt;Proプラン以上でないとEmail Notificationが利用できない&lt;/strong&gt;。そのため、無料のFree &amp;amp; Starterプランだと、そのままではGmail等へデプロイ通知を送信できない。しかし、&lt;strong&gt;GAS&lt;/strong&gt;（Google Apps Script）を使えば、&lt;strong&gt;無料で&lt;/strong&gt;デプロイ通知をGmail等のメールへ送れる。
本稿はその方法を解説する。&lt;/p&gt;
&lt;h2 id="全体の流れ"&gt;
全体の流れ&lt;a href="#%e5%85%a8%e4%bd%93%e3%81%ae%e6%b5%81%e3%82%8c"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;GAS（Google Apps Script）を作成する&lt;/li&gt;
&lt;li&gt;GASをデプロイする&lt;/li&gt;
&lt;li&gt;NetlifyのWebhookを作成する&lt;/li&gt;
&lt;li&gt;動作を確認する&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="手順"&gt;
手順&lt;a href="#%e6%89%8b%e9%a0%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-gasgoogle-apps-scriptを作成する"&gt;
1. GAS（Google Apps Script）を作成する&lt;a href="#1-gasgoogle-apps-script%e3%82%92%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;まず、&lt;a class="link" href="https://script.google.com/" target="_blank" rel="noopener"
&gt;Google Apps Script&lt;/a&gt;にアクセスする。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://script.google.com/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/3789c82c31b20ea7afe55a20cce7074a683ca8e8_hu_ba275ff7eecd1b78.webp"
alt="Apps Script  |  Google for Developers image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Apps Script  |  Google for Developers
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Develop high-quality, cloud-based solutions with ease.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
script.google.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;アクセスすると下図のような画面が出てくる。&lt;/p&gt;
&lt;style&gt;
:root {
--uni-warning-bg-color: #fae287;
--uni-warning-line-color: #544600;
}
:root[data-scheme='dark'] {
--uni-warning-bg-color: #544600;
--uni-warning-line-color: #fae287;
}
.block-highlight-warning {
display: flex;
align-items: center;
justify-content: first baseline;
height: 100%;
width: 100%;
padding: 1em;
margin: 1em 0;
border-left: 5px solid var(--uni-warning-line-color);
background-color: var(--uni-warning-bg-color);
border-radius: 0.5rem;
overflow: hidden;
color: var(--card-text-color-main);
line-height: 1.5;
}
.icon-warning {
display: inline-flex;
align-items: center;
vertical-align: middle;
}
.icon-warning svg {
vertical-align: baseline;
width: 1.5em;
height: 1.5em;
stroke-width: 1.5;
flex-shrink: 0;
}
&lt;/style&gt;
&lt;div class="block-highlight-warning"&gt;
&lt;span class="icon-warning"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-alert-triangle" width="44" height="44" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"&gt;
&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;
&lt;path d="M12 9v2m0 4v.01" /&gt;
&lt;path d="M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75" /&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span&gt;もし、Googleアカウントでログインしていない場合は、ログインする。&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508201741.png"
width="1011"
height="276"
srcset="https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508201741_hu_6a9cf18910dce6f2.png 480w, https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508201741_hu_9cfcd15331e2e02.png 1024w"
loading="lazy"
alt="GASのトップ画面"
class="gallery-image"
data-flex-grow="366"
data-flex-basis="879px"
&gt;&lt;/p&gt;
&lt;p&gt;画面の左上にある「新しいプロジェクト」をクリックする。しばらくすると、以下のような画面が表示される。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508201857.png"
width="1023"
height="495"
srcset="https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508201857_hu_8ce0d312ae57f59f.png 480w, https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508201857_hu_f69eff0d69bcedee.png 1024w"
loading="lazy"
alt="プロジェクト作成直後の画面"
class="gallery-image"
data-flex-grow="206"
data-flex-basis="496px"
&gt;&lt;/p&gt;
&lt;p&gt;次に、画面の左上にある「無題のプロジェクト」をクリックして、プロジェクト名を変更する。ここでは「Netlify Deploy Notification」とする。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508201930.png"
width="409"
height="232"
srcset="https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508201930_hu_f37904d82ea2e8e9.png 480w, https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508201930_hu_47386e03c286d3f9.png 1024w"
loading="lazy"
alt="名前を変更する"
class="gallery-image"
data-flex-grow="176"
data-flex-basis="423px"
&gt;&lt;/p&gt;
&lt;p&gt;次に、画面の左側にある「コード.gs」をクリックして、以下のコードを貼り付ける。&lt;/p&gt;
&lt;style&gt;
:root {
--uni-warning-bg-color: #fae287;
--uni-warning-line-color: #544600;
}
:root[data-scheme='dark'] {
--uni-warning-bg-color: #544600;
--uni-warning-line-color: #fae287;
}
.block-highlight-warning {
display: flex;
align-items: center;
justify-content: first baseline;
height: 100%;
width: 100%;
padding: 1em;
margin: 1em 0;
border-left: 5px solid var(--uni-warning-line-color);
background-color: var(--uni-warning-bg-color);
border-radius: 0.5rem;
overflow: hidden;
color: var(--card-text-color-main);
line-height: 1.5;
}
.icon-warning {
display: inline-flex;
align-items: center;
vertical-align: middle;
}
.icon-warning svg {
vertical-align: baseline;
width: 1.5em;
height: 1.5em;
stroke-width: 1.5;
flex-shrink: 0;
}
&lt;/style&gt;
&lt;div class="block-highlight-warning"&gt;
&lt;span class="icon-warning"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-alert-triangle" width="44" height="44" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"&gt;
&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;
&lt;path d="M12 9v2m0 4v.01" /&gt;
&lt;path d="M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75" /&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span&gt;以下のコードの&lt;code&gt;&amp;quot;your-email-XXXXXXXX@gmail.com&amp;quot;&lt;/code&gt;の部分を、&lt;strong&gt;実際に受信するGmailアドレスに変更する&lt;/strong&gt;こと。
このまま実行してしまうと、&amp;ldquo;&lt;a class="link" href="mailto:your-email-XXXXXXXX@gmail.com" &gt;your-email-XXXXXXXX@gmail.com&lt;/a&gt;&amp;quot;に通知が送信されてしまう。&lt;/span&gt;
&lt;/div&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;コード.gs&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;doPost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;json&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;postData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;contents&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// デプロイ状態（success, failed など）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;siteName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;deployUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;admin_url&lt;/span&gt;&lt;span class="p"&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="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;recipient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;your-email-XXXXXXXX@gmail.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 受信するGmailアドレス
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;subject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Netlify Deploy Status: &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Site: &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;siteName&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;\n&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Status: &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;\n&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Admin URL: &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;deployUrl&lt;/span&gt;&lt;span class="p"&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="nx"&gt;MailApp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sendEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;recipient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="2-gasをデプロイする"&gt;
2. GASをデプロイする&lt;a href="#2-gas%e3%82%92%e3%83%87%e3%83%97%e3%83%ad%e3%82%a4%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;コードを貼り付けたら、上のバーにある「デプロイ」をクリックし、「新しいデプロイ」を選択する。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508210715.png"
width="765"
height="222"
srcset="https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508210715_hu_4d2628e03fa3f942.png 480w, https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508210715_hu_19d7d3f0f1520c99.png 1024w"
loading="lazy"
alt="新しいデプロイをクリックする"
class="gallery-image"
data-flex-grow="344"
data-flex-basis="827px"
&gt;&lt;/p&gt;
&lt;p&gt;すると、以下のような画面が表示される。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508210814.png"
width="765"
height="604"
srcset="https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508210814_hu_170d59eba9a4d2de.png 480w, https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508210814_hu_f1d5f02b1b6bb75c.png 1024w"
loading="lazy"
alt="初期の設定画面"
class="gallery-image"
data-flex-grow="126"
data-flex-basis="303px"
&gt;&lt;/p&gt;
&lt;p&gt;左側の「種類の選択」が「ウェブアプリ」担っていることを確認し、「新しい説明文」に適当な名前を入力する。ここでは「Netlify Deploy Notification」とする。&lt;/p&gt;
&lt;p&gt;次に、下の「アクセスできるユーザー」を「全員」に変更する。これをしないと、NetlifyからのPOSTリクエストを受け取れない。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508210814.png"
width="765"
height="604"
srcset="https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508210814_hu_170d59eba9a4d2de.png 480w, https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508210814_hu_f1d5f02b1b6bb75c.png 1024w"
loading="lazy"
alt="設定後の画面"
class="gallery-image"
data-flex-grow="126"
data-flex-basis="303px"
&gt;&lt;/p&gt;
&lt;p&gt;最後に、右下の「デプロイ」をクリックする。すると、以下のような画面が表示される。表示されたURLをコピーして控えておく。&lt;/p&gt;
&lt;style&gt;
:root {
--uni-warning-bg-color: #fae287;
--uni-warning-line-color: #544600;
}
:root[data-scheme='dark'] {
--uni-warning-bg-color: #544600;
--uni-warning-line-color: #fae287;
}
.block-highlight-warning {
display: flex;
align-items: center;
justify-content: first baseline;
height: 100%;
width: 100%;
padding: 1em;
margin: 1em 0;
border-left: 5px solid var(--uni-warning-line-color);
background-color: var(--uni-warning-bg-color);
border-radius: 0.5rem;
overflow: hidden;
color: var(--card-text-color-main);
line-height: 1.5;
}
.icon-warning {
display: inline-flex;
align-items: center;
vertical-align: middle;
}
.icon-warning svg {
vertical-align: baseline;
width: 1.5em;
height: 1.5em;
stroke-width: 1.5;
flex-shrink: 0;
}
&lt;/style&gt;
&lt;div class="block-highlight-warning"&gt;
&lt;span class="icon-warning"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-alert-triangle" width="44" height="44" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"&gt;
&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;
&lt;path d="M12 9v2m0 4v.01" /&gt;
&lt;path d="M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75" /&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span&gt;このURLは、NetlifyのWebhookのURLとして使用するので、絶対に他人へ教えないこと。&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508211327.png"
width="760"
height="598"
srcset="https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508211327_hu_67083fa39859ae49.png 480w, https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508211327_hu_fa7245a1b0a050cc.png 1024w"
loading="lazy"
alt="デプロイ後の画面"
class="gallery-image"
data-flex-grow="127"
data-flex-basis="305px"
&gt;&lt;/p&gt;
&lt;h3 id="3-netlifyのwebhookを作成する"&gt;
3. NetlifyのWebhookを作成する&lt;a href="#3-netlify%e3%81%aewebhook%e3%82%92%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;NetlifyのWebhookを作成する。Netlifyのダッシュボードにアクセスし、対象のサイトを選択する。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://app.netlify.com/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="Netlify image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Netlify
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Start building the best web experiences in record time&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-96fcf99312e0db357918b5c4fe79b4984dad3c05.png"
style="margin-right: 2px;"
alt="app.netlify.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
app.netlify.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;次に、左側のメニューから「Site configuration」-&amp;gt;「Notifications」-&amp;gt;「Emails and webhooks」へ移動する。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508212422.png"
width="1982"
height="1186"
srcset="https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508212422_hu_56cbc7043fca26df.png 480w, https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508212422_hu_bd04a7fee7896714.png 1024w"
loading="lazy"
alt="Netlifyの通知設定画面"
class="gallery-image"
data-flex-grow="167"
data-flex-basis="401px"
&gt;&lt;/p&gt;
&lt;p&gt;ここの「Add notification」をクリックし、「HTTP POST request」を選択する。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508212507.png"
width="1255"
height="645"
srcset="https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508212507_hu_7f0476beb7f673d5.png 480w, https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508212507_hu_804e7780edd107f2.png 1024w"
loading="lazy"
alt="「Add notification」をクリックし、「HTTP POST request」を選択する"
class="gallery-image"
data-flex-grow="194"
data-flex-basis="466px"
&gt;&lt;/p&gt;
&lt;p&gt;選択すると以下のような画面が表示される。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508212605.png"
width="935"
height="605"
srcset="https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508212605_hu_9e57dd2ba903339.png 480w, https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508212605_hu_218737b3aadda1e2.png 1024w"
loading="lazy"
alt="Netlifyの通知設定の初期画面"
class="gallery-image"
data-flex-grow="154"
data-flex-basis="370px"
&gt;&lt;/p&gt;
&lt;p&gt;「Event to Listen for」は、通知を受け取るイベントを選択する。たとえば、「Deploy succeeded」を選択すると、デプロイが成功したときに通知を受け取れる。デプロイ開始時なら「Deploy started」を選択する。デプロイ失敗時なら「Deploy failed」を選択する。&lt;/p&gt;
&lt;p&gt;「URL to notify」には、先ほどGASをデプロイしたときに表示されたURLを貼り付ける。&lt;/p&gt;
&lt;p&gt;「JWS secret token (optional)」には、特に何も入力しなくて良い。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508213030.png"
width="606"
height="391"
srcset="https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508213030_hu_2e59356e11c2124e.png 480w, https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508213030_hu_ccffc4a19054f165.png 1024w"
loading="lazy"
alt="Netlifyの通知設定をしたあとの画面の例"
class="gallery-image"
data-flex-grow="154"
data-flex-basis="371px"
&gt;&lt;/p&gt;
&lt;p&gt;最後に、左下の「Save」をクリックして保存する。すると、「Emails and webhooks」の「Deploy notifications」にフックが追加される。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508213238.png"
width="546"
height="198"
srcset="https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508213238_hu_c5691bd22a1efdbe.png 480w, https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508213238_hu_195162eebe6a5679.png 1024w"
loading="lazy"
alt="通知のフックが追加された"
class="gallery-image"
data-flex-grow="275"
data-flex-basis="661px"
&gt;&lt;/p&gt;
&lt;h3 id="4-動作を確認する"&gt;
4. 動作を確認する&lt;a href="#4-%e5%8b%95%e4%bd%9c%e3%82%92%e7%a2%ba%e8%aa%8d%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Netlifyのダッシュボードに戻り、デプロイを実行する。デプロイが完了すると、Gmailに通知が届く。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508213433.png"
width="747"
height="193"
srcset="https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508213433_hu_903e1cdb95c816ac.png 480w, https://notes.nakurei.com/post/netlify-gas-gmail-notification/20250508213433_hu_ad4a13390eb9d53b.png 1024w"
loading="lazy"
alt="Gmailに通知が届いた"
class="gallery-image"
data-flex-grow="387"
data-flex-basis="928px"
&gt;&lt;/p&gt;
&lt;h2 id="まとめ"&gt;
まとめ&lt;a href="#%e3%81%be%e3%81%a8%e3%82%81"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;GASを使えば、Netlifyの無料プランでも、デプロイ通知をメールで受け取れる。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://script.google.com/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/3789c82c31b20ea7afe55a20cce7074a683ca8e8_hu_ba275ff7eecd1b78.webp"
alt="Apps Script  |  Google for Developers image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Apps Script  |  Google for Developers
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Develop high-quality, cloud-based solutions with ease.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
script.google.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>MATLABのstringにmustBeNonemptyは効かない</title><link>https://notes.nakurei.com/post/matlab-mustbenonempty-string-spec/</link><pubDate>Sat, 05 Apr 2025 10:17:50 +0900</pubDate><guid>https://notes.nakurei.com/post/matlab-mustbenonempty-string-spec/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;MATLABの&lt;code&gt;arguments&lt;/code&gt;構文で関数の引数を検証するとき、&lt;strong&gt;&lt;code&gt;string&lt;/code&gt;の長さを検証するために&lt;code&gt;mustBeNonempty&lt;/code&gt;を使っても、長さゼロの&lt;code&gt;string&lt;/code&gt;（&lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt;）はエラーにならない&lt;/strong&gt;という話。&lt;/p&gt;
&lt;h2 id="例"&gt;
例&lt;a href="#%e4%be%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;たとえば、次のような関数を定義したとする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-matlab" data-lang="matlab"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;s&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;arguments&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;mustBeNonempty&lt;/span&gt;&lt;span class="p"&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;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;このとき、&lt;code&gt;foo(&amp;quot;&amp;quot;)&lt;/code&gt;を実行すると、エラーにならない。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-matlab" data-lang="matlab"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&amp;#34;&amp;#34;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;ans&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &amp;#34;&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="解決策"&gt;
解決策&lt;a href="#%e8%a7%a3%e6%b1%ba%e7%ad%96"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;どうやら&lt;strong&gt;MATLABの仕様上、長さゼロの&lt;code&gt;string&lt;/code&gt;（&lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt;）は空とみなされない&lt;/strong&gt;らしい。そのため、&lt;code&gt;mustBeNonempty&lt;/code&gt;は効かない。
&lt;strong&gt;長さゼロの&lt;code&gt;string&lt;/code&gt;（&lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt;）を検証するためには、&lt;code&gt;mustBeNonzeroLengthText&lt;/code&gt;を使う必要がある&lt;/strong&gt;。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-matlab" data-lang="matlab"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;s&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;arguments&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;mustBeNonzeroLengthText&lt;/span&gt;&lt;span class="p"&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;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;このようにすると、&lt;code&gt;foo(&amp;quot;&amp;quot;)&lt;/code&gt;を実行するとエラーになる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-matlab" data-lang="matlab"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&amp;#34;&amp;#34;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Error&lt;/span&gt; &lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Invalid&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;argument&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;s&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Must&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;non&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;zero&lt;/span&gt; &lt;span class="nb"&gt;length&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ただし、&lt;code&gt;mustBeNonzeroLengthText&lt;/code&gt;はMATLAB R2020bから追加された関数なので、これより古いバージョンのMATLABでは使えない。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;
まとめ&lt;a href="#%e3%81%be%e3%81%a8%e3%82%81"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;MATLABの&lt;code&gt;arguments&lt;/code&gt;構文で、長さゼロの&lt;code&gt;string&lt;/code&gt;（&lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt;）を検証するためには、&lt;code&gt;mustBeNonempty&lt;/code&gt;ではなく、&lt;code&gt;mustBeNonzeroLengthText&lt;/code&gt;を使う必要がある。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
style="
display: flex;
align-items: center;
justify-content: center;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
cursor: not-allowed;
"
&gt;
&lt;div
style="
display: flex;
align-items: center;
justify-content: center;
height: 120px;
width: 120px;
max-width: 200px;
"
&gt;
&lt;img src="https://notes.nakurei.com/icons/link-off.svg" alt="No Image" width="100%" height="100%" style="object-fit: cover; margin: 0; flex-shrink: 0;"&gt;
&lt;/div&gt;
&lt;div
style="
display: flex;
flex-direction: column;
flex: 1 1 0%;
"
&gt;
&lt;div&gt;
jp.mathworks.com にアクセスできません
&lt;/div&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
"
&gt;
&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
jp.mathworks.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
style="
display: flex;
align-items: center;
justify-content: center;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
cursor: not-allowed;
"
&gt;
&lt;div
style="
display: flex;
align-items: center;
justify-content: center;
height: 120px;
width: 120px;
max-width: 200px;
"
&gt;
&lt;img src="https://notes.nakurei.com/icons/link-off.svg" alt="No Image" width="100%" height="100%" style="object-fit: cover; margin: 0; flex-shrink: 0;"&gt;
&lt;/div&gt;
&lt;div
style="
display: flex;
flex-direction: column;
flex: 1 1 0%;
"
&gt;
&lt;div&gt;
jp.mathworks.com にアクセスできません
&lt;/div&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
"
&gt;
&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
jp.mathworks.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
style="
display: flex;
align-items: center;
justify-content: center;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
cursor: not-allowed;
"
&gt;
&lt;div
style="
display: flex;
align-items: center;
justify-content: center;
height: 120px;
width: 120px;
max-width: 200px;
"
&gt;
&lt;img src="https://notes.nakurei.com/icons/link-off.svg" alt="No Image" width="100%" height="100%" style="object-fit: cover; margin: 0; flex-shrink: 0;"&gt;
&lt;/div&gt;
&lt;div
style="
display: flex;
flex-direction: column;
flex: 1 1 0%;
"
&gt;
&lt;div&gt;
jp.mathworks.com にアクセスできません
&lt;/div&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
"
&gt;
&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
jp.mathworks.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>Hugoで1年以上前の古い記事に警告を表示するようにした</title><link>https://notes.nakurei.com/post/hugo-old-article-warning/</link><pubDate>Sun, 16 Mar 2025 17:54:56 +0900</pubDate><guid>https://notes.nakurei.com/post/hugo-old-article-warning/</guid><description>&lt;img src="https://notes.nakurei.com/post/hugo-old-article-warning/20250316181850.png" alt="Featured image of post Hugoで1年以上前の古い記事に警告を表示するようにした" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Hugoで1年以上前の古い記事に警告を表示するようにした。そのときの実装のメモ。&lt;/p&gt;
&lt;h2 id="実装"&gt;
実装&lt;a href="#%e5%ae%9f%e8%a3%85"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ほぼ以下の記事を&lt;del&gt;パクって&lt;/del&gt;参考に実装した。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://tech-wafter.net/2019/show-notification-if-now-greater-equal-updated-time/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/4ab7fdee0632ec8690508c689ee583fc8ee500b1_hu_1e7eb2b734f1c5c0.webp"
alt="Hugoで記事が一年以上過ぎた場合はnoticeを表示するようにした image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Hugoで記事が一年以上過ぎた場合はnoticeを表示するようにした
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-6e81df8adf95428631f2215c55abe02da44d318d.png"
style="margin-right: 2px;"
alt="tech-wafter.net favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
tech-wafter.net
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;実装部分だけ抜粋すると以下のとおり。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ $lastmod := .Lastmod | default .Date }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ $year := (div (sub now.Unix $lastmod.Unix) 31536000) }}
&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;{{ if ge $year 1 }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;block-highlight-warning&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;icon-warning&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;{{ partial &amp;#34;helper/icon&amp;#34; &amp;#34;alert-triangle&amp;#34; }}&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;この記事は最終更新日から{{ $year }}年以上経過しています。&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ end }}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;実装にあたり参考元から3点変更した。&lt;/p&gt;
&lt;p&gt;まず、元記事では&lt;code&gt;.Lastmod&lt;/code&gt;を直接利用していたが、&lt;code&gt;.Lastmod&lt;/code&gt;がない場合に&lt;code&gt;.Date&lt;/code&gt;を利用するように変更した。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ $lastmod := .Lastmod | default .Date }}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;次に、1年以上の判定について、元記事では&lt;code&gt;le&lt;/code&gt;で比較していたが、個人的に比較対象を左に置きたかったので&lt;code&gt;ge&lt;/code&gt;に変更した。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ if ge $year 1 }}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;最後に、スタイルを好みに変更した。アイコンのあるほうがわかりやすいため、アイコンを追加した。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/hugo-old-article-warning/20250316181850.png"
width="1130"
height="144"
srcset="https://notes.nakurei.com/post/hugo-old-article-warning/20250316181850_hu_ce59d57efcf70e1f.png 480w, https://notes.nakurei.com/post/hugo-old-article-warning/20250316181850_hu_1be8bbec13a1c523.png 1024w"
loading="lazy"
alt="ライトモードでの表示"
class="gallery-image"
data-flex-grow="784"
data-flex-basis="1883px"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/hugo-old-article-warning/20250316181903.png"
width="1138"
height="146"
srcset="https://notes.nakurei.com/post/hugo-old-article-warning/20250316181903_hu_a7692dcefd357d2f.png 480w, https://notes.nakurei.com/post/hugo-old-article-warning/20250316181903_hu_803d4f4cd69ed28e.png 1024w"
loading="lazy"
alt="ダークモードでの表示"
class="gallery-image"
data-flex-grow="779"
data-flex-basis="1870px"
&gt;&lt;/p&gt;
&lt;p&gt;本サイトでは、&lt;a class="link" href="https://themes.gohugo.io/themes/hugo-theme-stack/" target="_blank" rel="noopener"
&gt;Stack&lt;/a&gt;テーマを利用しているので、&lt;code&gt;layouts/partials/article/components/content.html&lt;/code&gt;に追加で実装した。そうすると、すべての記事に反映される。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;実際の実装&lt;/summary&gt;
&lt;p&gt;&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;layouts/partials/article/components/content.html&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;style&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;block-highlight-warning&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="cl"&gt; &lt;span class="k"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#ff6f00&lt;/span&gt;&lt;span class="mi"&gt;20&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="cl"&gt; &lt;span class="k"&gt;border-left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt; &lt;span class="kc"&gt;solid&lt;/span&gt; &lt;span class="mh"&gt;#ff6f00&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="cl"&gt; &lt;span class="k"&gt;word-break&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;break-word&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="cl"&gt; &lt;span class="k"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;flex&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="cl"&gt; &lt;span class="k"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;center&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="cl"&gt; &lt;span class="k"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="kt"&gt;em&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="cl"&gt; &lt;span class="k"&gt;line-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&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="cl"&gt; &lt;span class="k"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="kt"&gt;em&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="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;icon-warning&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="cl"&gt; &lt;span class="k"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;inline-flex&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="cl"&gt; &lt;span class="k"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;center&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="cl"&gt; &lt;span class="k"&gt;vertical-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;middle&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="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;icon-warning&lt;/span&gt; &lt;span class="nt"&gt;svg&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="cl"&gt; &lt;span class="k"&gt;vertical-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;baseline&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="cl"&gt; &lt;span class="k"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.5&lt;/span&gt;&lt;span class="kt"&gt;em&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="cl"&gt; &lt;span class="k"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.5&lt;/span&gt;&lt;span class="kt"&gt;em&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="cl"&gt; &lt;span class="n"&gt;stroke-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.5&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="cl"&gt; &lt;span class="k"&gt;flex-shrink&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&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="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;style&lt;/span&gt;&lt;span class="p"&gt;&amp;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 hl"&gt;&lt;span class="cl"&gt;{{ $lastmod := .Lastmod | default .Date }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;{{ $year := (div (sub now.Unix $lastmod.Unix) 31536000) }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;section&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;article-content&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt; {{ if ge $year 1 }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;block-highlight-warning&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;icon-warning&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;{{ partial &amp;#34;helper/icon&amp;#34; &amp;#34;alert-triangle&amp;#34; }}&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;この記事は最終更新日から{{ $year }}年以上経過しています。&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt; {{ end }}
&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="c"&gt;&amp;lt;!-- Refer to https://discourse.gohugo.io/t/responsive-tables-in-markdown/10639/5 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {{ $wrappedTable := printf &amp;#34;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;\&amp;#34;table-wrapper\&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;${1}&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&amp;#34; }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {{ .Content | replaceRE &amp;#34;(&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;table&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;(?:.|\n)+?&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;table&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;)&amp;#34; $wrappedTable | safeHTML }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;section&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="おまけ"&gt;
おまけ&lt;a href="#%e3%81%8a%e3%81%be%e3%81%91"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ちなみに、&lt;code&gt;N&lt;/code&gt;年以上であることを示さなくていいなら、下記の書き方のほうがシンプルかもしれない。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ if ge (now.AddDate -1 0 0) .Date }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;alert-warning&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;alert&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;strong&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Warning!&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;strong&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; This article is over a year old.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ end }}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://tech-wafter.net/2019/show-notification-if-now-greater-equal-updated-time/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/4ab7fdee0632ec8690508c689ee583fc8ee500b1_hu_1e7eb2b734f1c5c0.webp"
alt="Hugoで記事が一年以上過ぎた場合はnoticeを表示するようにした image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Hugoで記事が一年以上過ぎた場合はnoticeを表示するようにした
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-6e81df8adf95428631f2215c55abe02da44d318d.png"
style="margin-right: 2px;"
alt="tech-wafter.net favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
tech-wafter.net
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>Shell scriptが実行できないときに確認することリスト</title><link>https://notes.nakurei.com/post/checklist-shell-script-not-working/</link><pubDate>Mon, 10 Mar 2025 11:25:07 +0900</pubDate><guid>https://notes.nakurei.com/post/checklist-shell-script-not-working/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Shell scriptが実行できないときに確認することのメモ。&lt;/p&gt;
&lt;h2 id="確認することリスト"&gt;
確認することリスト&lt;a href="#%e7%a2%ba%e8%aa%8d%e3%81%99%e3%82%8b%e3%81%93%e3%81%a8%e3%83%aa%e3%82%b9%e3%83%88"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="実行権限を確認する"&gt;
実行権限を確認する&lt;a href="#%e5%ae%9f%e8%a1%8c%e6%a8%a9%e9%99%90%e3%82%92%e7%a2%ba%e8%aa%8d%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;実行権限が付与されているか確認する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls -l script.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;実行権限がある場合は、&lt;code&gt;x&lt;/code&gt;が付与されている。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ls -l script.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rwxr-xr-x &lt;span class="m"&gt;1&lt;/span&gt; user user &lt;span class="m"&gt;0&lt;/span&gt; Mar &lt;span class="m"&gt;10&lt;/span&gt; 11:25 script.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;実行権限がない場合は、&lt;code&gt;chmod&lt;/code&gt;コマンドで実行権限を付与する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod +x script.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="所有者を確認する"&gt;
所有者を確認する&lt;a href="#%e6%89%80%e6%9c%89%e8%80%85%e3%82%92%e7%a2%ba%e8%aa%8d%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;実行権限に対し、所有者が正しいか確認する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls -l script.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;所有者が正しくない場合は、&lt;code&gt;chown&lt;/code&gt;コマンドで所有者を変更する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chown user script.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="シバンを確認する"&gt;
シバンを確認する&lt;a href="#%e3%82%b7%e3%83%90%e3%83%b3%e3%82%92%e7%a2%ba%e8%aa%8d%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;シバンが正しく設定されているか確認する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;head -n &lt;span class="m"&gt;1&lt;/span&gt; script.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;シバンが正しく設定されていない場合は、正しいシバンを設定する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#!/bin/bash&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="ファイルの改行コードを確認する"&gt;
ファイルの改行コードを確認する&lt;a href="#%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e6%94%b9%e8%a1%8c%e3%82%b3%e3%83%bc%e3%83%89%e3%82%92%e7%a2%ba%e8%aa%8d%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ファイルの改行コードが正しいか確認する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;file script.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Linuxの改行コードは&lt;code&gt;LF&lt;/code&gt;、Windowsの改行コードは&lt;code&gt;CRLF&lt;/code&gt;である。よって、Windowsで作成したファイルをWSLで実行する場合はとくに注意が必要で、改行コードを変換する必要がある。&lt;/p&gt;
&lt;p&gt;改行コードは、&lt;code&gt;dos2unix&lt;/code&gt;コマンドで変換できる。VS Codeの場合は、ファイルを開いて、右下の改行コードをクリックして変換もできる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dos2unix script.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="ファイルの存在を確認する"&gt;
ファイルの存在を確認する&lt;a href="#%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e5%ad%98%e5%9c%a8%e3%82%92%e7%a2%ba%e8%aa%8d%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ファイルが存在するか確認する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls script.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ファイルが存在しない場合は、ファイルを作成したり、移動したりする。&lt;/p&gt;
&lt;h3 id="pathを確認する"&gt;
PATHを確認する&lt;a href="#path%e3%82%92%e7%a2%ba%e8%aa%8d%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;シェルスクリプトがコマンドとして認識されない場合は、PATHにスクリプトのディレクトリが含まれているか確認する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;PATHにスクリプトのディレクトリが含まれていない場合は、&lt;code&gt;export&lt;/code&gt;コマンドでPATHにスクリプトのディレクトリを追加する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;:/path/to/script&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>nohupを付けて実行した処理を強制終了する</title><link>https://notes.nakurei.com/post/nohup-kill-command/</link><pubDate>Sun, 09 Mar 2025 15:53:47 +0900</pubDate><guid>https://notes.nakurei.com/post/nohup-kill-command/</guid><description>&lt;p&gt;ここでは、&lt;code&gt;python&lt;/code&gt;のプログラムを&lt;code&gt;nohup&lt;/code&gt;を付けて実行した処理を強制終了する方法を紹介する。&lt;/p&gt;
&lt;h2 id="やりかた"&gt;
やりかた&lt;a href="#%e3%82%84%e3%82%8a%e3%81%8b%e3%81%9f"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;下記コマンドでPIDをチェックする。&lt;/li&gt;
&lt;/ol&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ps -ef &lt;span class="p"&gt;|&lt;/span&gt; grep python&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これを実行すると、以下のような出力が得られる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ps -ef &lt;span class="p"&gt;|&lt;/span&gt; grep python
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; user &lt;span class="m"&gt;591&lt;/span&gt; &lt;span class="m"&gt;462&lt;/span&gt; cons0 15:57:42 /c/Users/user/AppData/Local/Programs/Python/Python312/python&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;この場合、PIDは591である。このPIDを使ってkillコマンドを実行する。&lt;code&gt;-9&lt;/code&gt;は強制終了を意味する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;kill&lt;/span&gt; -9 &lt;span class="m"&gt;591&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これで、&lt;code&gt;nohup&lt;/code&gt;を付けて実行した処理を強制終了できる。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://ja.stackoverflow.com/questions/72807/nohup-%E4%BB%98%E3%81%8D%E3%81%A7%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%9F%E5%87%A6%E7%90%86%E3%82%92%E5%BC%B7%E5%88%B6%E7%B5%82%E4%BA%86%E3%81%97%E3%81%9F%E3%81%84"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/5b7a190d8d937b5ba7f9116d63c8d35f971df004_hu_c72b6fa43362d51b.webp"
alt="nohup 付きで実行した処理を強制終了したい image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
nohup 付きで実行した処理を強制終了したい
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Linux上のterminalで nohup を付けて処理を動かしているのですが、処理が間違っていたことに気づきました。 nohup処理を止めたいのですが、どのようにすれば良いでしょうか？ なお他にも動いているnohup処理はあり、そちらは止めたくありません。 (1) 実行した処理 nohup python3 -u my_script1.py &gt; output1.txt nohup p...&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-96a7809889e47049bbc56a4594ea88445baa2d40.png"
style="margin-right: 2px;"
alt="ja.stackoverflow.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
ja.stackoverflow.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>個人的 .bashrc に追加することたち</title><link>https://notes.nakurei.com/post/my-adding-to-bashrc/</link><pubDate>Mon, 24 Feb 2025 22:59:55 +0900</pubDate><guid>https://notes.nakurei.com/post/my-adding-to-bashrc/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;.bashrc&lt;/code&gt; に追加している設定をメモ程度に残しておくだけ。&lt;/p&gt;
&lt;h2 id="設定"&gt;
設定&lt;a href="#%e8%a8%ad%e5%ae%9a"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="リダイレクトをtypoして上書きしないようにする"&gt;
リダイレクトをtypoして上書きしないようにする&lt;a href="#%e3%83%aa%e3%83%80%e3%82%a4%e3%83%ac%e3%82%af%e3%83%88%e3%82%92typo%e3%81%97%e3%81%a6%e4%b8%8a%e6%9b%b8%e3%81%8d%e3%81%97%e3%81%aa%e3%81%84%e3%82%88%e3%81%86%e3%81%ab%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;下記を追記すると、リダイレクト先のファイルがすでに存在する場合、エラーを出してくれる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -o noclobber&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt;による書き込みに影響はない。&lt;/p&gt;
&lt;h3 id="エイリアスを設定する"&gt;
エイリアスを設定する&lt;a href="#%e3%82%a8%e3%82%a4%e3%83%aa%e3%82%a2%e3%82%b9%e3%82%92%e8%a8%ad%e5%ae%9a%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;よく使うエイリアスを設定する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="nv"&gt;ll&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ls -l&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="nv"&gt;la&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ls -a&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="nv"&gt;lla&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ls -la&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="pythonのデバッグをしやすくする"&gt;
Pythonのデバッグをしやすくする&lt;a href="#python%e3%81%ae%e3%83%87%e3%83%90%e3%83%83%e3%82%b0%e3%82%92%e3%81%97%e3%82%84%e3%81%99%e3%81%8f%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Pythonスクリプトをデバッグしやすくするためのエイリアスを設定する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="nv"&gt;pydbg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;python -m pdb -c continue&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;complete&lt;/span&gt; -o default -o nospace -F _filedir pydbg&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://tech.withsin.net/2018/05/22/set-o-noclobber/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="set -o noclobber | technote image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
set -o noclobber | technote
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-e73d2f2c0b42016553843ee2eeb6f0872c7c7c40.jpeg"
style="margin-right: 2px;"
alt="tech.withsin.net favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
tech.withsin.net
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://docs.oracle.com/cd/E19683-01/816-3946/customize-3/index.html"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="noclobber 変数 (Solaris ユーザーズガイド (上級編)) image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
noclobber 変数 (Solaris ユーザーズガイド (上級編))
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-f3f11fd36b60f218517df4c8a17bbcc5607e35e1.png"
style="margin-right: 2px;"
alt="docs.oracle.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
docs.oracle.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;/p&gt;</description></item><item><title>ExpoのアプリがAndroidシミュレータでCommandError No development build for this project is installed. といわれて動作しなかったときの対応メモ</title><link>https://notes.nakurei.com/post/fix-expo-app-not-work-with-command-error-dev-build/</link><pubDate>Mon, 13 Jan 2025 14:06:48 +0900</pubDate><guid>https://notes.nakurei.com/post/fix-expo-app-not-work-with-command-error-dev-build/</guid><description>&lt;h2 id="状況"&gt;
状況&lt;a href="#%e7%8a%b6%e6%b3%81"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;npx expo run:android&lt;/code&gt;を実行した際に自動で起動するAndroidエミュレータ端末では問題なく動作する。しかし、その後に&lt;code&gt;Shift+a&lt;/code&gt;を押して別の端末を選ぶと、次のエラーが発生し、アプリが動作しなかった。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;√ Select a device/emulator » Pixel_Tablet_API_35 (emulator)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;› Opening emulator Pixel_Tablet_API_35
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CommandError: No development build (com.name.XXXXXXXXXX) for this project is installed. Please make and install a development build on the device first.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Learn more: https://docs.expo.dev/development/build/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="解決策"&gt;
解決策&lt;a href="#%e8%a7%a3%e6%b1%ba%e7%ad%96"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;まず、すべてのエミュレータを一度終了し、起動したいエミュレータを起動する。たとえば、起動したいエミュレータが&lt;code&gt;Pixel_Tablet_API_35&lt;/code&gt;である場合、以下のコマンドを実行する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;emulator -avd Pixel_Tablet_API_35&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;エミュレータが完全に起動したら、以下のコマンドを実行して、エミュレータに直接インストールする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx expo run:android --device&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;デバイス選択のプロンプトが表示されたら、起動したいエミュレータ（e.g. &lt;code&gt;Pixel_Tablet_API_35&lt;/code&gt;）を選択する。
これでアプリが動作するようになった。&lt;/p&gt;</description></item><item><title>間違ってmainブランチにコミットしてしまった場合の対処法</title><link>https://notes.nakurei.com/post/how-to-move-commit-to-another-branch/</link><pubDate>Sun, 05 Jan 2025 12:19:00 +0900</pubDate><guid>https://notes.nakurei.com/post/how-to-move-commit-to-another-branch/</guid><description>&lt;img src="https://notes.nakurei.com/icons/brand-git.svg" alt="Featured image of post 間違ってmainブランチにコミットしてしまった場合の対処法" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;間違って&lt;code&gt;main&lt;/code&gt;ブランチにコミットしてしまった場合に、それを別のブランチへ移す方法のメモ。&lt;/p&gt;
&lt;h2 id="注意"&gt;
注意&lt;a href="#%e6%b3%a8%e6%84%8f"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;この方法だと履歴を書き換えることになる&lt;/strong&gt;ので、&lt;code&gt;push&lt;/code&gt;してしまった後だと、&lt;code&gt;push --force&lt;/code&gt;が必要になってしまう。他者に影響が出るので、注意が必要である。&lt;/p&gt;
&lt;h2 id="方法"&gt;
方法&lt;a href="#%e6%96%b9%e6%b3%95"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;main&lt;/code&gt;ブランチから新しいブランチを作成する&lt;/li&gt;
&lt;/ol&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git switch -c new-branch&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol start="2"&gt;
&lt;li&gt;&lt;code&gt;main&lt;/code&gt;ブランチにいることを確認する&lt;/li&gt;
&lt;/ol&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git branch&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;main&lt;/code&gt;ブランチにいる場合は、以下のように表示される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git branch
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;* main
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; new-branch&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;main&lt;/code&gt;ブランチにいない場合は、以下のコマンドで切り替える。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git switch main&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol start="3"&gt;
&lt;li&gt;&lt;code&gt;main&lt;/code&gt;ブランチをリセットする範囲を確認する&lt;/li&gt;
&lt;/ol&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git log --oneline&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;例えば、次のように表示される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git log --oneline
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;abcdef3 &lt;span class="o"&gt;(&lt;/span&gt;HEAD -&amp;gt; main&lt;span class="o"&gt;)&lt;/span&gt; コミット3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;abcdef2 コミット2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;abcdef1 コミット1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol start="4"&gt;
&lt;li&gt;（省略可）安全のため、現在の状態をタグとして保存する&lt;/li&gt;
&lt;/ol&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git tag backup-before-reset&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これにより、なにか問題が生じたときに、タグを使って簡単にワークツリーを復元できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git checkout backup-before-reset&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;main&lt;/code&gt;ブランチのHEADも戻したい場合は、以下を実行する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git reset --hard backup-before-reset&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol start="5"&gt;
&lt;li&gt;&lt;code&gt;main&lt;/code&gt;ブランチをリセットする&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;例えば、コミット1の状態に戻したい場合、以下を実行する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git reset --hard abcdef1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol start="6"&gt;
&lt;li&gt;別ブランチに切り替えてで作業を続ける&lt;/li&gt;
&lt;/ol&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git switch new-branch&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>React NativeのborderRadiusは数値でないとならないらしい</title><link>https://notes.nakurei.com/post/react-native-border-radius-number/</link><pubDate>Thu, 02 Jan 2025 17:08:20 +0900</pubDate><guid>https://notes.nakurei.com/post/react-native-border-radius-number/</guid><description>&lt;p&gt;React Nativeの&lt;a class="link" href="https://reactnative.dev/docs/stylesheet" target="_blank" rel="noopener"
&gt;StyleSheet API&lt;/a&gt;で&lt;code&gt;borderRadius&lt;/code&gt;を指定する際、その指定値で公式にサポートされているのは&lt;code&gt;number&lt;/code&gt;のみである。&lt;a class="link" href="https://reactnative.dev/docs/view-style-props#borderradius" target="_blank" rel="noopener"
&gt;公式ドキュメント&lt;/a&gt;を見ても、TYPEに&lt;code&gt;number&lt;/code&gt;としか記載されていない。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://reactnative.dev/docs/view-style-props"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="reactnative.dev image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
reactnative.dev
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7e284da6139e833b0378d1367ff8b44ae857a090.png"
style="margin-right: 2px;"
alt="reactnative.dev favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
reactnative.dev
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;&lt;code&gt;'50%'&lt;/code&gt;のような文字列でも動くので問題ないと思っていたが、公式の仕様に従っていないことに留意すべきだろう。将来のアプデや環境変化を考えると、現時点では数値による指定が推奨される。&lt;/p&gt;
&lt;p&gt;ChatGPTにリファクタリングを頼んでみるもんだなあ…。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://reactnative.dev/docs/view-style-props"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="reactnative.dev image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
reactnative.dev
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7e284da6139e833b0378d1367ff8b44ae857a090.png"
style="margin-right: 2px;"
alt="reactnative.dev favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
reactnative.dev
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>React + Tailwind CSSでフッタの位置を画面の最下部に固定する方法のメモ</title><link>https://notes.nakurei.com/post/react-tailwind-css-sticky-footer/</link><pubDate>Sun, 24 Nov 2024 22:32:48 +0900</pubDate><guid>https://notes.nakurei.com/post/react-tailwind-css-sticky-footer/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;React + Tailwind CSSでフッタの位置を画面の最下部に固定する方法のメモ。&lt;/p&gt;
&lt;h2 id="なにをつくるか"&gt;
なにをつくるか&lt;a href="#%e3%81%aa%e3%81%ab%e3%82%92%e3%81%a4%e3%81%8f%e3%82%8b%e3%81%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;フッタの位置を画面の最下部に固定する。何もしないと、メインコンテンツが少ないときに。フッタが最下部よりも上に表示されてしまう。それを防ぐ。&lt;/p&gt;
&lt;p&gt;この実装のことを&amp;quot;Sticky footers&amp;quot;と呼ぶらしい。&lt;/p&gt;
&lt;h2 id="やり方"&gt;
やり方&lt;a href="#%e3%82%84%e3%82%8a%e6%96%b9"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;下記サイトが参考になった。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://developer.mozilla.org/en-US/docs/Web/CSS/Layout_cookbook/Sticky_footers"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="Sticky footers - CSS | MDN image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Sticky footers - CSS | MDN
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;A sticky footer pattern is one where the footer of your page "sticks" to the bottom of the viewport in cases where the content is shorter than the viewport height. We'll look at a couple of techniques for creating one in this recipe.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-bb2fb99cb499be45ab515f12bbda8cee42f68fdb.png"
style="margin-right: 2px;"
alt="developer.mozilla.org favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
developer.mozilla.org
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;h3 id="grid-layoutを使う"&gt;
Grid Layoutを使う&lt;a href="#grid-layout%e3%82%92%e4%bd%bf%e3%81%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Grid Layoutを使って、フッタを画面の最下部に固定する。コンテンツをラップするdiv要素を作成し、その最小の高さを設定する。そして、&lt;code&gt;grid&lt;/code&gt;を指定し、&lt;code&gt;grid-template-rows&lt;/code&gt;で&lt;code&gt;auto 1fr auto&lt;/code&gt;を指定する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;src/App.tsx&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-tsx" data-lang="tsx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;react&amp;#39;&lt;/span&gt;&lt;span class="p"&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="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;JSX&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Element&lt;/span&gt; &lt;span class="p"&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;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;w-full max-w-[100vw]&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;min-h-[100svh] h-[100svh]&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;grid grid-rows-[auto_1fr_auto]&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;header&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;header&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;header&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;main&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;main&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;footer&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;footer&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;footer&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これにより、ヘッダとフッタが&lt;code&gt;auto&lt;/code&gt;の高さを持ち、メインコンテンツが残りの高さを持つようになる。&lt;/p&gt;
&lt;h3 id="flexboxを使う"&gt;
Flexboxを使う&lt;a href="#flexbox%e3%82%92%e4%bd%bf%e3%81%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Grid Layoutに対応していないブラウザを対象とする場合は、Flexboxを使う方法もある。コンテンツをラップするdiv要素を作成し、その最小の高さを設定する。そして、&lt;code&gt;flex&lt;/code&gt;を指定し、&lt;code&gt;flex-col&lt;/code&gt;を指定する。加えて、main要素に&lt;code&gt;flex-1&lt;/code&gt;を指定する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;src/App.tsx&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-tsx" data-lang="tsx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;react&amp;#39;&lt;/span&gt;&lt;span class="p"&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="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;JSX&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Element&lt;/span&gt; &lt;span class="p"&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;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;w-full max-w-[100vw]&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;min-h-[100svh] h-[100svh]&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;flex flex-col&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;header&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;header&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;header&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;main&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;flex-1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;main&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;footer&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;footer&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;footer&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これにより、メインコンテンツがヘッダとフッタの間の高さを持つようになる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;この方法は、毎回&lt;code&gt;flex-1&lt;/code&gt;を指定する必要があるため、Grid Layoutを使う方法のほうが簡潔である。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://developer.mozilla.org/en-US/docs/Web/CSS/Layout_cookbook/Sticky_footers"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="Sticky footers - CSS | MDN image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Sticky footers - CSS | MDN
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;A sticky footer pattern is one where the footer of your page "sticks" to the bottom of the viewport in cases where the content is shorter than the viewport height. We'll look at a couple of techniques for creating one in this recipe.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-bb2fb99cb499be45ab515f12bbda8cee42f68fdb.png"
style="margin-right: 2px;"
alt="developer.mozilla.org favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
developer.mozilla.org
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>React + Tailwind CSSで、ボタンをホバーしたときにちょっと色を変えるときの実装メモ</title><link>https://notes.nakurei.com/post/react-tailwind-css-hover-button-color-change/</link><pubDate>Sat, 23 Nov 2024 22:39:56 +0900</pubDate><guid>https://notes.nakurei.com/post/react-tailwind-css-hover-button-color-change/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;React + Tailwind CSSで、ボタンをホバーしたときにちょっと色を変えるときの実装メモ。&lt;/p&gt;
&lt;h2 id="実装"&gt;
実装&lt;a href="#%e5%ae%9f%e8%a3%85"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;やり方はいくつかある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;明るさを変える&lt;/li&gt;
&lt;li&gt;コントラストを変える&lt;/li&gt;
&lt;li&gt;彩度を変える&lt;/li&gt;
&lt;li&gt;色を変える&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この中でも、明るさを変えるのがもっとも簡単でそれっぽくなる。&lt;/p&gt;
&lt;p&gt;ライトモードでは、ボタンをホバーしたときに背景色を少し明るくする。これは、&lt;code&gt;hover:brightness-110&lt;/code&gt;を設定すると実現できる。&lt;/p&gt;
&lt;p&gt;ダークモードでは、ボタンをホバーしたときに背景色を少し暗くする。これは、&lt;code&gt;hover:brightness-90&lt;/code&gt;を設定すると実現できる。&lt;/p&gt;
&lt;p&gt;実装例を以下に示す。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-tsx" data-lang="tsx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;react&amp;#39;&lt;/span&gt;&lt;span class="p"&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="kr"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;CustomButton&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;JSX&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Element&lt;/span&gt; &lt;span class="p"&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;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;bg-blue-500 text-white&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;hover:brightness-110 dark:hover:brightness-90&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;ボタン&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Claude 3.5 Sonnet&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>GitHubのブランチ保護のルールについて調べたときのメモ</title><link>https://notes.nakurei.com/post/github-branching-rules-notes/</link><pubDate>Sun, 29 Sep 2024 19:25:55 +0900</pubDate><guid>https://notes.nakurei.com/post/github-branching-rules-notes/</guid><description>&lt;img src="https://notes.nakurei.com/icons/brand-github.svg" alt="Featured image of post GitHubのブランチ保護のルールについて調べたときのメモ" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;GitHubで設定できるブランチ保護のルールについて調べたときのメモ。&lt;/p&gt;
&lt;h2 id="前提"&gt;
前提&lt;a href="#%e5%89%8d%e6%8f%90"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ここでは、&lt;strong&gt;Target branchesに&lt;code&gt;main&lt;/code&gt;を指定した場合の&lt;/strong&gt;、各設定の意味を説明する。
そのため、本稿の&lt;code&gt;main&lt;/code&gt;は任意のブランチ名に変更できる。&lt;/p&gt;
&lt;h2 id="ルールセット"&gt;
ルールセット&lt;a href="#%e3%83%ab%e3%83%bc%e3%83%ab%e3%82%bb%e3%83%83%e3%83%88"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="restrict-creations作成の制限"&gt;
Restrict creations（作成の制限）&lt;a href="#restrict-creations%e4%bd%9c%e6%88%90%e3%81%ae%e5%88%b6%e9%99%90"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Only allow users with bypass permission to create matching refs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この設定を有効にすると、バイパス権限を持つユーザー以外の、&lt;code&gt;main&lt;/code&gt;ブランチ/タグの&lt;strong&gt;作成を禁止&lt;/strong&gt;できる。&lt;/p&gt;
&lt;p&gt;通常&lt;code&gt;main&lt;/code&gt;ブランチは最初に作成されるため、&lt;code&gt;main&lt;/code&gt;ブランチの作成を禁止することはないだろう。&lt;code&gt;main-*&lt;/code&gt;のようなパターンを指定すると、意味のある設定になる。&lt;/p&gt;
&lt;h3 id="restrict-updates更新の制限"&gt;
Restrict updates（更新の制限）&lt;a href="#restrict-updates%e6%9b%b4%e6%96%b0%e3%81%ae%e5%88%b6%e9%99%90"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Only allow users with bypass permission to update matching refs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この設定を有効にすると、バイパス権限を持つユーザー以外の、&lt;code&gt;main&lt;/code&gt;ブランチ/タグの&lt;strong&gt;更新を禁止&lt;/strong&gt;できる。バイパス権限を持つユーザーは、Bypass listで指定する。この「更新」はプッシュに限らず、リベースやマージなども含まれる。&lt;/p&gt;
&lt;p&gt;たとえば、もしBypass listに誰も指定しなければ、&lt;code&gt;main&lt;/code&gt;ブランチ/タグの更新をすべて禁止にできる。&lt;/p&gt;
&lt;p&gt;別の例として、リポジトリのadmin権限を自分しか持っていない場合、ルールのBypass listにRepository adminを指定してこの設定を有効にする。すると、自分だけが&lt;code&gt;main&lt;/code&gt;ブランチを更新できるようになる。&lt;/p&gt;
&lt;h3 id="restrict-deletions削除の制限"&gt;
Restrict deletions（削除の制限）&lt;a href="#restrict-deletions%e5%89%8a%e9%99%a4%e3%81%ae%e5%88%b6%e9%99%90"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Only allow users with bypass permissions to delete matching refs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この設定を有効にすると、バイパス権限を持つユーザー以外の、&lt;code&gt;main&lt;/code&gt;ブランチ/タグの&lt;strong&gt;削除を禁止&lt;/strong&gt;できる。この設定はデフォルトで有効になっている。&lt;/p&gt;
&lt;p&gt;とくに&lt;code&gt;main&lt;/code&gt;ブランチの場合は、誤った&lt;code&gt;main&lt;/code&gt;ブランチの削除を防ぐためにも、この設定は有効にしておくべきである。&lt;/p&gt;
&lt;h3 id="require-linear-history直線状の履歴必須"&gt;
Require linear history（直線状の履歴必須）&lt;a href="#require-linear-history%e7%9b%b4%e7%b7%9a%e7%8a%b6%e3%81%ae%e5%b1%a5%e6%ad%b4%e5%bf%85%e9%a0%88"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Prevent merge commits from being pushed to matching refs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この設定を有効にすると、&lt;code&gt;main&lt;/code&gt;ブランチ/タグへの&lt;strong&gt;マージコミットを禁止&lt;/strong&gt;できる。
言い換えれば、&lt;code&gt;main&lt;/code&gt;ブランチ/タグへマージする際に、Squash and mergeあるいはRebase and mergeの使用を強制できる。&lt;/p&gt;
&lt;p&gt;この設定はチームの方針による。個人的には、この設定は&lt;code&gt;main&lt;/code&gt;ブランチには使わず、&lt;code&gt;feature/*&lt;/code&gt;ブランチなどに使う。&lt;/p&gt;
&lt;h3 id="require-deployments-to-succeedデプロイ成功必須"&gt;
Require deployments to succeed（デプロイ成功必須）&lt;a href="#require-deployments-to-succeed%e3%83%87%e3%83%97%e3%83%ad%e3%82%a4%e6%88%90%e5%8a%9f%e5%bf%85%e9%a0%88"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Choose which environments must be successfully deployed to before refs can be pushed into a ref that matches this rule.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この設定を有効にすると、&lt;code&gt;main&lt;/code&gt;ブランチ/タグへのプッシュを許可する前に、指定した環境への&lt;strong&gt;デプロイ成功を必須&lt;/strong&gt;にできる。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;main&lt;/code&gt;ブランチをどこかにデプロイしているなら、この設定を有効にしておくとよい。&lt;/p&gt;
&lt;h3 id="require-signed-commits署名済みコミット必須"&gt;
Require signed commits（署名済みコミット必須）&lt;a href="#require-signed-commits%e7%bd%b2%e5%90%8d%e6%b8%88%e3%81%bf%e3%82%b3%e3%83%9f%e3%83%83%e3%83%88%e5%bf%85%e9%a0%88"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Commits pushed to matching refs must have verified signatures.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この設定を有効にすると、&lt;code&gt;main&lt;/code&gt;ブランチ/タグへのプッシュを許可する前に、&lt;strong&gt;署名済みコミットを要求&lt;/strong&gt;できる。&lt;/p&gt;
&lt;p&gt;自分が&lt;a class="link" href="https://docs.github.com/ja/authentication/managing-commit-signature-verification/about-commit-signature-verification" target="_blank" rel="noopener"
&gt;署名済みコミット&lt;/a&gt;を使っているなら、この設定を有効にしておくと、なりすましなどを防げる。&lt;/p&gt;
&lt;h3 id="require-a-pull-request-before-mergingマージ前のプルリクエストの必須"&gt;
Require a pull request before merging（マージ前のプルリクエストの必須）&lt;a href="#require-a-pull-request-before-merging%e3%83%9e%e3%83%bc%e3%82%b8%e5%89%8d%e3%81%ae%e3%83%97%e3%83%ab%e3%83%aa%e3%82%af%e3%82%a8%e3%82%b9%e3%83%88%e3%81%ae%e5%bf%85%e9%a0%88"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Require all commits be made to a non-target branch and submitted via a pull request before they can be merged.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この設定を有効にすると、&lt;code&gt;main&lt;/code&gt;ブランチ/タグへのプッシュを許可する前に、&lt;strong&gt;プルリクエストを要求&lt;/strong&gt;できる。&lt;/p&gt;
&lt;p&gt;複数人で開発する場合、&lt;code&gt;main&lt;/code&gt;ブランチへの直接のプッシュを禁止できるため、この設定は有効にしておくべきである。&lt;/p&gt;
&lt;p&gt;この設定には追加設定がある。&lt;/p&gt;
&lt;h4 id="required-approvals"&gt;
Required approvals&lt;a href="#required-approvals"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;The number of approving reviews that are required before a pull request can be merged.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この設定は、プルリクエストをマージするために必要な&lt;strong&gt;承認レビューの数&lt;/strong&gt;を指定できる。
この値を&lt;code&gt;1&lt;/code&gt;以上にすると、たとえ自分がプルリクエストを作成していても、他の人にレビューしてもらう必要がある。&lt;/p&gt;
&lt;p&gt;この設定を&lt;code&gt;1&lt;/code&gt;以上にすると、リポジトリの管理者ですらマージの際にレビューを受けなければならなくなってしまう。しかも、自分自身をレビュワーにはできない。
そのため、自分ひとりしかリポジトリを更新しないなら、この設定は&lt;code&gt;0&lt;/code&gt;にしなければならない。&lt;/p&gt;
&lt;h4 id="dismiss-stale-pull-request-approvals-when-new-commits-are-pushed"&gt;
Dismiss stale pull request approvals when new commits are pushed&lt;a href="#dismiss-stale-pull-request-approvals-when-new-commits-are-pushed"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;New, reviewable commits pushed will dismiss previous pull request review approvals.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この設定を有効にすると、新しいコミットがプッシュされたときに、古いプルリクエストの承認レビューが無効になる。言い換えれば、&lt;strong&gt;一度承認されたプルリクエストに対して新しくコミットがプッシュされた場合、再度のレビューと承認を強制&lt;/strong&gt;できる。&lt;/p&gt;
&lt;p&gt;特に理由がなければ、この設定は有効にしておくとよい。&lt;/p&gt;
&lt;h4 id="require-review-from-specific-teams"&gt;
Require review from specific teams&lt;a href="#require-review-from-specific-teams"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;A collection of reviewers and associated file patterns. Each reviewer has a list of file patterns which determine the files that reviewer is required to review.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この設定を有効にすると、&lt;strong&gt;特定のファイルや特定の拡張子のファイルに対して、特定のチームによるレビューを強制&lt;/strong&gt;できる。&lt;/p&gt;
&lt;p&gt;一部のファイルに対して特定のチームのレビューを強制したい場合に便利である。&lt;/p&gt;
&lt;h4 id="require-review-from-code-owners"&gt;
Require review from Code Owners&lt;a href="#require-review-from-code-owners"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;Require an approving review in pull requests that modify files that have a designated code owner.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この設定を有効にすると、指定した&lt;strong&gt;コードオーナーによるレビューを強制&lt;/strong&gt;できる。
コードオーナーは、&lt;code&gt;CODEOWNERS&lt;/code&gt;ファイルで指定する。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://docs.github.com/ja/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/9291c5895c60f68749774fbf3fc719163834727b_hu_6374f8e298a87eeb.webp"
alt="コードオーナーについて - GitHub ドキュメント image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
コードオーナーについて - GitHub ドキュメント
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;CODEOWNERS ファイルを使い、リポジトリ中のコードに対して責任を負う個人あるいは Team を指定できます。&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-93e8494b5705d47fd44472eac39f114eda44f780.png"
style="margin-right: 2px;"
alt="docs.github.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
docs.github.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;&lt;code&gt;CODEOWNERS&lt;/code&gt;ファイルを作成して自分を指定し、この設定を有効にしておくと、自分はプルリクエストを承認無しでマージでき、他の人にはコードオーナー（すなわち自分）によるレビューを強制できる。
そのため、他人のプルリクエストを受け付けるけれど、自分のプルリクエストは自分でマージしたい場合に便利である。&lt;/p&gt;
&lt;h4 id="require-approval-of-the-most-recent-reviewable-push"&gt;
Require approval of the most recent reviewable push&lt;a href="#require-approval-of-the-most-recent-reviewable-push"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;Whether the most recent reviewable push must be approved by someone other than the person who pushed it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この設定を有効にすると、プルリクエストをマージする前に、&lt;strong&gt;最後にプッシュした人以外の誰かによる承認を強制&lt;/strong&gt;できる。つまり、自己承認を防げる。&lt;/p&gt;
&lt;p&gt;大規模な開発の場合は有効にすると良さそう。&lt;/p&gt;
&lt;h4 id="require-conversation-resolution-before-merging"&gt;
Require conversation resolution before merging&lt;a href="#require-conversation-resolution-before-merging"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;All conversations on code must be resolved before a pull request can be merged.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この設定を有効にすると、プルリクエストをマージする前に、&lt;strong&gt;すべてのコードに関する会話（コメント）を解決&lt;/strong&gt;する必要がある。よって、プルリクエストへのコメントの見逃しを防げる。&lt;/p&gt;
&lt;p&gt;この設定は、プルリクエストの品質を向上させるため、有効にしておくとよい。&lt;/p&gt;
&lt;h4 id="automatically-request-copilot-code-review"&gt;
Automatically request Copilot code review&lt;a href="#automatically-request-copilot-code-review"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;Request Copilot code review for new pull requests automatically if the author has access to Copilot code review.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この設定を有効にすると、Copilot Code Reviewを利用している場合、プルリクエストの作成時に&lt;strong&gt;自動的にCopilot Code Reviewを要求&lt;/strong&gt;できる。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://docs.github.com/ja/copilot/how-tos/use-copilot-agents/request-a-code-review/use-code-review"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/b84ebf33864a1e3b98441519b01dc6904a0c4267_hu_b20aed94c288a3b4.webp"
alt="GitHub Copilot コード レビューの使用 - GitHub ドキュメント image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
GitHub Copilot コード レビューの使用 - GitHub ドキュメント
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;GitHub Copilot からコード レビューを要求する方法について説明します。&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-93e8494b5705d47fd44472eac39f114eda44f780.png"
style="margin-right: 2px;"
alt="docs.github.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
docs.github.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;Copilot Code Reviewを利用しているなら、この設定を有効にしておくとよい。&lt;/p&gt;
&lt;h4 id="allowed-merge-methods"&gt;
Allowed merge methods&lt;a href="#allowed-merge-methods"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;When merging pull requests, you can allow any combination of merge commits, squashing, or rebasing. At least one option must be enabled.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;プルリクエストの&lt;strong&gt;マージ方法を強制&lt;/strong&gt;できる。
&lt;code&gt;Merge commits&lt;/code&gt;、&lt;code&gt;Squash merging&lt;/code&gt;、&lt;code&gt;Rebase merging&lt;/code&gt;のいずれかを有効にする必要がある。複数有効にもできる。&lt;/p&gt;
&lt;p&gt;この設定はチームの方針による。個人的には、&lt;code&gt;main&lt;/code&gt;ブランチは&lt;code&gt;Merge commits&lt;/code&gt;のみを有効にすることが多い。ブランチのコミットの粒度が雑な場合は、&lt;code&gt;Squash merging&lt;/code&gt;のみを有効にするとよい。&lt;/p&gt;
&lt;h3 id="require-status-checks-to-passステータスチェックのパスの強制"&gt;
Require status checks to pass（ステータスチェックのパスの強制）&lt;a href="#require-status-checks-to-pass%e3%82%b9%e3%83%86%e3%83%bc%e3%82%bf%e3%82%b9%e3%83%81%e3%82%a7%e3%83%83%e3%82%af%e3%81%ae%e3%83%91%e3%82%b9%e3%81%ae%e5%bc%b7%e5%88%b6"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Choose which status checks must pass before the ref is updated. When enabled, commits must first be pushed to another ref where the checks pass.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この設定を有効にすると、&lt;code&gt;main&lt;/code&gt;ブランチ/タグへのプッシュを許可する前に、指定したステータスチェックのパスを強制できる。
つまり、&lt;strong&gt;必須CI/CDの通過を要求&lt;/strong&gt;できる。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Status checks that are required&lt;/code&gt;に、必須にしたいステータスチェックを追加する。&lt;/p&gt;
&lt;p&gt;この設定には追加設定がある。&lt;/p&gt;
&lt;h4 id="require-branches-to-be-up-to-date-before-merging"&gt;
Require branches to be up to date before merging&lt;a href="#require-branches-to-be-up-to-date-before-merging"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;Whether pull requests targeting a matching branch must be tested with the latest code. This setting will not take effect unless at least one status check is enabled.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この設定を有効にすると、プルリクエストに対して、&lt;strong&gt;最新のコードによるテストを要求&lt;/strong&gt;できる。&lt;/p&gt;
&lt;p&gt;特別な理由がない限り、この設定は有効にしておくとよい。&lt;/p&gt;
&lt;h4 id="do-not-require-status-checks-on-creation"&gt;
Do not require status checks on creation&lt;a href="#do-not-require-status-checks-on-creation"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;Allow repositories and branches to be created if a check would otherwise prohibit it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この設定を有効にすると、&lt;strong&gt;ブランチやリポジトリの作成時には、ステータスチェックを必須としなくなる&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;ステータスチェックを通せないくらいの初期段階では有効にしてもよいだろう。&lt;/p&gt;
&lt;h3 id="block-force-pushes強制プッシュのブロック"&gt;
Block force pushes（強制プッシュのブロック）&lt;a href="#block-force-pushes%e5%bc%b7%e5%88%b6%e3%83%97%e3%83%83%e3%82%b7%e3%83%a5%e3%81%ae%e3%83%96%e3%83%ad%e3%83%83%e3%82%af"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Prevent users with push access from force pushing to refs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この設定を有効にすると、&lt;code&gt;main&lt;/code&gt;ブランチ/タグへの&lt;strong&gt;強制プッシュを禁止&lt;/strong&gt;できる。この設定はデフォルトで有効になっている。&lt;/p&gt;
&lt;p&gt;とくに&lt;code&gt;main&lt;/code&gt;ブランチの場合は、誤った&lt;code&gt;main&lt;/code&gt;ブランチの強制プッシュを防ぐためにも、この設定は有効にしておくべきである。&lt;/p&gt;
&lt;h3 id="require-code-scanning-resultsコードスキャンの強制"&gt;
Require code scanning results（コードスキャンの強制）&lt;a href="#require-code-scanning-results%e3%82%b3%e3%83%bc%e3%83%89%e3%82%b9%e3%82%ad%e3%83%a3%e3%83%b3%e3%81%ae%e5%bc%b7%e5%88%b6"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Choose which tools must provide code scanning results before the reference is updated. When configured, code scanning must be enabled and have results for both the commit and the reference being updated.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この設定を有効にすると、&lt;code&gt;main&lt;/code&gt;ブランチ/タグへのプッシュを許可する前に、指定した&lt;strong&gt;コードスキャン結果の提供を強制&lt;/strong&gt;できる。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Required tools and alert thresholds&lt;/code&gt;に、必須にしたいコードスキャンツールを追加する。&lt;/p&gt;
&lt;p&gt;CodeQLなどのコードスキャンツールを利用しているなら、この設定を有効にしておくとよさそう。&lt;/p&gt;
&lt;h3 id="require-code-quality-resultsコード品質結果の強制"&gt;
Require code quality results（コード品質結果の強制）&lt;a href="#require-code-quality-results%e3%82%b3%e3%83%bc%e3%83%89%e5%93%81%e8%b3%aa%e7%b5%90%e6%9e%9c%e3%81%ae%e5%bc%b7%e5%88%b6"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Choose which severity levels of code quality results should block pull request merges. When configured, a code quality analysis must be done on the pull request before the changes can be merged.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この設定を有効にすると、コード品質結果に基づいてプルリクエストのマージをブロックできる。
ブロックしたいコード品質の重大度レベルは指定できる。&lt;/p&gt;
&lt;p&gt;これは使ったことがないのでわからないが、コード品質を自動で分析してもらえるという点では有用そう。&lt;/p&gt;
&lt;h3 id="automatically-request-copilot-code-review自動的にcopilotコードレビューを要求"&gt;
Automatically request Copilot code review（自動的にCopilotコードレビューを要求）&lt;a href="#automatically-request-copilot-code-review%e8%87%aa%e5%8b%95%e7%9a%84%e3%81%abcopilot%e3%82%b3%e3%83%bc%e3%83%89%e3%83%ac%e3%83%93%e3%83%a5%e3%83%bc%e3%82%92%e8%a6%81%e6%b1%82"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Request Copilot code review for new pull requests automatically if the author has access to Copilot code review and their premium requests quota has not reached the limit.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この設定を有効にすると、Copilot Code Reviewを利用している場合、プルリクエストの作成時に&lt;strong&gt;自動的にCopilot Code Reviewを要求&lt;/strong&gt;できる。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://docs.github.com/ja/copilot/how-tos/use-copilot-agents/request-a-code-review/use-code-review"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/b84ebf33864a1e3b98441519b01dc6904a0c4267_hu_b20aed94c288a3b4.webp"
alt="GitHub Copilot コード レビューの使用 - GitHub ドキュメント image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
GitHub Copilot コード レビューの使用 - GitHub ドキュメント
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;GitHub Copilot からコード レビューを要求する方法について説明します。&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-93e8494b5705d47fd44472eac39f114eda44f780.png"
style="margin-right: 2px;"
alt="docs.github.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
docs.github.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;この設定には追加設定がある。&lt;/p&gt;
&lt;h4 id="review-new-pushes"&gt;
Review new pushes&lt;a href="#review-new-pushes"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;Copilot automatically reviews each new push to the pull request.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この設定を有効にすると、プルリクエストへの&lt;strong&gt;新しいプッシュごと&lt;/strong&gt;にCopilotが自動でレビューする。&lt;/p&gt;
&lt;p&gt;個人的にはプッシュごとにレビューを回す必要はないため、この設定は無効にしている。&lt;/p&gt;
&lt;h4 id="review-draft-pull-requests"&gt;
Review draft pull requests&lt;a href="#review-draft-pull-requests"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;Copilot automatically reviews draft pull requests before they are marked as ready for review.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この設定を有効にすると、Copilotが&lt;strong&gt;ドラフトのプルリクエストを&lt;/strong&gt;自動でレビューする。&lt;/p&gt;
&lt;p&gt;これは開発方針によるが、プルリクエストごとにCopilotによるレビューを回したいなら、この設定は有効にしておくとよい。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://docs.github.com/ja/repositories/configuring-branches-and-merges-in-your-repository/managing-rulesets/available-rules-for-rulesets"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/9291c5895c60f68749774fbf3fc719163834727b_hu_6374f8e298a87eeb.webp"
alt="ルールセットで使用できるルール - GitHub ドキュメント image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
ルールセットで使用できるルール - GitHub ドキュメント
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;リポジトリ内の特定のブランチとタグを保護するためにルールセットに追加できるルールについて説明します。&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-93e8494b5705d47fd44472eac39f114eda44f780.png"
style="margin-right: 2px;"
alt="docs.github.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
docs.github.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://qiita.com/MrMs/items/f7fc915d47bff57706b5"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/746acc807dd54e529ef2efc6fdceff4aa4a159af_hu_5b99e79e3316df3f.webp"
alt="リポジトリ管理者はapproveなしでマージできるようにしようとしたら少しハマった話 - Qiita image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
リポジトリ管理者はapproveなしでマージできるようにしようとしたら少しハマった話 - Qiita
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;はじめに 個人開発用のリポジトリを作成し、Branch protection ruleを設定していた時の話です。 設定項目が間違っており、意図した挙動になっていなかったのを解消しました。 やりたかったこと 「リポジトリ管理者(CODEOWNERS)は、approveなし...&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7dfa4a32e8b8dd3b8a6b654e1cd55932c6a19262.png"
style="margin-right: 2px;"
alt="qiita.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
qiita.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>Gitで新しいブランチにもとのブランチの最新の変更を取り込む方法</title><link>https://notes.nakurei.com/post/git-update-branch-with-main-changes/</link><pubDate>Sun, 08 Sep 2024 10:32:01 +0900</pubDate><guid>https://notes.nakurei.com/post/git-update-branch-with-main-changes/</guid><description>&lt;img src="https://notes.nakurei.com/icons/brand-git.svg" alt="Featured image of post Gitで新しいブランチにもとのブランチの最新の変更を取り込む方法" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Gitで、新しいブランチを作成したあと、もとのブランチに更新が入ったときに、どうすればいいのかのメモ。&lt;/p&gt;
&lt;h2 id="前提条件"&gt;
前提条件&lt;a href="#%e5%89%8d%e6%8f%90%e6%9d%a1%e4%bb%b6"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Gitの基本的な使い方を知っている&lt;/li&gt;
&lt;li&gt;コマンドラインでGitを操作できる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="はじめに"&gt;
はじめに&lt;a href="#%e3%81%af%e3%81%98%e3%82%81%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Gitを利用する際、たとえば&lt;code&gt;main&lt;/code&gt;ブランチから新しいブランチを作成したあと、&lt;code&gt;main&lt;/code&gt;ブランチに更新が入ることはよくある。そのときに、&lt;code&gt;main&lt;/code&gt;ブランチの最新の変更を新しいブランチに取り込みたいことがある。&lt;/p&gt;
&lt;p&gt;以下では、もとのブランチが&lt;code&gt;main&lt;/code&gt;ブランチで、新しいブランチが&lt;code&gt;new-branch&lt;/code&gt;であると仮定して説明する。ただし、この方法は特段&lt;code&gt;main&lt;/code&gt;ブランチに限らず、どのブランチに対しても適用できる。&lt;/p&gt;
&lt;h2 id="対応方法の種類"&gt;
対応方法の種類&lt;a href="#%e5%af%be%e5%bf%9c%e6%96%b9%e6%b3%95%e3%81%ae%e7%a8%ae%e9%a1%9e"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;最新の変更を取り込む方法は大別して2つある。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;新しいブランチの&lt;strong&gt;開始点を、&lt;code&gt;main&lt;/code&gt;ブランチの最新のコミットへ移動&lt;/strong&gt;する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;main&lt;/code&gt;ブランチの&lt;strong&gt;最新のコミットを、新しいブランチへ取り込む&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;基本的に、新しいブランチにまだ&lt;strong&gt;コミットがない場合は1&lt;/strong&gt;、すでに&lt;strong&gt;コミットがある場合は2&lt;/strong&gt;の方法を取る。
ただし、新しいブランチにコミットがあっても、まだリモートリポジトリにプッシュしていない場合は、1の方法でも問題ない。&lt;/p&gt;
&lt;h2 id="事前の準備作業状態の保存"&gt;
事前の準備：作業状態の保存&lt;a href="#%e4%ba%8b%e5%89%8d%e3%81%ae%e6%ba%96%e5%82%99%e4%bd%9c%e6%a5%ad%e7%8a%b6%e6%85%8b%e3%81%ae%e4%bf%9d%e5%ad%98"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;変更を取り込む前に、&lt;code&gt;git stash&lt;/code&gt;コマンドで現在の作業状態を保存しておくことをオススメする。これにより、操作中に問題が発生した場合でも、簡単に元の状態に戻せる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git stash save &lt;span class="s2"&gt;&amp;#34;作業中の変更を一時保存&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;この操作により、現在の変更が一時的に保存され、作業ディレクトリがクリーンな状態になる。
後述する操作で変更の取り込みが完了した後、保存した変更は次の操作で復元できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git stash pop&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;pop&lt;/code&gt;オプションを指定することで、最後に保存した変更を復元できる。&lt;/p&gt;
&lt;h2 id="手順"&gt;
手順&lt;a href="#%e6%89%8b%e9%a0%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="新しいブランチの開始点を移動する"&gt;
新しいブランチの開始点を移動する&lt;a href="#%e6%96%b0%e3%81%97%e3%81%84%e3%83%96%e3%83%a9%e3%83%b3%e3%83%81%e3%81%ae%e9%96%8b%e5%a7%8b%e7%82%b9%e3%82%92%e7%a7%bb%e5%8b%95%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;この方法は、以下の場合に使える。&lt;strong&gt;この方法はコミット履歴を変更してしまうため、リモートリポジトリへプッシュした後は使えない&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;新しいブランチを作成しただけで、まだ何もコミットしていない場合&lt;/li&gt;
&lt;li&gt;新しいブランチを作成し、すぐにコミットしているが、まだリモートリポジトリへプッシュしていない場合&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;まず、新しいブランチに切り替える&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git switch new-branch&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;その後、&lt;code&gt;main&lt;/code&gt;ブランチの最新の状態へリベースする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git rebase main&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これにより、新しいブランチの開始点を、&lt;code&gt;main&lt;/code&gt;ブランチの最新のコミットへ移動できる。
コンフリクトが発生した場合は、コンフリクトを解消してから&lt;code&gt;git rebase --continue&lt;/code&gt;を実行する。&lt;/p&gt;
&lt;p&gt;くれぐれも、&lt;strong&gt;すでにリモートリポジトリへプッシュしている場合は、&lt;code&gt;rebase&lt;/code&gt;を使ってはならない&lt;/strong&gt;。なぜなら、&lt;code&gt;rebase&lt;/code&gt;は履歴を書き換える操作だからである。&lt;/p&gt;
&lt;p&gt;リモートリポジトリへプッシュした後に&lt;code&gt;rebase&lt;/code&gt;でローカルリポジトリの履歴を書き換えてしまうと、リモートリポジトリとローカルリポジトリとで、コミット履歴の整合性が取れなくなってしまう。&lt;/p&gt;
&lt;p&gt;もし、すでに新しいブランチでコミットしていて、リモートリポジトリにプッシュしている場合は、次に述べる&lt;code&gt;merge&lt;/code&gt;を使う。&lt;/p&gt;
&lt;h3 id="新しいブランチに最新のコミットを取り込む"&gt;
新しいブランチに最新のコミットを取り込む&lt;a href="#%e6%96%b0%e3%81%97%e3%81%84%e3%83%96%e3%83%a9%e3%83%b3%e3%83%81%e3%81%ab%e6%9c%80%e6%96%b0%e3%81%ae%e3%82%b3%e3%83%9f%e3%83%83%e3%83%88%e3%82%92%e5%8f%96%e3%82%8a%e8%be%bc%e3%82%80"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;この方法は、以下の場合に使える。&lt;strong&gt;この方法はコミット履歴を書き換えないため、リモートリポジトリへプッシュした後でも使える&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;新しく作成したブランチにすでにコミットがあり、かつ、すでにリモートリポジトリへプッシュしている場合&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;まず、新しいブランチに切り替える。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git switch new-branch&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;その後、&lt;code&gt;main&lt;/code&gt;ブランチの最新の状態をマージする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git merge main&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これにより、新しいブランチに、&lt;code&gt;main&lt;/code&gt;ブランチの最新の状態を取り込める。ブランチの開始点は変わらないが、履歴を書き換えずに、新しいブランチの状態を&lt;code&gt;main&lt;/code&gt;ブランチの最新のコミットへ合わせられる。
マージの際にコミットが作成される点には注意すること。&lt;/p&gt;
&lt;p&gt;コンフリクトが発生した場合は、コンフリクトを解消してから通常のコミットを行う。&lt;/p&gt;
&lt;h2 id="appendix--コンフリクトの対処"&gt;
Appendix | コンフリクトの対処&lt;a href="#appendix--%e3%82%b3%e3%83%b3%e3%83%95%e3%83%aa%e3%82%af%e3%83%88%e3%81%ae%e5%af%be%e5%87%a6"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;rebase&lt;/code&gt;や&lt;code&gt;merge&lt;/code&gt;の際に、同じファイルの同じ部分が両方のブランチで変更されていると、コンフリクトが発生しうる。コンフリクトが発生した場合は、Gitは自動的にマージを停止し、手動での解決を求める。&lt;/p&gt;
&lt;p&gt;コンフリクトが発生した場合の一般的な手順は以下のとおりである。本稿では詳細な説明は省略する。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;コンフリクトしたファイルを開く&lt;/li&gt;
&lt;li&gt;コンフリクトのある部分を探す&lt;/li&gt;
&lt;li&gt;望ましい最終的な内容に編集し、コンフリクトを解決する&lt;/li&gt;
&lt;li&gt;変更をステージングエリアに追加する&lt;/li&gt;
&lt;li&gt;コンフリクト解決後、&lt;code&gt;rebase&lt;/code&gt;の場合は&lt;code&gt;git rebase --continue&lt;/code&gt;を、&lt;code&gt;merge&lt;/code&gt;の場合は通常のコミットを行う&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="まとめ"&gt;
まとめ&lt;a href="#%e3%81%be%e3%81%a8%e3%82%81"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;新しいブランチを作成した後、もとのブランチに更新が入ったときは、以下の方法で対応できる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;新しいブランチにまだコミットがない場合は、&lt;code&gt;rebase&lt;/code&gt;を利用して、新しいブランチの開始点を&lt;code&gt;main&lt;/code&gt;ブランチの最新のコミットへ移動する&lt;/li&gt;
&lt;li&gt;新しいブランチにすでにコミットがある場合、とくにリモートリポジトリへプッシュした後の場合は、&lt;code&gt;merge&lt;/code&gt;を利用して、&lt;code&gt;main&lt;/code&gt;ブランチの最新のコミットを新しいブランチへ取り込む&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;&lt;code&gt;git switch&lt;/code&gt;はGit 2.23以降で利用可能。それ以前のバージョンでは&lt;code&gt;git checkout&lt;/code&gt;を使う。&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Linuxで容量の大きいファイル/ディレクトリを探すコマンドのメモ</title><link>https://notes.nakurei.com/post/find-large-files-and-directories-in-linux/</link><pubDate>Fri, 30 Aug 2024 22:06:41 +0900</pubDate><guid>https://notes.nakurei.com/post/find-large-files-and-directories-in-linux/</guid><description>&lt;img src="https://notes.nakurei.com/img/header/console.webp" alt="Featured image of post Linuxで容量の大きいファイル/ディレクトリを探すコマンドのメモ" /&gt;&lt;p&gt;Linuxで、サイズの大きいファイルは下記のコマンドで探せる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;du -sh ./data/* &lt;span class="p"&gt;|&lt;/span&gt; sort -rh &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;10&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;上記のコマンドは、&lt;code&gt;./data/&lt;/code&gt;ディレクトリ以下のファイル/ディレクトリのサイズを合計して表示し、サイズの大きい順に上位10件を表示する。&lt;/p&gt;
&lt;h2 id="duコマンド"&gt;
&lt;code&gt;du&lt;/code&gt;コマンド&lt;a href="#du%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;du&lt;/code&gt;コマンドは、ディレクトリ/ファイルのディスク使用量を表示するコマンドである。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-s&lt;/code&gt;オプション: ディレクトリのサイズを合計して表示する。これをつけることで、サブディレクトリを含めた合計サイズを表示できる。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-h&lt;/code&gt;オプション: 人間が読みやすい形式で表示する。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sortコマンド"&gt;
&lt;code&gt;sort&lt;/code&gt;コマンド&lt;a href="#sort%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;sort&lt;/code&gt;コマンドは、行をソートするコマンドである。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-r&lt;/code&gt;オプション: 逆順にソートする。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-h&lt;/code&gt;オプション: 人間が読みやすい形式でソートする。これをつけることで、&lt;code&gt;1K&lt;/code&gt;、&lt;code&gt;1M&lt;/code&gt;、&lt;code&gt;1G&lt;/code&gt;のようなサイズを比較できる。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="headコマンド"&gt;
&lt;code&gt;head&lt;/code&gt;コマンド&lt;a href="#head%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;head&lt;/code&gt;コマンドは、先頭から指定した行数を表示するコマンドである。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-n&lt;/code&gt;オプション: 表示する行数を指定する。ここでは&lt;code&gt;10&lt;/code&gt;を指定しているため、上位10件のディレクトリ/ファイルが表示される。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>GitHubで署名付きコミットを反映させるための設定メモ</title><link>https://notes.nakurei.com/post/github-signed-commits-setup-guide/</link><pubDate>Sat, 17 Aug 2024 02:28:02 +0900</pubDate><guid>https://notes.nakurei.com/post/github-signed-commits-setup-guide/</guid><description>&lt;img src="https://notes.nakurei.com/icons/brand-git.svg" alt="Featured image of post GitHubで署名付きコミットを反映させるための設定メモ" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;GitHubで署名付きコミットを反映させるための設定のメモ。&lt;/p&gt;
&lt;h2 id="署名付きコミットとは"&gt;
署名付きコミットとは&lt;a href="#%e7%bd%b2%e5%90%8d%e4%bb%98%e3%81%8d%e3%82%b3%e3%83%9f%e3%83%83%e3%83%88%e3%81%a8%e3%81%af"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;署名付きコミットとは、コミットした人が本人であると証明するためのものである。&lt;/p&gt;
&lt;p&gt;Gitで誰がコミットしたかという情報は、Gitで設定する&lt;code&gt;user.name&lt;/code&gt;と&lt;code&gt;user.email&lt;/code&gt;で判断できる。しかし、これらの値は簡単にカスタマイズできるため、いくらでもなりすましができてしまう。このなりすましを回避し、本人であることを証明するのに、署名付きコミットは有用である。&lt;/p&gt;
&lt;p&gt;署名付きコミットではGPGキーが利用される。GPGとは、&lt;a class="link" href="https://gnupg.org/" target="_blank" rel="noopener"
&gt;GNU Privacy Guard&lt;/a&gt;の略で、データの暗号化や署名に利用できる。GPGキーは秘密鍵と公開鍵のペアで構成される。GPGキーを利用してコミットすると、コミットには秘密鍵で署名が付与される。この署名を公開鍵で検証することで、そのコミットが本人によって行われたと証明できる。&lt;/p&gt;
&lt;h2 id="全体の流れ"&gt;
全体の流れ&lt;a href="#%e5%85%a8%e4%bd%93%e3%81%ae%e6%b5%81%e3%82%8c"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;GitHubで署名付きコミットを利用するための手順は以下のとおりである。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;GPGキーの作成&lt;/li&gt;
&lt;li&gt;GitHubへのGPGキーの登録&lt;/li&gt;
&lt;li&gt;GitにおけるGPGキーの設定&lt;/li&gt;
&lt;li&gt;書名付きコミットを試す&lt;/li&gt;
&lt;li&gt;署名付きコミットの確認&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;本記事は以下の環境で動作確認した。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WSL2 Ubuntu 22.04 LTS&lt;/li&gt;
&lt;li&gt;Git 2.34.1&lt;/li&gt;
&lt;li&gt;GnuPG 2.2.27&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="gpgキーの作成"&gt;
GPGキーの作成&lt;a href="#gpg%e3%82%ad%e3%83%bc%e3%81%ae%e4%bd%9c%e6%88%90"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;書名付きコミットをするために、GPGキーを作成する。&lt;/p&gt;
&lt;h3 id="gnupgのインストール"&gt;
GnuPGのインストール&lt;a href="#gnupg%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;GPGキーは、&lt;a class="link" href="https://www.gnupg.org/download/" target="_blank" rel="noopener"
&gt;GnuPG&lt;/a&gt;というGPGのCLIツールを利用して作成する。このツールを入れると&lt;code&gt;gpg&lt;/code&gt;コマンドが使えるようになる。インストールのしかたはOSによって異なるため、&lt;a class="link" href="https://gnupg.org/" target="_blank" rel="noopener"
&gt;公式サイト&lt;/a&gt;を参照すること。&lt;/p&gt;
&lt;p&gt;GnuPGが正常にインストールされていれば、以下のコマンドでバージョンを確認できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ gpg --version
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gpg &lt;span class="o"&gt;(&lt;/span&gt;GnuPG&lt;span class="o"&gt;)&lt;/span&gt; 2.2.27
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;libgcrypt 1.9.4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="m"&gt;2021&lt;/span&gt; Free Software Foundation, Inc.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;License GNU GPL-3.0-or-later &amp;lt;https://gnu.org/licenses/gpl.html&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;This is free software: you are free to change and redistribute it.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;There is NO WARRANTY, to the extent permitted by law.
&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;Home: /home/user/.gnupg
&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;公開鍵: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;暗号方式: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; TWOFISH, CAMELLIA128, CAMELLIA192, CAMELLIA256
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ハッシュ: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;圧縮: 無圧縮, ZIP, ZLIB, BZIP2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 id="windowsの場合"&gt;
Windowsの場合&lt;a href="#windows%e3%81%ae%e5%a0%b4%e5%90%88"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Windowsマシンの場合&lt;a class="link" href="https://www.gpg4win.org/index.html" target="_blank" rel="noopener"
&gt;Gpg4win&lt;/a&gt;をインストールする。&lt;a class="link" href="https://github.com/microsoft/winget-cli" target="_blank" rel="noopener"
&gt;winget&lt;/a&gt;を使ってインストールすると簡単。wingetは、&lt;a class="link" href="https://learn.microsoft.com/ja-jp/windows/package-manager/winget/" target="_blank" rel="noopener"
&gt;Microsoft&lt;/a&gt;曰く、Windows 11ならデフォルトで利用できる。&lt;/p&gt;
&lt;p&gt;wingetでGpg4winを入れられるかどうかは、&lt;code&gt;winget search&lt;/code&gt;で確認できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;winget&lt;/span&gt; &lt;span class="n"&gt;search&lt;/span&gt; &lt;span class="n"&gt;gpg4win&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;以下のような出力が得られれば、インストールできる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;winget&lt;/span&gt; &lt;span class="n"&gt;search&lt;/span&gt; &lt;span class="n"&gt;gpg4win&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;名前&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="n"&gt;バージョン&lt;/span&gt; &lt;span class="n"&gt;一致&lt;/span&gt; &lt;span class="n"&gt;ソース&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;------------------------------------------------------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Gpg4win&lt;/span&gt; &lt;span class="n"&gt;GnuPG&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Gpg4win&lt;/span&gt; &lt;span class="mf"&gt;4.4&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;0&lt;/span&gt; &lt;span class="n"&gt;ProductCode&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="n"&gt;gpg4win&lt;/span&gt; &lt;span class="n"&gt;winget&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;インストールは&lt;code&gt;winget install&lt;/code&gt;で行う。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;winget&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;gpg4win&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;以下のような出力が得られれば、インストール完了となる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;winget&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;gpg4win&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;見つかりました&lt;/span&gt; &lt;span class="n"&gt;Gpg4win&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;GnuPG.Gpg4win&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;バージョン&lt;/span&gt; &lt;span class="mf"&gt;4.4&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;このアプリケーションは所有者からライセンス供与されます&lt;/span&gt;&lt;span class="err"&gt;。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Microsoft&lt;/span&gt; &lt;span class="n"&gt;はサードパーティのパッケージに対して責任を負わず&lt;/span&gt;&lt;span class="err"&gt;、&lt;/span&gt;&lt;span class="n"&gt;ライセンスも付与しません&lt;/span&gt;&lt;span class="err"&gt;。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ダウンロード中&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="p"&gt;//&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;gpg4win&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;gpg4win&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;4.4&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;exe&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;██████████████████████████████&lt;/span&gt; &lt;span class="mf"&gt;34.3&lt;/span&gt; &lt;span class="n"&gt;MB&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;34.3&lt;/span&gt; &lt;span class="n"&gt;MB&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;インストーラーハッシュが正常に検証されました&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;パッケージのインストールを開始しています&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;インストーラーは管理者として実行するように要求するため&lt;/span&gt;&lt;span class="err"&gt;、&lt;/span&gt;&lt;span class="n"&gt;プロンプトが表示されます&lt;/span&gt;&lt;span class="err"&gt;。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;インストールが完了しました&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ターミナル（e.g. PowerShell）を再起動して、&lt;code&gt;gpg --version&lt;/code&gt;でバージョンが表示されればインストール成功。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;gpg&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-version&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;details&gt;
&lt;summary&gt;Log&lt;/summary&gt;
&lt;p&gt;&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;gpg&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;gpg&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GnuPG&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mf"&gt;2.4&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;7&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;libgcrypt&lt;/span&gt; &lt;span class="mf"&gt;1.11&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Copyright&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mf"&gt;2024&lt;/span&gt; &lt;span class="n"&gt;g10&lt;/span&gt; &lt;span class="n"&gt;Code&lt;/span&gt; &lt;span class="n"&gt;GmbH&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;License&lt;/span&gt; &lt;span class="n"&gt;GNU&lt;/span&gt; &lt;span class="n"&gt;GPL&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="o"&gt;-or&lt;/span&gt;&lt;span class="n"&gt;-later&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="p"&gt;//&lt;/span&gt;&lt;span class="n"&gt;gnu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;licenses&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;gpl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;This&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;free&lt;/span&gt; &lt;span class="n"&gt;software&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="n"&gt;free&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;change&lt;/span&gt; &lt;span class="n"&gt;and&lt;/span&gt; &lt;span class="n"&gt;redistribute&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;There&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;NO&lt;/span&gt; &lt;span class="n"&gt;WARRANTY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;extent&lt;/span&gt; &lt;span class="n"&gt;permitted&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="n"&gt;law&lt;/span&gt;&lt;span class="p"&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="n"&gt;Home&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="n"&gt;C:&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;nak&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;AppData&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Roaming&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;gnupg&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;サポートしているアルゴリズム&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;公開鍵&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="n"&gt;RSA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ELG&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DSA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ECDH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ECDSA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;EDDSA&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;暗号方式&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IDEA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;3DES&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CAST5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BLOWFISH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AES&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AES192&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AES256&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;TWOFISH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CAMELLIA128&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CAMELLIA192&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CAMELLIA256&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ハッシュ&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="n"&gt;SHA1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;RIPEMD160&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SHA256&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SHA384&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SHA512&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SHA224&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;圧縮&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="n"&gt;無圧縮&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ZIP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ZLIB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BZIP2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;h3 id="主鍵の作成"&gt;
主鍵の作成&lt;a href="#%e4%b8%bb%e9%8d%b5%e3%81%ae%e4%bd%9c%e6%88%90"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;GPGキーは以下のコマンドで作成できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gpg --full-generate-key&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://docs.github.com/ja/authentication/managing-commit-signature-verification/generating-a-new-gpg-key"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/e0d07dbbe47b84f5b88b046b3cff22c86924428b_hu_f32ef2c992f3f25f.webp"
alt="新しい GPG キーを生成する - GitHub ドキュメント image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
新しい GPG キーを生成する - GitHub ドキュメント
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;既存の GPG キーがない場合は、新しい GPG キーを生成してコミットおよびタグの署名に使用できます。&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-93e8494b5705d47fd44472eac39f114eda44f780.png"
style="margin-right: 2px;"
alt="docs.github.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
docs.github.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;鍵の作成時に&lt;code&gt;--expert&lt;/code&gt;オプションを付けると、より詳細な設定ができる。たとえば、gpgのバージョンによっては&lt;code&gt;--expert&lt;/code&gt;オプションをつけないとECCで鍵が作れない。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gpg --full-generate-key --expert&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;コマンドを実行すると、プロンプトで鍵の作成に関する質問が表示される。聞かれるのは以下のような質問である。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;鍵の種類（RSA、ECCなど）&lt;/li&gt;
&lt;li&gt;鍵の長さ&lt;/li&gt;
&lt;li&gt;鍵の有効期限&lt;/li&gt;
&lt;li&gt;鍵のユーザー情報
&lt;ul&gt;
&lt;li&gt;ユーザー名&lt;/li&gt;
&lt;li&gt;メールアドレス&lt;/li&gt;
&lt;li&gt;コメント&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;パスフレーズ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最初に鍵の種類を選択する。選択肢は以下の通りである。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ gpg --full-generate-key --expert
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gpg &lt;span class="o"&gt;(&lt;/span&gt;GnuPG&lt;span class="o"&gt;)&lt;/span&gt; 2.2.27&lt;span class="p"&gt;;&lt;/span&gt; Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="m"&gt;2021&lt;/span&gt; Free Software Foundation, Inc.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;This is free software: you are free to change and redistribute it.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;There is NO WARRANTY, to the extent permitted by law.
&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; &lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt; RSA と RSA &lt;span class="o"&gt;(&lt;/span&gt;デフォルト&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt; DSA と Elgamal
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;3&lt;span class="o"&gt;)&lt;/span&gt; DSA &lt;span class="o"&gt;(&lt;/span&gt;署名のみ&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;4&lt;span class="o"&gt;)&lt;/span&gt; RSA &lt;span class="o"&gt;(&lt;/span&gt;署名のみ&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;7&lt;span class="o"&gt;)&lt;/span&gt; DSA &lt;span class="o"&gt;(&lt;/span&gt;機能をあなた自身で設定&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;8&lt;span class="o"&gt;)&lt;/span&gt; RSA &lt;span class="o"&gt;(&lt;/span&gt;機能をあなた自身で設定&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;9&lt;span class="o"&gt;)&lt;/span&gt; ECC と ECC
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;10&lt;span class="o"&gt;)&lt;/span&gt; ECC &lt;span class="o"&gt;(&lt;/span&gt;署名のみ&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;11&lt;span class="o"&gt;)&lt;/span&gt; ECC &lt;span class="o"&gt;(&lt;/span&gt;機能をあなた自身で設定&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;13&lt;span class="o"&gt;)&lt;/span&gt; 既存の鍵
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;14&lt;span class="o"&gt;)&lt;/span&gt; カードに存在する鍵
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;あなたの選択は? &lt;span class="m"&gt;11&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;ここで作成する鍵は、鍵の認証にのみ利用する&lt;/strong&gt;。そのため、&lt;strong&gt;鍵の認証機能のみを持つ鍵を生成する&lt;/strong&gt;。上記の選択肢には認証機能のみを持つ鍵の選択肢はないため、RSAやECCでも機能を自分で設定する選択肢（e.g. &lt;code&gt;RSA (機能をあなた自身で設定)&lt;/code&gt;や&lt;code&gt;ECC (機能をあなた自身で設定)&lt;/code&gt;）を選ぶ。&lt;/p&gt;
&lt;p&gt;たとえば、選択肢&lt;code&gt;11&lt;/code&gt;（&lt;code&gt;ECC (機能をあなた自身で設定)&lt;/code&gt;）を選ぶと、以下のような質問が表示される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;鍵ECDSA/EdDSAに認められた操作: Sign Certify Authenticate
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;現在の認められた操作: Sign Certify
&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="o"&gt;(&lt;/span&gt;S&lt;span class="o"&gt;)&lt;/span&gt; 署名機能を反転する
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;A&lt;span class="o"&gt;)&lt;/span&gt; 認証機能を反転する
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;Q&lt;span class="o"&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;この&lt;code&gt;現在の認められた操作&lt;/code&gt;が鍵の機能を示す。&lt;code&gt;Sign Certify&lt;/code&gt;の場合、署名（Sign）と鍵の認証（Certify）の機能が両方付与されている。ここで作成する鍵は鍵の認証にのみ利用するため、署名の機能（&lt;code&gt;S&lt;/code&gt;）を削除する。&lt;code&gt;S&lt;/code&gt;を選択すると、署名の機能が削除される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;あなたの選択は? S
&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;鍵ECDSA/EdDSAに認められた操作: Sign Certify Authenticate
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;現在の認められた操作: Certify
&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="o"&gt;(&lt;/span&gt;S&lt;span class="o"&gt;)&lt;/span&gt; 署名機能を反転する
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;A&lt;span class="o"&gt;)&lt;/span&gt; 認証機能を反転する
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;Q&lt;span class="o"&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;あなたの選択は? Q&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;現在の認められた操作&lt;/code&gt;が&lt;code&gt;Certify&lt;/code&gt;のみになったら&lt;/strong&gt;、&lt;code&gt;Q&lt;/code&gt;を選択して設定を完了する。&lt;/p&gt;
&lt;p&gt;次に、&lt;code&gt;RSA&lt;/code&gt;なら鍵の長さ、&lt;code&gt;ECC&lt;/code&gt;なら曲線の種類を選ぶ。個人の好みとしては、&lt;code&gt;RSA&lt;/code&gt;なら&lt;code&gt;4096&lt;/code&gt;&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;、&lt;code&gt;ECC&lt;/code&gt;なら&lt;code&gt;curve25519&lt;/code&gt;を選ぶのがよいだろう。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&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="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt; Curve &lt;span class="m"&gt;25519&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;3&lt;span class="o"&gt;)&lt;/span&gt; NIST P-256
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;4&lt;span class="o"&gt;)&lt;/span&gt; NIST P-384
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;5&lt;span class="o"&gt;)&lt;/span&gt; NIST P-521
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;6&lt;span class="o"&gt;)&lt;/span&gt; Brainpool P-256
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;7&lt;span class="o"&gt;)&lt;/span&gt; Brainpool P-384
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;8&lt;span class="o"&gt;)&lt;/span&gt; Brainpool P-512
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;9&lt;span class="o"&gt;)&lt;/span&gt; secp256k1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;あなたの選択は? &lt;span class="m"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;次に、鍵の有効期限を設定する。有効期限は&lt;code&gt;0&lt;/code&gt;を選ぶと無期限になる。有効期限を設定する場合は、&lt;code&gt;1y&lt;/code&gt;（1年）、&lt;code&gt;2y&lt;/code&gt;（2年）などの形式で設定する。セキュリティの観点では、定期的な鍵の更新のために、有効期限を設けることが推奨される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&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="nv"&gt;0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 鍵は無期限
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;n&amp;gt; &lt;span class="o"&gt;=&lt;/span&gt; 鍵は n 日間で期限切れ
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;n&amp;gt;w &lt;span class="o"&gt;=&lt;/span&gt; 鍵は n 週間で期限切れ
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;n&amp;gt;m &lt;span class="o"&gt;=&lt;/span&gt; 鍵は n か月間で期限切れ
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;n&amp;gt;y &lt;span class="o"&gt;=&lt;/span&gt; 鍵は n 年間で期限切れ
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;鍵の有効期間は? &lt;span class="o"&gt;(&lt;/span&gt;0&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="m"&gt;0&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;次に、鍵のユーザー情報を設定する。ユーザー名、メールアドレス、コメントを設定する。ユーザー名とメールアドレスは必須、コメントは任意である。おそらく本来は本名や実際のメールアドレスを設定すべきだが、別に架空の名前でも良い。&lt;/p&gt;
&lt;p&gt;注意点として、&lt;strong&gt;ここで設定するメールアドレスは、GitHubに登録しているメールアドレスと同一のものにしなければならない&lt;/strong&gt;。GitHubは、GPGキーのメールアドレスとGitHubのメールアドレスが一致している場合、署名付きコミットを認識する。&lt;/p&gt;
&lt;p&gt;最後に、パスフレーズを設定する。パスフレーズは秘密鍵を保護するためのもので、他人に知られてはならない。パスフレーズは長く複雑なものを設定するのが望ましい。&lt;strong&gt;パスフレーズは鍵の利用時に要求されるため、必ず記録しておくこと&lt;/strong&gt;。パスワードマネージャーを利用するのがよいだろう。&lt;/p&gt;
&lt;p&gt;以上でGPGキーが生成される。作成された鍵は次のコマンドで確認できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gpg -k&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;たとえば、次のような情報が表示される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ gpg -k
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/home/user/.gnupg/pubring.kbx
&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;pub ed25519 YYYY-MM-DD &lt;span class="o"&gt;[&lt;/span&gt;C&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 1234567890ABCDEF1234567890ABCDEF12345678
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uid &lt;span class="o"&gt;[&lt;/span&gt; 究極 &lt;span class="o"&gt;]&lt;/span&gt; UserName &amp;lt;example@mail.com&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;この手順で作成されるGPGキー（&lt;code&gt;pub&lt;/code&gt;のところに表示されるもの）は&lt;strong&gt;主鍵&lt;/strong&gt;と呼ばれる&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;主鍵の&lt;code&gt;[C]&lt;/code&gt;の表記は、主鍵に鍵の認証（Certify）の機能が付与されていることを示している&lt;/strong&gt;。もし、主鍵に認証の機能（&lt;code&gt;C&lt;/code&gt;）がない場合は、主鍵の機能を変更する必要がある。&lt;/p&gt;
&lt;p&gt;設定次第では、主鍵でも書名付きコミットはできる。しかし、セキュリティ上の理由から、主鍵を日常的に利用するのは避けるべきである。基本的に、主鍵は副鍵を保証するのだけに利用する。日常的に利用する署名や認証には、このあと作成する副鍵を利用する。これにより、情報漏洩時のリスクを軽減できる。&lt;/p&gt;
&lt;h3 id="副鍵の作成"&gt;
副鍵の作成&lt;a href="#%e5%89%af%e9%8d%b5%e3%81%ae%e4%bd%9c%e6%88%90"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;副鍵の作成方法は次のとおりである。まず、主鍵のIDを調べる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gpg --list-secret-keys --keyid-format LONG&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;すると、以下のような情報が表示される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;~$ gpg --list-secret-keys --keyid-format LONG
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/home/user/.gnupg/pubring.kbx
&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;sec ed25519/SYUKAGINOID YYYY-MM-DD &lt;span class="o"&gt;[&lt;/span&gt;C&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 1234567890ABCDEF1234567890ABCDEF12345678
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uid &lt;span class="o"&gt;[&lt;/span&gt; 究極 &lt;span class="o"&gt;]&lt;/span&gt; UserName &amp;lt;example@mail.com&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;この中で、&lt;code&gt;SYUKAGINOID&lt;/code&gt;が主鍵のIDである。このIDを使って副鍵を作成する。&lt;/p&gt;
&lt;p&gt;まず、次の&lt;code&gt;gpg&lt;/code&gt;コマンドを実行する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gpg --expert --edit-key &amp;lt;主鍵のID&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;すると、以下のようなプロンプトが表示される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gpg&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;このプロンプトで、&lt;code&gt;addkey&lt;/code&gt;コマンドを実行する。実行時のプロンプトは以下のようになる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gpg&amp;gt; addkey&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;addkey&lt;/code&gt;コマンドを実行すると、主鍵作成時と同様の質問が表示される。&lt;strong&gt;注意点として、GitHubの署名付きコミットを利用する場合、副鍵は署名(Signed)の機能を持つように作成しなければならない&lt;/strong&gt;。逆に言うと、署名の機能だけを持つ副鍵を作成すれば十分である。&lt;/p&gt;
&lt;p&gt;たとえば、以下の選択肢が表示され、&lt;code&gt;ECC&lt;/code&gt;の副鍵を作成する場合、署名の機能だけを持つ副鍵を作成するには&lt;code&gt;10&lt;/code&gt;を選択する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gpg&amp;gt; addkey
&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="o"&gt;(&lt;/span&gt;3&lt;span class="o"&gt;)&lt;/span&gt; DSA &lt;span class="o"&gt;(&lt;/span&gt;署名のみ&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;4&lt;span class="o"&gt;)&lt;/span&gt; RSA &lt;span class="o"&gt;(&lt;/span&gt;署名のみ&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;5&lt;span class="o"&gt;)&lt;/span&gt; Elgamal &lt;span class="o"&gt;(&lt;/span&gt;暗号化のみ&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;6&lt;span class="o"&gt;)&lt;/span&gt; RSA &lt;span class="o"&gt;(&lt;/span&gt;暗号化のみ&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;7&lt;span class="o"&gt;)&lt;/span&gt; DSA &lt;span class="o"&gt;(&lt;/span&gt;機能をあなた自身で設定&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;8&lt;span class="o"&gt;)&lt;/span&gt; RSA &lt;span class="o"&gt;(&lt;/span&gt;機能をあなた自身で設定&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;10&lt;span class="o"&gt;)&lt;/span&gt; ECC &lt;span class="o"&gt;(&lt;/span&gt;署名のみ&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;11&lt;span class="o"&gt;)&lt;/span&gt; ECC &lt;span class="o"&gt;(&lt;/span&gt;機能をあなた自身で設定&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;12&lt;span class="o"&gt;)&lt;/span&gt; ECC &lt;span class="o"&gt;(&lt;/span&gt;暗号化のみ&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;13&lt;span class="o"&gt;)&lt;/span&gt; 既存の鍵
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;14&lt;span class="o"&gt;)&lt;/span&gt; カードに存在する鍵
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;あなたの選択は? &lt;span class="m"&gt;10&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;質問に回答すると副鍵&lt;sup id="fnref:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt;が作成される。生成された副鍵は次のコマンドで確認できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gpg -k&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;たとえば、次のような情報が表示される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ gpg -k
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/home/user/.gnupg/pubring.kbx
&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;pub ed25519 YYYY-MM-DD &lt;span class="o"&gt;[&lt;/span&gt;C&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 1234567890ABCDEF1234567890ABCDEF12345678
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uid &lt;span class="o"&gt;[&lt;/span&gt; 究極 &lt;span class="o"&gt;]&lt;/span&gt; UserName &amp;lt;example@mail.com&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sub ed25519 YYYY-MM-DD &lt;span class="o"&gt;[&lt;/span&gt;S&lt;span class="o"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;この&lt;code&gt;sub&lt;/code&gt;に表示される情報が&lt;strong&gt;副鍵&lt;/strong&gt;である。&lt;strong&gt;副鍵の&lt;code&gt;[S]&lt;/code&gt;の表記は、副鍵に署名（Sign）の機能が付与されていることを示している&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="githubへのgpgキーの登録"&gt;
GitHubへのGPGキーの登録&lt;a href="#github%e3%81%b8%e3%81%aegpg%e3%82%ad%e3%83%bc%e3%81%ae%e7%99%bb%e9%8c%b2"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;鍵を生成したら、GitHubに公開鍵を登録する。まず、署名に利用する鍵のIDを確認する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gpg --list-secret-keys --keyid-format LONG&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;すると、以下のような情報が表示される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ gpg --list-secret-keys --keyid-format LONG
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/home/user/.gnupg/pubring.kbx
&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;sec ed25519/SYUKAGINOID YYYY-MM-DD &lt;span class="o"&gt;[&lt;/span&gt;C&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 1234567890ABCDEF1234567890ABCDEF12345678
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uid &lt;span class="o"&gt;[&lt;/span&gt; 究極 &lt;span class="o"&gt;]&lt;/span&gt; UserName &amp;lt;example@mail.com&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssb ed25519/FUKUKAGINOID YYYY-MM-DD &lt;span class="o"&gt;[&lt;/span&gt;S&lt;span class="o"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;この中で、&lt;code&gt;FUKUKAGINOID&lt;/code&gt;が署名に利用する鍵のIDである。このIDを使って公開鍵を取得する。公開鍵の情報は以下のコマンドで取得できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gpg --armor --export &amp;lt;key-id&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;たとえば、&lt;code&gt;FUKUKAGINOID&lt;/code&gt;の公開鍵を取得するには、次のコマンドを実行する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gpg --armor --export FUKUKAGINOID&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;すると、以下のような公開鍵が表示される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ gpg --armor --export FUKUKAGINOID
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-----BEGIN PGP PUBLIC KEY BLOCK-----
&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;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
&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;-----END PGP PUBLIC KEY BLOCK-----&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;この&lt;code&gt;-----BEGIN PGP PUBLIC KEY BLOCK-----&lt;/code&gt;から&lt;code&gt;-----END PGP PUBLIC KEY BLOCK-----&lt;/code&gt;までの部分が公開鍵である。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/settings/gpg/new" target="_blank" rel="noopener"
&gt;Add new GPG keys&lt;/a&gt;へアクセスし、上記の公開鍵をコピー&amp;amp;ペーストして登録する。&lt;strong&gt;&lt;code&gt;-----BEGIN PGP PUBLIC KEY BLOCK-----&lt;/code&gt;と&lt;code&gt;-----END PGP PUBLIC KEY BLOCK-----&lt;/code&gt;も含めてコピーすること&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;以上で、GitHubで書名付きコミットを利用するための設定が完了した。&lt;/p&gt;
&lt;h2 id="gitにおけるgpgキーの設定"&gt;
GitにおけるGPGキーの設定&lt;a href="#git%e3%81%ab%e3%81%8a%e3%81%91%e3%82%8bgpg%e3%82%ad%e3%83%bc%e3%81%ae%e8%a8%ad%e5%ae%9a"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;手元で&lt;code&gt;git commit&lt;/code&gt;する際に使うGPGキーを設定する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global user.signingkey &amp;lt;key-id&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;たとえば、今回は&lt;code&gt;FUKUKAGINOID&lt;/code&gt;を使うので、次のように設定する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global user.signingkey FUKUKAGINOID&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="書名付きコミットを試す"&gt;
書名付きコミットを試す&lt;a href="#%e6%9b%b8%e5%90%8d%e4%bb%98%e3%81%8d%e3%82%b3%e3%83%9f%e3%83%83%e3%83%88%e3%82%92%e8%a9%a6%e3%81%99"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;書名付きコミットをするには、3つの方法がある。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;コミット単位で書名付きコミットをする&lt;/li&gt;
&lt;li&gt;リポジトリ内のすべてのコミットを書名付きにする&lt;/li&gt;
&lt;li&gt;すべてのリポジトリで署名付きコミットをデフォルトにする&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="コミット単位で書名付きコミットをする"&gt;
コミット単位で書名付きコミットをする&lt;a href="#%e3%82%b3%e3%83%9f%e3%83%83%e3%83%88%e5%8d%98%e4%bd%8d%e3%81%a7%e6%9b%b8%e5%90%8d%e4%bb%98%e3%81%8d%e3%82%b3%e3%83%9f%e3%83%83%e3%83%88%e3%82%92%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;コミット単位で書名付きコミットをするには、&lt;code&gt;-S&lt;/code&gt;オプションを利用する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git commit -S -m &lt;span class="s2"&gt;&amp;#34;commit message&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="リポジトリ内のすべてのコミットを書名付きにする"&gt;
リポジトリ内のすべてのコミットを書名付きにする&lt;a href="#%e3%83%aa%e3%83%9d%e3%82%b8%e3%83%88%e3%83%aa%e5%86%85%e3%81%ae%e3%81%99%e3%81%b9%e3%81%a6%e3%81%ae%e3%82%b3%e3%83%9f%e3%83%83%e3%83%88%e3%82%92%e6%9b%b8%e5%90%8d%e4%bb%98%e3%81%8d%e3%81%ab%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;リポジトリ内のすべてのコミットを書名付きにするには、そのリポジトリのディレクトリ内で、Gitのlocalのconfigを変更する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config commit.gpgsign true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これにより、そのリポジトリでは、&lt;code&gt;-S&lt;/code&gt;オプションを付けずにコミットしても、署名付きコミットが行われる。&lt;/p&gt;
&lt;h3 id="すべてのリポジトリで署名付きコミットをデフォルトにする"&gt;
すべてのリポジトリで署名付きコミットをデフォルトにする&lt;a href="#%e3%81%99%e3%81%b9%e3%81%a6%e3%81%ae%e3%83%aa%e3%83%9d%e3%82%b8%e3%83%88%e3%83%aa%e3%81%a7%e7%bd%b2%e5%90%8d%e4%bb%98%e3%81%8d%e3%82%b3%e3%83%9f%e3%83%83%e3%83%88%e3%82%92%e3%83%87%e3%83%95%e3%82%a9%e3%83%ab%e3%83%88%e3%81%ab%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;すべてのリポジトリで署名付きコミットをデフォルトにするには、Gitのglobalのconfigを変更する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global commit.gpgsign true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これにより、すべてのリポジトリで、&lt;code&gt;-S&lt;/code&gt;オプションを付けずにコミットしても、署名付きコミットが行われる。&lt;/p&gt;
&lt;h2 id="署名付きコミットの確認"&gt;
署名付きコミットの確認&lt;a href="#%e7%bd%b2%e5%90%8d%e4%bb%98%e3%81%8d%e3%82%b3%e3%83%9f%e3%83%83%e3%83%88%e3%81%ae%e7%a2%ba%e8%aa%8d"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;署名付きコミットを確認するには、&lt;code&gt;git log&lt;/code&gt;コマンドを利用する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git log --show-signature&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;GitHub上だと、コミットの右側に&lt;code&gt;Verified&lt;/code&gt;と表示される。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/github-signed-commits-setup-guide/20240817142557.png"
width="573"
height="94"
srcset="https://notes.nakurei.com/post/github-signed-commits-setup-guide/20240817142557_hu_f8c20c98855948e1.png 480w, https://notes.nakurei.com/post/github-signed-commits-setup-guide/20240817142557_hu_8f8e62017f9abb41.png 1024w"
loading="lazy"
alt="GitHub上で書名付きコミットを確認"
class="gallery-image"
data-flex-grow="609"
data-flex-basis="1462px"
&gt;&lt;/p&gt;
&lt;h2 id="appendix--署名付きタグの設定"&gt;
Appendix | 署名付きタグの設定&lt;a href="#appendix--%e7%bd%b2%e5%90%8d%e4%bb%98%e3%81%8d%e3%82%bf%e3%82%b0%e3%81%ae%e8%a8%ad%e5%ae%9a"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;書名付きのタグも作成できる。署名付きタグを作成するには、&lt;code&gt;-s&lt;/code&gt;オプションを利用する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git tag -s &amp;lt;tag-name&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;git config&lt;/code&gt;の設定で、デフォルトでタグに署名をつけるように設定できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global tag.gpgsign true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://blog.livewing.net/gpg-life"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/ecd6ce9d1d93677c97e73ffd6614541fec907db4_hu_d2cc7ff684985ee6.webp"
alt="GPG で始める暗号・署名ライフ - blog.livewing.net image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
GPG で始める暗号・署名ライフ - blog.livewing.net
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;PGP (Pretty Good Privacy) の実装のひとつである GPG (GNU Privacy Guard) を使用して鍵を生成する方法をゼロから紹介します。 また、ファイルを暗号化・署名してやりとりする方法や、 Git のコミットに署名をつける方法、エンジニアフレンドリーなパスワードマネージャー Pass によるパスワード管理の方法なども紹介します。 メールでパスワードつき zip ...&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
blog.livewing.net
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://zenn.dev/murnana/scraps/77d52dbf9723c9"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/2116fb0d1bd64483ab4697ef77049b9666083768_hu_c699e040ee43f5db.webp"
alt="GPGキーの設定 (2023-10-13記録) image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
GPGキーの設定 (2023-10-13記録)
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;murnanaさんのスクラップ&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-8299b9ca5170247061175f654bfc883ff1cc2440.png"
style="margin-right: 2px;"
alt="zenn.dev favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
zenn.dev
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://zenn.dev/mtaku3/articles/07cfa52ab35d2f"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/24361f72a964819a58be5035f9734991e6774805_hu_d70d459527bedbb8.webp"
alt="Windows, WSL, DevContainerでコミットを署名する image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Windows, WSL, DevContainerでコミットを署名する
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-8299b9ca5170247061175f654bfc883ff1cc2440.png"
style="margin-right: 2px;"
alt="zenn.dev favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
zenn.dev
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://qiita.com/noraworld/items/43cd1dd8c28931a766c1"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/6014789e7596a3a252954e058cb010078a3cf20f_hu_961e194688134d6.webp"
alt="GitHub 上で表示されるコミットを署名付きにする方法 - Qiita image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
GitHub 上で表示されるコミットを署名付きにする方法 - Qiita
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;実現できること この記事の手順を実践すると、GitHub 上のコミット欄に "Verified" マークをつけることができる。 単にマークをつけられるだけでなく、そのコミットが本人のものであるということを証明することができる。つまり、コミットの偽装防止 ができる。 環...&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7dfa4a32e8b8dd3b8a6b654e1cd55932c6a19262.png"
style="margin-right: 2px;"
alt="qiita.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
qiita.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;長いほうがセキュリティ的に良い。&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;生成時の鍵の種類の選択によっては、主鍵と副鍵のペアで作成されることもある。たとえば、鍵の種類を&lt;code&gt;RSA と RSA (デフォルト)&lt;/code&gt;にした場合は、主鍵と副鍵のペアで作成される。&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;副鍵は主鍵に紐づいており、主鍵の証明書に副鍵の情報が含まれる。副鍵は主鍵によって署名されているため、副鍵が信頼できるかどうかは主鍵に依存する。&amp;#160;&lt;a href="#fnref:3" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>nuxt/eslint-configからESLint Moduleへ移行したときの手順メモ</title><link>https://notes.nakurei.com/post/migrate-nuxt-eslint-config-to-eslint-module/</link><pubDate>Sat, 29 Jun 2024 15:03:33 +0900</pubDate><guid>https://notes.nakurei.com/post/migrate-nuxt-eslint-config-to-eslint-module/</guid><description>&lt;img src="https://notes.nakurei.com/img/header/nuxt_full_logo.webp" alt="Featured image of post nuxt/eslint-configからESLint Moduleへ移行したときの手順メモ" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;@nuxt/eslint-config&lt;/code&gt;を用いた&lt;code&gt;eslintrc&lt;/code&gt;の設定から、&lt;a class="link" href="https://nuxt.com/modules/eslint" target="_blank" rel="noopener"
&gt;ESLint Module&lt;/a&gt;（&lt;code&gt;@nuxt/eslint&lt;/code&gt;）を用いた&lt;code&gt;ESLint flat config&lt;/code&gt;へ移行したときに取った手順のメモ。&lt;/p&gt;
&lt;h2 id="手順"&gt;
手順&lt;a href="#%e6%89%8b%e9%a0%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-eslintrccjsとeslintignoreを削除する"&gt;
1. &lt;code&gt;.eslintrc.cjs&lt;/code&gt;と&lt;code&gt;.eslintignore&lt;/code&gt;を削除する&lt;a href="#1-eslintrccjs%e3%81%a8eslintignore%e3%82%92%e5%89%8a%e9%99%a4%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Flat configでは&lt;code&gt;.eslintrc.cjs&lt;/code&gt;でなく&lt;code&gt;eslint.config.mjs&lt;/code&gt;を使う。そのため、&lt;code&gt;.eslintrc.cjs&lt;/code&gt;は削除する。&lt;/p&gt;
&lt;p&gt;Flat configでは&lt;code&gt;.eslintignore&lt;/code&gt;は廃止され、無視するファイルも&lt;code&gt;eslint.config.js&lt;/code&gt;に記述する。そのため、&lt;code&gt;.eslintignore&lt;/code&gt;も削除する。&lt;/p&gt;
&lt;h3 id="2-packagejsonからeslint関連のライブラリを削除する"&gt;
2. &lt;code&gt;package.json&lt;/code&gt;から、ESLint関連のライブラリを削除する&lt;a href="#2-packagejson%e3%81%8b%e3%82%89eslint%e9%96%a2%e9%80%a3%e3%81%ae%e3%83%a9%e3%82%a4%e3%83%96%e3%83%a9%e3%83%aa%e3%82%92%e5%89%8a%e9%99%a4%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;@nuxt/eslint-config&lt;/code&gt;と&lt;code&gt;eslint&lt;/code&gt;を削除する。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;eslint-config-prettier&lt;/code&gt;を入れている場合は、これも削除する。&lt;code&gt;@nuxt/eslint&lt;/code&gt;モジュールは、デフォルトではフォーマットを実行しないため、Prettierなど別のフォーマッタを使う場合でも競合を起こさない。&lt;/p&gt;
&lt;h3 id="3-nuxteslintモジュールをプロジェクトに追加する"&gt;
3. &lt;code&gt;@nuxt/eslint&lt;/code&gt;モジュールをプロジェクトに追加する&lt;a href="#3-nuxteslint%e3%83%a2%e3%82%b8%e3%83%a5%e3%83%bc%e3%83%ab%e3%82%92%e3%83%97%e3%83%ad%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%81%ab%e8%bf%bd%e5%8a%a0%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;下記コマンドで&lt;code&gt;@nuxt/eslint&lt;/code&gt;と&lt;code&gt;eslint&lt;/code&gt;を入れる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install --save-dev @nuxt/eslint eslint&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;nuxt.config.ts&lt;/code&gt;に&lt;code&gt;@nuxt/eslint&lt;/code&gt;モジュールを追加する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;nuxt.config.ts&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;// https://nuxt.com/docs/api/configuration/nuxt-config
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;export default defineNuxtConfig({
&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; modules: [
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;@nuxtjs/tailwindcss&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;@nuxtjs/color-mode&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;@nuxtjs/i18n&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ &amp;#34;@nuxt/eslint&amp;#34;,
&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;この状態で一度アプリを起動する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run dev&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;すると、自動で&lt;code&gt;eslint.config.mjs&lt;/code&gt;が生成される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;eslint.config.mjs&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// @ts-check
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;withNuxt&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;./.nuxt/eslint.config.mjs&amp;#39;&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="kr"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;withNuxt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Your custom configs here
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これでESLintが有効になる。
&lt;code&gt;eslint.config.mjs&lt;/code&gt;を編集することで独自のルールを設けられる。&lt;/p&gt;
&lt;h2 id="eslintconfigmjsを編集してルールを追加する"&gt;
&lt;code&gt;eslint.config.mjs&lt;/code&gt;を編集してルールを追加する&lt;a href="#eslintconfigmjs%e3%82%92%e7%b7%a8%e9%9b%86%e3%81%97%e3%81%a6%e3%83%ab%e3%83%bc%e3%83%ab%e3%82%92%e8%bf%bd%e5%8a%a0%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;eslint.config.mjs&lt;/code&gt;を編集することで、ルールを追加できる。例を次に示す。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;eslint.config.mjs&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// @ts-check
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;withNuxt&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;./.nuxt/eslint.config.mjs&amp;#39;&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="kr"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;withNuxt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;**/*.vue&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;**/*.ts&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;rules&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;no-console&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;warn&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;@typescript-eslint/no-explicit-any&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;error&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;@typescript-eslint/no-unused-vars&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;error&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;@typescript-eslint/typedef&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;error&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;**/*.vue&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;ignores&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;pages/**/*.vue&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;layouts/**/*.vue&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;rules&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;vue/multi-word-component-names&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;error&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;**/*.vue&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;rules&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;vue/no-multiple-template-root&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;error&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;vue/require-v-for-key&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;error&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;vue/no-use-v-if-with-v-for&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;error&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;vue/no-v-html&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;error&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;vue/require-default-prop&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;error&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="gitignoreに書かれたファイルを無視する"&gt;
&lt;code&gt;.gitignore&lt;/code&gt;に書かれたファイルを無視する&lt;a href="#gitignore%e3%81%ab%e6%9b%b8%e3%81%8b%e3%82%8c%e3%81%9f%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92%e7%84%a1%e8%a6%96%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;.eslintrc&lt;/code&gt;を利用していた場合は、&lt;code&gt;--ignore-path .gitignore&lt;/code&gt;オプションで、&lt;code&gt;.gitignore&lt;/code&gt;ファイルに書かれたファイルを無視できた。しかし、このオプションはESLint flat configには存在しないため、別途設定が必要になる。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.gitignore&lt;/code&gt;を追加する設定は&lt;a class="link" href="https://eslint.org/docs/latest/use/configure/ignore#including-gitignore-files" target="_blank" rel="noopener"
&gt;公式&lt;/a&gt;に記載されている。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://eslint.org/docs/latest/use/configure/ignore"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/8807488f294c01afe5f2a6c6fc6173fb66b3d72a_hu_355f50fd33ef5778.webp"
alt="Ignore Files - ESLint - Pluggable JavaScript Linter image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Ignore Files - ESLint - Pluggable JavaScript Linter
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-0235017548751e418cbadd62f239a7874814bfb9.png"
style="margin-right: 2px;"
alt="eslint.org favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
eslint.org
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;下記の記述は上記サイトのコードをそのまま引用したものである。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;eslint.config.mjs&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// eslint.config.js
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;includeIgnoreFile&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;@eslint/compat&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;node:path&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;fileURLToPath&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;node:url&amp;#34;&lt;/span&gt;&lt;span class="p"&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="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;__filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fileURLToPath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;import&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;__dirname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__filename&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;gitignorePath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;.gitignore&amp;#34;&lt;/span&gt;&lt;span class="p"&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="kr"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;includeIgnoreFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;gitignorePath&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// your overrides
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;];&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これをそのまま&lt;code&gt;eslint.config.mjs&lt;/code&gt;に追加すれば動作する。&lt;/p&gt;
&lt;p&gt;なお、&lt;code&gt;@eslint/compat&lt;/code&gt;は&lt;code&gt;npm&lt;/code&gt;でインストールする必要がある。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install @eslint/compat -D&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="appendix--eslint-stylisticを有効にする"&gt;
Appendix | ESLint Stylisticを有効にする&lt;a href="#appendix--eslint-stylistic%e3%82%92%e6%9c%89%e5%8a%b9%e3%81%ab%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;@nuxt/eslint&lt;/code&gt;モジュールは、デフォルトではフォーマットを実行しない。そのため、Prettierなど別のフォーマッタを使う場合は特に追加の設定は必要ない。&lt;/p&gt;
&lt;p&gt;ESLintには&lt;code&gt;ESLint Stylistic&lt;/code&gt;という機能があり、これを有効にすると、ESLintがフォーマットを実行する。&lt;/p&gt;
&lt;p&gt;ESLint Stylisticは、&lt;code&gt;nuxt.config.ts&lt;/code&gt;の&lt;code&gt;eslint&lt;/code&gt;モジュールのオプションで、&lt;code&gt;config.stylistic&lt;/code&gt;を&lt;code&gt;true&lt;/code&gt;に設定すると有効化できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;nuxt.config.ts&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;defineNuxtConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;eslint&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;stylistic&lt;/span&gt;: &lt;span class="kt"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ルールをカスタマイズする場合は、&lt;code&gt;stylistic&lt;/code&gt;オプションにルールを追加する。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://eslint.nuxt.com/packages/module"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/2e2c3df3debc235300ceaa1628fca498351a3ae4_hu_bbb491a47eaf7b07.webp"
alt="ESLint Module - Nuxt ESLint image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
ESLint Module - Nuxt ESLint
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;All-in-one ESLint integration for Nuxt. It generates a project-aware ESLint flat config and provides the ability to optionally run ESLint check along side the dev server.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-17aa6aefd53e412d98d86911fa9d67326fc97405.png"
style="margin-right: 2px;"
alt="eslint.nuxt.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
eslint.nuxt.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://qiita.com/yuki_s_14/items/96620ccfb1dd897ce9f3"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/4aa6353eb63fb3b87d3043a883fafb4eb415b121_hu_8328a46221d959d4.webp"
alt="【Nuxt3】簡単！@nuxt/eslintを使ったESLintとフォーマッタの設定 ※2024年版 - Qiita image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
【Nuxt3】簡単！@nuxt/eslintを使ったESLintとフォーマッタの設定 ※2024年版 - Qiita
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;閲覧頂き、ありがとうございます🙇 この記事は @nuxt/eslint を用いた、 ESLint と フォーマッタ の導入環境を作成していきます！ 前提 name version Nuxt.js(Vue.js) v3.x ESLint v8.x ...&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7dfa4a32e8b8dd3b8a6b654e1cd55932c6a19262.png"
style="margin-right: 2px;"
alt="qiita.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
qiita.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://zenn.dev/gerunda/articles/20240430-nuxt-eslint-flat-config-migration"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/726a006bf77f1fb9d2737234bd8c5a1bc04ecace_hu_f7238d47f64387b6.webp"
alt="Nuxt3で「eslintrcとprettier」から「flat configとeslint stylistic」へ移行した話 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Nuxt3で「eslintrcとprettier」から「flat configとeslint stylistic」へ移行した話
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-8299b9ca5170247061175f654bfc883ff1cc2440.png"
style="margin-right: 2px;"
alt="zenn.dev favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
zenn.dev
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://zenn.dev/babel/articles/eslint-flat-config-for-babel"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/6b8054b2ce010e988a03a5ca5fae871906c4dad9_hu_6c690ffaeb05934c.webp"
alt="Flat Config導入完了！　新しいESLintの設定フォーマットを使ってみた image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Flat Config導入完了！　新しいESLintの設定フォーマットを使ってみた
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-8299b9ca5170247061175f654bfc883ff1cc2440.png"
style="margin-right: 2px;"
alt="zenn.dev favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
zenn.dev
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>Gitのログの表示をカスタマイズする</title><link>https://notes.nakurei.com/post/git-log-customize/</link><pubDate>Fri, 21 Jun 2024 01:36:04 +0900</pubDate><guid>https://notes.nakurei.com/post/git-log-customize/</guid><description>&lt;img src="https://notes.nakurei.com/icons/brand-git.svg" alt="Featured image of post Gitのログの表示をカスタマイズする" /&gt;&lt;h2 id="gitのログのカスタマイズ"&gt;
Gitのログのカスタマイズ&lt;a href="#git%e3%81%ae%e3%83%ad%e3%82%b0%e3%81%ae%e3%82%ab%e3%82%b9%e3%82%bf%e3%83%9e%e3%82%a4%e3%82%ba"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Gitのログの表示はカスタマイズできる。たとえば、以下のようにエイリアスを設定すれば、&lt;code&gt;git logg&lt;/code&gt;と打つだけで、カスタマイズされたログを表示できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global alias.logg &lt;span class="s1"&gt;&amp;#39;log --graph --abbrev-commit --pretty=format:&amp;#34;%C(yellow)%h%C(reset) - %C(cyan)%ad%C(reset) %C(green)(%ar)%C(reset)%C(auto)%d%C(reset)%n %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%n&amp;#34;&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/git-log-customize/20240621014025.png"
width="1285"
height="421"
srcset="https://notes.nakurei.com/post/git-log-customize/20240621014025_hu_28e81d61ad92a1f0.png 480w, https://notes.nakurei.com/post/git-log-customize/20240621014025_hu_bddf357a649222fe.png 1024w"
loading="lazy"
alt="カスタマイズしたGit log"
class="gallery-image"
data-flex-grow="305"
data-flex-basis="732px"
&gt;&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://qiita.com/kawasaki_dev/items/41afaafe477b877b5b73"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/98f2dbf8e8196fb2757d1e2d8a9028c2520cd63c_hu_7a8091ec062fae96.webp"
alt="git logのオプションと綺麗にツリー表示するためのエイリアス - Qiita image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
git logのオプションと綺麗にツリー表示するためのエイリアス - Qiita
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;要旨 まず、git logコマンドの細かなオプションを説明します。 最終的に、以下のようなコミットツリーの表示するためのオプションの指定方法を例示します。 # `git log`とは gitで管理しているリポジトリがあるディレクトリで`git log`を叩くと過去のコ...&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7dfa4a32e8b8dd3b8a6b654e1cd55932c6a19262.png"
style="margin-right: 2px;"
alt="qiita.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
qiita.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://stackoverflow.com/questions/1057564/pretty-git-branch-graphs"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/b1995bdb4b881850f12db37016031f68948341e4_hu_e9e0c6470616eb54.webp"
alt="Pretty Git branch graphs image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Pretty Git branch graphs
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;I've seen some books and articles have some really pretty looking graphs of Git branches and commits. How can I make high-quality printable images of Git history?&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-ed6fec9f8f5309a9f43c1f4960ab21f735a49541.png"
style="margin-right: 2px;"
alt="stackoverflow.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
stackoverflow.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>シェルのclearコマンドについてのメモ</title><link>https://notes.nakurei.com/post/what-is-clear-command-in-shell/</link><pubDate>Sun, 16 Jun 2024 11:57:39 +0900</pubDate><guid>https://notes.nakurei.com/post/what-is-clear-command-in-shell/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;シェルの&lt;code&gt;clear&lt;/code&gt;コマンドについてのメモ。&lt;/p&gt;
&lt;h2 id="clear-コマンドとは"&gt;
&lt;code&gt;clear&lt;/code&gt; コマンドとは&lt;a href="#clear-%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89%e3%81%a8%e3%81%af"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;clear&lt;/code&gt; コマンドは、ターミナルの画面をクリアするコマンドである。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;clear&lt;/code&gt; コマンドを実行すると、ターミナルの画面がクリアされ、新しい画面が表示される。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Ctrl + L&lt;/code&gt;でも同様の効果がある。&lt;/p&gt;
&lt;h2 id="clear-コマンドの実装"&gt;
&lt;code&gt;clear&lt;/code&gt; コマンドの実装&lt;a href="#clear-%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89%e3%81%ae%e5%ae%9f%e8%a3%85"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;clear&lt;/code&gt; コマンドは、ANSIエスケープシーケンスを利用して、ターミナルの画面をクリアしている。&lt;/p&gt;
&lt;p&gt;たとえば、&lt;code&gt;clear&lt;/code&gt; コマンドを実行した結果をファイルにリダイレクトすると、ターミナルはクリアされない。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;clear &amp;gt; clear.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;代わりに、以下のような文字列が&lt;code&gt;clear.txt&lt;/code&gt;へ書き込まれる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-txt" data-lang="txt"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [H [2J [3J&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;この文字列は、ターミナルの画面をクリアするための特殊な文字列（ANSIエスケープシーケンス）である。ターミナルは、この文字列を「画面をクリアする指示」として解釈し、画面をクリアする。&lt;/p&gt;
&lt;p&gt;上記で四角になってしまっている部分は、&lt;code&gt;hexdump&lt;/code&gt;コマンド&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;で確認できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ clear &lt;span class="p"&gt;|&lt;/span&gt; hexdump -c
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;0000000&lt;/span&gt; &lt;span class="m"&gt;033&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; H &lt;span class="m"&gt;033&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt; J &lt;span class="m"&gt;033&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt; J
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;000000b&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;つまり、&lt;code&gt;clear&lt;/code&gt;コマンドは、ターミナルの画面をクリアするための特殊な文字列&lt;code&gt;&amp;quot;\033[H\033[2J\033[3J&amp;quot;&lt;/code&gt;をターミナルへ出力している。&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;&lt;code&gt;hexdump&lt;/code&gt;は、バイナリファイルを16進数で表示するコマンドである。&lt;code&gt;-c&lt;/code&gt;オプションを指定することで、ASCII文字として表示できる。&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>シェルとターミナルの違い</title><link>https://notes.nakurei.com/post/difference-between-shell-and-terminal/</link><pubDate>Sun, 16 Jun 2024 11:38:36 +0900</pubDate><guid>https://notes.nakurei.com/post/difference-between-shell-and-terminal/</guid><description>&lt;h2 id="シェルとは"&gt;
シェルとは&lt;a href="#%e3%82%b7%e3%82%a7%e3%83%ab%e3%81%a8%e3%81%af"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;シェルとは、コマンドを受け取り実行するプログラムである。&lt;/p&gt;
&lt;p&gt;シェルは、OSとユーザーの間に立つインターフェースである。ユーザーからコマンドを受け取り、それをOSに渡して実行する。シェルからOSにコマンドを渡す際は、OSの提供するシステムコールを利用する。&lt;/p&gt;
&lt;p&gt;つまり、&lt;strong&gt;シェルは、ユーザーが入力したコマンドを解釈し、それに対応するシステムコールを呼び出すプログラム&lt;/strong&gt;である。&lt;/p&gt;
&lt;h2 id="ターミナルとは"&gt;
ターミナルとは&lt;a href="#%e3%82%bf%e3%83%bc%e3%83%9f%e3%83%8a%e3%83%ab%e3%81%a8%e3%81%af"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ターミナルとは、シェルとユーザーの間のインターフェースとなるデバイスである。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ターミナル自身はコマンドの実行機能を持たない&lt;/strong&gt;。あくまでユーザーの入力をシェルに渡し、シェルからの出力をユーザーに表示する役割を持つデバイスである。&lt;/p&gt;
&lt;p&gt;昔はターミナルと呼ばれる物理的なデバイスを利用していたが、現在はターミナルエミュレータというソフトウェアを利用するのが一般的である。&lt;/p&gt;
&lt;h3 id="ターミナルの表示"&gt;
ターミナルの表示&lt;a href="#%e3%82%bf%e3%83%bc%e3%83%9f%e3%83%8a%e3%83%ab%e3%81%ae%e8%a1%a8%e7%a4%ba"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;シェルの出力はターミナルの機能で画面に表示される。そのため、ターミナルがシェルの出力をどう解釈するかによって、表示のされ方が異なる。&lt;/p&gt;
&lt;p&gt;たとえば、出力に&lt;code&gt;\n&lt;/code&gt;が含まれていると、大抵のシェルは改行する。これは、ターミナルが&lt;code&gt;\n&lt;/code&gt;を「改行」と解釈して表示するためである。&lt;/p&gt;
&lt;p&gt;細かいターミナル表示の制御をするために、ANSIエスケープシーケンスと呼ばれる特殊な文字列が存在する。これを利用することで、文字色や背景色の変更、カーソルの移動、画面のクリアなどが可能となる。&lt;/p&gt;</description></item><item><title>シェルがプロセスを実行するしくみ</title><link>https://notes.nakurei.com/post/shell-execution-mechanism/</link><pubDate>Tue, 11 Jun 2024 23:58:51 +0900</pubDate><guid>https://notes.nakurei.com/post/shell-execution-mechanism/</guid><description>&lt;h2 id="シェルはプロセスを直接実行しない"&gt;
シェルはプロセスを直接実行しない&lt;a href="#%e3%82%b7%e3%82%a7%e3%83%ab%e3%81%af%e3%83%97%e3%83%ad%e3%82%bb%e3%82%b9%e3%82%92%e7%9b%b4%e6%8e%a5%e5%ae%9f%e8%a1%8c%e3%81%97%e3%81%aa%e3%81%84"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;カーネル以外のプロセスは、新しくプロセスを実行できない&lt;/strong&gt;。そのため、シェルでプロセスを実行するためには、シ&lt;strong&gt;ェルからカーネルにプロセスの実行を依頼&lt;/strong&gt;しなければならない。&lt;/p&gt;
&lt;h2 id="カーネルへの依頼にはシステムコールを使う"&gt;
カーネルへの依頼にはシステムコールを使う&lt;a href="#%e3%82%ab%e3%83%bc%e3%83%8d%e3%83%ab%e3%81%b8%e3%81%ae%e4%be%9d%e9%a0%bc%e3%81%ab%e3%81%af%e3%82%b7%e3%82%b9%e3%83%86%e3%83%a0%e3%82%b3%e3%83%bc%e3%83%ab%e3%82%92%e4%bd%bf%e3%81%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;カーネルになにかの処理を依頼するためには、&lt;strong&gt;システムコール&lt;/strong&gt;を使う。システムコールは、ユーザプログラムがカーネルに処理を依頼するためのインターフェースである。&lt;/p&gt;
&lt;h2 id="シェルからカーネルへのプロセスの実行依頼"&gt;
シェルからカーネルへのプロセスの実行依頼&lt;a href="#%e3%82%b7%e3%82%a7%e3%83%ab%e3%81%8b%e3%82%89%e3%82%ab%e3%83%bc%e3%83%8d%e3%83%ab%e3%81%b8%e3%81%ae%e3%83%97%e3%83%ad%e3%82%bb%e3%82%b9%e3%81%ae%e5%ae%9f%e8%a1%8c%e4%be%9d%e9%a0%bc"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;シェルからカーネルへのプロセスの実行依頼は、&lt;strong&gt;&lt;code&gt;fork&lt;/code&gt;システムコールと&lt;code&gt;execve&lt;/code&gt;システムコール&lt;/strong&gt;を使って行う。なお、プログラミング言語からは、これらのシステムコールに対応するライブラリの関数を呼び出すことになる。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;fork&lt;/code&gt;システムコールを呼び出すと、カーネルは&lt;strong&gt;呼び出し元のプロセスのコピーを作成&lt;/strong&gt;し、新しいプロセスを生成する。この時点で生成されるプロセスは呼び出し元のコピーであるため、呼び出し元のプロセスと同じプログラムを実行する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;pid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fork&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;fork&lt;/code&gt;で生成したプロセスに新しいプログラムを実行させるには、&lt;code&gt;execve&lt;/code&gt;システムコールを呼び出す&lt;/strong&gt;。&lt;code&gt;execve&lt;/code&gt;システムコールでは、プログラムのパス名と引数を指定する。これを呼び出すと、プロセスのプログラムが指定したプログラムに置き換わる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;pid&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# Child process&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/bin/ls&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/bin/ls&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;-l&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="プロセスの入出力のリダイレクト"&gt;
プロセスの入出力のリダイレクト&lt;a href="#%e3%83%97%e3%83%ad%e3%82%bb%e3%82%b9%e3%81%ae%e5%85%a5%e5%87%ba%e5%8a%9b%e3%81%ae%e3%83%aa%e3%83%80%e3%82%a4%e3%83%ac%e3%82%af%e3%83%88"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;fork&lt;/code&gt;で複製された処理の標準入力・標準出力・標準エラー出力は、ファイルディスクリプタとして&lt;strong&gt;親プロセスから子プロセスへコピーされる&lt;/strong&gt;。これにより、親プロセスと子プロセスは独立して処理できる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;子プロセスのファイルディスクリプタをリダイレクト先に変更&lt;/strong&gt;することで、標準入力・標準出力・標準エラー出力をリダイレクトできる。&lt;/p&gt;
&lt;p&gt;ファイルディスクリプタの変更は、&lt;strong&gt;&lt;code&gt;dup2&lt;/code&gt;システムコール&lt;/strong&gt;を使って行う。&lt;code&gt;dup2&lt;/code&gt;システムコールは、指定したファイルディスクリプタを、指定したファイルディスクリプタ（の番号）へコピーする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="c1"&gt;# 標準入力をリダイレクト&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# stdin_fd: リダイレクト先のファイルディスクリプタ&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# sys.stdin.fileno(): 標準入力のファイルディスクリプタ&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dup2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stdin_fd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fileno&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="プロセスのパイプ"&gt;
プロセスのパイプ&lt;a href="#%e3%83%97%e3%83%ad%e3%82%bb%e3%82%b9%e3%81%ae%e3%83%91%e3%82%a4%e3%83%97"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;あるプロセスの出力を別のプロセスの入力につなぐことを&lt;strong&gt;パイプ&lt;/strong&gt;という。&lt;/p&gt;
&lt;p&gt;パイプは、&lt;strong&gt;&lt;code&gt;pipe&lt;/code&gt;システムコール&lt;/strong&gt;を使って作成する。&lt;code&gt;pipe&lt;/code&gt;システムコールを使うと、読み込み用と書き込み用の2つのファイルディスクリプタが生成される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;pipe_read&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pipe_write&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これらのファイルディスクリプタをパイプ前の出力とパイプ後の入力にリダイレクトすることで、パイプを実現できる。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
style="
display: flex;
align-items: center;
justify-content: center;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
cursor: not-allowed;
"
&gt;
&lt;div
style="
display: flex;
align-items: center;
justify-content: center;
height: 120px;
width: 120px;
max-width: 200px;
"
&gt;
&lt;img src="https://notes.nakurei.com/icons/link-off.svg" alt="No Image" width="100%" height="100%" style="object-fit: cover; margin: 0; flex-shrink: 0;"&gt;
&lt;/div&gt;
&lt;div
style="
display: flex;
flex-direction: column;
flex: 1 1 0%;
"
&gt;
&lt;div&gt;
www.udemy.com にアクセスできません
&lt;/div&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
"
&gt;
&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
www.udemy.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>シェルの出力をリダイレクトする方法</title><link>https://notes.nakurei.com/post/shell-redirect-note/</link><pubDate>Mon, 10 Jun 2024 13:42:22 +0900</pubDate><guid>https://notes.nakurei.com/post/shell-redirect-note/</guid><description>&lt;p&gt;シェルの出力をリダイレクトする方法のメモ。&lt;/p&gt;
&lt;h2 id="標準出力"&gt;
標準出力&lt;a href="#%e6%a8%99%e6%ba%96%e5%87%ba%e5%8a%9b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;標準出力とは、コマンドの実行結果のデフォルトの表示先である。標準出力は通常、端末（コンソール）である。&lt;/p&gt;
&lt;p&gt;たとえば、&lt;code&gt;echo&lt;/code&gt;コマンドを実行すると、標準出力に&lt;code&gt;Hello, World!&lt;/code&gt;という文字列が表示される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Hello, World!&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hello, World!&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="標準出力のリダイレクト"&gt;
標準出力のリダイレクト&lt;a href="#%e6%a8%99%e6%ba%96%e5%87%ba%e5%8a%9b%e3%81%ae%e3%83%aa%e3%83%80%e3%82%a4%e3%83%ac%e3%82%af%e3%83%88"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;シェルの標準出力をリダイレクトするには、次のように&lt;code&gt;&amp;gt;&lt;/code&gt;演算子を使う。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Hello, World!&amp;#34;&lt;/span&gt; &amp;gt; hello.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;上記のコマンドを実行すると、&lt;code&gt;hello.txt&lt;/code&gt;というファイルが作成され、その中に&lt;code&gt;Hello, World!&lt;/code&gt;という文字列が書き込まれる。&lt;/p&gt;
&lt;p&gt;この&lt;code&gt;&amp;gt;&lt;/code&gt;は、標準出力をリダイレクトする演算子である。&lt;code&gt;&amp;gt;&lt;/code&gt;の右側に指定されたファイルへ出力が書き込まれる。&lt;/p&gt;
&lt;h2 id="標準エラー出力"&gt;
標準エラー出力&lt;a href="#%e6%a8%99%e6%ba%96%e3%82%a8%e3%83%a9%e3%83%bc%e5%87%ba%e5%8a%9b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;標準エラー出力とは、コマンド実行時のエラーメッセージの、デフォルトの表示先である。標準エラー出力は通常、端末（コンソール）である。&lt;/p&gt;
&lt;p&gt;たとえば、存在しないファイルを&lt;code&gt;cat&lt;/code&gt;コマンドで表示しようとすると、標準エラー出力にエラーメッセージが表示される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat not_exist.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat: not_exist.txt: No such file or directory&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="標準エラー出力のリダイレクト"&gt;
標準エラー出力のリダイレクト&lt;a href="#%e6%a8%99%e6%ba%96%e3%82%a8%e3%83%a9%e3%83%bc%e5%87%ba%e5%8a%9b%e3%81%ae%e3%83%aa%e3%83%80%e3%82%a4%e3%83%ac%e3%82%af%e3%83%88"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;シェルの標準エラー出力をリダイレクトするには、次のように&lt;code&gt;2&amp;gt;&lt;/code&gt;演算子を使う。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat not_exist.txt 2&amp;gt; error.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;上記のコマンドを実行すると、&lt;code&gt;error.txt&lt;/code&gt;というファイルが作成され、その中にエラーメッセージが書き込まれる。&lt;/p&gt;
&lt;p&gt;この&lt;code&gt;2&amp;gt;&lt;/code&gt;は、標準エラー出力をリダイレクトする演算子である。&lt;code&gt;2&amp;gt;&lt;/code&gt;の右側に指定されたファイルへエラー出力が書き込まれる。&lt;/p&gt;
&lt;h2 id="標準出力と標準エラー出力を同時にリダイレクト"&gt;
標準出力と標準エラー出力を同時にリダイレクト&lt;a href="#%e6%a8%99%e6%ba%96%e5%87%ba%e5%8a%9b%e3%81%a8%e6%a8%99%e6%ba%96%e3%82%a8%e3%83%a9%e3%83%bc%e5%87%ba%e5%8a%9b%e3%82%92%e5%90%8c%e6%99%82%e3%81%ab%e3%83%aa%e3%83%80%e3%82%a4%e3%83%ac%e3%82%af%e3%83%88"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;標準出力と標準エラー出力を同時にリダイレクトするには、次のように&lt;code&gt;2&amp;gt;&amp;amp;1&lt;/code&gt;を使う。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat not_exist.txt &amp;gt; output.txt 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;上記のコマンドを実行すると、&lt;code&gt;output.txt&lt;/code&gt;というファイルが作成され、そこに出力とエラーメッセージが両方書き込まれる。&lt;/p&gt;
&lt;p&gt;この&lt;code&gt;2&amp;gt;&amp;amp;1&lt;/code&gt;は、標準エラー出力を標準出力にリダイレクトする演算子である。&lt;code&gt;2&amp;gt;&amp;amp;1&lt;/code&gt;と書くことで、標準エラー出力が標準出力と同じファイルに書き込まれる。&lt;/p&gt;
&lt;h2 id="標準入力"&gt;
標準入力&lt;a href="#%e6%a8%99%e6%ba%96%e5%85%a5%e5%8a%9b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;標準入力とは、コマンドの実行時に入力されるデータのデフォルトの取得先である。標準入力は通常、端末（キーボード）である。&lt;/p&gt;
&lt;p&gt;たとえば、&lt;code&gt;cat&lt;/code&gt;コマンドを実行すると、標準入力から入力されたデータが表示される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hello, World!
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hello, World!&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;上記のコマンドを実行すると、&lt;code&gt;Hello, World!&lt;/code&gt;という文字列を入力すると、その文字列が表示される。&lt;/p&gt;
&lt;h2 id="標準入力のリダイレクト"&gt;
標準入力のリダイレクト&lt;a href="#%e6%a8%99%e6%ba%96%e5%85%a5%e5%8a%9b%e3%81%ae%e3%83%aa%e3%83%80%e3%82%a4%e3%83%ac%e3%82%af%e3%83%88"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;シェルの標準入力をリダイレクトするには、次のように&lt;code&gt;&amp;lt;&lt;/code&gt;演算子を使う。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;lt; input.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;上記のコマンドを実行すると、&lt;code&gt;input.txt&lt;/code&gt;というファイルからデータを読み込み、それを&lt;code&gt;cat&lt;/code&gt;コマンドに渡す。&lt;/p&gt;
&lt;p&gt;この&lt;code&gt;&amp;lt;&lt;/code&gt;は、標準入力をリダイレクトする演算子である。&lt;code&gt;&amp;lt;&lt;/code&gt;の右側に指定されたファイルからデータを読み込み、それを標準入力としてコマンドに渡す。&lt;/p&gt;
&lt;h2 id="パイプ"&gt;
パイプ&lt;a href="#%e3%83%91%e3%82%a4%e3%83%97"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;パイプとは、コマンドの出力を別のコマンドの入力として渡す機能である。パイプは&lt;code&gt;|&lt;/code&gt;演算子を使って表現される。&lt;/p&gt;
&lt;p&gt;たとえば、&lt;code&gt;ls&lt;/code&gt;コマンドの出力を&lt;code&gt;grep&lt;/code&gt;コマンドに渡して、特定のファイルだけを表示する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ls &lt;span class="p"&gt;|&lt;/span&gt; grep .txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hello.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;input.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;output.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;上記のコマンドを実行すると、&lt;code&gt;ls&lt;/code&gt;コマンドの出力が&lt;code&gt;grep&lt;/code&gt;コマンドに渡され、&lt;code&gt;.txt&lt;/code&gt;という文字列を含むファイルだけが表示される。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;
まとめ&lt;a href="#%e3%81%be%e3%81%a8%e3%82%81"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;標準出力をリダイレクトするには、&lt;code&gt;&amp;gt;&lt;/code&gt;演算子を使う。&lt;/li&gt;
&lt;li&gt;標準エラー出力をリダイレクトするには、&lt;code&gt;2&amp;gt;&lt;/code&gt;演算子を使う。&lt;/li&gt;
&lt;li&gt;標準出力と標準エラー出力を同時にリダイレクトするには、&lt;code&gt;2&amp;gt;&amp;amp;1&lt;/code&gt;を使う。&lt;/li&gt;
&lt;li&gt;標準入力をリダイレクトするには、&lt;code&gt;&amp;lt;&lt;/code&gt;演算子を使う。&lt;/li&gt;
&lt;li&gt;パイプを使って、コマンドの出力を別のコマンドの入力として渡せる。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
style="
display: flex;
align-items: center;
justify-content: center;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
cursor: not-allowed;
"
&gt;
&lt;div
style="
display: flex;
align-items: center;
justify-content: center;
height: 120px;
width: 120px;
max-width: 200px;
"
&gt;
&lt;img src="https://notes.nakurei.com/icons/link-off.svg" alt="No Image" width="100%" height="100%" style="object-fit: cover; margin: 0; flex-shrink: 0;"&gt;
&lt;/div&gt;
&lt;div
style="
display: flex;
flex-direction: column;
flex: 1 1 0%;
"
&gt;
&lt;div&gt;
www.udemy.com にアクセスできません
&lt;/div&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
"
&gt;
&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
www.udemy.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>シェルのコマンドの種類についてのメモ</title><link>https://notes.nakurei.com/post/shell-command-type-memo/</link><pubDate>Sun, 09 Jun 2024 17:15:39 +0900</pubDate><guid>https://notes.nakurei.com/post/shell-command-type-memo/</guid><description>&lt;h2 id="シェルのコマンドは2種類ある"&gt;
シェルのコマンドは2種類ある&lt;a href="#%e3%82%b7%e3%82%a7%e3%83%ab%e3%81%ae%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89%e3%81%af2%e7%a8%ae%e9%a1%9e%e3%81%82%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;シェルのコマンドには、内部コマンド（組み込みコマンド）と外部コマンドがある。&lt;/p&gt;
&lt;p&gt;コマンドの種類は&lt;code&gt;type&lt;/code&gt;コマンドで確認できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;type&lt;/span&gt; &amp;lt;コマンド名&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="内部コマンド"&gt;
内部コマンド&lt;a href="#%e5%86%85%e9%83%a8%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;内部コマンドは、シェルの機能として実装されているコマンドである。たとえば、&lt;code&gt;cd&lt;/code&gt;, &lt;code&gt;echo&lt;/code&gt;, &lt;code&gt;pwd&lt;/code&gt;, &lt;code&gt;type&lt;/code&gt;などが該当する。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;cd&lt;/code&gt;コマンドが内部コマンドか&lt;code&gt;type&lt;/code&gt;コマンドで確認すると、以下のように表示される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; is a shell builtin&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これより、&lt;code&gt;cd&lt;/code&gt;コマンドはシェルの内部コマンドであるとわかる。&lt;/p&gt;
&lt;h2 id="外部コマンド"&gt;
外部コマンド&lt;a href="#%e5%a4%96%e9%83%a8%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;外部コマンドは、シェルの外部にあるプログラムファイルとして実装されているコマンドである。たとえば、&lt;code&gt;ls&lt;/code&gt;, &lt;code&gt;cat&lt;/code&gt;, &lt;code&gt;grep&lt;/code&gt;, &lt;code&gt;find&lt;/code&gt;などが該当する。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ls&lt;/code&gt;コマンドが外部コマンドか&lt;code&gt;type&lt;/code&gt;コマンドで確認すると、以下のように表示される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;type&lt;/span&gt; ls
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls is /usr/bin/ls&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これより、&lt;code&gt;ls&lt;/code&gt;コマンドはシェルの外部にあるプログラムファイル&lt;code&gt;/usr/bin/ls&lt;/code&gt;として実装されていることがわかる。つまり、&lt;code&gt;ls&lt;/code&gt;コマンドが実行されるとき、シェルは&lt;code&gt;/usr/bin/ls&lt;/code&gt;を実行する。&lt;/p&gt;
&lt;p&gt;入力されたコマンドが内部コマンドでない場合、シェルは&lt;code&gt;$PATH&lt;/code&gt;変数に設定されたディレクトリを順に検索し、最初に見つかったファイルを実行する。&lt;code&gt;$PATH&lt;/code&gt;変数に設定されたディレクトリは、&lt;code&gt;echo $PATH&lt;/code&gt;で確認できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$PATH&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/vscode/vscode-server/bin/linux-x64/89de5a8d4d6205e5b11647eb6a74844ca23d2573/bin/remote-cli:/usr/local/nvm/versions/node/v20.14.0/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;コロン区切りだと見づらいので、改行区切りで表示すると、次のようになる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$PATH&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tr &lt;span class="s1"&gt;&amp;#39;:&amp;#39;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;\n&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/vscode/vscode-server/bin/linux-x64/89de5a8d4d6205e5b11647eb6a74844ca23d2573/bin/remote-cli
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/usr/local/nvm/versions/node/v20.14.0/bin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/usr/local/bin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/usr/local/sbin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/usr/local/bin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/usr/sbin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/usr/bin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/sbin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/bin&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;シェルはこれらのディレクトリを順に検索し、最初に見つかったファイルを実行する。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
style="
display: flex;
align-items: center;
justify-content: center;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
cursor: not-allowed;
"
&gt;
&lt;div
style="
display: flex;
align-items: center;
justify-content: center;
height: 120px;
width: 120px;
max-width: 200px;
"
&gt;
&lt;img src="https://notes.nakurei.com/icons/link-off.svg" alt="No Image" width="100%" height="100%" style="object-fit: cover; margin: 0; flex-shrink: 0;"&gt;
&lt;/div&gt;
&lt;div
style="
display: flex;
flex-direction: column;
flex: 1 1 0%;
"
&gt;
&lt;div&gt;
www.udemy.com にアクセスできません
&lt;/div&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
"
&gt;
&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
www.udemy.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>Vue 3.4以降のカスタムコンポーネントでv-modelを双方向バインディングする</title><link>https://notes.nakurei.com/post/use-v-model-in-custom-component-with-vue/</link><pubDate>Sun, 31 Mar 2024 15:03:38 +0900</pubDate><guid>https://notes.nakurei.com/post/use-v-model-in-custom-component-with-vue/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Vue 3.4以降で、カスタムコンポーネントで&lt;code&gt;v-model&lt;/code&gt;を双方向バインディングして使えるようにする方法のメモ。&lt;/p&gt;
&lt;h2 id="方法"&gt;
方法&lt;a href="#%e6%96%b9%e6%b3%95"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Vue 3.4以前の場合は、&lt;code&gt;props&lt;/code&gt;と&lt;code&gt;emit&lt;/code&gt;を使って、&lt;code&gt;v-model&lt;/code&gt;の双方向バインディングを行っていた。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;Vue 3.4以前の方法&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-vue" data-lang="vue"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;defineProps&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;modelValue&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;emit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;defineEmits&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;update:modelValue&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;:value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;props.modelValue&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;@input&lt;/span&gt;&lt;span class="s"&gt;=&amp;#34;emit(&amp;#39;update:modelValue&amp;#39;, $event.target.value)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;しかし、Vue 3.4からは&lt;code&gt;defineModel()&lt;/code&gt;を使うことで、より簡単に双方向バインディングできる。&lt;/p&gt;
&lt;p&gt;例を以下にあげる。以下の例はテキスト入力コンポーネントである。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;InputText.vue&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-vue" data-lang="vue"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;:id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;v-model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;model&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;text&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;:placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;placeholder&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ts&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;defineModel&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;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="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Props&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;placeholder&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;withDefaults&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;defineProps&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;Props&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(),&lt;/span&gt; &lt;span class="p"&gt;{});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;const model = defineModel&amp;lt;string&amp;gt;();&lt;/code&gt;で作成した&lt;code&gt;model&lt;/code&gt;を、&lt;code&gt;v-model&lt;/code&gt;にバインドする。&lt;/p&gt;
&lt;p&gt;このコンポーネントを使うときは、次のようにする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;index.vue&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-vue" data-lang="vue"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;InputText&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;search&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;v-model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;searchQuery&amp;#34;&lt;/span&gt;&lt;span class="p"&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;:placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;入力してください&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ts&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;searchQuery&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;v-model&lt;/code&gt;に&lt;code&gt;searchQuery&lt;/code&gt;をバインドすることで、&lt;code&gt;InputText&lt;/code&gt;コンポーネントで入力した値が&lt;code&gt;searchQuery&lt;/code&gt;に反映される。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://vuejs.org/guide/components/v-model.html"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/be0d3144db1720b8b4e02acbbea273e73a8af748_hu_69d63edc284c4d44.webp"
alt="Vue.js image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Vue.js
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Vue.js - The Progressive JavaScript Framework&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-70354770873fdb2d1390e928daa394ea307e7712.png"
style="margin-right: 2px;"
alt="vuejs.org favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
vuejs.org
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>複数のリモートリポジトリへ同時にpushする</title><link>https://notes.nakurei.com/post/simultaneous-git-push-to-multiple-repositories/</link><pubDate>Fri, 29 Mar 2024 23:35:01 +0900</pubDate><guid>https://notes.nakurei.com/post/simultaneous-git-push-to-multiple-repositories/</guid><description>&lt;img src="https://notes.nakurei.com/icons/brand-git.svg" alt="Featured image of post 複数のリモートリポジトリへ同時にpushする" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;とある事情でGitLabとGitHubの2つのリモートリポジトリへ同時にpushすることになったので、そのときとった方法のメモ。&lt;/p&gt;
&lt;h2 id="注意"&gt;
注意&lt;a href="#%e6%b3%a8%e6%84%8f"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;この方法は&lt;code&gt;git push origin main&lt;/code&gt;で2つのリモートリポジトリへ同時にpushできる。しかし、&lt;code&gt;git fetch&lt;/code&gt;や&lt;code&gt;git pull&lt;/code&gt;できるのは1つ目に登録したリモートリポジトリだけである。そのため、登録順を考慮してリモートリポジトリを登録すること。&lt;/p&gt;
&lt;h2 id="方法"&gt;
方法&lt;a href="#%e6%96%b9%e6%b3%95"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;リモートリポジトリを異なる識別名で2つ登録してもよかったのだが、片方は開発目的ではなくWatching目的だったので、同じ識別名に2つのリモートリポジトリを登録した。&lt;/p&gt;
&lt;p&gt;まず。リモートリポジトリを登録する。すでに登録してあるなら不要。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git remote add origin https://primary-repo-url.git&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;次に、Watching用のリモートリポジトリを追加する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git remote set-url --add origin https://secondary-repo-url.git&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;すると、リモートリポジトリが2つ登録される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git remote -v
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;origin https://primary-repo-url.git &lt;span class="o"&gt;(&lt;/span&gt;fetch&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;origin https://primary-repo-url.git &lt;span class="o"&gt;(&lt;/span&gt;push&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;origin https://secondary-repo-url.git &lt;span class="o"&gt;(&lt;/span&gt;push&lt;span class="o"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;あとは、通常通り&lt;code&gt;git push origin main&lt;/code&gt;でpushする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git push origin main&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;すると、2つのリモートリポジトリへ同時にpushできる。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
style="
display: flex;
align-items: center;
justify-content: center;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px red;
border-radius: 0.5rem;
overflow: hidden;
cursor: not-allowed;
"
&gt;
&lt;p&gt;このサイトへのリンクはカード生成をスキップしています。&lt;/p&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>コマンドプロンプトで特定の日付以降に更新されたファイルを一覧表示するコマンド</title><link>https://notes.nakurei.com/post/listing-files-by-date-after-specific-date-cmd/</link><pubDate>Mon, 12 Feb 2024 09:00:00 +0900</pubDate><guid>https://notes.nakurei.com/post/listing-files-by-date-after-specific-date-cmd/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;コマンドプロンプトで特定の日付以降に更新されたファイルを一覧表示するコマンドのメモ。&lt;/p&gt;
&lt;h2 id="コマンド"&gt;
コマンド&lt;a href="#%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cmd" data-lang="cmd"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;forfiles /p &lt;span class="s2"&gt;&amp;#34;対象ディレクトリのパス&amp;#34;&lt;/span&gt; /s /m *.* /d +2024/02/10 /c &lt;span class="s2"&gt;&amp;#34;cmd /c echo @path&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/p &amp;quot;対象ディレクトリのパス&amp;quot;&lt;/code&gt; : 対象ディレクトリのパス&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/s&lt;/code&gt; : サブディレクトリも含めて検索&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/m *.*&lt;/code&gt; : ファイル名のパターン&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/d +2024/02/10&lt;/code&gt; : この日付以降に更新されたファイルを検索&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/c &amp;quot;cmd /c echo @path&amp;quot;&lt;/code&gt; : 検索結果のファイルパスを表示&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Nuxt3の環境にPrettierを導入する</title><link>https://notes.nakurei.com/post/nuxt3-prettier-setup-guide/</link><pubDate>Sat, 03 Feb 2024 13:53:40 +0900</pubDate><guid>https://notes.nakurei.com/post/nuxt3-prettier-setup-guide/</guid><description>&lt;img src="https://notes.nakurei.com/img/header/nuxt_full_logo.webp" alt="Featured image of post Nuxt3の環境にPrettierを導入する" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Nuxt.js 3の環境にPrettierを導入する方法のメモ。&lt;/p&gt;
&lt;h2 id="はじめに"&gt;
はじめに&lt;a href="#%e3%81%af%e3%81%98%e3%82%81%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;本記事の執筆時点では、&lt;a class="link" href="https://nuxt.com/docs/guide/concepts/code-style" target="_blank" rel="noopener"
&gt;Nuxt.jsのドキュメント&lt;/a&gt;によると、ESLintはフォーマットを実行しない。そのため、フォーマットのためには、後述するようにPrettierなどのツールを利用するよう書かれている。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;At the moment, this configuration will not format your files; you can set up Prettier or another tool to do so.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Prettierの利用については&lt;a class="link" href="https://github.com/nuxt/eslint-config/issues/224" target="_blank" rel="noopener"
&gt;ここ&lt;/a&gt;で議論されていたようだが、どうやらESLintでフォーマットまで行うのをやめたようだ。&lt;/p&gt;
&lt;h2 id="prettierの導入"&gt;
Prettierの導入&lt;a href="#prettier%e3%81%ae%e5%b0%8e%e5%85%a5"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;まず、Prettierをインストールする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install --save-dev prettier&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ESLintを導入している場合は、&lt;code&gt;prettier eslint-config-prettier&lt;/code&gt;も入れる。これは、Prettierと競合するESLintの設定を無効化するconfigである。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install --save-dev eslint-config-prettier&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;また、ESLintを導入している場合は、ESLintの設定ファイル&lt;code&gt;.eslintrc.cjs&lt;/code&gt;にPrettier用の設定を追加する。これを追加することで、ESLintとPrettierの住み分けができる。必ず&lt;code&gt;extends&lt;/code&gt;の&lt;strong&gt;一番最後&lt;/strong&gt;に入れる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.eslintrc.cjs&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;root&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;extends&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;@nuxt/eslint-config&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;prettier&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;次に、Prettierの設定ファイルである&lt;code&gt;.prettierrc.json&lt;/code&gt;を作成し、任意のオプションを設定する。設定できるオプションの詳細は&lt;a class="link" href="https://prettier.io/docs/en/options.html" target="_blank" rel="noopener"
&gt;Prettier公式&lt;/a&gt;を参照してほしい。下記に例を示す。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.prettierrc.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;printWidth&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;tabWidth&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;semi&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;singleQuote&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;vueIndentScriptAndStyle&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;その後、&lt;code&gt;package.json&lt;/code&gt;にフォーマット用のコマンドを追加する。下記では、&lt;code&gt;fix&lt;/code&gt;コマンドも追加し、ESLintと同時に実行できるようにしている。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;package.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;scripts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;format&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;prettier . --write&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;fix&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;eslint --fix --ignore-path .gitignore . &amp;amp;&amp;amp; prettier . --write&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これでPrettierによるフォーマットを実行できるはずなので、以下のコマンドを実行してみる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run format&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;自動修正もできるか確認する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run fix&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;VS Codeに&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode" target="_blank" rel="noopener"
&gt;Prettierの拡張機能&lt;/a&gt;をインストールし、以下のVS Codeの設定を追記すれば、ファイル保存時に自動でESLintを実行できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// formatter
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;editor.defaultFormatter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;esbenp.prettier-vscode&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;editor.formatOnSave&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;editor.formatOnPaste&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;editor.formatOnType&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ちなみにVS Codeの場合、Prettierを入れた直後はESLintとバッティングしてうまく動作しないことがある。その場合は、一度VS Codeを再起動する。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://nuxt.com/docs/guide/concepts/code-style"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/d712be85bf3fa0bb6b6561545cf19d817995c669_hu_4ac12656f92667b3.webp"
alt="Code Style · Nuxt Concepts v4 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Code Style · Nuxt Concepts v4
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Nuxt supports ESLint out of the box&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-99bde38c149c358b7dfab3b37e4fb64ec722c402.png"
style="margin-right: 2px;"
alt="nuxt.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
nuxt.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="http://notes.nakurei.com/post/create-nextjs-web-app-environment/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="Next.jsでWebアプリを作るときの環境構築手順メモ image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Next.jsでWebアプリを作るときの環境構築手順メモ
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
notes.nakurei.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>Next.js + Tailwind CSSで、 ちらつかないダークモードを実装する</title><link>https://notes.nakurei.com/post/nextjs-dark-mode-with-tailwind-css-and-next-themes/</link><pubDate>Sat, 20 Jan 2024 15:57:53 +0900</pubDate><guid>https://notes.nakurei.com/post/nextjs-dark-mode-with-tailwind-css-and-next-themes/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Next.js 14のApp Routerでダークモードを実装したときのメモ。
Tailwind CSSを利用。アプリはSSRでレンダリングする。&lt;/p&gt;
&lt;p&gt;下記のサイトをほぼそのまま実装した。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://github.com/vercel/next.js/discussions/47952"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/21bf67845d51496a3ec4d57ac61f454c641d7ab1_hu_81e481a51d5b2297.webp"
alt="App Directory dark mode with tailwindcss and SSR · vercel next.js · Discussion #47952 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
App Directory dark mode with tailwindcss and SSR · vercel next.js · Discussion #47952
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Dark mode in app dir with tailwindcss and SSR Get theme from cookies in main layout // app/layout.tsx export default function RootLayout({ children, }: { children: React.ReactNode }) { const theme ...&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-ffd1aa80239afc78c1628dfb5e08cff1205f22d5.png"
style="margin-right: 2px;"
alt="github.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
github.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;LocalStorageを利用すると、ページをリロードしたときにちらついてしまう。そのため、Cookieを利用する。&lt;/p&gt;
&lt;h2 id="手順"&gt;
手順&lt;a href="#%e6%89%8b%e9%a0%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="taiwindconfigjsの設定を変更する"&gt;
taiwind.config.jsの設定を変更する&lt;a href="#taiwindconfigjs%e3%81%ae%e8%a8%ad%e5%ae%9a%e3%82%92%e5%a4%89%e6%9b%b4%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;tailwind.config.js&lt;/code&gt;に&lt;code&gt;darkMode: 'class'&lt;/code&gt;を追加する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;tailwind.config.js&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;const config: Config = {
&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="gi"&gt;+ darkMode: &amp;#39;class&amp;#39;,
&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="cookieを取得する"&gt;
cookieを取得する&lt;a href="#cookie%e3%82%92%e5%8f%96%e5%be%97%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;app/layout.tsx&lt;/code&gt;でcookieから&lt;code&gt;theme&lt;/code&gt;の値を取得し、&lt;code&gt;html&lt;/code&gt;タグの&lt;code&gt;className&lt;/code&gt;に設定する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;app/layout.tsx&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-tsx" data-lang="tsx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;cookies&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;next/headers&amp;#39;&lt;/span&gt;&lt;span class="p"&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="kr"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;RootLayout&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Readonly&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;children&lt;/span&gt;: &lt;span class="kt"&gt;React.ReactNode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;cookies&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="kr"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;theme&amp;#39;&lt;/span&gt;&lt;span class="p"&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;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ja&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* ... */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="3-テーマを定義する"&gt;
3. テーマを定義する&lt;a href="#3-%e3%83%86%e3%83%bc%e3%83%9e%e3%82%92%e5%ae%9a%e7%be%a9%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;type&lt;/code&gt;としてテーマを定義する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;app/_types/theme.ts&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-tsx" data-lang="tsx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Theme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;Light&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;light&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;Dark&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;dark&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;as&lt;/span&gt; &lt;span class="kr"&gt;const&lt;/span&gt;&lt;span class="p"&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="kr"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Theme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;Theme&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="k"&gt;keyof&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;Theme&lt;/span&gt;&lt;span class="p"&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="kr"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;Theme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="4-テーマ切り替えボタンを実装する"&gt;
4. テーマ切り替えボタンを実装する&lt;a href="#4-%e3%83%86%e3%83%bc%e3%83%9e%e5%88%87%e3%82%8a%e6%9b%bf%e3%81%88%e3%83%9c%e3%82%bf%e3%83%b3%e3%82%92%e5%ae%9f%e8%a3%85%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;テーマを切り替えるためのボタンを実装する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;app/_components/ThemeSwitch.tsx&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-tsx" data-lang="tsx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;#39;use client&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;react&amp;#39;&lt;/span&gt;&lt;span class="p"&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="kr"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Theme&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;@/app/_types/theme&amp;#39;&lt;/span&gt;&lt;span class="p"&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="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;ThemeSwitchProps&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;theme&lt;/span&gt;: &lt;span class="kt"&gt;Theme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;className?&lt;/span&gt;: &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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="kr"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;ThemeSwitch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;: &lt;span class="kt"&gt;Readonly&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ThemeSwitchProps&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setTheme&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;Theme&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&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="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;toggleTheme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementsByTagName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;html&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toggle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Theme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Dark&lt;/span&gt;&lt;span class="p"&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;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Theme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Dark&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;setTheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Theme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Dark&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cookie&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sb"&gt;`theme=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;Theme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Dark&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;setTheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Theme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Light&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cookie&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sb"&gt;`theme=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;Theme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Light&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bg-gray-300 dark:bg-gray-700&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;toggleTheme&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nx"&gt;Theme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Light&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;Theme.Light&lt;/span&gt; : &lt;span class="kt"&gt;Theme.Dark&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="5-テーマ切り替えボタンを表示する"&gt;
5. テーマ切り替えボタンを表示する&lt;a href="#5-%e3%83%86%e3%83%bc%e3%83%9e%e5%88%87%e3%82%8a%e6%9b%bf%e3%81%88%e3%83%9c%e3%82%bf%e3%83%b3%e3%82%92%e8%a1%a8%e7%a4%ba%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ThemeSwitch&lt;/code&gt;を表示する。今回は&lt;code&gt;app/_components/MainHeader.tsx&lt;/code&gt;で表示する例を示すが、任意の場所で構わない。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;app/_components/MainHeader.tsx&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-tsx" data-lang="tsx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;cookies&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;next/headers&amp;#39;&lt;/span&gt;&lt;span class="p"&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="kr"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ThemeSwitch&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;./ThemeSwitch&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Theme&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;@/app/_types/theme&amp;#39;&lt;/span&gt;&lt;span class="p"&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="kr"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;MainHeader() {&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;cookies&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="kr"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;theme&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;Theme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Dark&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;Theme.Dark&lt;/span&gt; : &lt;span class="kt"&gt;Theme.Light&lt;/span&gt;&lt;span class="p"&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;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;header&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ThemeSwitch&lt;/span&gt; &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;header&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="6-テーマを切り替える"&gt;
6. テーマを切り替える&lt;a href="#6-%e3%83%86%e3%83%bc%e3%83%9e%e3%82%92%e5%88%87%e3%82%8a%e6%9b%bf%e3%81%88%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;テーマ切り替えボタンをクリックして、テーマが切り替わることを確認する。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://github.com/vercel/next.js/discussions/47952"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/21bf67845d51496a3ec4d57ac61f454c641d7ab1_hu_81e481a51d5b2297.webp"
alt="App Directory dark mode with tailwindcss and SSR · vercel next.js · Discussion #47952 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
App Directory dark mode with tailwindcss and SSR · vercel next.js · Discussion #47952
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Dark mode in app dir with tailwindcss and SSR Get theme from cookies in main layout // app/layout.tsx export default function RootLayout({ children, }: { children: React.ReactNode }) { const theme ...&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-ffd1aa80239afc78c1628dfb5e08cff1205f22d5.png"
style="margin-right: 2px;"
alt="github.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
github.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>Next.jsでWebアプリを作るときの環境構築手順メモ</title><link>https://notes.nakurei.com/post/create-nextjs-web-app-environment/</link><pubDate>Fri, 19 Jan 2024 10:42:44 +0900</pubDate><guid>https://notes.nakurei.com/post/create-nextjs-web-app-environment/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Next.js 15でWebアプリを作る環境構築をしたときの手順メモ。&lt;/p&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;WSL2 : Ubuntu-24.04&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Docker version 28.4.0&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;VS Code 1.105.0 x64&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Next.js 15.5.4&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TypeScript 5.9.3&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Prettier 3.6.2&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="vs-codeの改行設定を変更する"&gt;
VS Codeの改行設定を変更する&lt;a href="#vs-code%e3%81%ae%e6%94%b9%e8%a1%8c%e8%a8%ad%e5%ae%9a%e3%82%92%e5%a4%89%e6%9b%b4%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;VSCodeの改行の設定を、念のためLFにする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.vscode/settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;files.eol&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="dev-containersを用いたvs-code用開発環境を構築する"&gt;
Dev Containersを用いたVS Code用開発環境を構築する&lt;a href="#dev-containers%e3%82%92%e7%94%a8%e3%81%84%e3%81%9fvs-code%e7%94%a8%e9%96%8b%e7%99%ba%e7%92%b0%e5%a2%83%e3%82%92%e6%a7%8b%e7%af%89%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;VS Codeの拡張機能&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers" target="_blank" rel="noopener"
&gt;Dev Containers&lt;/a&gt;を使って環境を構築する。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.devcontainer&lt;/code&gt;ディレクトリを作成し、その中に&lt;code&gt;devcontainer.json&lt;/code&gt;と&lt;code&gt;Dockerfile&lt;/code&gt;、&lt;code&gt;compose.yaml&lt;/code&gt;を作成する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&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;└── .devcontainer/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── compose.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── devcontainer.json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── Dockerfile&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="composeyamlを作成する"&gt;
compose.yamlを作成する&lt;a href="#composeyaml%e3%82%92%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;compose.yaml&lt;/code&gt;は次のように記述する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.devcontainer/compose.yaml&lt;/div&gt;
&lt;div class="code-block-content"&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="nt"&gt;services&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;build&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;dockerfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;.devcontainer/Dockerfile&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;your-project-name&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;sleep infinity&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;logging&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;json-file&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;options&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;max-size&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;1m&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;max-file&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;3&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;../..:/workspaces:cached&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="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;~/.gnupg:/home/node/.gnupg&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;3050:3000&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;GPG_TTY=/dev/pts/0&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="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;TZ=Asia/Tokyo&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="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;LANG=ja_JP.UTF-8&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="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;LANGUAGE=ja_JP:jp&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="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;LC_ALL=ja_JP.UTF-8&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;your-project-name&lt;/code&gt;は任意のコンテナ名に変更する。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;3050:3000&lt;/code&gt;の&lt;code&gt;3050&lt;/code&gt;はホスト側のポート番号で、&lt;code&gt;3000&lt;/code&gt;はコンテナ側のポート番号である。&lt;code&gt;3050&lt;/code&gt;のほうは任意のポート番号に変更できるが、&lt;code&gt;3000&lt;/code&gt;はNext.jsのデフォルトポートなので変更しない。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TZ&lt;/code&gt;はタイムゾーン、&lt;code&gt;LANG&lt;/code&gt;、&lt;code&gt;LANGUAGE&lt;/code&gt;、&lt;code&gt;LC_ALL&lt;/code&gt;はロケール設定である。必要に応じて変更する。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="devcontainerjsonを作成する"&gt;
devcontainer.jsonを作成する&lt;a href="#devcontainerjson%e3%82%92%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;devcontainer.json&lt;/code&gt;は次のように記述する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.devcontainer/devcontainer.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;your-project-name&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;dockerComposeFile&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./compose.yaml&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;service&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;app&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;workspaceFolder&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/workspaces/${localWorkspaceFolderBasename}&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;customizations&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;vscode&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;extensions&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;dbaeumer.vscode-eslint&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;esbenp.prettier-vscode&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;bradlc.vscode-tailwindcss&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;formulahendry.auto-rename-tag&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;christian-kohler.path-intellisense&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;settings&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;editor.defaultFormatter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;esbenp.prettier-vscode&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;editor.formatOnSave&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;remoteUser&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;node&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;your-project-name&lt;/code&gt;は任意の名前に変更する。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;extensions&lt;/code&gt;は必須の拡張機能を指定する。必要に応じて変更する。ちなみに、必須でない拡張機能は&lt;code&gt;.vscode/extensions.json&lt;/code&gt;に記述するとよい。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="dockerfileを作成する"&gt;
Dockerfileを作成する&lt;a href="#dockerfile%e3%82%92%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Dockerfile&lt;/code&gt;は次のように記述する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.devcontainer/Dockerfile&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:22-bookworm&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Install additional tools and dependencies&lt;/span&gt;&lt;span class="err"&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;RUN&lt;/span&gt; apt-get update -y &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;DEBIAN_FRONTEND&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;noninteractive &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; apt-get install -y --no-install-recommends &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ca-certificates &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; curl &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; git &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gnupg &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; locales &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; openssh-client &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; tzdata &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; xsel &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; update-ca-certificates &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get clean &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; rm -rf /var/lib/apt/lists/*&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Set up available locales (can be controlled via compose.yaml)&lt;/span&gt;&lt;span class="err"&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;RUN&lt;/span&gt; locale-gen en_US.UTF-8 ja_JP.UTF-8 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; localedef -f UTF-8 -i en_US en_US.UTF-8 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; localedef -f UTF-8 -i ja_JP ja_JP.UTF-8&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Install global npm packages&lt;/span&gt;&lt;span class="err"&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;RUN&lt;/span&gt; npm install -g @anthropic-ai/claude-code&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Set working directory&lt;/span&gt;&lt;span class="err"&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;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/workspaces&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Expose Next.js default port&lt;/span&gt;&lt;span class="err"&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;EXPOSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;3000&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Switch to non-root user&lt;/span&gt;&lt;span class="err"&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;USER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Set default command&lt;/span&gt;&lt;span class="err"&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;CMD&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;bash&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;node:22-bookworm&lt;/code&gt;はNode.js 22のDockerイメージである。必要に応じて変更する。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;claude-code&lt;/code&gt;は必要に応じて削除する。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="dockerコンテナにアタッチする"&gt;
Dockerコンテナにアタッチする&lt;a href="#docker%e3%82%b3%e3%83%b3%e3%83%86%e3%83%8a%e3%81%ab%e3%82%a2%e3%82%bf%e3%83%83%e3%83%81%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;VSCodeの拡張機能&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers" target="_blank" rel="noopener"
&gt;Dev Containers&lt;/a&gt;を使って、Dockerfileをビルドし、Dockerコンテナにアタッチする。&lt;/p&gt;
&lt;p&gt;VS Codeで&lt;code&gt;Ctrl + Shift + P&lt;/code&gt;を押してコマンドパレットを開き、&lt;code&gt;Dev Containers: Reopen in Container&lt;/code&gt;を実行する。これにより、&lt;code&gt;Dockerfile&lt;/code&gt;がビルドされ、VS Codeがコンテナにアタッチされる。&lt;/p&gt;
&lt;h2 id="推奨拡張機能をインストールする"&gt;
推奨拡張機能をインストールする&lt;a href="#%e6%8e%a8%e5%a5%a8%e6%8b%a1%e5%bc%b5%e6%a9%9f%e8%83%bd%e3%82%92%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;VS Codeの拡張機能のタブで&lt;code&gt;@recommended&lt;/code&gt;と検索すると、&lt;code&gt;.vscode/extensions.json&lt;/code&gt;に記述した拡張機能が表示される。必要に応じて拡張機能をインストールする。&lt;/p&gt;
&lt;h2 id="git管理する"&gt;
Git管理する&lt;a href="#git%e7%ae%a1%e7%90%86%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;プロジェクトをgit管理下に置く。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git init&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;branch名をデフォルトで&lt;code&gt;main&lt;/code&gt;にしていない場合はwarningが出るので、&lt;code&gt;main&lt;/code&gt;にしておく。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git branch -m main&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="アプリを作成する"&gt;
アプリを作成する&lt;a href="#%e3%82%a2%e3%83%97%e3%83%aa%e3%82%92%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;コンテナ内でアプリ作成コマンドをたたく。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx create-next-app@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;create-next-app&lt;/code&gt;をインストールするか聞かれたら&lt;code&gt;y&lt;/code&gt;を入力してインストールする。
いろいろ聞かれるので、適宜プロジェクトに合わせて答える。&lt;/p&gt;
&lt;p&gt;出力結果の例を示す。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/create-nextjs-web-app-environment/20251013165633.png"
width="864"
height="203"
srcset="https://notes.nakurei.com/post/create-nextjs-web-app-environment/20251013165633_hu_d46213a8a8f8e0c8.png 480w, https://notes.nakurei.com/post/create-nextjs-web-app-environment/20251013165633_hu_ad8b3236f9cf2847.png 1024w"
loading="lazy"
alt="設定選択"
class="gallery-image"
data-flex-grow="425"
data-flex-basis="1021px"
&gt;&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;出力の詳細&lt;/summary&gt;
&lt;p&gt;&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ npx create-next-app@latest
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Need to install the following packages:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;create-next-app@15.5.4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Ok to proceed? &lt;span class="o"&gt;(&lt;/span&gt;y&lt;span class="o"&gt;)&lt;/span&gt; y
&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;✔ What is your project named? … next-app
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✔ Would you like to use TypeScript? … No / Yes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✔ Which linter would you like to use? › ESLint
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✔ Would you like to use Tailwind CSS? … No / Yes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✔ Would you like your code inside a &lt;span class="sb"&gt;`&lt;/span&gt;src/&lt;span class="sb"&gt;`&lt;/span&gt; directory? … No / Yes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✔ Would you like to use App Router? &lt;span class="o"&gt;(&lt;/span&gt;recommended&lt;span class="o"&gt;)&lt;/span&gt; … No / Yes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✔ Would you like to use Turbopack? &lt;span class="o"&gt;(&lt;/span&gt;recommended&lt;span class="o"&gt;)&lt;/span&gt; … No / Yes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✔ Would you like to customize the import &lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;@/*&lt;span class="sb"&gt;`&lt;/span&gt; by default&lt;span class="o"&gt;)&lt;/span&gt;? … No / Yes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Creating a new Next.js app in /workspaces/your-project-name/next-app.
&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;Using npm.
&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;Initializing project with template: app-tw
&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;Installing dependencies:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- react
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- react-dom
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- next
&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;Installing devDependencies:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- typescript
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- @types/node
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- @types/react
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- @types/react-dom
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- @tailwindcss/postcss
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- tailwindcss
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- eslint
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- eslint-config-next
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- @eslint/eslintrc
&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;added &lt;span class="m"&gt;332&lt;/span&gt; packages, and audited &lt;span class="m"&gt;333&lt;/span&gt; packages in 20s
&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="m"&gt;136&lt;/span&gt; packages are looking &lt;span class="k"&gt;for&lt;/span&gt; funding
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; run &lt;span class="sb"&gt;`&lt;/span&gt;npm fund&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; details
&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;found &lt;span class="m"&gt;0&lt;/span&gt; vulnerabilities
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Success! Created next-app at /workspaces/your-project-name/next-app&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="アプリを起動する"&gt;
アプリを起動する&lt;a href="#%e3%82%a2%e3%83%97%e3%83%aa%e3%82%92%e8%b5%b7%e5%8b%95%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;作成されたアプリディレクトリへ移動し、アプリを起動する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; next-app
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run dev&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a class="link" href="http://localhost:3050/" target="_blank" rel="noopener"
&gt;http://localhost:3050/&lt;/a&gt;にアクセスすると、Next.jsのデフォルトページが表示される。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/create-nextjs-web-app-environment/20251013165857.png"
width="1052"
height="504"
srcset="https://notes.nakurei.com/post/create-nextjs-web-app-environment/20251013165857_hu_be474b733fceb042.png 480w, https://notes.nakurei.com/post/create-nextjs-web-app-environment/20251013165857_hu_d32424fcbdf50ab0.png 1024w"
loading="lazy"
alt="デフォルトページ"
class="gallery-image"
data-flex-grow="208"
data-flex-basis="500px"
&gt;&lt;/p&gt;
&lt;h2 id="eslintのルールを変更する"&gt;
ESLintのルールを変更する&lt;a href="#eslint%e3%81%ae%e3%83%ab%e3%83%bc%e3%83%ab%e3%82%92%e5%a4%89%e6%9b%b4%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;必要に応じて、ESLintのルールを変更する。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://eslint.org/docs/latest/use/configure/configuration-files"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/8732506150339d5f5e697356562bc5ab3b484496_hu_55c22eaee5ecd4b2.webp"
alt="Configuration Files - ESLint - Pluggable JavaScript Linter image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Configuration Files - ESLint - Pluggable JavaScript Linter
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-0235017548751e418cbadd62f239a7874814bfb9.png"
style="margin-right: 2px;"
alt="eslint.org favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
eslint.org
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;変更したら、ESLintを実行して動作を確認する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run lint&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="prettierを入れる"&gt;
Prettierを入れる&lt;a href="#prettier%e3%82%92%e5%85%a5%e3%82%8c%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;FormatterとしてPrettierを入れる。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://nextjs.org/docs/app/api-reference/config/eslint"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/0285e00ed79df33086b8f8003c55816a87557b79_hu_e4aeb997ae9796d4.webp"
alt="Configuration: ESLint | Next.js image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Configuration: ESLint | Next.js
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Learn how to use and configure the ESLint plugin to catch common issues and problems in a Next.js application.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-2e6a38d9fd715661dc4cca7ae68c7135876852fe.png"
style="margin-right: 2px;"
alt="nextjs.org favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
nextjs.org
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;パッケージをインストールする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install --save-dev prettier eslint-config-prettier&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Prettierの設定ファイル&lt;code&gt;.prettierrc.yaml&lt;/code&gt;を作る。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.prettierrc.yaml&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;&amp;#39;semi&amp;#39;:&lt;/span&gt; &lt;span class="err"&gt;true,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;&amp;#39;trailingComma&amp;#39;:&lt;/span&gt; &lt;span class="err"&gt;&amp;#39;all&amp;#39;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;&amp;#39;singleQuote&amp;#39;:&lt;/span&gt; &lt;span class="err"&gt;true,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;&amp;#39;printWidth&amp;#39;:&lt;/span&gt; &lt;span class="err"&gt;80,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;&amp;#39;tabWidth&amp;#39;:&lt;/span&gt; &lt;span class="err"&gt;2,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;eslint.config.mjs&lt;/code&gt;にPrettierの設定を追加する。必ず最後に追加する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;eslint.config.mjs&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&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;const eslintConfig = [
&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="gd"&gt;- ...compat.extends(&amp;#39;next/core-web-vitals&amp;#39;, &amp;#39;next/typescript&amp;#39;),
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ ...compat.extends(&amp;#39;next/core-web-vitals&amp;#39;, &amp;#39;next/typescript&amp;#39;, &amp;#39;prettier&amp;#39;),
&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;export default eslintConfig;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;package.json&lt;/code&gt;に&lt;code&gt;format&lt;/code&gt;コマンドを追加する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;package.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;scripts&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;dev&amp;#34;: &amp;#34;next dev&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;build&amp;#34;: &amp;#34;next build&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;start&amp;#34;: &amp;#34;next start&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;lint&amp;#34;: &amp;#34;next lint --ignore-path .gitignore&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ &amp;#34;format&amp;#34;: &amp;#34;prettier --write --ignore-path .gitignore .&amp;#34;
&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Prettierを実行して動作を確認する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run format&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="コミット時にlinterとformatterを自動実行する"&gt;
コミット時にlinterとformatterを自動実行する&lt;a href="#%e3%82%b3%e3%83%9f%e3%83%83%e3%83%88%e6%99%82%e3%81%ablinter%e3%81%a8formatter%e3%82%92%e8%87%aa%e5%8b%95%e5%ae%9f%e8%a1%8c%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;コミット時に&lt;code&gt;npm run lint&lt;/code&gt;と&lt;code&gt;npm run format&lt;/code&gt;を実行し、エラーが出る場合はコミットできないようにする。&lt;/p&gt;
&lt;p&gt;まず、&lt;code&gt;husky&lt;/code&gt;をインストールする。&lt;/p&gt;
&lt;style&gt;
:root {
--uni-warning-bg-color: #fae287;
--uni-warning-line-color: #544600;
}
:root[data-scheme='dark'] {
--uni-warning-bg-color: #544600;
--uni-warning-line-color: #fae287;
}
.block-highlight-warning {
display: flex;
align-items: center;
justify-content: first baseline;
height: 100%;
width: 100%;
padding: 1em;
margin: 1em 0;
border-left: 5px solid var(--uni-warning-line-color);
background-color: var(--uni-warning-bg-color);
border-radius: 0.5rem;
overflow: hidden;
color: var(--card-text-color-main);
line-height: 1.5;
}
.icon-warning {
display: inline-flex;
align-items: center;
vertical-align: middle;
}
.icon-warning svg {
vertical-align: baseline;
width: 1.5em;
height: 1.5em;
stroke-width: 1.5;
flex-shrink: 0;
}
&lt;/style&gt;
&lt;div class="block-highlight-warning"&gt;
&lt;span class="icon-warning"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-alert-triangle" width="44" height="44" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"&gt;
&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;
&lt;path d="M12 9v2m0 4v.01" /&gt;
&lt;path d="M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75" /&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span&gt;注意点として、Huskyは.gitディレクトリと同じ階層にインストールする必要がある。&lt;/span&gt;
&lt;/div&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install --save-dev husky&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;次に、&lt;code&gt;husky-init&lt;/code&gt;コマンドを実行する。&lt;/p&gt;
&lt;style&gt;
:root {
--uni-warning-bg-color: #fae287;
--uni-warning-line-color: #544600;
}
:root[data-scheme='dark'] {
--uni-warning-bg-color: #544600;
--uni-warning-line-color: #fae287;
}
.block-highlight-warning {
display: flex;
align-items: center;
justify-content: first baseline;
height: 100%;
width: 100%;
padding: 1em;
margin: 1em 0;
border-left: 5px solid var(--uni-warning-line-color);
background-color: var(--uni-warning-bg-color);
border-radius: 0.5rem;
overflow: hidden;
color: var(--card-text-color-main);
line-height: 1.5;
}
.icon-warning {
display: inline-flex;
align-items: center;
vertical-align: middle;
}
.icon-warning svg {
vertical-align: baseline;
width: 1.5em;
height: 1.5em;
stroke-width: 1.5;
flex-shrink: 0;
}
&lt;/style&gt;
&lt;div class="block-highlight-warning"&gt;
&lt;span class="icon-warning"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-alert-triangle" width="44" height="44" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"&gt;
&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;
&lt;path d="M12 9v2m0 4v.01" /&gt;
&lt;path d="M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75" /&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span&gt;このコマンドは環境により異なるため、実行するコマンドの詳細はhuskyの公式サイトを必ず参照すること。&lt;/span&gt;
&lt;/div&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://typicode.github.io/husky/get-started.html"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="Get started | Husky image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Get started | Husky
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Git hooks made easy&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
typicode.github.io
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx husky init&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div
style="
display: flex;
align-items: center;
justify-content: center;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
cursor: not-allowed;
"&gt;
&lt;div&gt;typicode.github.io にアクセスできません&lt;/div&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;成功すると、&lt;code&gt;.husky&lt;/code&gt;ディレクトリが生成され、自動で&lt;code&gt;pre-commit&lt;/code&gt;フックが追加される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat .husky/pre-commit
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm test&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これを、&lt;code&gt;npx lint-staged&lt;/code&gt;を実行するように変更する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat .husky/pre-commit
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx lint-staged&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;details&gt;
&lt;summary&gt;特殊な環境でのhuskyのpre-commitフックの変更について&lt;/summary&gt;
&lt;p&gt;&lt;p&gt;&lt;code&gt;.git&lt;/code&gt;ディレクトリと&lt;code&gt;package.json&lt;/code&gt;ファイルが同じ階層に存在しない場合、下記のように、階層を移動するコマンドを追加する必要がある。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.husky/pre-commit&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ cd next-app # package.jsonのある階層に移動する
&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;npx lint-staged
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;ここまでで、huskyの設定は完了である。&lt;/p&gt;
&lt;p&gt;次に、&lt;code&gt;lint-staged&lt;/code&gt;をインストールする。&lt;/p&gt;
&lt;style&gt;
:root {
--uni-warning-bg-color: #fae287;
--uni-warning-line-color: #544600;
}
:root[data-scheme='dark'] {
--uni-warning-bg-color: #544600;
--uni-warning-line-color: #fae287;
}
.block-highlight-warning {
display: flex;
align-items: center;
justify-content: first baseline;
height: 100%;
width: 100%;
padding: 1em;
margin: 1em 0;
border-left: 5px solid var(--uni-warning-line-color);
background-color: var(--uni-warning-bg-color);
border-radius: 0.5rem;
overflow: hidden;
color: var(--card-text-color-main);
line-height: 1.5;
}
.icon-warning {
display: inline-flex;
align-items: center;
vertical-align: middle;
}
.icon-warning svg {
vertical-align: baseline;
width: 1.5em;
height: 1.5em;
stroke-width: 1.5;
flex-shrink: 0;
}
&lt;/style&gt;
&lt;div class="block-highlight-warning"&gt;
&lt;span class="icon-warning"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-alert-triangle" width="44" height="44" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"&gt;
&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;
&lt;path d="M12 9v2m0 4v.01" /&gt;
&lt;path d="M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75" /&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span&gt;&lt;code&gt;lint-staged&lt;/code&gt;はNext.jsのアプリプロジェクト内へインストールすること。&lt;/span&gt;
&lt;/div&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install --save-dev lint-staged&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;package.json&lt;/code&gt;に&lt;code&gt;lint-staged&lt;/code&gt;の設定を追加する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;package.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;scripts&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;dev&amp;#34;: &amp;#34;next dev --turbopack&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;build&amp;#34;: &amp;#34;next build --turbopack&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;start&amp;#34;: &amp;#34;next start&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;lint&amp;#34;: &amp;#34;eslint&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;format&amp;#34;: &amp;#34;prettier --write --ignore-path .gitignore .&amp;#34;
&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="gi"&gt;+ &amp;#34;lint-staged&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ &amp;#34;*.{js,jsx,ts,tsx,json,css,md}&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ &amp;#34;npm run format&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ &amp;#34;npm run lint&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ ]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ },
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;以上までの設定で、コミット時にlinterとformatterが自動で実行され、通らない場合はコミットできなくなる。&lt;/p&gt;
&lt;h2 id="コミットメッセージを自動チェックして統一する"&gt;
コミットメッセージを自動チェックして統一する&lt;a href="#%e3%82%b3%e3%83%9f%e3%83%83%e3%83%88%e3%83%a1%e3%83%83%e3%82%bb%e3%83%bc%e3%82%b8%e3%82%92%e8%87%aa%e5%8b%95%e3%83%81%e3%82%a7%e3%83%83%e3%82%af%e3%81%97%e3%81%a6%e7%b5%b1%e4%b8%80%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;コミットメッセージのフォーマットを統一するため、commitlintを入れる。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://commitlint.js.org/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="commitlint image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
commitlint
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Lint commit messages&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-3d0f588bfadd8e305439712c4035c5d457749d4b.png"
style="margin-right: 2px;"
alt="commitlint.js.org favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
commitlint.js.org
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;まず、&lt;code&gt;commitlint&lt;/code&gt;を入れる。&lt;/p&gt;
&lt;style&gt;
:root {
--uni-warning-bg-color: #fae287;
--uni-warning-line-color: #544600;
}
:root[data-scheme='dark'] {
--uni-warning-bg-color: #544600;
--uni-warning-line-color: #fae287;
}
.block-highlight-warning {
display: flex;
align-items: center;
justify-content: first baseline;
height: 100%;
width: 100%;
padding: 1em;
margin: 1em 0;
border-left: 5px solid var(--uni-warning-line-color);
background-color: var(--uni-warning-bg-color);
border-radius: 0.5rem;
overflow: hidden;
color: var(--card-text-color-main);
line-height: 1.5;
}
.icon-warning {
display: inline-flex;
align-items: center;
vertical-align: middle;
}
.icon-warning svg {
vertical-align: baseline;
width: 1.5em;
height: 1.5em;
stroke-width: 1.5;
flex-shrink: 0;
}
&lt;/style&gt;
&lt;div class="block-highlight-warning"&gt;
&lt;span class="icon-warning"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-alert-triangle" width="44" height="44" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"&gt;
&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;
&lt;path d="M12 9v2m0 4v.01" /&gt;
&lt;path d="M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75" /&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span&gt;注意点として、commitlintは.gitディレクトリと同じ階層にインストールする。&lt;/span&gt;
&lt;/div&gt;
&lt;style&gt;
:root {
--uni-warning-bg-color: #fae287;
--uni-warning-line-color: #544600;
}
:root[data-scheme='dark'] {
--uni-warning-bg-color: #544600;
--uni-warning-line-color: #fae287;
}
.block-highlight-warning {
display: flex;
align-items: center;
justify-content: first baseline;
height: 100%;
width: 100%;
padding: 1em;
margin: 1em 0;
border-left: 5px solid var(--uni-warning-line-color);
background-color: var(--uni-warning-bg-color);
border-radius: 0.5rem;
overflow: hidden;
color: var(--card-text-color-main);
line-height: 1.5;
}
.icon-warning {
display: inline-flex;
align-items: center;
vertical-align: middle;
}
.icon-warning svg {
vertical-align: baseline;
width: 1.5em;
height: 1.5em;
stroke-width: 1.5;
flex-shrink: 0;
}
&lt;/style&gt;
&lt;div class="block-highlight-warning"&gt;
&lt;span class="icon-warning"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-alert-triangle" width="44" height="44" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"&gt;
&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;
&lt;path d="M12 9v2m0 4v.01" /&gt;
&lt;path d="M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75" /&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span&gt;コマンドは上記リンク先を参照すること。下記は一例である。&lt;/span&gt;
&lt;/div&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install -D @commitlint/cli @commitlint/config-conventional&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;次に、下記のコマンドを実行して&lt;code&gt;commitlint.config.js&lt;/code&gt;を作成する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;export default { extends: [&amp;#39;@commitlint/config-conventional&amp;#39;] };&amp;#34;&lt;/span&gt; &amp;gt; commitlint.config.js&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;作成された&lt;code&gt;commitlint.config.js&lt;/code&gt;は以下のようになる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;commitlint.config.js&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="kr"&gt;extends&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;@commitlint/config-conventional&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;以上で&lt;code&gt;commitlint&lt;/code&gt;が動作するようになった。実行されるか確認する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx commitlint --from HEAD~1 --to HEAD --verbose&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;実行されれば、下記のようなログが出力される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;commitlintの実行結果&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ npx commitlint --from HEAD~1 --to HEAD --verbose
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;⧗ input: build&lt;span class="o"&gt;(&lt;/span&gt;git&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nb"&gt;set&lt;/span&gt; up husky and lint-staged pre-commit
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✔ found &lt;span class="m"&gt;0&lt;/span&gt; problems, &lt;span class="m"&gt;0&lt;/span&gt; warnings&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;続いて、コミット時に&lt;code&gt;commitlint&lt;/code&gt;を自動実行するように設定する。下記のコマンドを実行して、&lt;code&gt;husky&lt;/code&gt;に&lt;code&gt;commitlint&lt;/code&gt;を自動実行する&lt;code&gt;commit-msg&lt;/code&gt;フックを追加する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;npx --no -- commitlint --edit \${1}&amp;#34;&lt;/span&gt; &amp;gt; .husky/commit-msg&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これにより、&lt;code&gt;.husky/commit-msg&lt;/code&gt;ファイルが作成される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.husky/commit-msg&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx --no -- commitlint --edit &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これで、コミット時にcommitlintが実行されるようになる。&lt;/p&gt;
&lt;p&gt;最後に、commitlintのルールを変更する。commitlintのルールは、&lt;code&gt;commitlint.config.js&lt;/code&gt;にルールを追記することで変更できる。&lt;/p&gt;
&lt;p&gt;たとえば、&lt;code&gt;subject-max-length&lt;/code&gt;を&lt;code&gt;50&lt;/code&gt;に変更する場合は、下記のようにルールを追記する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;commitlint.config.js&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;module.exports = {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; extends: [&amp;#39;@commitlint/config-conventional&amp;#39;],
&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="gi"&gt;+ rules: {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ &amp;#39;subject-max-length&amp;#39;: [2, &amp;#39;always&amp;#39;, 50],
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://qiita.com/ybiquitous/items/74225bc4bf0a9ddcd7dd"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/a743dce08fffe01508822bd003c64d212d698340_hu_a52ea244f915c676.webp"
alt="commitlint の紹介 - Qiita image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
commitlint の紹介 - Qiita
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;commitlint というツールをご紹介します。 commitlint とは、Git のコミット規約（commit convention）に従わせるための npm ツールです。ESLint のように、ルールを JavaScript で設定・開発できます。 com...&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7dfa4a32e8b8dd3b8a6b654e1cd55932c6a19262.png"
style="margin-right: 2px;"
alt="qiita.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
qiita.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;ルールは、&lt;code&gt;{ルール名}: [{レベル:0|1|2}, '{可否:always|never}', {値}]&lt;/code&gt;の形式で記述する。レベルは各数値が下記段階に該当する。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;0: 無効&lt;/li&gt;
&lt;li&gt;1: 警告&lt;/li&gt;
&lt;li&gt;2: エラー&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;オレオレルールを下記に示す。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;commitlint.config.js&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;extends&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;@commitlint/config-conventional&amp;#39;&lt;/span&gt;&lt;span class="p"&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="nx"&gt;rules&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;type-case&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;always&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;lower-case&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;scope-case&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;always&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;lower-case&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;subject-max-length&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;always&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;body-full-stop&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;always&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;body-leading-blank&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;always&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;body-max-line-length&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;always&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;72&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;body-case&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;always&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;sentence-case&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;footer-leading-blank&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;always&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;footer-max-line-length&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;always&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;72&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;参考文献・URLは適宜記事内に示した。&lt;/p&gt;</description></item><item><title>Cocktail Sort</title><link>https://notes.nakurei.com/post/cocktail-sort/</link><pubDate>Sun, 24 Dec 2023 11:23:08 +0900</pubDate><guid>https://notes.nakurei.com/post/cocktail-sort/</guid><description>&lt;h2 id="cocktail-sortとは"&gt;
Cocktail Sortとは&lt;a href="#cocktail-sort%e3%81%a8%e3%81%af"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Cocktail Sort（カクテルソート）とは、バブルソートの改良版である。シェーカーソートとも呼ばれる。安定なソートの一種。&lt;/p&gt;
&lt;h2 id="アルゴリズム"&gt;
アルゴリズム&lt;a href="#%e3%82%a2%e3%83%ab%e3%82%b4%e3%83%aa%e3%82%ba%e3%83%a0"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;先頭から2つずつ隣り合う要素を比較し、先頭側が小さくなるように入れ替える
&lt;ul&gt;
&lt;li&gt;数値を入れ替えたらフラグを立てる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;末尾まで行き、フラグが立っていない場合は終了。フラグが立っている場合はフラグをリセットし、見る範囲の終端を1つ先頭側へずらす&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;末尾から2つずつ隣り合う要素を比較し、先頭側が小さくなるように入れ替える
&lt;ul&gt;
&lt;li&gt;数値を入れ替えたらフラグを立てる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;先頭まで行き、フラグが立っていない場合は終了。フラグが立っている場合はフラグをリセットし、見る範囲の始端を1つ末尾側へずらす&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;これをフラグが立たなくなるまで続ける&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="実装例"&gt;
実装例&lt;a href="#%e5%ae%9f%e8%a3%85%e4%be%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;swap_forward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;idx_start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;idx_end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&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;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;is_swapped&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;idx_start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;idx_end&lt;/span&gt;&lt;span class="p"&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;if&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;is_swapped&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;is_swapped&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;swap_backward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;idx_start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;idx_end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&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;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;is_swapped&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;idx_end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;idx_start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&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;if&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;is_swapped&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;is_swapped&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cocktail_sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&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;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;idx_start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;idx_end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&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="k"&gt;while&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&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;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;swap_forward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;idx_start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;idx_end&lt;/span&gt;&lt;span class="p"&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;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;idx_end&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;1&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="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;swap_backward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;idx_start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;idx_end&lt;/span&gt;&lt;span class="p"&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;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;idx_start&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&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="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="計算量"&gt;
計算量&lt;a href="#%e8%a8%88%e7%ae%97%e9%87%8f"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;要素数を$n$とする。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;&lt;/th&gt;
&lt;th style="text-align: left"&gt;計算量&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Average&lt;/td&gt;
&lt;td style="text-align: left"&gt;$\mathrm{O}(n^2)$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Best&lt;/td&gt;
&lt;td style="text-align: left"&gt;$\mathrm{O}(n)$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Worst&lt;/td&gt;
&lt;td style="text-align: left"&gt;$\mathrm{O}(n^2)$&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="pros"&gt;
Pros&lt;a href="#pros"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;バブルソートに比べて、特定の状況下で効率的
&lt;ul&gt;
&lt;li&gt;e.g. 末尾に小さい要素がある場合、先頭に大きい要素がある場合&lt;/li&gt;
&lt;li&gt;双方向捜査のため、両方向に対して局所的な順序を改善できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;安定なソート&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="cons"&gt;
Cons&lt;a href="#cons"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;効率が悪い&lt;/li&gt;
&lt;li&gt;計算量が大きいため速度は遅い&lt;/li&gt;
&lt;li&gt;ほとんどの場合、他のソートアルゴリズムの方が良い&lt;/li&gt;
&lt;li&gt;バブルソートに比べて実装が少し複雑&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="利用場面"&gt;
利用場面&lt;a href="#%e5%88%a9%e7%94%a8%e5%a0%b4%e9%9d%a2"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;要素数が少ない場合 : シンプルさと容易さが有利になることがある&lt;/li&gt;
&lt;li&gt;教育目的 : アルゴリズムの理解を深めるために用いられることがある&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;末尾まで行った時点で、末尾には必ず最大値が格納されるため。&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;先頭まで行った時点で、先頭には必ず最小値が格納されるため。&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Bubble Sort</title><link>https://notes.nakurei.com/post/bubble-sort/</link><pubDate>Sun, 24 Dec 2023 00:57:03 +0900</pubDate><guid>https://notes.nakurei.com/post/bubble-sort/</guid><description>&lt;h2 id="bubble-sortとは"&gt;
Bubble Sortとは&lt;a href="#bubble-sort%e3%81%a8%e3%81%af"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bubble Sort（バブルソート）とは、隣り合う要素を比較し交換することを繰り返してソートするアルゴリズム。安定なソートの一種。&lt;/p&gt;
&lt;h2 id="アルゴリズム"&gt;
アルゴリズム&lt;a href="#%e3%82%a2%e3%83%ab%e3%82%b4%e3%83%aa%e3%82%ba%e3%83%a0"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;先頭から隣り合う要素を2つずつ比較し、先頭側が小さくなるように入れ替える&lt;/li&gt;
&lt;li&gt;末尾まで行ったら、見る範囲の終端を1つ先頭側へずらして&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;、再度先頭から隣り合う要素を2つずつ比較し、先頭側が小さくなるように入れ替える&lt;/li&gt;
&lt;li&gt;これを比較ができなくなるまで続ける
&lt;ul&gt;
&lt;li&gt;見る範囲の終端が先頭に達したら終了&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;一度もスワップが発生しなかった場合に、ソートが完了していると判断して終了するようにすると、計算量を多少改善できる。&lt;/p&gt;
&lt;h2 id="実装例"&gt;
実装例&lt;a href="#%e5%ae%9f%e8%a3%85%e4%be%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;bubble_sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&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;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;limit_idx&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limit_idx&lt;/span&gt;&lt;span class="p"&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;if&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&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;return&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="計算量"&gt;
計算量&lt;a href="#%e8%a8%88%e7%ae%97%e9%87%8f"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;要素数を$n$とする。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;&lt;/th&gt;
&lt;th style="text-align: left"&gt;計算量&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Average&lt;/td&gt;
&lt;td style="text-align: left"&gt;$\mathrm{O}(n^2)$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Best&lt;/td&gt;
&lt;td style="text-align: left"&gt;$\mathrm{O}(n)$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Worst&lt;/td&gt;
&lt;td style="text-align: left"&gt;$\mathrm{O}(n^2)$&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="pros"&gt;
Pros&lt;a href="#pros"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;アルゴリズムがシンプル&lt;/li&gt;
&lt;li&gt;実装が簡単&lt;/li&gt;
&lt;li&gt;安定なソート&lt;/li&gt;
&lt;li&gt;メモリ使用量が少ない&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="cons"&gt;
Cons&lt;a href="#cons"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;効率が悪い&lt;/li&gt;
&lt;li&gt;計算量が大きいため速度は遅い&lt;/li&gt;
&lt;li&gt;ほとんどの場合、他のソートアルゴリズムの方が良い&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="利用場面"&gt;
利用場面&lt;a href="#%e5%88%a9%e7%94%a8%e5%a0%b4%e9%9d%a2"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;要素数が少ない場合 : シンプルさと容易さが有利になることがある&lt;/li&gt;
&lt;li&gt;教育目的 : アルゴリズムの理解を深めるために用いられることがある&lt;/li&gt;
&lt;li&gt;ほぼソートされているデータ : 他のソートアルゴリズムよりも速いことがある&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;末尾まで行った時点で、末尾には必ず最大値が格納されるため。&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Bogo Sort</title><link>https://notes.nakurei.com/post/bogo-sort/</link><pubDate>Sat, 23 Dec 2023 20:27:37 +0900</pubDate><guid>https://notes.nakurei.com/post/bogo-sort/</guid><description>&lt;h2 id="bogo-sortとは"&gt;
Bogo Sortとは&lt;a href="#bogo-sort%e3%81%a8%e3%81%af"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bogo Sort（ボゴソート）とは、非効率で非実用的なソートアルゴリズムのひとつ。非安定なソートの一種。&lt;/p&gt;
&lt;p&gt;ソートとしてこれを指すことはほぼない。教育目的やアルゴリズムの理解を深めるために用いられることがある。&lt;/p&gt;
&lt;h2 id="アルゴリズム"&gt;
アルゴリズム&lt;a href="#%e3%82%a2%e3%83%ab%e3%82%b4%e3%83%aa%e3%82%ba%e3%83%a0"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;適当に並び替える&lt;/li&gt;
&lt;li&gt;ソートが完了しているか確認する
&lt;ul&gt;
&lt;li&gt;完了していなければ1に戻る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="実装例"&gt;
実装例&lt;a href="#%e5%ae%9f%e8%a3%85%e4%be%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;random&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;is_sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&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;bool&lt;/span&gt;&lt;span class="p"&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;return&lt;/span&gt; &lt;span class="nb"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;bogo_sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&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;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sorted_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="p"&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;while&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;is_sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sorted_list&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shuffle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sorted_list&lt;/span&gt;&lt;span class="p"&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;return&lt;/span&gt; &lt;span class="n"&gt;sorted_list&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="計算量"&gt;
計算量&lt;a href="#%e8%a8%88%e7%ae%97%e9%87%8f"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;要素数を$n$とする。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;&lt;/th&gt;
&lt;th style="text-align: left"&gt;計算量&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Average&lt;/td&gt;
&lt;td style="text-align: left"&gt;$\mathrm{O}((n+1)!)$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Best&lt;/td&gt;
&lt;td style="text-align: left"&gt;$\mathrm{O}(n)$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Worst&lt;/td&gt;
&lt;td style="text-align: left"&gt;Unbounded&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="pros"&gt;
Pros&lt;a href="#pros"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;アルゴリズムが単純&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="cons"&gt;
Cons&lt;a href="#cons"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;極端に非効率。実用的なソートアルゴリズムとしてはまったく適さない。&lt;/li&gt;
&lt;li&gt;実行時間が不定。理論上、ソートが完了するまでに無限の時間がかかりうる。&lt;/li&gt;
&lt;li&gt;計算リソースを無駄に消費する&lt;/li&gt;
&lt;li&gt;非安定なソート&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="利用場面"&gt;
利用場面&lt;a href="#%e5%88%a9%e7%94%a8%e5%a0%b4%e9%9d%a2"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;教育目的 : 効率的なソートアルゴリズムと比較することで、アルゴリズムの理解を深められる&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>安定なソートと非安定なソートの違い</title><link>https://notes.nakurei.com/post/stable-sort-and-unstable-sort/</link><pubDate>Sat, 23 Dec 2023 20:03:45 +0900</pubDate><guid>https://notes.nakurei.com/post/stable-sort-and-unstable-sort/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;安定なソートと非安定なソートの違いについてのメモ。&lt;/p&gt;
&lt;h2 id="安定なソート"&gt;
安定なソート&lt;a href="#%e5%ae%89%e5%ae%9a%e3%81%aa%e3%82%bd%e3%83%bc%e3%83%88"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;安定なソート（Stable Sort）では、&lt;strong&gt;同じキーを持つ要素の相対的な順序が、ソートの前後で保持される&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;たとえば、&lt;code&gt;(1,&amp;quot;A&amp;quot;), (3,&amp;quot;D&amp;quot;), (2,&amp;quot;B&amp;quot;), (2,&amp;quot;C&amp;quot;)&lt;/code&gt;をソートしたとき、&lt;strong&gt;安定なソートでは&lt;code&gt;(2,&amp;quot;B&amp;quot;), (2,&amp;quot;C&amp;quot;)&lt;/code&gt;の順序は変わらない&lt;/strong&gt;。ソート後は&lt;code&gt;(1,&amp;quot;A&amp;quot;), (2,&amp;quot;B&amp;quot;), (2,&amp;quot;C&amp;quot;), (3,&amp;quot;D&amp;quot;)&lt;/code&gt;となる。&lt;/p&gt;
&lt;p&gt;安定なソートの例としては、バブルソート、マージソート、挿入ソートなどがある。&lt;/p&gt;
&lt;h2 id="非安定なソート"&gt;
非安定なソート&lt;a href="#%e9%9d%9e%e5%ae%89%e5%ae%9a%e3%81%aa%e3%82%bd%e3%83%bc%e3%83%88"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;非安定なソート（Unstable Sort）では、&lt;strong&gt;同じキーを持つ要素の相対的な順序が、ソートの過程で変わる可能性がある&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;たとえば、&lt;code&gt;(1,&amp;quot;A&amp;quot;), (3,&amp;quot;D&amp;quot;), (2,&amp;quot;B&amp;quot;), (2,&amp;quot;C&amp;quot;)&lt;/code&gt;をソートしたとき、&lt;strong&gt;非安定なソートでは&lt;code&gt;(2,&amp;quot;B&amp;quot;), (2,&amp;quot;C&amp;quot;)&lt;/code&gt;の順序の変わる可能性がある&lt;/strong&gt;。ソート後は&lt;code&gt;(1,&amp;quot;A&amp;quot;), (2,&amp;quot;C&amp;quot;), (2,&amp;quot;B&amp;quot;), (3,&amp;quot;D&amp;quot;)&lt;/code&gt;となる。&lt;/p&gt;
&lt;p&gt;非安定なソートの例としては、クイックソート、ヒープソート、選択ソートなどがある。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;
まとめ&lt;a href="#%e3%81%be%e3%81%a8%e3%82%81"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;安定なソートと非安定なソートの違いは、&lt;strong&gt;同じキーを持つ要素の相対的な順序が、ソートの前後で保持されるかどうか&lt;/strong&gt;である。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="link" href="https://www.udemy.com/course/python-algo/" target="_blank" rel="noopener"
&gt;Udemy : 現役シリコンバレーエンジニアが教えるアルゴリズム・データ構造・コーディングテスト入門&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Dockerコンテナ内でgit pushしようとしたら怒られた</title><link>https://notes.nakurei.com/post/git-not-working-in-docker-container/</link><pubDate>Mon, 06 Nov 2023 00:11:29 +0900</pubDate><guid>https://notes.nakurei.com/post/git-not-working-in-docker-container/</guid><description>&lt;img src="https://notes.nakurei.com/icons/brand-docker.svg" alt="Featured image of post Dockerコンテナ内でgit pushしようとしたら怒られた" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Dockerコンテナ内で&lt;code&gt;git push&lt;/code&gt;しようとしたら怒られたときの解決法メモ。
具体的には下記のエラーが発生した。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git push
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fatal: unable to access &lt;span class="s1"&gt;&amp;#39;https://github.com/NakuRei/nakureis-reading-notes.git/&amp;#39;&lt;/span&gt;: server certificate verification failed. CAfile: none CRLfile: none&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="解決法"&gt;
解決法&lt;a href="#%e8%a7%a3%e6%b1%ba%e6%b3%95"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Dockerコンテナ内に&lt;code&gt;ca-certificates&lt;/code&gt;を入れて&lt;code&gt;update-ca-certificates&lt;/code&gt;したら解決した。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt-get install ca-certificates
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;update-ca-certificates&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;最初からDockerfileで下記のようにすればOK。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Dockerfile" data-lang="Dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; apt-get update -y &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;DEBIAN_FRONTEND&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;noninteractive &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; apt-get install -y --no-install-recommends &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ca-certificates &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; git &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; update-ca-certificates&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>git rebaseしようとしたら、エディタが起動しなくてハマった話</title><link>https://notes.nakurei.com/post/git-rebase-editor-not-open-vscode/</link><pubDate>Sat, 04 Nov 2023 17:01:50 +0900</pubDate><guid>https://notes.nakurei.com/post/git-rebase-editor-not-open-vscode/</guid><description>&lt;img src="https://notes.nakurei.com/icons/brand-git.svg" alt="Featured image of post git rebaseしようとしたら、エディタが起動しなくてハマった話" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;git rebase&lt;/code&gt;しようとしたら、エディタが起動しなくてハマったときの解決メモ。&lt;/p&gt;
&lt;h2 id="要点"&gt;
要点&lt;a href="#%e8%a6%81%e7%82%b9"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;GitのエディタにVS Codeを設定するときは、下記コマンドのように&lt;code&gt;--wait&lt;/code&gt;フラグを追加する必要がある。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global core.editor &lt;span class="s2"&gt;&amp;#34;code --wait&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="試行錯誤のメモ"&gt;
試行錯誤のメモ&lt;a href="#%e8%a9%a6%e8%a1%8c%e9%8c%af%e8%aa%a4%e3%81%ae%e3%83%a1%e3%83%a2"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;git rebase&lt;/code&gt;しようとしたら、エディタが起動しない。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git rebase -i HEAD~4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hint: Waiting &lt;span class="k"&gt;for&lt;/span&gt; your editor to close the file... error: cannot run editor: No such file or directory
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;error: unable to start editor &lt;span class="s1"&gt;&amp;#39;editor&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;git configの&lt;code&gt;core.editor&lt;/code&gt;が設定されていなかったのが原因だった。そのため、下記コマンドでエディタをVS Codeに設定した。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global core.editor &lt;span class="s2"&gt;&amp;#34;code&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;しかし、再度&lt;code&gt;git rebase&lt;/code&gt;を実行すると、VS Codeは起動するものの&lt;code&gt;git-rebase-todo&lt;/code&gt;ファイルを開けない。「ファイルが見つからなかったため、エディターを開くことができませんでした」と言われる始末。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/git-rebase-editor-not-open-vscode/20231104170604.png"
width="779"
height="341"
srcset="https://notes.nakurei.com/post/git-rebase-editor-not-open-vscode/20231104170604_hu_638bf350e5894930.png 480w, https://notes.nakurei.com/post/git-rebase-editor-not-open-vscode/20231104170604_hu_a4ba352a609b177a.png 1024w"
loading="lazy"
alt="「ファイルが見つからなかったため、エディターを開くことができませんでした」"
class="gallery-image"
data-flex-grow="228"
data-flex-basis="548px"
&gt;&lt;/p&gt;
&lt;p&gt;シェル上では実行できたかのように表記された。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git rebase -i HEAD~4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Successfully rebased and updated refs/heads/develop.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;VS CodeのPATHもきちんと通っている。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ code -v
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1.84.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;d037ac076cee195194f93ce6fe2bdfe2969cc82d
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x64&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;調査の結果、&lt;code&gt;git-rebase-todo&lt;/code&gt;ファイルを開けなかったのは、どうやらVS Codeの挙動によるものらしい。VS CodeをGitエディタとして設定する際には、&lt;code&gt;--wait&lt;/code&gt;フラグを追加して、Gitがコミットやリベースなどの操作を続行する前にエディタを閉じるのを待つ必要がある。つまり、git configに設定すべき値は下記になる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global core.editor &lt;span class="s2"&gt;&amp;#34;code --wait&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これにより、今度は正常に&lt;code&gt;git rebase&lt;/code&gt;が実行できるようになった。めでたしめでたし。&lt;/p&gt;</description></item><item><title>Next.js 14のSSGの環境構築</title><link>https://notes.nakurei.com/post/create-next-app-ssg-environment/</link><pubDate>Sat, 04 Nov 2023 04:57:33 +0900</pubDate><guid>https://notes.nakurei.com/post/create-next-app-ssg-environment/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Next.js 14のSSGの環境構築をしたときのメモ。&lt;/p&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;WSL2 Ubuntu 22.04.2 LTS&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Docker version 24.0.6&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;VS Code 1.84.0&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Next 14.0.1&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="環境構築"&gt;
環境構築&lt;a href="#%e7%92%b0%e5%a2%83%e6%a7%8b%e7%af%89"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Dockerfile&lt;/code&gt;と&lt;code&gt;devcontainer.json&lt;/code&gt;を作って環境を構築する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.devcontainer/Dockerfile&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Dockerfile" data-lang="Dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:20-slim&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&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;EXPOSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;3000&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&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;RUN&lt;/span&gt; apt-get update -y &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;DEBIAN_FRONTEND&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;noninteractive &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; apt-get install -y --no-install-recommends &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; git &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; locales &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; tzdata &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; xsel &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get clean &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; rm -rf /var/lib/apt/lists/*&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&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;RUN&lt;/span&gt; locale-gen ja_JP.UTF-8 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; localedef -f UTF-8 -i ja_JP ja_JP.UTF-8&lt;span class="err"&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;ENV&lt;/span&gt; &lt;span class="nv"&gt;TZ&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Asia/Tokyo &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;LANG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ja_JP.UTF-8 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;LANGUAGE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ja_JP:jp &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;LC_ALL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ja_JP.UTF-8&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&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;RUN&lt;/span&gt; npm install -g npm&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&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;USER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.devcontainer/devcontainer.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Dockerfile" data-lang="Dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;build&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;dockerfile&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;./Dockerfile&amp;#34;&lt;/span&gt;,&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;context&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;..&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;forwardPorts&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;3000&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;,&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;customizations&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;vscode&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;extensions&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;PulkitGangwar.nextjs-snippets&amp;#34;&lt;/span&gt;,&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;dbaeumer.vscode-eslint&amp;#34;&lt;/span&gt;,&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;esbenp.prettier-vscode&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;必須の拡張機能は&lt;code&gt;devcontainer.json&lt;/code&gt;に書く。必須でないものは&lt;code&gt;.vscode/extensions.json&lt;/code&gt;に記述する。&lt;code&gt;.vscode/extensions.json&lt;/code&gt;に記述した後、VS Codeの拡張機能のタブにて&lt;code&gt;@recommended&lt;/code&gt;で検索すると、ワークスペースの推奨事項にそれらの拡張機能が表示される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.vscode/extensions.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;recommendations&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;oderwat.indent-rainbow&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// インデントに色を付ける
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;mohammadbaqer.better-folding&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// 折り畳みを見やすくする
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;streetsidesoftware.code-spell-checker&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// スペルチェック
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;naumovs.color-highlight&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// カラーコードをその色でハイライト
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;igorsbitnev.error-gutters&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// エラーが出ている横にアイコンをつける
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;saikou9901.evilinspector&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// 全角スペース強調
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;mhutchie.git-graph&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Gitのコミット履歴を見やすくできる
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;donjayamanne.githistory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// ファイルごとの変更履歴を見やすくできる
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;github.copilot&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// コード書くときのサポーター（有料）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;kisstkondoros.vscode-gutter-preview&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;christian-kohler.path-intellisense&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;gruntfuggly.todo-tree&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// TODOの強調
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;shardulm94.trailing-spaces&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// 行末の半角スペース強調
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;visualstudioexptteam.vscodeintellicode&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;// TypeScript書くときに補助してくれる
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;VS Code拡張機能の&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers" target="_blank" rel="noopener"
&gt;Dev Containers&lt;/a&gt;をローカルにインストールする。その後、&lt;code&gt;Ctrl + Shift + P&lt;/code&gt;でコマンドパレットを開き、&lt;code&gt;Dev Containers: Reopen in Container&lt;/code&gt;を実行する。これにより、&lt;code&gt;Dockerfile&lt;/code&gt;がビルドされ、VS Codeがコンテナにアタッチされる。&lt;/p&gt;
&lt;h2 id="nodejs環境の確認"&gt;
Node.js環境の確認&lt;a href="#nodejs%e7%92%b0%e5%a2%83%e3%81%ae%e7%a2%ba%e8%aa%8d"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;コンテナにアタッチされたVS Codeのターミナルで、&lt;code&gt;node -v&lt;/code&gt;と&lt;code&gt;npm -v&lt;/code&gt;を実行する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ node -v
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v20.9.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ npm -v
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;10.2.3&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="git管理する"&gt;
Git管理する&lt;a href="#git%e7%ae%a1%e7%90%86%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;プロジェクトをgit管理下に置く。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git init&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;branch名をデフォルトで&lt;code&gt;main&lt;/code&gt;にしていない場合はwarningが出るので、&lt;code&gt;main&lt;/code&gt;にしておく。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git branch -m main&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="アプリのひな型を作成する"&gt;
アプリのひな型を作成する&lt;a href="#%e3%82%a2%e3%83%97%e3%83%aa%e3%81%ae%e3%81%b2%e3%81%aa%e5%9e%8b%e3%82%92%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Next.jsのアプリのひな型を作る。下記コマンドを実行する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx create-next-app@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;プロジェクトの設定をいろいろ聞かれるので答える。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/create-next-app-ssg-environment/20231104051935.png"
width="975"
height="275"
srcset="https://notes.nakurei.com/post/create-next-app-ssg-environment/20231104051935_hu_ea88527e64bc35f5.png 480w, https://notes.nakurei.com/post/create-next-app-ssg-environment/20231104051935_hu_2b52715e837e13a3.png 1024w"
loading="lazy"
alt="設定選択"
class="gallery-image"
data-flex-grow="354"
data-flex-basis="850px"
&gt;&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;コンソール出力のログ&lt;/summary&gt;
&lt;p&gt;&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ npx create-next-app@latest
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Need to install the following packages:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;create-next-app@14.0.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Ok to proceed? &lt;span class="o"&gt;(&lt;/span&gt;y&lt;span class="o"&gt;)&lt;/span&gt; y
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✔ What is your project named? … next-app
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✔ Would you like to use TypeScript? … No / Yes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✔ Would you like to use ESLint? … No / Yes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✔ Would you like to use Tailwind CSS? … No / Yes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✔ Would you like to use &lt;span class="sb"&gt;`&lt;/span&gt;src/&lt;span class="sb"&gt;`&lt;/span&gt; directory? … No / Yes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✔ Would you like to use App Router? &lt;span class="o"&gt;(&lt;/span&gt;recommended&lt;span class="o"&gt;)&lt;/span&gt; … No / Yes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✔ Would you like to customize the default import &lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;@/*&lt;span class="o"&gt;)&lt;/span&gt;? … No / Yes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Creating a new Next.js app in /workspaces/path/next-app.
&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;Using npm.
&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;Initializing project with template: app-tw
&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;Installing dependencies:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- react
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- react-dom
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- next
&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;Installing devDependencies:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- typescript
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- @types/node
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- @types/react
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- @types/react-dom
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- autoprefixer
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- postcss
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- tailwindcss
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- eslint
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- eslint-config-next
&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;added &lt;span class="m"&gt;331&lt;/span&gt; packages, and audited &lt;span class="m"&gt;332&lt;/span&gt; packages in 25s
&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="m"&gt;116&lt;/span&gt; packages are looking &lt;span class="k"&gt;for&lt;/span&gt; funding
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; run &lt;span class="sb"&gt;`&lt;/span&gt;npm fund&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; details
&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;found &lt;span class="m"&gt;0&lt;/span&gt; vulnerabilities
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Success! Created next-app at /workspaces/path/next-app&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;すると、プロジェクト名（上記だと&lt;code&gt;next-app&lt;/code&gt;）のディレクトリが作成され、アプリのひな形が作られる。下記コマンドで起動するか確認する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; next-app
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run dev&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a class="link" href="http://localhost:3000" target="_blank" rel="noopener"
&gt;http://localhost:3000&lt;/a&gt;にアクセスして、下記のようなデフォルトページが表示されることを確認する。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/create-next-app-ssg-environment/20231104051458.png"
width="1076"
height="510"
srcset="https://notes.nakurei.com/post/create-next-app-ssg-environment/20231104051458_hu_d2aca68191a8c62e.png 480w, https://notes.nakurei.com/post/create-next-app-ssg-environment/20231104051458_hu_1cb42999c2316b86.png 1024w"
loading="lazy"
alt="デフォルトのページ"
class="gallery-image"
data-flex-grow="210"
data-flex-basis="506px"
&gt;&lt;/p&gt;
&lt;p&gt;ページの表示は&lt;code&gt;Ctrl + C&lt;/code&gt;で終了できる。&lt;/p&gt;
&lt;h2 id="ssgのためのプロジェクトの設定を変更する"&gt;
SSGのためのプロジェクトの設定を変更する&lt;a href="#ssg%e3%81%ae%e3%81%9f%e3%82%81%e3%81%ae%e3%83%97%e3%83%ad%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%81%ae%e8%a8%ad%e5%ae%9a%e3%82%92%e5%a4%89%e6%9b%b4%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;next.config.js&lt;/code&gt;を変更し、&lt;code&gt;reactStrictMode&lt;/code&gt;を有効にしておく。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://nextjs.org/docs/pages/api-reference/next-config-js/reactStrictMode"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/13a79b6c8ae23bf60dbc6c2fce3deb04cc3c301e_hu_aada1d64cbab4f57.webp"
alt="next.config.js Options: reactStrictMode | Next.js image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
next.config.js Options: reactStrictMode | Next.js
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;The complete Next.js runtime is now Strict Mode-compliant, learn how to opt-in&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-2e6a38d9fd715661dc4cca7ae68c7135876852fe.png"
style="margin-right: 2px;"
alt="nextjs.org favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
nextjs.org
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;また、静的サイトにするため、&lt;code&gt;output: 'export'&lt;/code&gt;を追加する。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://nextjs.org/docs/pages/building-your-application/deploying/static-exports"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/c0d2d48130e9d80abc298b8d6edc0d3b16573eab_hu_4f4565d454c03c2c.webp"
alt="Guides: Static Exports | Next.js image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Guides: Static Exports | Next.js
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Next.js enables starting as a static site or Single-Page Application (SPA), then later optionally upgrading to use features that require a server.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-2e6a38d9fd715661dc4cca7ae68c7135876852fe.png"
style="margin-right: 2px;"
alt="nextjs.org favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
nextjs.org
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;変更後の&lt;code&gt;next.config.js&lt;/code&gt;は下記のとおり。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;next.config.js&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;/** @type {import(&amp;#39;next&amp;#39;).NextConfig} */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nextConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;reactStrictMode&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;export&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;nextConfig&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;静的サイトの場合は、&lt;code&gt;output: 'export'&lt;/code&gt;を設定した後に&lt;code&gt;npm run build&lt;/code&gt;し、これにより、&lt;code&gt;npx serve@latest out&lt;/code&gt;することでビルドした静的サイトをプレビューできる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run build&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;details&gt;
&lt;summary&gt;npm run buildのログ&lt;/summary&gt;
&lt;p&gt;&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ npm run build
&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;gt; next-app@0.1.0 build
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; next build
&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; ▲ Next.js 14.0.1
&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; ✓ Creating an optimized production build
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ✓ Compiled successfully
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ✓ Linting and checking validity of types
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ✓ Collecting page data
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ✓ Generating static pages &lt;span class="o"&gt;(&lt;/span&gt;5/5&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ✓ Finalizing page optimization
&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;Route &lt;span class="o"&gt;(&lt;/span&gt;app&lt;span class="o"&gt;)&lt;/span&gt; Size First Load JS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌ ○ / 5.28 kB 90.4 kB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└ ○ /_not-found &lt;span class="m"&gt;882&lt;/span&gt; B &lt;span class="m"&gt;86&lt;/span&gt; kB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+ First Load JS shared by all 85.2 kB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├ chunks/472-39c72660b90e2701.js &lt;span class="m"&gt;30&lt;/span&gt; kB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├ chunks/fd9d1056-39de21f001c52188.js 53.2 kB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├ chunks/main-app-5c586790629e224c.js &lt;span class="m"&gt;232&lt;/span&gt; B
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └ chunks/webpack-2f0f07802d1106cf.js 1.69 kB
&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;○ &lt;span class="o"&gt;(&lt;/span&gt;Static&lt;span class="o"&gt;)&lt;/span&gt; prerendered as static HTML&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx serve@latest out&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;details&gt;
&lt;summary&gt;npx serve@latest outのログ&lt;/summary&gt;
&lt;p&gt;&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ npx serve@latest out
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Need to install the following packages:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;serve@14.2.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Ok to proceed? &lt;span class="o"&gt;(&lt;/span&gt;y&lt;span class="o"&gt;)&lt;/span&gt; y
&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; │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ Serving! │
&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; │ - Local: http://localhost:3000 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ - Network: http://172.17.0.3:3000 │
&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; │ Copied &lt;span class="nb"&gt;local&lt;/span&gt; address to clipboard! │
&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;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; HTTP 2023/11/4 5:41:17 127.0.0.1 GET /
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; HTTP 2023/11/4 5:41:17 127.0.0.1 Returned &lt;span class="m"&gt;200&lt;/span&gt; in &lt;span class="m"&gt;7&lt;/span&gt; ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; HTTP 2023/11/4 5:41:17 127.0.0.1 GET /_next/static/media/c9a5bc6a7c948fb0-s.p.woff2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; HTTP 2023/11/4 5:41:17 127.0.0.1 Returned &lt;span class="m"&gt;200&lt;/span&gt; in &lt;span class="m"&gt;1&lt;/span&gt; ms
&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;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;プレビューは&lt;code&gt;Ctrl + C&lt;/code&gt;で終了できる。&lt;/p&gt;
&lt;p&gt;毎回&lt;code&gt;npx serve@latest out&lt;/code&gt;と打つのは面倒なので、&lt;code&gt;package.json&lt;/code&gt;にコマンドを追加する。&lt;code&gt;npm run serve&lt;/code&gt;でbuildした静的サイトをプレビューできる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;package.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&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;#34;name&amp;#34;: &amp;#34;next-app&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;version&amp;#34;: &amp;#34;0.1.0&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;private&amp;#34;: true,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;scripts&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;dev&amp;#34;: &amp;#34;next dev&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;build&amp;#34;: &amp;#34;next build&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;start&amp;#34;: &amp;#34;next start&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;lint&amp;#34;: &amp;#34;next lint&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ &amp;#34;serve&amp;#34;: &amp;#34;npx serve@latest out&amp;#34;
&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;#34;dependencies&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;react&amp;#34;: &amp;#34;^18&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;react-dom&amp;#34;: &amp;#34;^18&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;next&amp;#34;: &amp;#34;14.0.1&amp;#34;
&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;#34;devDependencies&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;typescript&amp;#34;: &amp;#34;^5&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;@types/node&amp;#34;: &amp;#34;^20&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;@types/react&amp;#34;: &amp;#34;^18&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;@types/react-dom&amp;#34;: &amp;#34;^18&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;autoprefixer&amp;#34;: &amp;#34;^10.0.1&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;postcss&amp;#34;: &amp;#34;^8&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;tailwindcss&amp;#34;: &amp;#34;^3.3.0&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;eslint&amp;#34;: &amp;#34;^8&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;eslint-config-next&amp;#34;: &amp;#34;14.0.1&amp;#34;
&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="linterがtsxファイルのエラーも検知するようにする"&gt;
Linterがtsxファイルのエラーも検知するようにする&lt;a href="#linter%e3%81%8ctsx%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e3%82%a8%e3%83%a9%e3%83%bc%e3%82%82%e6%a4%9c%e7%9f%a5%e3%81%99%e3%82%8b%e3%82%88%e3%81%86%e3%81%ab%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;npm run lint&lt;/code&gt;（あるいは&lt;code&gt;npx next lint&lt;/code&gt;）を実行してもTypeScriptのコードのエラーは表示されない。これを表示されるように変更する。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://chaika.hatenablog.com/entry/2023/02/28/090000"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/174d8bd3aefc67a4e0c0162dbd3932bea154699e_hu_6a08410af979797a.webp"
alt="Next.js ESLint で TypeScript のエラーを表示するようにしたい - かもメモ image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Next.js ESLint で TypeScript のエラーを表示するようにしたい - かもメモ
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;1. Next.js はデフォルトでは TypeScript のエラーが `npm run lint` では表示されない 2. ミニマムな TypeScript のエラーを表示させるには `@typescript-eslint/eslint-plugin` をインストールして `.eslintrc.json` にルールを追加する 3. 使用するルールに依っては `.eslintrc.json` に `parserOptions.project` プロパティを作成しプロジェクトの `tsconfig.json` のパスを指定する&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-e531ce9d8440098f4b971e646658074371fc0ef7.png"
style="margin-right: 2px;"
alt="chaika.hatenablog.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
chaika.hatenablog.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://zenn.dev/bloomer/articles/294cf65fda277b"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/9d7448c3823165c0a5ef3b49b6a8d792c1c752d7_hu_2e0b8cb09636749e.webp"
alt="Next.js13.4&amp;#43;TypeScript&amp;#43;ESLint&amp;#43;Prettier&amp;#43;Huskyのよくばりセットで環境を構築してみました image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Next.js13.4+TypeScript+ESLint+Prettier+Huskyのよくばりセットで環境を構築してみました
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-8299b9ca5170247061175f654bfc883ff1cc2440.png"
style="margin-right: 2px;"
alt="zenn.dev favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
zenn.dev
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;まず、必要なプラグインをインストールする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm i -D @typescript-eslint/eslint-plugin&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;次に、&lt;code&gt;.eslintrc.json&lt;/code&gt;を変更する。&lt;code&gt;extends&lt;/code&gt;と&lt;code&gt;parserOptions&lt;/code&gt;の変更は必須。他は任意。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.eslintrc.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;root&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;extends&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;plugin:@typescript-eslint/recommended&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;next/core-web-vitals&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;parserOptions&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;project&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./tsconfig.json&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;rules&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;@typescript-eslint/no-unused-vars&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;error&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;@typescript-eslint/no-explicit-any&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;error&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;@typescript-eslint/no-unsafe-call&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;error&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;@typescript-eslint/no-unsafe-member-access&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;error&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;@typescript-eslint/no-unsafe-return&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;error&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ここまで設定すれば、&lt;code&gt;npm run lint&lt;/code&gt;で&lt;code&gt;.tsx&lt;/code&gt;のエラーが表示されるようになる。これ以降の設定は、必要であれば設定する。&lt;/p&gt;
&lt;p&gt;VSCodeの設定を変更して、linterがVS Codeでも正常に動くようにする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.vscode/settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Linter
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;eslint.workingDirectories&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;./next-app&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;editor.codeActionsOnSave&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;source.fixAll&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&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;&amp;#34;source.fixAll.eslint&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;package.json&lt;/code&gt;のlintコマンドを変更し、&lt;code&gt;.gitignore&lt;/code&gt;に指定しているファイルは無視するように変更する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;package.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&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;#34;scripts&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;dev&amp;#34;: &amp;#34;next dev&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;build&amp;#34;: &amp;#34;next build&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;start&amp;#34;: &amp;#34;next start&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;- &amp;#34;lint&amp;#34;: &amp;#34;next lint&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ &amp;#34;lint&amp;#34;: &amp;#34;next lint --ignore-path .gitignore&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;serve&amp;#34;: &amp;#34;npx serve@latest out&amp;#34;
&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="prettierを入れる"&gt;
Prettierを入れる&lt;a href="#prettier%e3%82%92%e5%85%a5%e3%82%8c%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;FormatterとしてPrettierを入れる。まず、パッケージをインストールする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm i -D prettier eslint-config-prettier&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;次に、Prettierの設定ファイルを作る。この設定は好みや方針により異なる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.prettierrc&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;semi&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;trailingComma&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;all&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;singleQuote&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;printWidth&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&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;&amp;#34;tabWidth&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;加えて、&lt;code&gt;.eslintrc.json&lt;/code&gt;にPrettierを追加する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.eslintrc.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&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;#34;root&amp;#34;: true,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;extends&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;plugin:@typescript-eslint/recommended&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;next/core-web-vitals&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ &amp;#34;prettier&amp;#34;
&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;#34;parserOptions&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;project&amp;#34;: &amp;#34;./tsconfig.json&amp;#34;
&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;#34;rules&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;@typescript-eslint/no-unused-vars&amp;#34;: &amp;#34;error&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;@typescript-eslint/no-explicit-any&amp;#34;: &amp;#34;error&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;@typescript-eslint/no-unsafe-call&amp;#34;: &amp;#34;error&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;@typescript-eslint/no-unsafe-member-access&amp;#34;: &amp;#34;error&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;@typescript-eslint/no-unsafe-return&amp;#34;: &amp;#34;error&amp;#34;
&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;最後に、&lt;code&gt;package.json&lt;/code&gt;に&lt;code&gt;format&lt;/code&gt;コマンドを追加する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;package.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&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;#34;scripts&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;dev&amp;#34;: &amp;#34;next dev&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;build&amp;#34;: &amp;#34;next build&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;start&amp;#34;: &amp;#34;next start&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;lint&amp;#34;: &amp;#34;next lint --ignore-path .gitignore&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ &amp;#34;format&amp;#34;: &amp;#34;prettier --write --ignore-path .gitignore .&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;serve&amp;#34;: &amp;#34;npx serve@latest out&amp;#34;
&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;追加したら&lt;code&gt;npm run format&lt;/code&gt;を実行して動作を確認する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run format&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;VS Codeの場合は下記の設定を追加すると、保存時やタイプ時に自動でフォーマットされる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.vscode/settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// formatter
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;editor.defaultFormatter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;esbenp.prettier-vscode&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;editor.formatOnSave&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;editor.formatOnPaste&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;editor.formatOnType&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="コミット時にlinterとformatterを自動実行する"&gt;
コミット時にlinterとformatterを自動実行する&lt;a href="#%e3%82%b3%e3%83%9f%e3%83%83%e3%83%88%e6%99%82%e3%81%ablinter%e3%81%a8formatter%e3%82%92%e8%87%aa%e5%8b%95%e5%ae%9f%e8%a1%8c%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;コミット時に&lt;code&gt;npm run lint&lt;/code&gt;と&lt;code&gt;npm run format&lt;/code&gt;を実行し、エラーが出る場合はコミットできないようにする。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://zenn.dev/bloomer/articles/294cf65fda277b"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/9d7448c3823165c0a5ef3b49b6a8d792c1c752d7_hu_2e0b8cb09636749e.webp"
alt="Next.js13.4&amp;#43;TypeScript&amp;#43;ESLint&amp;#43;Prettier&amp;#43;Huskyのよくばりセットで環境を構築してみました image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Next.js13.4+TypeScript+ESLint+Prettier+Huskyのよくばりセットで環境を構築してみました
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-8299b9ca5170247061175f654bfc883ff1cc2440.png"
style="margin-right: 2px;"
alt="zenn.dev favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
zenn.dev
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://itc-engineering-blog.netlify.app/blogs/netxjs-husky-lint-staged"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/3ea6bb016d605731631d5cd479a9af13d26bc728_hu_38c813327cf32946.webp"
alt="Next.jsでhuskyを使ったcommit時lintエラー検出とGitHub Desktop対応 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Next.jsでhuskyを使ったcommit時lintエラー検出とGitHub Desktop対応
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Next.js で husky と lint-staged を使って、commit 時に ESLint エラー検出の仕組みの解説と手順です。加えて、GitHub Desktop（Windows 10 x64）でも動作するようにしました。React の場合も手順を記載しました。&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-f70f21fa680b4bb526ce67678bd2348999dbc4bb.png"
style="margin-right: 2px;"
alt="itc-engineering-blog.netlify.app favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
itc-engineering-blog.netlify.a …
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://notes.nakurei.com/post/linter-run-before-commit-with-husky-lint-staged/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="husky &amp;#43; lint-stagedでコミット前にLinterを実行させる image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
husky &amp;#43; lint-stagedでコミット前にLinterを実行させる
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-1eff5ad74ed7b442dfa6826d07982b3bff45afb2.png"
style="margin-right: 2px;"
alt="notes.nakurei.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
notes.nakurei.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;h3 id="huskyとlint-stagedを入れる"&gt;
huskyとlint-stagedを入れる&lt;a href="#husky%e3%81%a8lint-staged%e3%82%92%e5%85%a5%e3%82%8c%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;まず、必要なパッケージをインストールする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm i -D husky lint-staged&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;次に、&lt;code&gt;husky-init&lt;/code&gt;コマンドを実行する。環境によりコマンドが異なるため、実行するコマンドの詳細は&lt;a class="link" href="https://typicode.github.io/husky/getting-started.html" target="_blank" rel="noopener"
&gt;huskyの公式サイト&lt;/a&gt;を参照すること。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx husky-init &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm install&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div
style="
display: flex;
align-items: center;
justify-content: center;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
cursor: not-allowed;
"&gt;
&lt;div&gt;typicode.github.io にアクセスできません&lt;/div&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;&lt;code&gt;.git&lt;/code&gt;ディレクトリと&lt;code&gt;package.json&lt;/code&gt;ファイルが同じ階層に存在しない場合は、下記のようなエラーが発生する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ npx husky-init &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Need to install the following packages:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;husky-init@8.0.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Ok to proceed? &lt;span class="o"&gt;(&lt;/span&gt;y&lt;span class="o"&gt;)&lt;/span&gt; y
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;husky-init updating package.json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; setting prepare script to &lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;husky install&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/home/node/.npm/_npx/1ab9c0f68ac2536e/node_modules/husky/lib/index.js:23
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; throw new Error&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;.git can&lt;span class="s1"&gt;&amp;#39;t be found (see ${url})`);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; ^
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;Error: .git can&amp;#39;&lt;/span&gt;t be found &lt;span class="o"&gt;(&lt;/span&gt;see https://typicode.github.io/husky/#/?id&lt;span class="o"&gt;=&lt;/span&gt;custom-directory&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at install &lt;span class="o"&gt;(&lt;/span&gt;/home/node/.npm/_npx/1ab9c0f68ac2536e/node_modules/husky/lib/index.js:23:15&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Object.&amp;lt;anonymous&amp;gt; &lt;span class="o"&gt;(&lt;/span&gt;/home/node/.npm/_npx/1ab9c0f68ac2536e/node_modules/husky-init/lib/bin.js:16:21&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Module._compile &lt;span class="o"&gt;(&lt;/span&gt;node:internal/modules/cjs/loader:1241:14&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Module._extensions..js &lt;span class="o"&gt;(&lt;/span&gt;node:internal/modules/cjs/loader:1295:10&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Module.load &lt;span class="o"&gt;(&lt;/span&gt;node:internal/modules/cjs/loader:1091:32&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Module._load &lt;span class="o"&gt;(&lt;/span&gt;node:internal/modules/cjs/loader:938:12&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Function.executeUserEntryPoint &lt;span class="o"&gt;[&lt;/span&gt;as runMain&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;node:internal/modules/run_main:83:12&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at node:internal/main/run_main_module:23:47
&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;Node.js v20.9.0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;このエラーへの対処法は、&lt;a class="link" href="https://typicode.github.io/husky/guide.html#custom-directory" target="_blank" rel="noopener"
&gt;huskyの公式サイト&lt;/a&gt;に書かれているとおりで、&lt;code&gt;npx husky-init&lt;/code&gt;によって&lt;code&gt;package.json&lt;/code&gt;に追加された&lt;code&gt;prepare&lt;/code&gt;スクリプトを変更する。&lt;/p&gt;
&lt;div
style="
display: flex;
align-items: center;
justify-content: center;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
cursor: not-allowed;
"&gt;
&lt;div&gt;typicode.github.io にアクセスできません&lt;/div&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;たとえば、プロジェクト名が&lt;code&gt;next-app&lt;/code&gt;の場合は下記のように変更する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;package.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&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;#34;scripts&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;- &amp;#34;prepare&amp;#34;: &amp;#34;husky install&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ &amp;#34;prepare&amp;#34;: &amp;#34;cd .. &amp;amp;&amp;amp; husky install next-app/.husky&amp;#34;
&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;変更したら、再度&lt;code&gt;npm i&lt;/code&gt;（あるいは&lt;code&gt;npm install&lt;/code&gt;）を実行する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm i&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;成功すると、&lt;code&gt;.husky&lt;/code&gt;ディレクトリが生成される。&lt;/p&gt;
&lt;h3 id="huskyにhookを追加する"&gt;
huskyにhookを追加する&lt;a href="#husky%e3%81%abhook%e3%82%92%e8%bf%bd%e5%8a%a0%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;.husky&lt;/code&gt;ディレクトリが生成されたら、自動実行のためのhookを追加する。今回は下記のコマンドで&lt;code&gt;pre-commit&lt;/code&gt;のhookを追加する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx husky add .husky/pre-commit &lt;span class="s2"&gt;&amp;#34;npx lint-staged&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;実行すると、&lt;code&gt;.husky&lt;/code&gt;ディレクトリに下記の&lt;code&gt;pre_commit&lt;/code&gt;ファイルが生成される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.husky/pre-commit&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;. &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;dirname -- &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;/_/husky.sh&amp;#34;&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;npx lint-staged&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;.git&lt;/code&gt;ディレクトリと&lt;code&gt;package.json&lt;/code&gt;ファイルが同じ階層に存在しない場合は、下記のように階層を移動するコマンドを追加する必要がある。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.husky/pre-commit&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#!/usr/bin/env sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;. &amp;#34;$(dirname -- &amp;#34;$0&amp;#34;)/_/husky.sh&amp;#34;
&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="gi"&gt;+ cd next-app # package.jsonのある階層に移動する
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx lint-staged
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ここまでできたら、&lt;code&gt;lint-staged&lt;/code&gt;の設定に移る。&lt;/p&gt;
&lt;h3 id="lint-stagedの設定をする"&gt;
lint-stagedの設定をする&lt;a href="#lint-staged%e3%81%ae%e8%a8%ad%e5%ae%9a%e3%82%92%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Next.jsにおける&lt;code&gt;lint-staged&lt;/code&gt;の設定は特殊である。詳細は&lt;a class="link" href="https://nextjs.org/docs/pages/building-your-application/configuring/eslint#lint-staged" target="_blank" rel="noopener"
&gt;Next.jsの公式サイト&lt;/a&gt;を参照すること。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://nextjs.org/docs/pages/building-your-application/configuring/eslint"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/0285e00ed79df33086b8f8003c55816a87557b79_hu_e4aeb997ae9796d4.webp"
alt="Configuration: ESLint | Next.js image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Configuration: ESLint | Next.js
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Next.js reports ESLint errors and warnings during builds by default. Learn how to opt-out of this behavior here.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-2e6a38d9fd715661dc4cca7ae68c7135876852fe.png"
style="margin-right: 2px;"
alt="nextjs.org favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
nextjs.org
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;要するに、Next.jsにおいて&lt;code&gt;next lint&lt;/code&gt;と&lt;code&gt;lint-staged&lt;/code&gt;を共存させる場合は、&lt;code&gt;.lintstagedrc.js&lt;/code&gt;ファイルを作成し、そこに設定を記す必要がある。&lt;/p&gt;
&lt;p&gt;公式に載っている&lt;code&gt;.lintstagedrc.js&lt;/code&gt;は下記のとおり。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.lintstagedrc.js&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;path&amp;#39;&lt;/span&gt;&lt;span class="p"&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="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;buildEslintCommand&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;filenames&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sb"&gt;`next lint --fix --file &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;filenames&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;relative&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cwd&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39; --file &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&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="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;*.{js,jsx,ts,tsx}&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;buildEslintCommand&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;上記のように、&lt;code&gt;module.exports&lt;/code&gt;に、適用するファイルと実行するコマンドのペアを記述する。たとえば、自動修正しないlinterとformatterを実行する場合は、下記のようになる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.lintstagedrc.js&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;path&amp;#39;&lt;/span&gt;&lt;span class="p"&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="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;buildLintCommand&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;filenames&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sb"&gt;`next lint --file &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;filenames&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;relative&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cwd&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39; --file &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="p"&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="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;buildFormatCommand&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;filenames&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sb"&gt;`prettier --check --debug-check &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;filenames&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;relative&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cwd&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="p"&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="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;app/**/*.{js,jsx,ts,tsx}&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;buildLintCommand&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;pages/**/*.{js,jsx,ts,tsx}&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;buildLintCommand&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;*.{js,jsx,ts,tsx,json,css}&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;buildFormatCommand&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;以上までの設定で、コミット時にlinterとformatterが自動で実行され、通らない場合はコミットできなくなる。&lt;/p&gt;
&lt;h2 id="コミットメッセージを自動チェックして統一する"&gt;
コミットメッセージを自動チェックして統一する&lt;a href="#%e3%82%b3%e3%83%9f%e3%83%83%e3%83%88%e3%83%a1%e3%83%83%e3%82%bb%e3%83%bc%e3%82%b8%e3%82%92%e8%87%aa%e5%8b%95%e3%83%81%e3%82%a7%e3%83%83%e3%82%af%e3%81%97%e3%81%a6%e7%b5%b1%e4%b8%80%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;コミットメッセージのフォーマットを統一するため、commitlintを入れる。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://commitlint.js.org/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="commitlint image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
commitlint
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Lint commit messages&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-3d0f588bfadd8e305439712c4035c5d457749d4b.png"
style="margin-right: 2px;"
alt="commitlint.js.org favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
commitlint.js.org
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://zenn.dev/horitaka/articles/commit-message-rules"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/c0f13e45da7a6f13af466bb8b48c7dd44a7f35b4_hu_539ec1bca1cce66e.webp"
alt="commitlintとCommitizenを使ってチーム開発におけるコミットメッセージを統一する image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
commitlintとCommitizenを使ってチーム開発におけるコミットメッセージを統一する
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-8299b9ca5170247061175f654bfc883ff1cc2440.png"
style="margin-right: 2px;"
alt="zenn.dev favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
zenn.dev
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;h3 id="commitlintを入れる"&gt;
commitlintを入れる&lt;a href="#commitlint%e3%82%92%e5%85%a5%e3%82%8c%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;まず、パッケージをインストールする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install --save-dev @commitlint/&lt;span class="o"&gt;{&lt;/span&gt;cli,config-conventional&lt;span class="o"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;次に、下記のコマンドを実行して&lt;code&gt;commitlint.config.js&lt;/code&gt;を作成する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;module.exports = { extends: [&amp;#39;@commitlint/config-conventional&amp;#39;] };&amp;#34;&lt;/span&gt; &amp;gt; commitlint.config.js&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;作成された&lt;code&gt;commitlint.config.js&lt;/code&gt;は以下のようになる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;commitlint.config.js&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;extends&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;@commitlint/config-conventional&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;上記の代わりに、&lt;code&gt;package.json&lt;/code&gt;に記述してもよい。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;package.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;commitlint&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;extends&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@commitlint/config-conventional&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;以上でcommitlintが動作するようになったので、実行されるか確認する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx commitlint --from HEAD~1 --to HEAD --verbose&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;実行されれば、下記のようなログが出力される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;commitlintの実行結果&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ npx commitlint --from HEAD~1 --to HEAD --verbose
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;⧗ input: build: &lt;span class="nb"&gt;set&lt;/span&gt; up husky and lint-staged pre-commit
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✔ found &lt;span class="m"&gt;0&lt;/span&gt; problems, &lt;span class="m"&gt;0&lt;/span&gt; warnings&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="コミット時にcommitlintを自動実行する"&gt;
コミット時にcommitlintを自動実行する&lt;a href="#%e3%82%b3%e3%83%9f%e3%83%83%e3%83%88%e6%99%82%e3%81%abcommitlint%e3%82%92%e8%87%aa%e5%8b%95%e5%ae%9f%e8%a1%8c%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;コミット時に&lt;code&gt;commitlint&lt;/code&gt;が自動実行されるように設定する。&lt;code&gt;commitlint&lt;/code&gt;は&lt;code&gt;commit-msg&lt;/code&gt;フックで実行する。下記のコマンドを実行して、&lt;code&gt;husky&lt;/code&gt;から&lt;code&gt;commit-msg&lt;/code&gt;フックを追加する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx husky add .husky/commit-msg &lt;span class="s1"&gt;&amp;#39;npx --no -- commitlint --edit ${1}&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これにより、&lt;code&gt;.husky/commit-msg&lt;/code&gt;ファイルが作成される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.husky/commit-msg&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;. &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;dirname -- &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;/_/husky.sh&amp;#34;&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;npx --no -- commitlint --edit &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;.git&lt;/code&gt;ディレクトリと&lt;code&gt;package.json&lt;/code&gt;が同一階層にない場合は、下記のように階層を移動するコマンドを追加する必要がある。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.husky/commit-msg&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#!/usr/bin/env sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;. &amp;#34;$(dirname -- &amp;#34;$0&amp;#34;)/_/husky.sh&amp;#34;
&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="gi"&gt;+ cd next-app # package.jsonのある階層に移動する
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx --no -- commitlint --edit ${1}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これで、コミット時にcommitlintが実行されるようになる。&lt;/p&gt;
&lt;h3 id="commitlintのルールを変更する"&gt;
commitlintのルールを変更する&lt;a href="#commitlint%e3%81%ae%e3%83%ab%e3%83%bc%e3%83%ab%e3%82%92%e5%a4%89%e6%9b%b4%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;commitlintのルールは、&lt;code&gt;commitlint.config.js&lt;/code&gt;にルールを追記することで上書きできる。デフォルトの設定および上書き方法は、下記公式サイトに記述されている。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://commitlint.js.org/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="commitlint image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
commitlint
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Lint commit messages&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-3d0f588bfadd8e305439712c4035c5d457749d4b.png"
style="margin-right: 2px;"
alt="commitlint.js.org favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
commitlint.js.org
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;たとえば、&lt;code&gt;subject-max-length&lt;/code&gt;を&lt;code&gt;50&lt;/code&gt;に変更する場合は、下記のようにルールを追記する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;commitlint.config.js&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;module.exports = {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; extends: [&amp;#39;@commitlint/config-conventional&amp;#39;],
&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="gi"&gt;+ rules: {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ &amp;#39;subject-max-length&amp;#39;: [2, &amp;#39;always&amp;#39;, 50],
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://qiita.com/ybiquitous/items/74225bc4bf0a9ddcd7dd"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/a743dce08fffe01508822bd003c64d212d698340_hu_a52ea244f915c676.webp"
alt="commitlint の紹介 - Qiita image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
commitlint の紹介 - Qiita
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;commitlint というツールをご紹介します。 commitlint とは、Git のコミット規約（commit convention）に従わせるための npm ツールです。ESLint のように、ルールを JavaScript で設定・開発できます。 com...&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7dfa4a32e8b8dd3b8a6b654e1cd55932c6a19262.png"
style="margin-right: 2px;"
alt="qiita.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
qiita.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;ルールは、&lt;code&gt;{ルール名}: [{レベル:0|1|2}, '{可否:always|never}', {値}]&lt;/code&gt;の形式で記述する。レベルは各数値が下記段階に該当する。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;0: 無効&lt;/li&gt;
&lt;li&gt;1: 警告&lt;/li&gt;
&lt;li&gt;2: エラー&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;オレオレルールはこんな感じ。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;commitlint.config.js&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;extends&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;@commitlint/config-conventional&amp;#39;&lt;/span&gt;&lt;span class="p"&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="nx"&gt;rules&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;type-case&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;always&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;lower-case&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;scope-case&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;always&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;lower-case&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;subject-max-length&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;always&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;body-full-stop&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;always&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;body-leading-blank&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;always&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;body-max-line-length&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;always&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;72&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;body-case&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;always&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;sentence-case&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;footer-leading-blank&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;always&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;footer-max-line-length&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;always&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;72&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;参考文献・URLは適宜記事内に示した。&lt;/p&gt;</description></item><item><title>VS Codeの設定を見直したときのメモ</title><link>https://notes.nakurei.com/post/vscode-settings-note/</link><pubDate>Fri, 03 Nov 2023 18:48:11 +0900</pubDate><guid>https://notes.nakurei.com/post/vscode-settings-note/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;VS Codeの設定を見直したときのメモ。自分が何を何に設定しているかの整理。&lt;/p&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;VS Code 1.109.0&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="エディタの見た目overall-style"&gt;
エディタの見た目（Overall Style）&lt;a href="#%e3%82%a8%e3%83%87%e3%82%a3%e3%82%bf%e3%81%ae%e8%a6%8b%e3%81%9f%e7%9b%aeoverall-style"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="アイコン"&gt;
アイコン&lt;a href="#%e3%82%a2%e3%82%a4%e3%82%b3%e3%83%b3"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;workbench.iconTheme&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;catppuccin-mocha&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// icon theme
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;vsicons.dontShowNewVersionMessage&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;最近の好みはCatppuccin Icons。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=Catppuccin.catppuccin-vsc-icons"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/98854343f338183305e3a51128cd72971a3357a7_hu_7052cb33f904f085.webp"
alt="Catppuccin Icons for VSCode - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Catppuccin Icons for VSCode - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - 🦊 Soothing pastel icon theme for VSCode&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;もちろんMaterial Iconやvscode-iconsもわかりやすい。これらを使うこともある。&lt;/p&gt;
&lt;p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=PKief.material-icon-theme"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/e7579351b6ff40ac8280a1f38fe321256d50571d_hu_5f095a78534d353f.webp"
alt="Material Icon Theme - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Material Icon Theme - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Material Design Icons for Visual Studio Code&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=vscode-icons-team.vscode-icons"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/a9ba5bc93108ac468ef9e9da6f23f38ba43b6bbf_hu_577042a1fabada52.webp"
alt="vscode-icons - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
vscode-icons - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Icons for Visual Studio Code&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;/p&gt;
&lt;h3 id="カラーテーマ"&gt;
カラーテーマ&lt;a href="#%e3%82%ab%e3%83%a9%e3%83%bc%e3%83%86%e3%83%bc%e3%83%9e"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;workbench.colorTheme&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Night Owl&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// color theme
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;好みと見やすさで選んでいる。最近はNight OwlかTokyo Nightをよく使っている。&lt;/p&gt;
&lt;p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=sdras.night-owl"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/b786624e35cded66d167da33542bae82d8cd21e6_hu_adefcf941feb5685.webp"
alt="Night Owl - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Night Owl - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - A VS Code theme for the night owls out there. Now introducing Light Owl theme for daytime usage. Decisions were based on meaningful contrast for reading comprehension and for optimal razzle dazzle. ✨&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=enkia.tokyo-night"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/f59b9007e788f3d29cbae35aa2becd9f78b2ff7a_hu_bf5dc60c193e8250.webp"
alt="Tokyo Night - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Tokyo Night - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - A clean Visual Studio Code theme that celebrates the lights of Downtown Tokyo at night.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;/p&gt;
&lt;p&gt;下記のテーマも好み。気分で変えることがある。&lt;/p&gt;
&lt;p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=dnlytras.nord-wave"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/042392cd1f889dcaa419ee739bcfbcf40c5aa253_hu_470c676b55c10324.webp"
alt="Nord Wave - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Nord Wave - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Darker version of the awesome Nord theme&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=teabyii.ayu"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/ff0b07e1e9bd47c21e00362a6f42664847d6361d_hu_ab89a435f11b6ea8.webp"
alt="Ayu - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Ayu - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - A simple theme with bright colors and comes in three versions — dark, light and mirage for all day long comfortable work.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=johnpapa.winteriscoming"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/b39a36bc5d2e523074ad66565d6e9cc78521c471_hu_575a5d707f8e68d5.webp"
alt="Winter is Coming Theme - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Winter is Coming Theme - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Preferred dark/light themes by John Papa&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;/p&gt;
&lt;h3 id="フォント"&gt;
フォント&lt;a href="#%e3%83%95%e3%82%a9%e3%83%b3%e3%83%88"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;editor.fontFamily&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Cica, &amp;#39;Bizin Gothic&amp;#39;, Firge, PlemolJP, Consolas, &amp;#39;Yu Gothic&amp;#39;, &amp;#39;Meiryo&amp;#39;, &amp;#39;Courier New&amp;#39;, monospace, &amp;#39;Ricty Diminished&amp;#39;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// font
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;terminal.integrated.fontFamily&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#39;UDEV Gothic&amp;#39;, &amp;#39;HackGen Console&amp;#39;, HackGen, PlemolJP, Cica&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// terminal font
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;エディタのフォントはCicaを愛用している。好きなので。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://github.com/miiton/Cica"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/17df87099bffff1451b90cde5267cd5bc15b4715_hu_3d864925a8ffb38c.webp"
alt="GitHub - miiton/Cica: プログラミング用日本語等幅フォント Cica(シカ) image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
GitHub - miiton/Cica: プログラミング用日本語等幅フォント Cica(シカ)
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;プログラミング用日本語等幅フォント Cica(シカ). Contribute to miiton/Cica development by creating an account on GitHub.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-ffd1aa80239afc78c1628dfb5e08cff1205f22d5.png"
style="margin-right: 2px;"
alt="github.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
github.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;Bizin Gothicも好み。そもそもInconsolataが好みなので。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://github.com/yuru7/bizin-gothic"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/cf49471055c1a38d903e6568fd26aa8fb0c80bba_hu_90495ad1b74e7e62.webp"
alt="GitHub - yuru7/bizin-gothic: Bizin Gothic は、ユニバーサルデザインフォントの BIZ UDゴシック と英文フォント Inconsolata を合成したプログラミング向けフォントです。 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
GitHub - yuru7/bizin-gothic: Bizin Gothic は、ユニバーサルデザインフォントの BIZ UDゴシック と英文フォント Inconsolata を合成したプログラミング向けフォントです。
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Bizin Gothic は、ユニバーサルデザインフォントの BIZ UDゴシック と英文フォント Inconsolata を合成したプログラミング向けフォントです。 - yuru7/bizin-gothic&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-ffd1aa80239afc78c1628dfb5e08cff1205f22d5.png"
style="margin-right: 2px;"
alt="github.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
github.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;ターミナルはターミナル上で読みやすいと感じたフォントを使うようにしている。最近はUDEV GothicとHackGenを行ったり来たりしている。&lt;/p&gt;
&lt;p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://github.com/yuru7/udev-gothic"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/900ea38f3c3b8f8fe527f2fae9f45f25149dd212_hu_a8d6579ba9d4b073.webp"
alt="GitHub - yuru7/udev-gothic: UDEV Gothic は、ユニバーサルデザインフォントのBIZ UDゴシックと、 開発者向けフォントの JetBrains Mono を合成した、プログラミング向けフォントです。 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
GitHub - yuru7/udev-gothic: UDEV Gothic は、ユニバーサルデザインフォントのBIZ UDゴシックと、 開発者向けフォントの JetBrains Mono を合成した、プログラミング向けフォントです。
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;UDEV Gothic は、ユニバーサルデザインフォントのBIZ UDゴシックと、 開発者向けフォントの JetBrains Mono を合成した、プログラミング向けフォントです。 - yuru7/udev-gothic&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-ffd1aa80239afc78c1628dfb5e08cff1205f22d5.png"
style="margin-right: 2px;"
alt="github.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
github.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://github.com/yuru7/HackGen"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/9387ce9b74d607ed7d3083799bf49203acae5267_hu_14050d49b51c750b.webp"
alt="GitHub - yuru7/HackGen: Hack と源柔ゴシックを合成したプログラミングフォント 白源 (はくげん／HackGen) image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
GitHub - yuru7/HackGen: Hack と源柔ゴシックを合成したプログラミングフォント 白源 (はくげん／HackGen)
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Hack と源柔ゴシックを合成したプログラミングフォント 白源 (はくげん／HackGen). Contribute to yuru7/HackGen development by creating an account on GitHub.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-ffd1aa80239afc78c1628dfb5e08cff1205f22d5.png"
style="margin-right: 2px;"
alt="github.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
github.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;/p&gt;
&lt;p&gt;他に、気分で変えたくなったときにすぐ変えられるように、いくつかフォントを書いておいている。&lt;/p&gt;
&lt;h3 id="色の調整"&gt;
色の調整&lt;a href="#%e8%89%b2%e3%81%ae%e8%aa%bf%e6%95%b4"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;カラーテーマを気分で変えたときに見にくくならないように、ミニマップと選択範囲の色をカスタマイズしている。これを設定してから見にくさで困らなくなった。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Custom color
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;workbench.colorCustomizations&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Minimap
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;minimapSlider.activeBackground&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#4c4d03a0&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;minimapSlider.background&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#4c4d03a0&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;minimapSlider.hoverBackground&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#4c4d03a0&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Selection
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;editor.selectionBackground&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#535029&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;editor.findMatchHighlightBackground&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#1d5f82f0&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;editor.findMatchBackground&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#197331&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="カーソル"&gt;
カーソル&lt;a href="#%e3%82%ab%e3%83%bc%e3%82%bd%e3%83%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;カーソルのスタイル。デフォルトだと個人的に見づらいので見やすくしている。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Cursor
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;editor.cursorWidth&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;&amp;#34;editor.cursorBlinking&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;phase&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;&amp;#34;terminal.integrated.cursorBlinking&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// ターミナルのカーソルを点滅
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="ミニマップ"&gt;
ミニマップ&lt;a href="#%e3%83%9f%e3%83%8b%e3%83%9e%e3%83%83%e3%83%97"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ミニマップのハイライトを常に表示している。また、ミニマップの文字は読まないので、詳細な文字を表示しないようにしている。ハイライトの色がわかれば十分。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Minimap
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;editor.minimap.showSlider&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;always&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;&amp;#34;editor.minimap.renderCharacters&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// ミニマップに文字を表示しない
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="ファイル作成時"&gt;
ファイル作成時&lt;a href="#%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e4%bd%9c%e6%88%90%e6%99%82"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ファイル作成時の挙動。とくに改行文字は&lt;code&gt;auto&lt;/code&gt;にすると意図しない動作をしそうなので、明示的に指定している。環境や言語に依存するので、よくワークスペースの設定で上書きする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Create File
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;files.eol&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;&amp;#34;editor.tabSize&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// tab size
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;workbench.editor.empty.hint&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hidden&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// 新規ファイル作成時のヒントを非表示
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="ファイル保存時"&gt;
ファイル保存時&lt;a href="#%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e4%bf%9d%e5%ad%98%e6%99%82"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ファイル保存時の挙動。余計な空白や改行は削除するようにしている。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Save file
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;files.autoSave&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;onWindowChange&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;&amp;#34;files.insertFinalNewline&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;&amp;#34;files.trimFinalNewlines&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;&amp;#34;files.trimTrailingWhitespace&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;&amp;#34;editor.trimAutoWhitespace&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// インデント用の空白文字を、その行が空白文字だけの場合に削除する
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;下記の拡張機能も使っている。削除の面では必要ないが、残っている空白をハイライトしてくれるのが便利。諸事情でフォーマッターを保存時に走らせられない場合とくに重宝する。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=shardulm94.trailing-spaces"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/c5df148f628800e949faf9e168c541c886424cba_hu_4f069c8281e3e1e3.webp"
alt="Trailing Spaces - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Trailing Spaces - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Highlight trailing spaces and delete them in a flash!&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;h2 id="ファイルスクロール時"&gt;
ファイルスクロール時&lt;a href="#%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%b9%e3%82%af%e3%83%ad%e3%83%bc%e3%83%ab%e6%99%82"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;stickyScroll&lt;/code&gt;はファイルスクロール時に関数名や見出しを保持してスクロールしてくれる便利機能。個人的にないと困る。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;scrollBeyondLastLine&lt;/code&gt;と&lt;code&gt;padding.bottom&lt;/code&gt;を指定することで、最終行よりも下にスクロールできる度合いを調整している。これは好みの問題。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Scroll file
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;editor.stickyScroll.enabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;&amp;#34;editor.scrollBeyondLastLine&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;&amp;#34;editor.padding.bottom&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// 最終行より下に空白を追加
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="マウスホイールの挙動"&gt;
マウスホイールの挙動&lt;a href="#%e3%83%9e%e3%82%a6%e3%82%b9%e3%83%9b%e3%82%a4%e3%83%bc%e3%83%ab%e3%81%ae%e6%8c%99%e5%8b%95"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;マウスホイールでズームできると画面共有時に便利。タブ切り替えの設定は好み。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Mouse wheel
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;editor.mouseWheelZoom&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;&amp;#34;window.zoomLevel&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;-1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;&amp;#34;workbench.editor.scrollToSwitchTabs&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// タブ上部でマウスホイール時に、shiftを押さなくてもタブを切り替える
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="エクスプローラを見やすくする"&gt;
エクスプローラを見やすくする&lt;a href="#%e3%82%a8%e3%82%af%e3%82%b9%e3%83%97%e3%83%ad%e3%83%bc%e3%83%a9%e3%82%92%e8%a6%8b%e3%82%84%e3%81%99%e3%81%8f%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;エクスプローラのインデントを調整し、見やすくしている。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Explorer
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;workbench.tree.indent&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;&amp;#34;workbench.tree.renderIndentGuides&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;always&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// エクスプローラのインデントガイドを常に表示
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="特定文字の可視化強調"&gt;
特定文字の可視化/強調&lt;a href="#%e7%89%b9%e5%ae%9a%e6%96%87%e5%ad%97%e3%81%ae%e5%8f%af%e8%a6%96%e5%8c%96%e5%bc%b7%e8%aa%bf"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;可視化/強調できる文字は可能な限りそうする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Text emphasis
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;editor.renderWhitespace&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;all&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;&amp;#34;editor.unicodeHighlight.nonBasicASCII&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;//基本ASCII以外の文字を強調表示
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;editor.renderControlCharacters&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// 制御文字を表示
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="その他のエディタ機能の設定"&gt;
その他のエディタ機能の設定&lt;a href="#%e3%81%9d%e3%81%ae%e4%bb%96%e3%81%ae%e3%82%a8%e3%83%87%e3%82%a3%e3%82%bf%e6%a9%9f%e8%83%bd%e3%81%ae%e8%a8%ad%e5%ae%9a"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;その他の細かい設定。&lt;/p&gt;
&lt;p&gt;括弧の色付けと縦線のガイドは必須といってもいいほど便利。&lt;/p&gt;
&lt;p&gt;区切り文字の変更はデフォルトからハイフンを除外しているだけ。ダブルクリック時にハイフンを含めて選択できるようになるのが便利。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Editor
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;workbench.editor.tabSizing&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;shrink&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;&amp;#34;editor.rulers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="c1"&gt;// 80文字目に縦線を表示
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;editor.lineHeight&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;&amp;#34;editor.letterSpacing&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;&amp;#34;editor.multiDocumentOccurrencesHighlight&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;&amp;#34;workbench.editor.pinnedTabsOnSeparateRow&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;&amp;#34;editor.bracketPairColorization.enabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;&amp;#34;editor.guides.bracketPairs&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;&amp;#34;editor.wordSeparators&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;`~!@#$%^&amp;amp;*()=+[{]}\\|;:&amp;#39;\&amp;#34;,.&amp;lt;&amp;gt;/?&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;&amp;#34;telemetry.telemetryLevel&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;off&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;&amp;#34;editor.accessibilitySupport&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;off&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;&amp;#34;window.title&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${dirty}${activeEditorMedium}${separator}${rootName}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;&amp;#34;workbench.startupEditor&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;&amp;#34;editor.inlineSuggest.enabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;&amp;#34;editor.inlayHints.enabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;on&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// インラインヒントを表示
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// DiffEditor
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;diffEditor.ignoreTrimWhitespace&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// 空白文字の変更を無視しない
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Suggestion
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;editor.acceptSuggestionOnEnter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;off&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Enterで予測候補が入力されないようにする
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;editor.suggestSelection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;first&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// 最初の候補を選択
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Debug
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;debug.inlineValues&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;on&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// デバッグ中に行内に変数値を表示
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// File reading
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;files.readonlyInclude&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;node_modules&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;.git&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="gitの挙動"&gt;
Gitの挙動&lt;a href="#git%e3%81%ae%e6%8c%99%e5%8b%95"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;autofetch&lt;/code&gt;を有効にすることでpullし忘れを防いでいる（まあ忘れるときは忘れる）。また、GitHubを使うことが多いので、プロトコルをsshに変更している。&lt;/p&gt;
&lt;p&gt;署名付きコミットを使っている場合は他のツールも署名付きコミットを使うように設定する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Git
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;git.autofetch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;all&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// 自動fetchをON
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;github.gitProtocol&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ssh&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// gitのプロトコルをsshに変更
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;git.enableCommitSigning&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;git-graph.repository.sign.commits&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;gpgIndicator.enablePassphraseCache&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Git関連で使っている拡張機能は下記のとおり。&lt;/p&gt;
&lt;p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=mhutchie.git-graph"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/6277f9cc6a4f80225b06eee9dcb6ceac08d41415_hu_d5d970748b086cfc.webp"
alt="Git Graph - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Git Graph - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - View a Git Graph of your repository, and perform Git actions from the graph.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=donjayamanne.githistory"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/5fb94e29d719a5f8c800c4a7f222e7d924797d2d_hu_4522df8d127416f1.webp"
alt="Git History - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Git History - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - View git log, file history, compare branches or commits&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;/p&gt;
&lt;p&gt;GitHubのPRをよく使うプロジェクトだと下記も使う。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=GitHub.vscode-pull-request-github"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/0b8bfc088a50b5861a4085d58c91bf6a73773f41_hu_4ff3f377afdbc568.webp"
alt="GitHub Pull Requests - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
GitHub Pull Requests - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Pull Request and Issue Provider for GitHub&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;署名付きコミットを使う場合で、かつdevcontainerを使っている場合は、下記の拡張機能でgpgキーのパスをキャッシュしている。これは自己責任で。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=wdhongtw.gpg-indicator"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/e175b2374f6a106a82119bdd763d72b2f80ec3b9_hu_acc15c7013408fd2.webp"
alt="GPG Indicator - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
GPG Indicator - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Status indicator and unlocker for GPG signing key&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;h2 id="github-copilotの挙動"&gt;
GitHub Copilotの挙動&lt;a href="#github-copilot%e3%81%ae%e6%8c%99%e5%8b%95"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;この設定は暫定。アップデートが激しい。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;GitHub Copilotの設定（暫定）&lt;/summary&gt;
&lt;p&gt;&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Github Copilot
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;chat.agent.enabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;github.copilot.nextEditSuggestions.enabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;github.copilot.chat.commitMessageGeneration.instructions&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;file&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;.github/instructions/commit-message.instruction.md&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;text&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;You must write in English.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;github.copilot.enable&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;*&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;plaintext&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;markdown&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;scminput&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;chat.tools.terminal.autoApprove&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;cd&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;ls&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;find&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;head&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;mkdir&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;touch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;/^uv\\s+--version$/&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;/^uv\\s+init\\b/&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;/^uv\\s+venv\\b/&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;/^uv\\s+python\\s+pin\\b/&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;/^uv\\s+add\\b/&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;/^uv\\s+remove\\b/&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;/^uv\\s+run\\b/&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// False commands
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;rm&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&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;&amp;#34;del&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&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;&amp;#34;git&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;chat.tools.urls.autoApprove&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;https://raw.githubusercontent.com/github/gitignore/main/Python.gitignore&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;approveRequest&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&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;&amp;#34;approveResponse&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;拡張機能を入れる必要がある。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=GitHub.copilot-chat"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/57afbc569d8d84fbb5bf4e5712c16d76354c3bde_hu_20dafcf0a6121ddc.webp"
alt="GitHub Copilot Chat - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
GitHub Copilot Chat - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - AI chat features powered by Copilot&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;h2 id="リモート接続"&gt;
リモート接続&lt;a href="#%e3%83%aa%e3%83%a2%e3%83%bc%e3%83%88%e6%8e%a5%e7%b6%9a"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ポートを自動で転送するようにしている。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Remote
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;remote.autoForwardPortsSource&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hybrid&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;リモート関連の機能については、下記の拡張機能パッケージを入れておけばたいてい問題ない。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/ecaff2337c447c6f5f63df810ace3b96a4365c2e_hu_2536578cab1c1f0.webp"
alt="Remote Development - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Remote Development - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - An extension pack that lets you open any folder in a container, on a remote machine, or in WSL and take advantage of VS Code's full feature set.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;devcontainerを使うときはDockerfileも書くことがあるので、Dockerの拡張機能も入れている。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/3c3aa1888f2aee203fbf668c2eb6ffd4495afd7a_hu_f4f6a5b2bee586b9.webp"
alt="Docker - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Docker - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Makes it easy to create, manage, and debug containerized applications.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;h2 id="ターミナル"&gt;
ターミナル&lt;a href="#%e3%82%bf%e3%83%bc%e3%83%9f%e3%83%8a%e3%83%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ターミナルを開いたときにデフォルトで起動するshellを変更している。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Terminal
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;terminal.integrated.defaultProfile.windows&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Git Bash&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// デフォルトのshellを変更
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="フォーマット"&gt;
フォーマット&lt;a href="#%e3%83%95%e3%82%a9%e3%83%bc%e3%83%9e%e3%83%83%e3%83%88"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;自動フォーマットの設定。デフォルトのフォーマッターは言語により異なるのでここには書いていない。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Formatter
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;editor.formatOnSave&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// 保存時にformatする
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;editor.formatOnType&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// タイプ時にformatする
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="言語ごとの設定"&gt;
言語ごとの設定&lt;a href="#%e8%a8%80%e8%aa%9e%e3%81%94%e3%81%a8%e3%81%ae%e8%a8%ad%e5%ae%9a"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="markdown"&gt;
Markdown&lt;a href="#markdown"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;テキスト、とくにマークダウンは一番書くといっても過言ではない。そのため色々設定している。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Markdown
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;textlint.autoFixOnSave&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&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;&amp;#34;[markdown]&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;editor.tabSize&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&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;&amp;#34;editor.suggest.showWords&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&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;&amp;#34;editor.wordWrap&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;on&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;editor.quickSuggestions&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;comments&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;on&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;strings&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;on&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;other&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;on&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;editor.snippetSuggestions&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;top&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;editor.defaultFormatter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;yzhang.markdown-all-in-one&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;editor.unicodeHighlight.nonBasicASCII&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;markdown.preview.breaks&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&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;&amp;#34;markdown.preview.fontFamily&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#39;Yu Gothic&amp;#39;,&amp;#39;Meiryo&amp;#39;, -apple-system, BlinkMacSystemFont, &amp;#39;Segoe WPC&amp;#39;, &amp;#39;Segoe UI&amp;#39;, system-ui, &amp;#39;Ubuntu&amp;#39;, &amp;#39;Droid Sans&amp;#39;, sans-serif&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;markdownlint.config&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;MD007&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&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;&amp;#34;MD010&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&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;&amp;#34;MD025&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&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;&amp;#34;MD026&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&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;&amp;#34;MD033&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;markdown.extension.list.indentationSize&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;inherit&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;markdown.extension.orderedList.marker&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;one&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;markdown.extension.toc.orderedList&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;markdown.extension.toc.levels&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2..6&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;markdown.extension.toc.updateOnSave&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&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;&amp;#34;markdown-preview-enhanced.hideDefaultVSCodeMarkdownPreviewButtons&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&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;&amp;#34;markdown-preview-enhanced.mermaidTheme&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;forest&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;markdown-preview-enhanced.breakOnSingleNewLine&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&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;&amp;#34;markdown-pdf.styles&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;VSCode_mdPreview.css&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;markdown.marp.html&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;all&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;マークダウン関連で使っている拡張機能は結構多い。下記は必須級。&lt;/p&gt;
&lt;p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/9300ba299636a545a2ba04ffc58b37635b1842a7_hu_66e083b746e4c581.webp"
alt="Markdown All in One - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Markdown All in One - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - All you need to write Markdown (keyboard shortcuts, table of contents, auto preview and more)&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=DavidAnson.vscode-markdownlint"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/d85d3a606895ee3d3b26af027153b094c3a1a0e9_hu_f3ee57e878f84c0.webp"
alt="markdownlint - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
markdownlint - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Markdown linting and style checking for Visual Studio Code&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;/p&gt;
&lt;p&gt;下記は必須ではないが、見出しのずれに気づけるので便利。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=gera2ld.markmap-vscode"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/e2a6e0f768e678c180527ad8d3db9d1b1a1cb43c_hu_82e8efa6c4123d7b.webp"
alt="Markmap - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Markmap - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Visualize your markdown in VSCode&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;画像の貼り付けはPaste Imageを使っている。WSL環境でも動作するので便利。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=mushan.vscode-paste-image"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/b755862163248b216a8f4c3e5c99ad1382cf831a_hu_b35ca742e07fd3d.webp"
alt="Paste Image - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Paste Image - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - paste image from clipboard directly&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;読みやすい文章を書くためにチェックツールも使っている。&lt;/p&gt;
&lt;p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=3w36zj6.textlint"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/9d6e6465c14b48d0d5674557cfa0c29548555b58_hu_414d65f95063bdf4.webp"
alt="textlint - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
textlint - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Integrates textlint into VS Code.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=noy-shimotsuki.hyogai-kanji-checker"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="表外漢字チェッカー - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
表外漢字チェッカー - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - テキスト内の表外漢字（人名用漢字を含む常用外漢字）を強調表示させます。&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;/p&gt;
&lt;p&gt;マークダウンすら知らない人に渡すとき、あるいは文書改ざんを防ぎたいときはPDFにしている。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=yzane.markdown-pdf"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/ddf9d678c9eb3ccf2e336ae18bb851d07b681d60_hu_b3c22f0b0c89bf7b.webp"
alt="Markdown PDF - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Markdown PDF - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Convert Markdown to PDF&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;Marpを使うときは下記を入れる。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=marp-team.marp-vscode"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/c33385e1a461c3a36c78df28795b6d017c6f2f78_hu_77dfff3d7679afb9.webp"
alt="Marp for VS Code - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Marp for VS Code - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Create slide deck written in Marp Markdown on VS Code&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;h3 id="プレーンテキスト"&gt;
プレーンテキスト&lt;a href="#%e3%83%97%e3%83%ac%e3%83%bc%e3%83%b3%e3%83%86%e3%82%ad%e3%82%b9%e3%83%88"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Plain text
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;[plaintext]&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;editor.suggest.showWords&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="jsonjsonc"&gt;
JSON/JSONC&lt;a href="#jsonjsonc"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;フォーマットの設定だけ。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// JSON
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;[json]&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;editor.defaultFormatter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;esbenp.prettier-vscode&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;[jsonc]&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;editor.defaultFormatter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;esbenp.prettier-vscode&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="python"&gt;
Python&lt;a href="#python"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Python settings
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;[python]&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;editor.tabSize&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&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;&amp;#34;editor.wordBasedSuggestions&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;off&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;editor.defaultFormatter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;charliermarsh.ruff&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;python.analysis.inlayHints.callArgumentNames&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;all&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;python.analysis.inlayHints.functionReturnTypes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;python.analysis.inlayHints.variableTypes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;python.analysis.inlayHints.pytestParameters&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;flake8.args&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;--ignore=E203,W503,E704&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;--max-line-length=80&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;notebook.cellToolbarLocation&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;default&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;right&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;jupyter-notebook&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;python.analysis.typeCheckingMode&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;strict&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;python.analysis.diagnosticSeverityOverrides&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;reportMissingImports&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;error&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;reportMissingSuperCall&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;error&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;reportMissingParameterType&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;error&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;reportMissingModuleSource&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;error&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;reportMissingTypeArgument&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;error&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;reportMissingTypeStubs&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;information&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;最近は基本的に&lt;code&gt;ruff&lt;/code&gt;を使っているので、&lt;code&gt;flake8&lt;/code&gt;の設定は昔の設定だが、念のため残してある。また、プロジェクトに&lt;code&gt;pyrightconfig.json&lt;/code&gt;を設定していることが多いので、一部の設定はたいてい&lt;code&gt;pyrightconfig.json&lt;/code&gt;で上書きしている。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=charliermarsh.ruff"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/4d4501221a359a6577db2bb603575241de3372b1_hu_e7bdb65c8ca02b05.webp"
alt="Ruff - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Ruff - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - A Visual Studio Code extension with support for the Ruff linter and formatter for Python.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;Pythonの拡張機能は必須。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=ms-python.python"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/29a6e81aa845ef908b07292d7b8538761ef35e7e_hu_3312adcd9e380ec6.webp"
alt="Python - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Python - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Python language support with extension access points for IntelliSense (Pylance), Debugging (Python Debugger), linting, formatting, refactoring, unit tests, and more.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;Mypyも基本的に使っている。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=ms-python.mypy-type-checker"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/bc443415d9489f72d035900edfeb59800d6f60c4_hu_3312adcd9e380ec6.webp"
alt="Mypy Type Checker - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Mypy Type Checker - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Type checking support for Python files using Mypy.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;ドキュメントをきちんと書くときはプレビューツールも使う。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=ms-vscode.live-server"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/20a5fa39a202c9f5861194956309f57cb8aa7421_hu_5f181681eb0d819c.webp"
alt="Live Preview - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Live Preview - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Hosts a local server in your workspace for you to preview your webpages on.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;h3 id="c"&gt;
C++&lt;a href="#c"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;フォーマットスタイルの指定をしている。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;C_Cpp.clang_format_style&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;{ BasedOnStyle: LLVM, AccessModifierOffset: -4, BreakBeforeBraces: Attach, IndentWidth: 4, PointerAlignment: Left }&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;liveServer.settings.donotShowInfoMsg&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="web関連"&gt;
Web関連&lt;a href="#web%e9%96%a2%e9%80%a3"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Auto close tagに変わる設定と、Auto rename tagに変わる設定を有効にしている。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Auto close tag
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;html.autoClosingTags&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;javascript.autoClosingTags&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;typescript.autoClosingTags&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Auto rename tag
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;editor.linkedEditing&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Web related
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;[html]&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;editor.tabSize&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&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;&amp;#34;editor.defaultFormatter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;esbenp.prettier-vscode&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;[css]&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;editor.tabSize&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&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;&amp;#34;editor.defaultFormatter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;esbenp.prettier-vscode&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;[scss]&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;editor.tabSize&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;javascript.updateImportsOnFileMove.enabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;never&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;[javascript]&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;editor.tabSize&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&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;&amp;#34;editor.defaultFormatter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;esbenp.prettier-vscode&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;typescript.updateImportsOnFileMove.enabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;never&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;[typescript]&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;editor.defaultFormatter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;esbenp.prettier-vscode&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;[typescriptreact]&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;editor.defaultFormatter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;esbenp.prettier-vscode&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;大抵はESLintとPrettierを使う。もちろんNext.jsやVue.jsなどのフレームワーク固有の設定もプロジェクトごとに行っている。&lt;/p&gt;
&lt;p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/8a48f6a162e6a3dd5463a1317d8dc69d1b6687ff_hu_d47ba0320a9b1a71.webp"
alt="ESLint - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
ESLint - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Integrates ESLint JavaScript into VS Code.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/2ab1e70bb03490de9856c5f320665332acce9ac3_hu_35841037b6d12a96.webp"
alt="Prettier - Code formatter - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Prettier - Code formatter - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Code formatter using prettier&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;/p&gt;
&lt;p&gt;Highlight Matching Tagも便利。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=vincaslt.highlight-matching-tag"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/9cde83a2e8c731f8a2415d1898fffae5cb89671a_hu_e0971bc443f43ca1.webp"
alt="Highlight Matching Tag - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Highlight Matching Tag - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Highlights matching closing and opening tags&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;たまにプレビュー機能も使う。下記のどちらがより良いのかはよくわかっていない。&lt;/p&gt;
&lt;p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/3377dafae21e0663c0596acb79839786d5cd752e_hu_17b5c98a9b992119.webp"
alt="Live Server - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Live Server - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Launch a development local Server with live reload feature for static &amp; dynamic pages&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=ms-vscode.live-server"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/20a5fa39a202c9f5861194956309f57cb8aa7421_hu_5f181681eb0d819c.webp"
alt="Live Preview - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Live Preview - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Hosts a local server in your workspace for you to preview your webpages on.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;/p&gt;
&lt;p&gt;SVGを使うときは、拡張機能をいれてプレビューできるようにしている。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=SimonSiefke.svg-preview"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/f4ceeb96446211dc941feacc9bf587bd3f32284a_hu_64172c09ce1bb3e5.webp"
alt="Svg Preview - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Svg Preview - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Preview for Svg files&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;ただ、これはダークテーマと相性が悪いので、設定も追加している。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// SVG Preview
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;svgPreview.autoOpen&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&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;&amp;#34;svgPreview.style&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;html&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;background&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;white&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="latex"&gt;
LaTeX&lt;a href="#latex"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;最近はマークダウンから変換しているので全然書いていない。だからこの設定も古いままだと思われる。参考まで。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;タイトル&lt;/summary&gt;
&lt;p&gt;&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;[latex]&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;editor.wordWrap&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;on&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;editor.wordSeparators&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./\\()\&amp;#34;&amp;#39;-:,.;&amp;lt;&amp;gt;~!@#$%^&amp;amp;*|+=[]{}`~?．。，、（）「」［］｛｝《》てにをはがのともへでや&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;editor.suggestSelection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;recentlyUsedByPrefix&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;editor.suggest.snippetsPreventQuickSuggestions&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&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;&amp;#34;editor.quickSuggestions&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;other&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;comments&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&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;&amp;#34;strings&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;editor.tabSize&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;[tex]&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;editor.suggest.snippetsPreventQuickSuggestions&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&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;&amp;#34;editor.tabSize&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;[bibtex]&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;editor.tabSize&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;latex-workshop.latex.autoBuild.run&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;never&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;latex-workshop.intellisense.package.enabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;latex-workshop.view.pdf.viewer&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;tab&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;latex-workshop.docker.enabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&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;&amp;#34;latex-workshop.docker.image.latex&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;latexindent&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;latex-workshop.latex.outDir&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./latex-output&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;latex-workshop.view.pdf.zoom&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;page-width&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;latex-workshop.latex.recipe.default&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;lastUsed&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;latex-workshop.latex.autoClean.run&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;onFailed&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;latex-workshop.latex.clean.fileTypes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;*.aux&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;*.bbl&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;*.blg&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;*.idx&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;*.ind&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;*.lof&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;*.lot&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;*.out&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;*.toc&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;*.acn&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;*.acr&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;*.alg&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;*.glg&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;*.glo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;*.gls&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;*.ist&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;*.fls&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;*.fdb_latexmk&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;*_minted*&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;*.snm&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;*.nav&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;*.vrb&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;*.dvi&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;*.synctex.gz&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;*.bcf&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// ADD
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;*.run.xml&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;// ADD
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;latex-workshop.latex.recipes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;LuaLaTeX with BibLaTeX&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;tools&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;lualatex_non-synctex&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;biblatex&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;lualatex_non-synctex&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;lualatex&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;LuaLaTeX&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;tools&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;lualatex_non-synctex&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;lualatex&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;latex-workshop.latex.tools&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// LuaLaTeX non-SyncTeX mode
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;lualatex_non-synctex&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;lualatex&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;args&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;-interaction=nonstopmode&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;-file-line-error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;-halt-on-error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;--output-directory=%OUTDIR%&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;%DOC%&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// LuaLaTeX
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;lualatex&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;lualatex&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;args&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;-synctex=1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;-interaction=nonstopmode&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;-file-line-error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;-halt-on-error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;--output-directory=%OUTDIR%&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;%DOC%&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// BibLaTeX
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;biblatex&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;biber&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;args&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;%DOCFILE%&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;--bblencoding=utf8&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;-u&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;-U&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;--output_safechars&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;--output-directory=%OUTDIR%&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="拡張機能特有の設定"&gt;
拡張機能特有の設定&lt;a href="#%e6%8b%a1%e5%bc%b5%e6%a9%9f%e8%83%bd%e7%89%b9%e6%9c%89%e3%81%ae%e8%a8%ad%e5%ae%9a"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="highlight"&gt;
Highlight&lt;a href="#highlight"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;任意の用語をハイライトするのに使っている拡張機能。主に読みやすい日本語を書くために直したほうが良い表現をハイライトしている。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=fabiospampinato.vscode-highlight"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/6bd4aa58f6e69f7f56cd70aa54825724b79549af_hu_6dcdb1c7174fabd2.webp"
alt="Highlight - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Highlight - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Advanced text highlighter based on regexes. Useful for todos, annotations, colors etc.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;details&gt;
&lt;summary&gt;Highlightの設定（長いので畳む）&lt;/summary&gt;
&lt;p&gt;&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Highlight
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;highlight.regexes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// URL強調
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;(https?|ftp)(://[-_.!~*\\&amp;#39;()a-zA-Z0-9;/?:\\@&amp;amp;=+\\$,%#]+)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#9FA8DA&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#9FA8DA&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&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;&amp;#34;([０-９Ａ-Ｚ])&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;backgroundColor&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#455A64&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#C62828&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 二重否定強調（参考：https://qiita.com/azu/items/60764ed6f415d3c748bf）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;(なくはない|なくはありません|ないでもない|ないでもありません|ないものではない|ないものではありません|ないことはない|ないことはありません|ないわけではない|ないわけではありません|ないとはいいきれない|ないとはいいきれません|ないとはかぎらない|ないとはかぎりません)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;backgroundColor&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#455A64&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#C62828&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 冗長表現（害悪）1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;(ことが可能|ことも可能|ことができ|こともでき|ことはでき|可能で|可能と)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;backgroundColor&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#455A64&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#C62828&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 冗長表現（害悪）2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;(を行う|を行います|を行った|を行いました|を行える|を行って|を行った|ことによって|ことにより|となって|させること|おいては|ということ)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;backgroundColor&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#455A64&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#C62828&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&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;&amp;#34;(一番最初|まずはじめ|まず、はじめ|まず初|まず、初|まず最初|まず、最初|では次に|では、次に|必ず必要|必ず、必要)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;backgroundColor&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#455A64&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#C62828&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 冗長表現（害悪）3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;(その結果として|する方法で|するのです|いますので|いますため)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;backgroundColor&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#455A64&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#C62828&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&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;&amp;#34;(なんか|。なので|にて|なのか|なんて|といった|こっち|そっち|どっち|ちゃんと|でも、|だけど|けど|やっぱり|とっても|いっぱい|なきゃ|じゃなくて|じゃない|すごく|から、|全然|いろんな|だったりする|だったりします|一応|こんな|やっと)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;backgroundColor&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#455A64&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#C62828&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&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;&amp;#34;(づつ)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;backgroundColor&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#455A64&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#C62828&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&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;&amp;#34;(なのだといえ|なのだと言え|であるといえ|であると言え|であるから)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;backgroundColor&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#455A64&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#C62828&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&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;&amp;#34;(という|こと|ので|ため|また、|したがって、|よって、|ゆえに、|ようにする)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#C0CA33&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&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;&amp;#34;(と考えられる|と考えられます|かもしれない|かもしれません|と思う|と思います|と思われる|と思っている|と思われます|きっと|であろう|でしょう|のようである|のようです|と見ても良い|と見てもよい|と見てもいい|とみても良い|とみてもよい|とみてもいい|ほぼ|ような|らしい|みたいな|な感じ|かな|的に|的な)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;backgroundColor&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#1A237E&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&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;&amp;#34;(通してる|行ってる|見れ|食べれ|着れ|考えれ)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;backgroundColor&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#1A237E&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 2文に分けられるのでは？
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;(し、|であり、|して、|だが、|ですが、|せず、|おらず、|なく、)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;backgroundColor&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#827717&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&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;&amp;#34;(あり、|おり、|が、|き、|し、|て、|く、|ず、|で、)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;backgroundColor&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#827717&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&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;&amp;#34;(になります|になる|の方|のほう|中で、|されてくる|に対して)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;backgroundColor&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#004D40&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// ひらがなにしよう！1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;(沢山|共に|出来る|出来た|出来て|出来な|下さい|更に|暫く|既に|偶に|時々|及び|且つ|但し|尚|並びに|又は|全て|初めに|始めに|分かる|分から|分かっ)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#E65100&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// ひらがなにしよう！2（参考：https://github.com/lostandfound/textlint-rule-ja-hiragana-keishikimeishi）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;(る上|た上|の上|る事|た事|の事|る度|た度|の度|る方|た方|の方|る時|た時|の時|る毎|た毎|の毎|る為|た為|の為|る訳|た訳|の訳|る所|た所|の所|る通り|た通り|の通り|る物|た物|の物|る他|た他|の他)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#E65100&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// ひらがなにしよう！3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;(為|致します|無い|頂き|頂く|等|如何|何時も|何故|所謂|乍ら|様々な|然し|若し|次第|是非|度々|取り敢えず|前以て|前以って|先ず|殆ど|し易い|の様に|以下の通り)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#E65100&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&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;&amp;#34;(DONE)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#00897B&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;(DELAY|INCOMPLETE)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#C62828&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;(PENDING)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#827717&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;(NOW)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#E65100&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;(PROBLEM)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;backgroundColor&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#C62828&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#E0F2F1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;(FUTURE)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#59bae0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;h3 id="todo-tree"&gt;
Todo Tree&lt;a href="#todo-tree"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=Gruntfuggly.todo-tree"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/c04cb2b5864771b8f66d4b6f18b23f677cbc897f_hu_24455efcc1cb8e8b.webp"
alt="Todo Tree - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Todo Tree - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Show TODO, FIXME, etc. comment tags in a tree view&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;重要度に合わせて色を付けている。タグにコロンを付けないと反応しないようにしている。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Todo Treeの設定（長いので畳む）&lt;/summary&gt;
&lt;p&gt;&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;todo-tree.general.debug&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;todo-tree.general.tags&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;BUG:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// 動かない
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;XXX:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// 動くがなぜ動くかわからない
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;FIXME:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// 既知の不具合があり、修正が必要
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;TODO:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// 追加/修正するべき機能がある
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;REVIEW:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// 意図したとおりに動くか要確認
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;WARNING:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// 注意
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;OPTIMIZE:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// ボトルネックになっている
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;HACK:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// あまりきれいではなく、リファクタリングが必要
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;CHANGED:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// コードをどのように変更したかのメモ
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;NOTE:&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;// メモ
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;todo-tree.regex.regex&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;((//|#|&amp;lt;!--|;|/\\*|^)\\s*($TAGS)|^//\\s*\\[x\\]|^//\\s*\\[ \\])&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;todo-tree.highlights.defaultHighlight&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;text-and-comment&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;icon&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;alert&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;foreground&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#00897B&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;background&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#E0F2F1&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;iconColour&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#00897B&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;gutterIcon&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;todo-tree.highlights.customHighlight&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;BUG:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&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;&amp;#34;icon&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;bug&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;background&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#ffcdd2&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;foreground&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#d32f2f&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;fontWeight&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;bold&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;iconColour&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#e53935&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;XXX:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&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;&amp;#34;icon&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;x-circle-fill&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;background&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#ffcdd2&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;foreground&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#d32f2f&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;fontWeight&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;bold&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;iconColour&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#e53935&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;FIXME:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&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;&amp;#34;icon&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;flame&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;background&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#ffcdd2&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;foreground&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#d32f2f&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;fontWeight&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;bold&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;iconColour&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#e53935&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;TODO:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&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;&amp;#34;icon&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;tools&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;foreground&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#33691E&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;background&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#DCEDC8&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;iconColour&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#81C784&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;REVIEW:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&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;&amp;#34;icon&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;eye&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;foreground&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#E65100&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;background&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#FFE0B2&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;iconColour&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#F57C00&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;WARNING:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&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;&amp;#34;icon&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;alert&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;foreground&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#E65100&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;background&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#FFE0B2&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;iconColour&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#F57C00&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;OPTIMIZE:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&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;&amp;#34;icon&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hourglass&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;foreground&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#E65100&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;background&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#FFE0B2&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;iconColour&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#F57C00&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;HACK:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&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;&amp;#34;icon&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;pin&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;foreground&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#E65100&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;background&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#FFE0B2&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;iconColour&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#F57C00&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;CHANGED:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&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;&amp;#34;icon&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;issue-reopened&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;foreground&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#1A237E&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;background&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#C5CAE9&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;iconColour&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#F9A825&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;NOTE:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&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;&amp;#34;icon&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;pencil&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;hideFromTree&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;//&amp;#34;gutterIcon&amp;#34;: false,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="vsnotes"&gt;
VSNotes&lt;a href="#vsnotes"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=patricklee.vsnotes"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/d834d15cb1384fb83b899b3e9195b63e77ce2e0e_hu_8b99648bfb10a290.webp"
alt="VSNotes - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
VSNotes - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Simple VS Code extension for plain text note taking.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;デフォルトのパスと、作成されるファイル名のフォーマットを設定している。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;VSNotesの設定&lt;/summary&gt;
&lt;p&gt;&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// VSNotes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;vsnotes.defaultNotePath&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;path/to/VSNotes&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;vsnotes.tokens&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;datetime&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;token&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;{dt}&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;format&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;YYYYMMDD&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Insert formatted datetime.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;token&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;{title}&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Insert note title from input box.&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;format&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Untitled&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;extension&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;token&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;{ext}&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Insert file extension.&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;format&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;md&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="その他の拡張機能"&gt;
その他の拡張機能&lt;a href="#%e3%81%9d%e3%81%ae%e4%bb%96%e3%81%ae%e6%8b%a1%e5%bc%b5%e6%a9%9f%e8%83%bd"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="優先度高"&gt;
優先度高&lt;a href="#%e5%84%aa%e5%85%88%e5%ba%a6%e9%ab%98"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;パスの候補を表示する拡張機能。これがあるだけで手間が格段に減る。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=christian-kohler.path-intellisense"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/e5b8c2c17fbb172bc21d63ef33bc14ebb182db12_hu_3c4a9197ccca7ff5.webp"
alt="Path Intellisense - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Path Intellisense - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Visual Studio Code plugin that autocompletes filenames&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;スペルチェックの拡張機能。タイプミスにも気づけるので、プログラミングには必須。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/b6fb8310837efc119da53cdb70ccf48988666c62_hu_bc8558e5debb3de2.webp"
alt="Code Spell Checker - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Code Spell Checker - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Spelling checker for source code&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;エラーをエディタ上に表示してくれる拡張機能。毎回ターミナルの問題を読まずに済む。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=usernamehw.errorlens"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/de57947d5073e782c83d4771ecc2b672974840cc_hu_6bbdf1434fb49cc0.webp"
alt="Error Lens - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Error Lens - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Improve highlighting of errors, warnings and other language diagnostics.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;インデントに色を付ける拡張機能。Pythonを読み書きするときはないと困る。重いらしいが、個人的には気になったことはない。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=oderwat.indent-rainbow"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/c973f480b876f96cd00696c6aaa933481c0c0001_hu_867586937c45741e.webp"
alt="indent-rainbow - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
indent-rainbow - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Makes indentation easier to read&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;h3 id="優先度中"&gt;
優先度中&lt;a href="#%e5%84%aa%e5%85%88%e5%ba%a6%e4%b8%ad"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;カラーコードを書くとその色でハイライトしてくれる拡張機能。意外とカラーコードを書くことはあるので、書いている最中に色を確認できるのは便利。標準のハイライトよりもわかりやすくて好き。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=naumovs.color-highlight"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/769260c9fd7da7d19219847866349f2295c46469_hu_e2699110af82a0b4.webp"
alt="Color Highlight - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Color Highlight - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Highlight web colors in your editor&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;日本語にする拡張機能。日本語にしたいときは日本語にしている。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/490e88287663ead8f28826f5f2543f5f757c8602_hu_9d5a7a73a7ae748b.webp"
alt="Japanese Language Pack for Visual Studio Code - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Japanese Language Pack for Visual Studio Code - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Language pack extension for Japanese&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;音声ファイルの詳細をVS Codeで確認できる拡張機能。音声処理をするときに非常に便利。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=sukumo28.wav-preview"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/cd107e96ff4c3412c0776808a25cc83c6fe5fffc_hu_3cf9e0ee13cda217.webp"
alt="audio-preview - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
audio-preview - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - play &amp; preview audio file in VS Code. (wav,mp3,ogg,aac,flac,...etc)&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;h3 id="優先度低"&gt;
優先度低&lt;a href="#%e5%84%aa%e5%85%88%e5%ba%a6%e4%bd%8e"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;VS CodeでPDFを見れるようにする拡張機能。とくにLaTeXで文章を書くとき確認で使う。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=tomoki1207.pdf"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/97dadcfb5973f33794dc1fcd590535332bfb0002_hu_5806b844c0ed1b77.webp"
alt="vscode-pdf - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
vscode-pdf - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Display pdf file in VSCode.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;マークダウンで文章を書いているときにどういう画像が貼られているかをプレビューする拡張機能。そんなに使わないが、あると便利なこともある。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=kisstkondoros.vscode-gutter-preview"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/a48b4039741112df526351830ad5b4dd06aced46_hu_a801f74bfcf3e3d8.webp"
alt="Image preview - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Image preview - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Shows image preview in the gutter and on hover&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;CSVファイルを見やすくする拡張機能。そんなに使わないが、あると便利なこともある。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=mechatroner.rainbow-csv"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/46104c4a0c8e492bcc7c37c5d39091304e10967e_hu_2b2b1fb3d9e0ab.webp"
alt="Rainbow CSV - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Rainbow CSV - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Highlight CSV and TSV files, Run SQL-like queries&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;右下に猫を飼える。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://marketplace.visualstudio.com/items?itemName=pixl-garden.BongoCat"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/f502ace27a4d31700df526ee19935ea07d6254be_hu_c5a78e598fad0b24.webp"
alt="Bongo Cat - Visual Studio Marketplace image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Bongo Cat - Visual Studio Marketplace
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Extension for Visual Studio Code - Adds a tiny bongo cat to your status bar 😼&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7c4f239997ba0cf4df25b9ff1a8aee3ebb19a319.png"
style="margin-right: 2px;"
alt="marketplace.visualstudio.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
marketplace.visualstudio.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>MATLABでファイルパスからファイル名を取得する関数の実装</title><link>https://notes.nakurei.com/post/get-filename-from-filepath-in-matlab/</link><pubDate>Sat, 28 Oct 2023 22:17:21 +0900</pubDate><guid>https://notes.nakurei.com/post/get-filename-from-filepath-in-matlab/</guid><description>&lt;p&gt;毎回似たような実装をしている気がしたので、ある程度きちんと実装したときのコードをメモしておく。&lt;/p&gt;
&lt;h2 id="実装"&gt;
実装&lt;a href="#%e5%ae%9f%e8%a3%85"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;getFilenameFromFilepath.m&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-matlab" data-lang="matlab"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;filename_string &lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;getFilenameFromFilepath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;filepath&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;% getFilenameFromFilepath: Extracts the filename (including extension) from a given filepath.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;% Input:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;% - filepath: A char or string representing the full path to a file.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;% Output:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;% - filename_string: A string representing the filename extracted from the filepath.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;% Note: The filename is first generated as a char array to allow for easy modifications&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;% in the future if a char type output becomes necessary.&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="n"&gt;arguments&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;filepath&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;mustBeText&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c"&gt;% ensures that filepath is either char or string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&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="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ext&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fileparts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filepath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;filename_char&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;strcat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ext&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;filename_string&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename_char&lt;/span&gt;&lt;span class="p"&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;end&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
style="
display: flex;
align-items: center;
justify-content: center;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
cursor: not-allowed;
"
&gt;
&lt;div
style="
display: flex;
align-items: center;
justify-content: center;
height: 120px;
width: 120px;
max-width: 200px;
"
&gt;
&lt;img src="https://notes.nakurei.com/icons/link-off.svg" alt="No Image" width="100%" height="100%" style="object-fit: cover; margin: 0; flex-shrink: 0;"&gt;
&lt;/div&gt;
&lt;div
style="
display: flex;
flex-direction: column;
flex: 1 1 0%;
"
&gt;
&lt;div&gt;
jp.mathworks.com にアクセスできません
&lt;/div&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
"
&gt;
&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
jp.mathworks.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
style="
display: flex;
align-items: center;
justify-content: center;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
cursor: not-allowed;
"
&gt;
&lt;div
style="
display: flex;
align-items: center;
justify-content: center;
height: 120px;
width: 120px;
max-width: 200px;
"
&gt;
&lt;img src="https://notes.nakurei.com/icons/link-off.svg" alt="No Image" width="100%" height="100%" style="object-fit: cover; margin: 0; flex-shrink: 0;"&gt;
&lt;/div&gt;
&lt;div
style="
display: flex;
flex-direction: column;
flex: 1 1 0%;
"
&gt;
&lt;div&gt;
jp.mathworks.com にアクセスできません
&lt;/div&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
"
&gt;
&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
jp.mathworks.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
style="
display: flex;
align-items: center;
justify-content: center;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
cursor: not-allowed;
"
&gt;
&lt;div
style="
display: flex;
align-items: center;
justify-content: center;
height: 120px;
width: 120px;
max-width: 200px;
"
&gt;
&lt;img src="https://notes.nakurei.com/icons/link-off.svg" alt="No Image" width="100%" height="100%" style="object-fit: cover; margin: 0; flex-shrink: 0;"&gt;
&lt;/div&gt;
&lt;div
style="
display: flex;
flex-direction: column;
flex: 1 1 0%;
"
&gt;
&lt;div&gt;
jp.mathworks.com にアクセスできません
&lt;/div&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
"
&gt;
&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
jp.mathworks.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>Dockerコンテナにrootユーザーでattachする方法のメモ</title><link>https://notes.nakurei.com/post/attach-docker-container-as-root/</link><pubDate>Sat, 07 Oct 2023 23:07:52 +0900</pubDate><guid>https://notes.nakurei.com/post/attach-docker-container-as-root/</guid><description>&lt;img src="https://notes.nakurei.com/icons/brand-docker.svg" alt="Featured image of post Dockerコンテナにrootユーザーでattachする方法のメモ" /&gt;&lt;h2 id="メモ"&gt;
メモ&lt;a href="#%e3%83%a1%e3%83%a2"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Dockerコンテナにrootユーザーでattachするには、以下のコマンドを実行する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; -it --user root &amp;lt;コンテナ名&amp;gt; /bin/bash&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ただし、対象のコンテナが起動していなければならない。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://qiita.com/susumu_chang/items/956435e9baa91774a966"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/8ceff6689be4fc11dc9844791385f875c1d45321_hu_c3aea20784a5f844.webp"
alt="Docker: コンテナにrootログイン - Qiita image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Docker: コンテナにrootログイン - Qiita
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;$ docker exec -it --user root {コンテナ名} /bin/bash コンテナ名は docker ps -a で調べてよね&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7dfa4a32e8b8dd3b8a6b654e1cd55932c6a19262.png"
style="margin-right: 2px;"
alt="qiita.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
qiita.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>bytesとstrを同時に使わない - Effective Python 項目3</title><link>https://notes.nakurei.com/post/effective-python-ver2-003/</link><pubDate>Mon, 18 Sep 2023 10:01:30 +0900</pubDate><guid>https://notes.nakurei.com/post/effective-python-ver2-003/</guid><description>&lt;img src="https://notes.nakurei.com/img/header/Effective-Python-v2.webp" alt="Featured image of post bytesとstrを同時に使わない - Effective Python 項目3" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="link" href="https://www.oreilly.co.jp/books/9784873119175/" target="_blank" rel="noopener"
&gt;Effective Python 第2版&lt;/a&gt;、項目3「bytesとstrの違いを知っておく」のまとめ。&lt;/p&gt;
&lt;h2 id="ポイント"&gt;
ポイント&lt;a href="#%e3%83%9d%e3%82%a4%e3%83%b3%e3%83%88"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;bytes&lt;/code&gt;と&lt;code&gt;str&lt;/code&gt;はまったく異なるため、同時に使わないようにしよう&lt;/li&gt;
&lt;li&gt;ヘルパー関数を使って、入力が期待する文字列型か確認しよう&lt;/li&gt;
&lt;li&gt;ファイルにUnicodeデータを読み書きするときは、&lt;code&gt;open&lt;/code&gt;時に&lt;code&gt;encoding&lt;/code&gt;パラメータを明示的に指定しよう&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="bytesとstrはまったく異なる"&gt;
&lt;code&gt;bytes&lt;/code&gt;と&lt;code&gt;str&lt;/code&gt;はまったく異なる&lt;a href="#bytes%e3%81%a8str%e3%81%af%e3%81%be%e3%81%a3%e3%81%9f%e3%81%8f%e7%95%b0%e3%81%aa%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Python3には、文字列データを表すのに&lt;code&gt;bytes&lt;/code&gt;と&lt;code&gt;str&lt;/code&gt;の2種類がある。ただし、&lt;code&gt;bytes&lt;/code&gt;はバイナリデータ、&lt;code&gt;str&lt;/code&gt;はテキストデータであるため、この2つはまったく異なる。&lt;/p&gt;
&lt;h3 id="bytes"&gt;
&lt;code&gt;bytes&lt;/code&gt;&lt;a href="#bytes"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;bytes&lt;/code&gt;はバイト型であり、生の符号なし8ビット値からなる。通常はASCIIエンコーディングで表示される。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;bytes&lt;/code&gt;のリテラルは&lt;code&gt;b&lt;/code&gt;プレフィックスを伴うクオーテーションで定義できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# b&amp;#39;hello&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# [104, 101, 108, 108, 111] (ASCIIコード)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;bytes&lt;/code&gt;はバイナリのため、バイト文字列を扱える。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\x65&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;# 16進数で表されたバイト 16進数の65は、10進数で101に等しい&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# b&amp;#39;e&amp;#39; ASCIIコードの101は文字eに対応している&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# [101]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;bytes&lt;/code&gt;はテキストエンコーディングを持たない。そのため、これをテキストデータとして扱うには、&lt;code&gt;bytes&lt;/code&gt;の&lt;code&gt;decode&lt;/code&gt;メソッドを呼び出さなければならない。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# hello&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# &amp;lt;class &amp;#39;str&amp;#39;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="str"&gt;
&lt;code&gt;str&lt;/code&gt;&lt;a href="#str"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;str&lt;/code&gt;は文字列型であり、テキスト文字を表すUnicodeコードポイントを含む。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# hello&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# [&amp;#39;h&amp;#39;, &amp;#39;e&amp;#39;, &amp;#39;l&amp;#39;, &amp;#39;l&amp;#39;, &amp;#39;o&amp;#39;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Unicodeデータのため、Unicode文字列を扱える。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;a&lt;/span&gt;&lt;span class="se"&gt;\u0300&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# à&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# [&amp;#39;a&amp;#39;, &amp;#39;̀&amp;#39;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;str&lt;/code&gt;はバイナリエンコーディングを持たない。そのため、これをバイナリデータとして扱うには、&lt;code&gt;str&lt;/code&gt;の&lt;code&gt;encode&lt;/code&gt;メソッドを呼び出さなければならない。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# b&amp;#39;hello&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# &amp;lt;class &amp;#39;bytes&amp;#39;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="文字列データの扱い方"&gt;
文字列データの扱い方&lt;a href="#%e6%96%87%e5%ad%97%e5%88%97%e3%83%87%e3%83%bc%e3%82%bf%e3%81%ae%e6%89%b1%e3%81%84%e6%96%b9"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pythonプログラムの核心部分ではUnicodeデータの&lt;code&gt;str&lt;/code&gt;を利用し、文字の符号化に関して一切の仮定をしてはならない。そうすることで、他の文字符号化を受け入れつつ、出力文字の符号化&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;を統一できる。&lt;/p&gt;
&lt;p&gt;核心部分で&lt;code&gt;str&lt;/code&gt;を利用するために、Pythonプログラムを書くときは、インターフェースのもっとも遠い箇所でUnicodeの符号化と複合化をすることが重要である。この方式はUnicodeサンドイッチと呼ばれる。&lt;/p&gt;
&lt;h2 id="文字列データを扱うためのヘルパー関数"&gt;
文字列データを扱うためのヘルパー関数&lt;a href="#%e6%96%87%e5%ad%97%e5%88%97%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92%e6%89%b1%e3%81%86%e3%81%9f%e3%82%81%e3%81%ae%e3%83%98%e3%83%ab%e3%83%91%e3%83%bc%e9%96%a2%e6%95%b0"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pythonでは文字列型が2種類あるため、次の2つの状況がよく起こる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;特定の符号化&lt;sup id="fnref1:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;文字の生の8ビット値を操作する&lt;/li&gt;
&lt;li&gt;符号化を指定しないUnicode文字列を操作する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本書では、この2つの文字型を変換して、入力値の種類がコードの期待するものとなるようにする2つのヘルパー関数が示されている。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;to_str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytes_or_str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&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;if&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytes_or_str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&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;return&lt;/span&gt; &lt;span class="n"&gt;bytes_or_str&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span class="p"&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;return&lt;/span&gt; &lt;span class="n"&gt;bytes_or_str&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;to_bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytes_or_str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&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;if&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytes_or_str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&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;return&lt;/span&gt; &lt;span class="n"&gt;bytes_or_str&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span class="p"&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;return&lt;/span&gt; &lt;span class="n"&gt;bytes_or_str&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="bytesとstrを扱うときの注意点"&gt;
&lt;code&gt;bytes&lt;/code&gt;と&lt;code&gt;str&lt;/code&gt;を扱うときの注意点&lt;a href="#bytes%e3%81%a8str%e3%82%92%e6%89%b1%e3%81%86%e3%81%a8%e3%81%8d%e3%81%ae%e6%b3%a8%e6%84%8f%e7%82%b9"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pythonで&lt;code&gt;bytes&lt;/code&gt;（生の8ビット文字列）と&lt;code&gt;str&lt;/code&gt;（Unicode文字）を扱うときに、理解しておくべき大事なことが2つある。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;bytes&lt;/code&gt;と&lt;code&gt;str&lt;/code&gt;を一緒に使えるとは限らない&lt;/li&gt;
&lt;li&gt;ファイルハンドルに絡む操作では、デフォルトでUnicode文字列が必要である&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="bytesとstrを一緒に使えるとは限らない"&gt;
&lt;code&gt;bytes&lt;/code&gt;と&lt;code&gt;str&lt;/code&gt;を一緒に使えるとは限らない&lt;a href="#bytes%e3%81%a8str%e3%82%92%e4%b8%80%e7%b7%92%e3%81%ab%e4%bd%bf%e3%81%88%e3%82%8b%e3%81%a8%e3%81%af%e9%99%90%e3%82%89%e3%81%aa%e3%81%84"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;bytes&lt;/code&gt;と&lt;code&gt;str&lt;/code&gt;は同じように動作するが、一緒に使えるとは限らない。たとえば、&lt;code&gt;bytes&lt;/code&gt;同士や&lt;code&gt;str&lt;/code&gt;同士は&lt;code&gt;+&lt;/code&gt;演算子で結合できるが、&lt;code&gt;str&lt;/code&gt;と&lt;code&gt;bytes&lt;/code&gt;は結合できない。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;one&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;two&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# できる&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;one&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;two&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# できる&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;one&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;two&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# できない（TypeError: can only concatenate str (not &amp;#34;bytes&amp;#34;) to str）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;one&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;two&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# できない（TypeError: can&amp;#39;t concat str to bytes）&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;同様に、二項演算子による大小比較も、&lt;code&gt;bytes&lt;/code&gt;と&lt;code&gt;str&lt;/code&gt;では比較できない。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;one&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;two&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# できる&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;one&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;two&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# できる&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;one&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;two&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# できない（TypeError: &amp;#39;&amp;gt;&amp;#39; not supported between instances of &amp;#39;bytes&amp;#39; and &amp;#39;str&amp;#39;）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;one&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;two&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# できない（TypeError: &amp;#39;&amp;gt;&amp;#39; not supported between instances of &amp;#39;str&amp;#39; and &amp;#39;bytes&amp;#39;）&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;==&lt;/code&gt;により等しいかどうか比較すると、&lt;code&gt;bytes&lt;/code&gt;と&lt;code&gt;str&lt;/code&gt;では、同じ文字列であっても評価値がFalseになる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# False&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;フォーマット文字列における&lt;code&gt;%&lt;/code&gt;演算子も、&lt;code&gt;bytes&lt;/code&gt;のフォーマット文字列に&lt;code&gt;str&lt;/code&gt;を渡すとエラーになる。これは、Pythonがどのバイナリテキスト符号化を使うべきかわからないためである。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;red &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;blue&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# TypeError: %b requires a bytes-like object, or an object that implements __bytes__, not &amp;#39;str&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;また、&lt;code&gt;str&lt;/code&gt;のフォーマット文字列に&lt;code&gt;bytes&lt;/code&gt;を渡すと、エラーにはならないが期待する結果にもならない。これは、&lt;code&gt;bytes&lt;/code&gt;インスタンスが&lt;code&gt;__repr__&lt;/code&gt;メソッドを呼び出し、その結果で&lt;code&gt;%s&lt;/code&gt;を置き換えるためである。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;red &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;blue&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# red b&amp;#39;blue&amp;#39;&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="c1"&gt;# このとき%sに入る文字列は、`repr`関数で得られる結果に等しい&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;repr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;blue&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# b&amp;#39;blue&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="ファイルハンドルに絡む操作ではデフォルトでunicode文字列が必要である"&gt;
ファイルハンドルに絡む操作では、デフォルトでUnicode文字列が必要である&lt;a href="#%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%83%8f%e3%83%b3%e3%83%89%e3%83%ab%e3%81%ab%e7%b5%a1%e3%82%80%e6%93%8d%e4%bd%9c%e3%81%a7%e3%81%af%e3%83%87%e3%83%95%e3%82%a9%e3%83%ab%e3%83%88%e3%81%a7unicode%e6%96%87%e5%ad%97%e5%88%97%e3%81%8c%e5%bf%85%e8%a6%81%e3%81%a7%e3%81%82%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Pythonの組み込み関数&lt;code&gt;open&lt;/code&gt;は、テキストモードの場合Unicode文字列が必要である。&lt;/p&gt;
&lt;p&gt;たとえば、バイナリデータをファイルに書き込む場合、下記のコードはエラーになる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;data.bin&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;w&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\xf1\xf2\xf3\xf4\xf5&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# TypeError: write() argument must be str, not bytes&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これは、ファイルがテキスト書き込みモード&lt;code&gt;&amp;quot;w&amp;quot;&lt;/code&gt;で開かれたためである。テキストモードで開かれたファイルの&lt;code&gt;write&lt;/code&gt;メソッドは、Unicodeデータである&lt;code&gt;str&lt;/code&gt;インスタンスを期待する。&lt;code&gt;bytes&lt;/code&gt;データを書き込みたい場合は、オープンモードを&lt;code&gt;&amp;quot;wb&amp;quot;&lt;/code&gt;にする必要がある。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;- with open(&amp;#34;data.bin&amp;#34;, &amp;#34;w&amp;#34;) as f:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ with open(&amp;#34;data.bin&amp;#34;, &amp;#34;wb&amp;#34;) as f:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; f.write(b&amp;#34;\xf1\xf2\xf3\xf4\xf5&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これは読み込みの場合も同じである。ファイルをテキスト読み込みモード&lt;code&gt;&amp;quot;r&amp;quot;&lt;/code&gt;で開くと、&lt;code&gt;encoding&lt;/code&gt;引数を明示的に与えていない場合、システムのデフォルトのテキスト符号化でデータを解釈する。ほとんどのシステムではデフォルトの符号化はUTF-8であるため、バイナリデータを扱えず、エラーが発生する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;data.bin&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;r&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# UnicodeDecodeError: &amp;#39;utf-8&amp;#39; codec can&amp;#39;t decode byte 0xf1 in position 0: invalid continuation byte&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;そのため、バイナリデータを読み込む場合は、オープンモードを&lt;code&gt;&amp;quot;rb&amp;quot;&lt;/code&gt;にする必要がある。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;- with open(&amp;#34;data.bin&amp;#34;, &amp;#34;r&amp;#34;) as f:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ with open(&amp;#34;data.bin&amp;#34;, &amp;#34;rb&amp;#34;) as f:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; data = f.read()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="open時にencodingを明示的に指定する"&gt;
&lt;code&gt;open&lt;/code&gt;時に&lt;code&gt;encoding&lt;/code&gt;を明示的に指定する&lt;a href="#open%e6%99%82%e3%81%abencoding%e3%82%92%e6%98%8e%e7%a4%ba%e7%9a%84%e3%81%ab%e6%8c%87%e5%ae%9a%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;open&lt;/code&gt;関数は&lt;code&gt;encoding&lt;/code&gt;引数を明示的に与えていない場合、システムのデフォルトのテキスト符号化でデータを解釈する。これはプラットフォーム依存である。&lt;/p&gt;
&lt;p&gt;システムのデフォルトのエンコーディングは、&lt;code&gt;locale.getencoding()&lt;/code&gt;で取得できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;locale&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="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;locale&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getencoding&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# UTF-8&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;プラットフォーム依存の振る舞いをなくすために、&lt;code&gt;open&lt;/code&gt;関数で&lt;code&gt;encoding&lt;/code&gt;パラメータを指定するとよい。こうすることで、期待する符号化と異なる符号化でファイルが開かれることを防げる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;data.bin&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;w&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;&lt;span class="p"&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="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;data.bin&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;r&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://www.oreilly.co.jp/books/9784873119175/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="Effective Python 第2版 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Effective Python 第2版
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-72643c6404932233884fa590ffbad10ed5c4b878.png"
style="margin-right: 2px;"
alt="www.oreilly.co.jp favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
www.oreilly.co.jp
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://docs.python.org/ja/3/library/functions.html?highlight=open"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="組み込み関数 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
組み込み関数
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Python インタプリタには数多くの関数と型が組み込まれており、いつでも利用できます。それらをここにアルファベット順に挙げます。,,,, 組み込み関数,,, A, abs(), aiter(), all(), anext(), any(), ascii(),, B, bin(), bool(), breakpoint(), bytearray(), bytes(),, C, callabl...&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-8733e1481071d5c53f855314d0d556afa2dfcefe.png"
style="margin-right: 2px;"
alt="docs.python.org favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
docs.python.org
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;理想はUTF-8。&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&amp;#160;&lt;a href="#fnref1:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>PEP 8スタイルガイドに従おう - Effective Python 項目2</title><link>https://notes.nakurei.com/post/effective-python-ver2-002/</link><pubDate>Sun, 17 Sep 2023 18:01:13 +0900</pubDate><guid>https://notes.nakurei.com/post/effective-python-ver2-002/</guid><description>&lt;img src="https://notes.nakurei.com/img/header/Effective-Python-v2.webp" alt="Featured image of post PEP 8スタイルガイドに従おう - Effective Python 項目2" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="link" href="https://www.oreilly.co.jp/books/9784873119175/" target="_blank" rel="noopener"
&gt;Effective Python 第2版&lt;/a&gt;、項目2「PEP 8スタイルガイドに従う」のまとめ。&lt;/p&gt;
&lt;h2 id="ポイント"&gt;
ポイント&lt;a href="#%e3%83%9d%e3%82%a4%e3%83%b3%e3%83%88"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;常にPEP 8スタイルガイドに従ってPythonコードを書こう&lt;/li&gt;
&lt;li&gt;大きなコミュニティの共通スタイルを共有すれば、協働作業がはかどる&lt;/li&gt;
&lt;li&gt;一貫したスタイルは、後の修正しやすさにつながる&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="pep-8とは"&gt;
PEP 8とは&lt;a href="#pep-8%e3%81%a8%e3%81%af"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;PEP 8とは、Python拡張提案（Python Enhancement Proposal）の8番目の文章である。これは、Pythonのコードをどのようにフォーマットするかのスタイルガイドである。明確なPythonコードの書き方に関する詳細な説明が豊富に記されている。&lt;/p&gt;
&lt;p&gt;PEP 8は下記のリンクから読める。これはPython言語の進化とともに継続的に更新されている。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://peps.python.org/pep-0008/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/0dbe073e8ce501aaebb9dfdc2da7ffcc1a680cc9_hu_c2c7e9d00c47e497.webp"
alt="PEP 8 – Style Guide for Python Code | peps.python.org image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
PEP 8 – Style Guide for Python Code | peps.python.org
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;This document gives coding conventions for the Python code comprising the standard library in the main Python distribution. Please see the companion informational PEP describing style guidelines for the C code in the C implementation of Python.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-08289977ee49c39810d2e9fe06745379ef48b797.png"
style="margin-right: 2px;"
alt="peps.python.org favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
peps.python.org
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;h2 id="スタイルガイドの必要性"&gt;
スタイルガイドの必要性&lt;a href="#%e3%82%b9%e3%82%bf%e3%82%a4%e3%83%ab%e3%82%ac%e3%82%a4%e3%83%89%e3%81%ae%e5%bf%85%e8%a6%81%e6%80%a7"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pythonのコードは正しい構文であればどのように書いてもよいが、一貫したスタイルに従うと下記の利点がある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コードがより扱いやすく、より読みやすくなる&lt;/li&gt;
&lt;li&gt;他のPythonプログラマと共通のスタイルを分かち合うことで、プロジェクトでの協働作業がはかどる&lt;/li&gt;
&lt;li&gt;コードを読む人が自分以外にいなくても、後の変更作業が容易になる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="従うべき主なルール"&gt;
従うべき主なルール&lt;a href="#%e5%be%93%e3%81%86%e3%81%b9%e3%81%8d%e4%b8%bb%e3%81%aa%e3%83%ab%e3%83%bc%e3%83%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="空白"&gt;
空白&lt;a href="#%e7%a9%ba%e7%99%bd"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;インデントは空白4個&lt;/li&gt;
&lt;li&gt;1行79文字以下&lt;/li&gt;
&lt;li&gt;長い式を改行する場合は1つインデントする&lt;/li&gt;
&lt;li&gt;関数とクラスは2行空ける、クラス内メソッドは1行空ける&lt;/li&gt;
&lt;li&gt;辞書
&lt;ul&gt;
&lt;li&gt;キーとコロンの間はスペースを空けない&lt;/li&gt;
&lt;li&gt;同じ行に値を書く場合は、値の前に空白を1つ空ける&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;変数代入の前後には空白を1つ空ける、2つ以上空けない&lt;/li&gt;
&lt;li&gt;型ヒント（型アノテーション）
&lt;ul&gt;
&lt;li&gt;変数名の直後にコロンを置く&lt;/li&gt;
&lt;li&gt;型情報の前に空白を1つ置く&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="名前付け"&gt;
名前付け&lt;a href="#%e5%90%8d%e5%89%8d%e4%bb%98%e3%81%91"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;対象&lt;/th&gt;
&lt;th style="text-align: left"&gt;名前付けルール&lt;/th&gt;
&lt;th style="text-align: left"&gt;例&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;関数、変数、属性&lt;/td&gt;
&lt;td style="text-align: left"&gt;lower_snake_case&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;code&gt;lowercase_underscore&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;protected属性&lt;/td&gt;
&lt;td style="text-align: left"&gt;アンダースコアを1つ先頭につける&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;code&gt;_leading_underscore&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;private属性&lt;/td&gt;
&lt;td style="text-align: left"&gt;アンダースコアを2つ先頭につける&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;code&gt;__double_underscore&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;クラス、例外&lt;/td&gt;
&lt;td style="text-align: left"&gt;UpperCamelCase&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;code&gt;CapitalizedWord&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;モジュールでの定数&lt;/td&gt;
&lt;td style="text-align: left"&gt;UPPER_SNAKE_CASE&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;code&gt;ALL_CAPS&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;クラスのインスタンスメソッドでは、第一引数の名前に&lt;code&gt;self&lt;/code&gt;を使う&lt;/li&gt;
&lt;li&gt;クラスメソッドは、第一引数の名前に&lt;code&gt;cls&lt;/code&gt;を使う&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="式と文"&gt;
式と文&lt;a href="#%e5%bc%8f%e3%81%a8%e6%96%87"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Pythonで&lt;code&gt;import this&lt;/code&gt;を実行すると、「The Zen of Python」が表示される。これは、Pythonプログラマの心構えを簡潔に記したものである。&lt;/p&gt;
&lt;p&gt;「The Zen of Python」には「明らかなやり方が1つ、できれば1つだけあるのがいい」という下記の記述がある。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There should be one&amp;ndash; and preferably only one &amp;ndash;obvious way to do it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;PEP 8では、これを式と文のガイダンスで実現している。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;式の否定（&lt;code&gt;if not a is b&lt;/code&gt;）ではなく内側の項の否定（&lt;code&gt;if a is not b&lt;/code&gt;）を使う&lt;/li&gt;
&lt;li&gt;空値の判定は&lt;code&gt;if not somelist&lt;/code&gt;を使う
&lt;ul&gt;
&lt;li&gt;空値が暗黙に&lt;code&gt;False&lt;/code&gt;と評価されることを使う&lt;/li&gt;
&lt;li&gt;コンテナやシーケンスの長さ（&lt;code&gt;lf len(somelist) == 0&lt;/code&gt;）で空値（&lt;code&gt;[]&lt;/code&gt;, &lt;code&gt;''&lt;/code&gt;）を判定しない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;非空値の判定は&lt;code&gt;if somelist&lt;/code&gt;を使う
&lt;ul&gt;
&lt;li&gt;非空値について、&lt;code&gt;if somelist&lt;/code&gt;は暗黙に&lt;code&gt;True&lt;/code&gt;と評価される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;if&lt;/code&gt;文、&lt;code&gt;for&lt;/code&gt;文、&lt;code&gt;while&lt;/code&gt;文、&lt;code&gt;except&lt;/code&gt;複合文を1行で書かない&lt;/li&gt;
&lt;li&gt;式が1行に収まらない場合は、括弧でくくり複数行にして、読みやすくインデントする
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;\&lt;/code&gt;で行分けするより、括弧を使って複数の式を囲むほうが良い&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="インポート"&gt;
インポート&lt;a href="#%e3%82%a4%e3%83%b3%e3%83%9d%e3%83%bc%e3%83%88"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;import&lt;/code&gt;文は常にファイルの先頭に置く&lt;/li&gt;
&lt;li&gt;インポートするときは常にモジュールの絶対名を使う
&lt;ul&gt;
&lt;li&gt;現モジュールのパスからの相対名は使わない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;相対インポートを使わなければならない場合は、明示的な構文&lt;code&gt;from . import foo&lt;/code&gt;を使う&lt;/li&gt;
&lt;li&gt;インポートは①標準ライブラリ、②サードパーティー、③自作モジュール、の順に行う
&lt;ul&gt;
&lt;li&gt;それぞれの部分はアルファベット順にインポートする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="pep-8に従っているか確認する"&gt;
PEP 8に従っているか確認する&lt;a href="#pep-8%e3%81%ab%e5%be%93%e3%81%a3%e3%81%a6%e3%81%84%e3%82%8b%e3%81%8b%e7%a2%ba%e8%aa%8d%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;PythonにはLinter（e.g. &lt;code&gt;pylint&lt;/code&gt;, &lt;code&gt;flake8&lt;/code&gt;）がある。これらは、自動でPEP 8スタイルガイドに沿っているか確認して、かつ、Pythonプログラムでよく見られる他の種類のエラーを検出する。また、多くのエディタやIDEにも同様の機能がある。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://www.oreilly.co.jp/books/9784873119175/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="Effective Python 第2版 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Effective Python 第2版
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-72643c6404932233884fa590ffbad10ed5c4b878.png"
style="margin-right: 2px;"
alt="www.oreilly.co.jp favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
www.oreilly.co.jp
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://peps.python.org/pep-0008/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/0dbe073e8ce501aaebb9dfdc2da7ffcc1a680cc9_hu_c2c7e9d00c47e497.webp"
alt="PEP 8 – Style Guide for Python Code | peps.python.org image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
PEP 8 – Style Guide for Python Code | peps.python.org
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;This document gives coding conventions for the Python code comprising the standard library in the main Python distribution. Please see the companion informational PEP describing style guidelines for the C code in the C implementation of Python.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-08289977ee49c39810d2e9fe06745379ef48b797.png"
style="margin-right: 2px;"
alt="peps.python.org favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
peps.python.org
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>Lintのルール - Google Python Style Guide 項目2.1</title><link>https://notes.nakurei.com/post/rules-of-lint-from-google-python-style-guide/</link><pubDate>Sun, 17 Sep 2023 16:33:48 +0900</pubDate><guid>https://notes.nakurei.com/post/rules-of-lint-from-google-python-style-guide/</guid><description>&lt;img src="https://notes.nakurei.com/img/header/python_img.webp" alt="Featured image of post Lintのルール - Google Python Style Guide 項目2.1" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="link" href="https://google.github.io/styleguide/pyguide.html" target="_blank" rel="noopener"
&gt;Google Python Style Guide&lt;/a&gt;、項目2.1 Lintのまとめ。&lt;/p&gt;
&lt;h2 id="ポイント"&gt;
ポイント&lt;a href="#%e3%83%9d%e3%82%a4%e3%83%b3%e3%83%88"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Linterを使う&lt;/li&gt;
&lt;li&gt;問題を隠さなければ、不適切な警告は抑制してよい&lt;/li&gt;
&lt;li&gt;未使用引数の警告は、関数の先頭で変数を削除（&lt;code&gt;del&lt;/code&gt;）して抑制する&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="linterとは"&gt;
Linterとは&lt;a href="#linter%e3%81%a8%e3%81%af"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Linterとはソースコードのバグやスタイルの問題を見つけるためのツールである。基本的にはベストプラクティスな書き方に則っていない部分を警告するツールだが、コードスタイルのチェックも行ってくれるものもある。&lt;/p&gt;
&lt;p&gt;Linterは静的型付け言語のコンパイラが検出するような問題を警告する。しかし、Pythonは動的型付け言語のため、いくつかの警告は正しくない可能性がある。&lt;/p&gt;
&lt;p&gt;Google Python Style Guideでは、Linterとして、特定のpylintrcに則った&lt;a class="link" href="https://pypi.org/project/pylint/" target="_blank" rel="noopener"
&gt;&lt;code&gt;pylint&lt;/code&gt;&lt;/a&gt;の利用を推奨している。pylintrcのファイルは元サイトで示されており、誰でもダウンロードできる。&lt;/p&gt;
&lt;h2 id="長所と短所"&gt;
長所と短所&lt;a href="#%e9%95%b7%e6%89%80%e3%81%a8%e7%9f%ad%e6%89%80"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Linterを利用すれば見逃しやすいミスを見逃さずにすむ。しかし、Linterは完璧ではない。ゆえに、警告を抑制したり修正したりする必要がある。&lt;/p&gt;
&lt;h2 id="どうするべきか"&gt;
どうするべきか&lt;a href="#%e3%81%a9%e3%81%86%e3%81%99%e3%82%8b%e3%81%b9%e3%81%8d%e3%81%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;まずはLinterが実行されていることを確認する。&lt;/p&gt;
&lt;p&gt;問題を隠さなければ、不適切な警告は抑制してよい。警告を抑制する場合は行レベルでコメントを設定する。&lt;code&gt;pylint&lt;/code&gt;の場合は下記のようになる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;do_PUT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="c1"&gt;# WSGI name, so pylint: disable=invalid-name&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;flake8&lt;/code&gt;の場合は下記のようになる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;example&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;example&amp;#39;&lt;/span&gt; &lt;span class="c1"&gt;# noqa: E731&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;pylint&lt;/code&gt;を利用する場合、警告はシンボル名で識別される。抑制理由がシンボル名から明らかでない場合は、説明を追加する。これにより、Linterの警告抑制を簡単に検索して再確認できる。&lt;/p&gt;
&lt;h2 id="未使用の引数について"&gt;
未使用の引数について&lt;a href="#%e6%9c%aa%e4%bd%bf%e7%94%a8%e3%81%ae%e5%bc%95%e6%95%b0%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;未使用引数の警告は、関数の先頭で変数を削除すると抑制できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;viking_cafe_order&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spam&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;beans&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;eggs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&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;str&lt;/span&gt;&lt;span class="p"&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;del&lt;/span&gt; &lt;span class="n"&gt;beans&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;eggs&lt;/span&gt; &lt;span class="c1"&gt;# Unused by vikings.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;spam&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;spam&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;spam&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;この場合は、必ず「なぜ削除するのか」を説明するコメントを入れる。&amp;ldquo;Unused.&amp;ldquo;で十分。&lt;/p&gt;
&lt;p&gt;未使用引数の警告を抑制する方法はほかにもある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;未使用の引数の識別子として&amp;rsquo;&lt;code&gt;_&lt;/code&gt;&amp;lsquo;を使う&lt;/li&gt;
&lt;li&gt;引数名の前に&amp;rsquo;&lt;code&gt;unused_&lt;/code&gt;&amp;lsquo;を付ける&lt;/li&gt;
&lt;li&gt;&amp;lsquo;&lt;code&gt;_&lt;/code&gt;&amp;lsquo;に代入する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらのスタイルは許可されるが、推奨されない。なぜなら、これらは引数を名前で渡す呼び出し元を破り、引数が実際に未使用であることを強制しないためである。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://google.github.io/styleguide/pyguide.html"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="styleguide image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
styleguide
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Style guides for Google-originated open-source projects&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-cd8f90e132d029d723cc11bc816bb9c5bddfa1c9.png"
style="margin-right: 2px;"
alt="google.github.io favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
google.github.io
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://flake8.pycqa.org/en/latest/user/violations.html"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="Selecting and Ignoring Violations &amp;amp;mdash; flake8 7.3.0 documentation image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Selecting and Ignoring Violations &amp;amp;mdash; flake8 7.3.0 documentation
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-1eb78a53e2def5009d12feb66caff2f48447f74a.png"
style="margin-right: 2px;"
alt="flake8.pycqa.org favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
flake8.pycqa.org
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>Pythonのジェネレータを理解する</title><link>https://notes.nakurei.com/post/what-is-generator-in-python/</link><pubDate>Fri, 08 Sep 2023 22:52:54 +0900</pubDate><guid>https://notes.nakurei.com/post/what-is-generator-in-python/</guid><description>&lt;img src="https://notes.nakurei.com/img/header/python_img.webp" alt="Featured image of post Pythonのジェネレータを理解する" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pythonのジェネレータとは何かを調べたメモ。&lt;/p&gt;
&lt;h2 id="ジェネレータとは"&gt;
ジェネレータとは&lt;a href="#%e3%82%b8%e3%82%a7%e3%83%8d%e3%83%ac%e3%83%bc%e3%82%bf%e3%81%a8%e3%81%af"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pythonにおけるジェネレータとは、遅延評価の性質を持つ特別なイテレータの一種である。&lt;/p&gt;
&lt;p&gt;ジェネレータはイテレータであるため、&lt;code&gt;__iter__()&lt;/code&gt;と&lt;code&gt;__next__()&lt;/code&gt;の2つのメソッドを持つ。また、遅延評価の性質を持つため、&lt;code&gt;__next__()&lt;/code&gt;メソッドが呼ばれるまで次の要素を生成しない。&lt;code&gt;__next__()&lt;/code&gt;メソッドが呼ばれてはじめて次の要素を生成する。&lt;/p&gt;
&lt;h2 id="ジェネレータの定義方法"&gt;
ジェネレータの定義方法&lt;a href="#%e3%82%b8%e3%82%a7%e3%83%8d%e3%83%ac%e3%83%bc%e3%82%bf%e3%81%ae%e5%ae%9a%e7%be%a9%e6%96%b9%e6%b3%95"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ジェネレータの作成方法は下記の2つがある。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ジェネレータ式の利用&lt;/li&gt;
&lt;li&gt;ジェネレータ関数の利用&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="ジェネレータ式とは"&gt;
ジェネレータ式とは&lt;a href="#%e3%82%b8%e3%82%a7%e3%83%8d%e3%83%ac%e3%83%bc%e3%82%bf%e5%bc%8f%e3%81%a8%e3%81%af"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ジェネレータ式はジェネレータを返す記法である。
基本的な形は以下のようになる。リスト内法表記と似ている。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;generator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expression&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;iterable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;たとえば、下記コードは与えられたリストの各要素を2乗するジェネレータである。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;squared&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;squared&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 1 4 9 16 25&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ジェネレータ式に条件を設けることもできる。たとえば、上記のリストから偶数だけを取り出して2乗するジェネレータは次のようになる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;even_squared&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;even_squared&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 4 16&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="ジェネレータ関数とは"&gt;
ジェネレータ関数とは&lt;a href="#%e3%82%b8%e3%82%a7%e3%83%8d%e3%83%ac%e3%83%bc%e3%82%bf%e9%96%a2%e6%95%b0%e3%81%a8%e3%81%af"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ジェネレータ関数とは、ジェネレータを生成する関数である。通常の関数と同様に&lt;code&gt;def&lt;/code&gt;で定義するが、&lt;code&gt;return&lt;/code&gt;の代わりに&lt;code&gt;yield&lt;/code&gt;を使用する。&lt;code&gt;yield&lt;/code&gt;を使用すると、関数はジェネレータイテレータを返す。&lt;/p&gt;
&lt;p&gt;基本的なジェネレータ関数の例を以下に示す。これは、0から&lt;code&gt;limit&lt;/code&gt;に指定した数までの整数を順に返す。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;count_up_to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&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;yield&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&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="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;count_up_to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 1 2 3 4 5&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ジェネレータ関数は実行状態を保持する。そのため、次回の呼び出し時には前回の状態から続けて実行できる。また、ジェネレータ関数はジェネレータを返すため、要素を必要とするタイミングでのみ評価される。&lt;/p&gt;
&lt;h2 id="ジェネレータの利点"&gt;
ジェネレータの利点&lt;a href="#%e3%82%b8%e3%82%a7%e3%83%8d%e3%83%ac%e3%83%bc%e3%82%bf%e3%81%ae%e5%88%a9%e7%82%b9"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ジェネレータは&lt;code&gt;__next__()&lt;/code&gt;メソッドが呼ばれるまで次の要素を生成しないため、メモリ効率が良い。また、一度にすべてのデータをメモリに保持する必要がないため、大量のデータを扱う際にも役立つ。&lt;/p&gt;
&lt;h2 id="ジェネレータの利用シーン"&gt;
ジェネレータの利用シーン&lt;a href="#%e3%82%b8%e3%82%a7%e3%83%8d%e3%83%ac%e3%83%bc%e3%82%bf%e3%81%ae%e5%88%a9%e7%94%a8%e3%82%b7%e3%83%bc%e3%83%b3"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;大規模なデータセット&lt;/li&gt;
&lt;li&gt;無限長のシーケンス&lt;/li&gt;
&lt;li&gt;計算量の大きいシーケンス&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ジェネレータの注意点"&gt;
ジェネレータの注意点&lt;a href="#%e3%82%b8%e3%82%a7%e3%83%8d%e3%83%ac%e3%83%bc%e3%82%bf%e3%81%ae%e6%b3%a8%e6%84%8f%e7%82%b9"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;一度&lt;code&gt;next()&lt;/code&gt;で呼び出した値は破棄される。そのため、一度イテレートした後に再度イテレートする場合は、新たにジェネレータインスタンスを生成しなければならない&lt;/li&gt;
&lt;li&gt;ジェネレータ関数は&lt;code&gt;yield&lt;/code&gt;文を実行した時点で一時停止する。そのため、次の呼び出しあるいは関数の終了まで関数の実行は保持される&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://docs.python.org/ja/3/reference/expressions.html"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="6. 式 (expression) image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
6. 式 (expression)
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;この章では、Python の式における個々の要素の意味について解説します。 表記法に関する注意: この章と以降の章での拡張BNF (extended BNF) 表記は、字句解析規則ではなく、構文規則を記述するために用いられています。ある構文規則 (のある表現方法) が、以下の形式 で記述されていて、この構文特有の意味付け (semantics) が記述されていない場合、 name の形式をと...&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-8733e1481071d5c53f855314d0d556afa2dfcefe.png"
style="margin-right: 2px;"
alt="docs.python.org favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
docs.python.org
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>イテレータでループさせつつインデックスも取得する - Effective Python 項目7</title><link>https://notes.nakurei.com/post/effective-python-ver2-007/</link><pubDate>Tue, 05 Sep 2023 23:23:15 +0900</pubDate><guid>https://notes.nakurei.com/post/effective-python-ver2-007/</guid><description>&lt;img src="https://notes.nakurei.com/img/header/Effective-Python-v2.webp" alt="Featured image of post イテレータでループさせつつインデックスも取得する - Effective Python 項目7" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="link" href="https://www.oreilly.co.jp/books/9784873119175/" target="_blank" rel="noopener"
&gt;Effective Python 第2版&lt;/a&gt;、項目7「rangeではなくenumerateを使う」のまとめ。&lt;/p&gt;
&lt;h2 id="ポイント"&gt;
ポイント&lt;a href="#%e3%83%9d%e3%82%a4%e3%83%b3%e3%83%88"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;enumerate&lt;/code&gt;を使えば、イテレータでループしつつ、要素のインデックスも取り出せる&lt;/li&gt;
&lt;li&gt;&lt;code&gt;range&lt;/code&gt;でインデックスをループさせるより、&lt;code&gt;enumerate&lt;/code&gt;を使ったほうが簡潔&lt;/li&gt;
&lt;li&gt;&lt;code&gt;enumerate&lt;/code&gt;の第2引数で、インデックスの開始番号を指定できる&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="rangeとは"&gt;
&lt;code&gt;range&lt;/code&gt;とは&lt;a href="#range%e3%81%a8%e3%81%af"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;range&lt;/code&gt;はPythonの組み込み関数のひとつ。ループ処理に便利。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="リストをループさせる"&gt;
リストをループさせる&lt;a href="#%e3%83%aa%e3%82%b9%e3%83%88%e3%82%92%e3%83%ab%e3%83%bc%e3%83%97%e3%81%95%e3%81%9b%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pythonの&lt;code&gt;list&lt;/code&gt;は配列。これをループさせるときは、シーケンスを直接ループできる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;languages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;python&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;golang&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;VHDL&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;C++&amp;#34;&lt;/span&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;lang&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;languages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="リストをループさせつつインデックスも取り出すことを考える"&gt;
リストをループさせつつ、インデックスも取り出すことを考える&lt;a href="#%e3%83%aa%e3%82%b9%e3%83%88%e3%82%92%e3%83%ab%e3%83%bc%e3%83%97%e3%81%95%e3%81%9b%e3%81%a4%e3%81%a4%e3%82%a4%e3%83%b3%e3%83%87%e3%83%83%e3%82%af%e3%82%b9%e3%82%82%e5%8f%96%e3%82%8a%e5%87%ba%e3%81%99%e3%81%93%e3%81%a8%e3%82%92%e8%80%83%e3%81%88%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;リストをループさせつつ要素のインデックスを得たい場合を考える。
&lt;code&gt;range&lt;/code&gt;を使うと下記のように書ける。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;languages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;python&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;golang&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;VHDL&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;C++&amp;#34;&lt;/span&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;languages&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;lang&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;languages&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;lang&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ただし、上記の書き方はステップが多く読みにくい。
Pythonには、こういう時に便利な組み込み関数&lt;code&gt;enumerate&lt;/code&gt;がある。&lt;/p&gt;
&lt;h2 id="enumerateとは"&gt;
&lt;code&gt;enumerate&lt;/code&gt;とは&lt;a href="#enumerate%e3%81%a8%e3%81%af"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;enumerate&lt;/code&gt;はPythonの組み込み関数のひとつ。遅延評価ジェネレータでイテレータをラップし、ループのインデックスとイテレータの次の値の対を&lt;code&gt;yield&lt;/code&gt;する。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://docs.python.org/ja/3/library/functions.html#enumerate" target="_blank" rel="noopener"
&gt;公式ドキュメント&lt;/a&gt;によると、下記の記述と等価らしい。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;iterable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;elem&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;iterable&lt;/span&gt;&lt;span class="p"&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;yield&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;elem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;つまり、&lt;code&gt;enumerate&lt;/code&gt;は、「ループのインデックスとイテレータの次の値の対」を呼び出すたびに生成（遅延評価）するジェネレータを生成する。
呼び出すたびに生成するため、メモリを圧迫せずに処理できる。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;enumerate&lt;/code&gt;はジェネレータを生成するため、&lt;code&gt;next&lt;/code&gt;を用いて次の値を取得できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;languages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;python&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;golang&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;VHDL&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;C++&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;languages&lt;/span&gt;&lt;span class="p"&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="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# (0, &amp;#39;python&amp;#39;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# (1, &amp;#39;golang&amp;#39;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="rangeではなくenumerateを使う"&gt;
&lt;code&gt;range&lt;/code&gt;ではなく&lt;code&gt;enumerate&lt;/code&gt;を使う&lt;a href="#range%e3%81%a7%e3%81%af%e3%81%aa%e3%81%8fenumerate%e3%82%92%e4%bd%bf%e3%81%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;リストをループさせつつ要素のインデックスを得たい場合、&lt;code&gt;enumerate&lt;/code&gt;を使うと下記のように書ける。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;languages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;python&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;golang&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;VHDL&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;C++&amp;#34;&lt;/span&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lang&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;languages&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;lang&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;range&lt;/code&gt;を使った場合と比較すると、&lt;code&gt;enumerate&lt;/code&gt;を使ったほうが簡潔に書ける。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;languages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;python&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;golang&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;VHDL&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;C++&amp;#34;&lt;/span&gt;&lt;span class="p"&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="c1"&gt;# enumerateを使う&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lang&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;languages&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;lang&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&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="c1"&gt;# rangeを使う&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;languages&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;lang&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;languages&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;lang&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="enumerateのカウント開始の数を変更する"&gt;
&lt;code&gt;enumerate&lt;/code&gt;のカウント開始の数を変更する&lt;a href="#enumerate%e3%81%ae%e3%82%ab%e3%82%a6%e3%83%b3%e3%83%88%e9%96%8b%e5%a7%8b%e3%81%ae%e6%95%b0%e3%82%92%e5%a4%89%e6%9b%b4%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;enumerate&lt;/code&gt;の第2引数にカウントを開始する数を指定できる。これを利用すると、先のコードはより簡潔に書ける。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;languages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;python&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;golang&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;VHDL&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;C++&amp;#34;&lt;/span&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lang&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;languages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;lang&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://www.oreilly.co.jp/books/9784873119175/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="Effective Python 第2版 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Effective Python 第2版
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-72643c6404932233884fa590ffbad10ed5c4b878.png"
style="margin-right: 2px;"
alt="www.oreilly.co.jp favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
www.oreilly.co.jp
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://docs.python.org/ja/3/library/functions.html"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="組み込み関数 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
組み込み関数
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Python インタプリタには数多くの関数と型が組み込まれており、いつでも利用できます。それらをここにアルファベット順に挙げます。,,,, 組み込み関数,,, A, abs(), aiter(), all(), anext(), any(), ascii(),, B, bin(), bool(), breakpoint(), bytearray(), bytes(),, C, callabl...&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-8733e1481071d5c53f855314d0d556afa2dfcefe.png"
style="margin-right: 2px;"
alt="docs.python.org favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
docs.python.org
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>Pythonのバージョンを知る - Effective Python 項目1</title><link>https://notes.nakurei.com/post/effective-python-ver2-001/</link><pubDate>Tue, 05 Sep 2023 22:05:27 +0900</pubDate><guid>https://notes.nakurei.com/post/effective-python-ver2-001/</guid><description>&lt;img src="https://notes.nakurei.com/img/header/Effective-Python-v2.webp" alt="Featured image of post Pythonのバージョンを知る - Effective Python 項目1" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="link" href="https://www.oreilly.co.jp/books/9784873119175/" target="_blank" rel="noopener"
&gt;Effective Python 第2版&lt;/a&gt;、項目1「使用するPythonのバージョンを知っておく」のまとめ。&lt;/p&gt;
&lt;h2 id="ポイント"&gt;
ポイント&lt;a href="#%e3%83%9d%e3%82%a4%e3%83%b3%e3%83%88"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;現時点の最新バージョンであるPython3を使おう&lt;/li&gt;
&lt;li&gt;コマンドラインで実行するPythonが、想定通りのバージョンか確認しよう&lt;/li&gt;
&lt;li&gt;Python2はサポートが終了しているため、使うのは避けよう&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="コマンドラインでpythonのバージョンを確認する"&gt;
コマンドラインでPythonのバージョンを確認する&lt;a href="#%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89%e3%83%a9%e3%82%a4%e3%83%b3%e3%81%a7python%e3%81%ae%e3%83%90%e3%83%bc%e3%82%b8%e3%83%a7%e3%83%b3%e3%82%92%e7%a2%ba%e8%aa%8d%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;コマンドラインで&lt;code&gt;python&lt;/code&gt;と入力したときのデフォルトは決まっていない。
Pythonのバージョンは&lt;code&gt;python&lt;/code&gt;コマンドに&lt;code&gt;--version&lt;/code&gt;フラグを付ければ確認できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python --version&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;--version&lt;/code&gt;フラグは&lt;code&gt;-V&lt;/code&gt;でもよい。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python -V&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;実行すると以下のように表示される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ python --version
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Python 3.11.4&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Linux環境では、Python3は&lt;code&gt;python3&lt;/code&gt;コマンドで使えることがある。
Windows環境では、Pythonをインストールしないと利用できない。&lt;/p&gt;
&lt;h2 id="python実行時にpythonのバージョンを確認する"&gt;
Python実行時にPythonのバージョンを確認する&lt;a href="#python%e5%ae%9f%e8%a1%8c%e6%99%82%e3%81%abpython%e3%81%ae%e3%83%90%e3%83%bc%e3%82%b8%e3%83%a7%e3%83%b3%e3%82%92%e7%a2%ba%e8%aa%8d%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Python実行時は、組み込みモジュール&lt;code&gt;sys&lt;/code&gt;を利用すれば、Pythonのバージョンを確認できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&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="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version_info&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;上記コードを実行すると、下記のようにPythonの情報が表示される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sys.version_info&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;major&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3, &lt;span class="nv"&gt;minor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;11, &lt;span class="nv"&gt;micro&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4, &lt;span class="nv"&gt;releaselevel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;final&amp;#39;&lt;/span&gt;, &lt;span class="nv"&gt;serial&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3.11.4 &lt;span class="o"&gt;(&lt;/span&gt;main, Aug &lt;span class="m"&gt;16&lt;/span&gt; 2023, 05:23:18&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;GCC 12.2.0&lt;span class="o"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;現時点ではオープンソースライブラリのほとんどがPython3準拠である。本書ではすべてのPythonプロジェクトでPython3を利用することを強く勧めている。&lt;/p&gt;
&lt;p&gt;Python2は、2020/04/20にPython 2.7.18がリリースされ、以降すべての開発が終了している。つまり、Python2の公式な保守はもう行われない。ゆえに利用は自己責任である。
現時点の最新バージョンであるPython3を使おう。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://www.oreilly.co.jp/books/9784873119175/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="Effective Python 第2版 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Effective Python 第2版
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-72643c6404932233884fa590ffbad10ed5c4b878.png"
style="margin-right: 2px;"
alt="www.oreilly.co.jp favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
www.oreilly.co.jp
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://forest.watch.impress.co.jp/docs/news/1248378.html"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/7062f94f8bf03becbe71794811086ca0e647a93d_hu_cecffebbc77745ba.webp"
alt="「Python 2.7.18」がリリース ～「Python 2」シリーズの最終版／以降は「Python 3」シリーズが積極的にメンテナンスされる唯一の「CPython」に image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
「Python 2.7.18」がリリース ～「Python 2」シリーズの最終版／以降は「Python 3」シリーズが積極的にメンテナンスされる唯一の「CPython」に
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;　Python Software Foundationは4月20日、「Python 2.7.18」をリリースした。「Python 2」シリーズは、本バージョンが最終。すべての開発は終了し、以降は「Python 3」シリーズが不具合や脆弱性の修正が積極的に行われる唯一の「CPython」となる。&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-d89ac55c0cc41a403cf4f02901d1673789441c07.png"
style="margin-right: 2px;"
alt="forest.watch.impress.co.jp favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
forest.watch.impress.co.jp
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>WSL2でVS Codeが急に起動しなくなったときにとった手段の備忘録</title><link>https://notes.nakurei.com/post/vscode-not-start-on-wsl/</link><pubDate>Mon, 14 Aug 2023 19:07:02 +0900</pubDate><guid>https://notes.nakurei.com/post/vscode-not-start-on-wsl/</guid><description>&lt;h2 id="生じた問題"&gt;
生じた問題&lt;a href="#%e7%94%9f%e3%81%98%e3%81%9f%e5%95%8f%e9%a1%8c"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;WSL2でVS Codeを開こうとしたら、下記のエラーが発生して開けなかった。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ code .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/mnt/c/Users/user/AppData/Local/Programs/Microsoft VS Code/bin/code: 61: /mnt/c/Users/user/AppData/Local/Programs/Microsoft VS Code/Code.exe: Exec format error&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;apt update&lt;/code&gt;と&lt;code&gt;apt upgrade&lt;/code&gt;を不用意に実行したせいだと思われる。&lt;/p&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Windows 11 Pro&lt;/li&gt;
&lt;li&gt;WSL2のディストリビューションはUbuntu&lt;/li&gt;
&lt;/ul&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ wsl --version
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WSL バージョン: 1.2.5.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;カーネル バージョン: 5.15.90.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WSLg バージョン: 1.0.51
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MSRDC バージョン: 1.2.3770
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Direct3D バージョン: 1.608.2-61064218
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Windows バージョン: 10.0.22621.2134&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="解決策"&gt;
解決策&lt;a href="#%e8%a7%a3%e6%b1%ba%e7%ad%96"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;状況としては下記リンクとほぼ同じだった。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://github.com/microsoft/vscode/issues/189694"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/9b02c53529343d74042fb525b2fa861faa0b213c_hu_98dc81c97dd1bdc3.webp"
alt="WSL2 - Code.exe: Exec format error · Issue #189694 · microsoft/vscode image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
WSL2 - Code.exe: Exec format error · Issue #189694 · microsoft/vscode
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Does this issue occur when all extensions are disabled?: Yes VS Code Version: Version: 1.81.0 (user setup) Commit: 6445d93c81ebe42c4cbd7a60712e0b17d9463e97 Date: 2023-08-02T12:37:13.485Z Electron: ...&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-ffd1aa80239afc78c1628dfb5e08cff1205f22d5.png"
style="margin-right: 2px;"
alt="github.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
github.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;解決策は下記リンク先で議論されていた。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://github.com/microsoft/WSL/issues/8952"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/e69429f007796b8e7f93fb69cd3f14b90d9093c0_hu_168c151ad0e05f5.webp"
alt="WSL2 (Preview) cannot run .exe files: exec format error: wsl.exe · Issue #8952 · microsoft/WSL image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
WSL2 (Preview) cannot run .exe files: exec format error: wsl.exe · Issue #8952 · microsoft/WSL
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Version Microsoft Windows [Version 10.0.22621.521] WSL Version WSL 2 WSL 1 Kernel Version 5.15.62.1-microsoft-standard-WSL2 Distro Version Ubuntu 22.04 Other Software systemd 249.11-0ubuntu3.3 WSL ...&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-ffd1aa80239afc78c1628dfb5e08cff1205f22d5.png"
style="margin-right: 2px;"
alt="github.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
github.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;とりあえず、ディストリビューションの&lt;code&gt;systemd&lt;/code&gt;を無効にすることで、無事問題が解決した。&lt;/p&gt;
&lt;h3 id="やったこと"&gt;
やったこと&lt;a href="#%e3%82%84%e3%81%a3%e3%81%9f%e3%81%93%e3%81%a8"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;WSL2のディストリビューション内にある&lt;code&gt;/etc/wsl.conf&lt;/code&gt;ファイルを書き換えて、&lt;code&gt;systemd&lt;/code&gt;を無効にした。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;/etc/wsl.conf&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[boot]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;- systemd=true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ systemd=false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;その後、WSL自体を再起動した。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wsl --shutdown&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Ubuntuのdockerイメージでgit cloneしようとしたら"server certificate verification failed. CAfile: none CRLfile: none"と言われた</title><link>https://notes.nakurei.com/post/git-clone-error-cafile-none-crlfile-none/</link><pubDate>Sat, 17 Jun 2023 19:20:53 +0900</pubDate><guid>https://notes.nakurei.com/post/git-clone-error-cafile-none-crlfile-none/</guid><description>&lt;img src="https://notes.nakurei.com/icons/brand-docker.svg" alt="Featured image of post Ubuntuのdockerイメージでgit cloneしようとしたら"server certificate verification failed. CAfile: none CRLfile: none"と言われた" /&gt;&lt;h2 id="起きた問題"&gt;
起きた問題&lt;a href="#%e8%b5%b7%e3%81%8d%e3%81%9f%e5%95%8f%e9%a1%8c"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ubuntuのdockerイメージで&lt;code&gt;git clone&lt;/code&gt;しようとしたら以下のエラーを吐かれてcloneできなかった。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/hoge/fuga.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Cloning into &lt;span class="s1"&gt;&amp;#39;fuga&amp;#39;&lt;/span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fatal: unable to access &lt;span class="s1"&gt;&amp;#39;https://github.com/hoge/fuga.git/&amp;#39;&lt;/span&gt;: server certificate verification failed. CAfile: none CRLfile: none&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ただし、&lt;code&gt;https://github.com/hoge/fuga.git&lt;/code&gt;のパスは正しいものとする。&lt;/p&gt;
&lt;h2 id="解決策"&gt;
解決策&lt;a href="#%e8%a7%a3%e6%b1%ba%e7%ad%96"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Dockerfileで&lt;code&gt;ca-certificates&lt;/code&gt;をインストールするようにしたら、無事にcloneできるようになった。たとえば、以下のようにする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;Dockerfile&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Dockerfile" data-lang="Dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; apt-get update -y &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;DEBIAN_FRONTEND&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;noninteractive &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; apt-get install -y --no-install-recommends &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; git &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ca-certificates&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="ほかの解決策"&gt;
ほかの解決策&lt;a href="#%e3%81%bb%e3%81%8b%e3%81%ae%e8%a7%a3%e6%b1%ba%e7%ad%96"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;sudo&lt;/code&gt;が実行できるユーザーを作成しているなら、コンテナ内で&lt;code&gt;sudo apt install --reinstall ca-certificates&lt;/code&gt;してもよさそう。&lt;/p&gt;
&lt;p&gt;コンテナidがわかっていて、そのコンテナだけ対応させたいなら、rootユーザーでコンテナに入る。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; -it -u root &amp;lt;container id&amp;gt; bash&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;その後、コンテナ内に&lt;code&gt;ca-certificates&lt;/code&gt;を再度インストールする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install --reinstall ca-certificates&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
style="
display: flex;
align-items: center;
justify-content: center;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
cursor: not-allowed;
"
&gt;
&lt;div
style="
display: flex;
align-items: center;
justify-content: center;
height: 120px;
width: 120px;
max-width: 200px;
"
&gt;
&lt;img src="https://notes.nakurei.com/icons/link-off.svg" alt="No Image" width="100%" height="100%" style="object-fit: cover; margin: 0; flex-shrink: 0;"&gt;
&lt;/div&gt;
&lt;div
style="
display: flex;
flex-direction: column;
flex: 1 1 0%;
"
&gt;
&lt;div&gt;
muoilog.xyz にアクセスできません
&lt;/div&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
"
&gt;
&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
muoilog.xyz
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://zuntan02.hateblo.jp/entry/2022/07/15/212655"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/690018cfd233a1b1f03b5ae6fb82b501660eb8c2_hu_3e65ab9a6a3506bd.webp"
alt="Ubuntu（WSL2の）でgit cloneしたらserver certificate verification failed - zuntan02のはてなブログ image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Ubuntu（WSL2の）でgit cloneしたらserver certificate verification failed - zuntan02のはてなブログ
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;【概要】 Ubuntu/WSL2でgit cloneしたらけられた fatal: unable to access 'https://ほげほげ': server certificate verification failed. CAfile: none CRLfile: none 【解決に至るメモ】 メッセージによれば証明書ファイルがないとのことなのでインストール apt-get install --reinstall ca-certificates→エラー W: An error occurred during the signature verification. The reposito…&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-73f656a9d78ffaf0cd4b89b4ced8c5766fcbb952.png"
style="margin-right: 2px;"
alt="zuntan02.hateblo.jp favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
zuntan02.hateblo.jp
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://qol-kk.com/wp2/blog/2020/11/06/post-2165/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/82bd8cc0b434e82e412c941ca84887f767e42510_hu_5a60a96a38e9e34b.webp"
alt="【Docker】コンテナにROOTで入る方法 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
【Docker】コンテナにROOTで入る方法
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;目次 1. 【Docker】コンテナにROOTで入る方法1.1. 参考用のdocker-compose.yml1.2. docker-composeで入る方法1.3. コンテナIDを指定してdockerで入る方法1.4. まとめ 【Dock&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-8f0350aa4f2398eae9d654f1e14a000882f01f1f.png"
style="margin-right: 2px;"
alt="qol-kk.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
qol-kk.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>PythonでRSSから最新の記事を取得する</title><link>https://notes.nakurei.com/post/get-latest-articles-from-rss-by-python/</link><pubDate>Mon, 12 Jun 2023 23:26:35 +0900</pubDate><guid>https://notes.nakurei.com/post/get-latest-articles-from-rss-by-python/</guid><description>&lt;img src="https://notes.nakurei.com/img/header/python_img.webp" alt="Featured image of post PythonでRSSから最新の記事を取得する" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;PythonでRSSから最新の記事を取得するために書いたコードのメモ。&lt;/p&gt;
&lt;h2 id="必要なモジュール"&gt;
必要なモジュール&lt;a href="#%e5%bf%85%e8%a6%81%e3%81%aa%e3%83%a2%e3%82%b8%e3%83%a5%e3%83%bc%e3%83%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;RSSをPythonで解析できるようにするため、&lt;a class="link" href="https://github.com/kurtmckee/feedparser" target="_blank" rel="noopener"
&gt;feedparser&lt;/a&gt;というPythonモジュールを利用する。&lt;code&gt;feedparser&lt;/code&gt;はpipでインストールできる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install feedparser&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="メモ"&gt;
メモ&lt;a href="#%e3%83%a1%e3%83%a2"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;feedparser&lt;/code&gt;では、以下のようにしてRSSのURLから情報を取得できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;feed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;feedparser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rss_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;feedparser&lt;/code&gt;で取得した情報は、&lt;code&gt;pprint&lt;/code&gt;を利用するときれいに表示できる。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;feedparser&lt;/code&gt;で取得した情報空記事の情報を取得する場合は&lt;code&gt;entries&lt;/code&gt;メンバにアクセスする。&lt;code&gt;entries&lt;/code&gt;はリストで、複数の記事の情報が入っている。たいていのRSSでは新しい記事から順になっている。この場合、たとえば&lt;code&gt;feed.entries[0].title&lt;/code&gt;で最新記事のタイトルを取得できる。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;link&lt;/code&gt;や&lt;code&gt;summary&lt;/code&gt;も取得できるが、RSSによっては設定されていないこともあるため注意が必要。また、このサイトのRSSはsummaryに記事の全文が入っているが、たとえばZennのRSSはsummaryに本文が途中まで入っていて、全文は入っていない。そのためsummaryを取得したからといって、記事の内容がすべて手に入るわけではない。&lt;/p&gt;
&lt;h2 id="最終的なコード"&gt;
最終的なコード&lt;a href="#%e6%9c%80%e7%b5%82%e7%9a%84%e3%81%aa%e3%82%b3%e3%83%bc%e3%83%89"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;RSSから取得される&lt;code&gt;entries&lt;/code&gt;が日時順になっていれば、次のコードで新しい記事から&lt;code&gt;check_article_num&lt;/code&gt;個の記事の情報を取得できる。この場合、&lt;code&gt;check_article_num = 1&lt;/code&gt;にすれば最新の記事を取得できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;get_latest_article_from_rss.py&lt;/div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;feedparser&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;time&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_latest_articles_from_rss&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;rss_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;check_article_num&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;Get the latest articles from an RSS feed.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; Parameters
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; ----------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; rss_url : str
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; The URL of the RSS feed.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; check_article_num : int, optional
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; The number of articles to check, by default 5.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; Returns
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; -------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; list[feedparser.FeedParserDict]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; The list of latest articles.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;feed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;feedparser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rss_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;articles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;check_article_num&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;feed_published_time&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;struct_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;feed&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;published_parsed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;feed&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;feed_published_time&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;articles&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;feed&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&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;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;articles&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;No new articles found.&amp;#34;&lt;/span&gt;&lt;span class="p"&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;return&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;articles&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;rss_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://notes.nakurei.com/index.xml&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;get_latest_articles_from_rss&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;rss_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;rss_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;check_article_num&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;feed_published_time&lt;/code&gt;のように、記事がいつ公開されたかもRSSから取得できる。そのためこれを基準時刻と比較すれば、ある日時以降に公開された記事の情報を取得できそう。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://note.nkmk.me/python-feedparser-tutorial/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/d4d74ef97270d4a131b475fc84c6380e001aa54e_hu_651e82ccb0e63d17.webp"
alt="Python, feedparserでRSS, Atomフィードを解析 | note.nkmk.me image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Python, feedparserでRSS, Atomフィードを解析 | note.nkmk.me
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Pythonのサードパーティライブラリfeedparserを使うと、RSS / Atomフィードを解析（パース）してサイトの新着記事などの情報を抽出できる。フォーマットの仕様の違いをfeedparserが吸収してくれるので、どんなフォー ...&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-59d974ab54a5ade3a1626f50b1cd3ac4eba79d8c.png"
style="margin-right: 2px;"
alt="note.nkmk.me favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
note.nkmk.me
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>localhostにアクセスしたら昔のサイトが表示されて困った（解決した）</title><link>https://notes.nakurei.com/post/how-i-resolved-old-site-on-localhost-problem/</link><pubDate>Mon, 29 May 2023 23:11:10 +0900</pubDate><guid>https://notes.nakurei.com/post/how-i-resolved-old-site-on-localhost-problem/</guid><description>&lt;h2 id="生じた問題"&gt;
生じた問題&lt;a href="#%e7%94%9f%e3%81%98%e3%81%9f%e5%95%8f%e9%a1%8c"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Next.js (Next 3)でアプリを作って&lt;code&gt;npm run dev&lt;/code&gt;で起動し&lt;code&gt;http://localhost:3000/&lt;/code&gt;にアクセスしたら、前に作っていたNuxt.jsのアプリの画面が出てしまった。F5でブラウザを更新しても新しいNext.jsの画面にならない。&lt;/p&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Brave 1.51.118&lt;/li&gt;
&lt;li&gt;Windows 11&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="chatgptに聞いた"&gt;
ChatGPTに聞いた&lt;a href="#chatgpt%e3%81%ab%e8%81%9e%e3%81%84%e3%81%9f"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="質問"&gt;
質問&lt;a href="#%e8%b3%aa%e5%95%8f"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;braveで&lt;code&gt;http://localhost:3000/&lt;/code&gt;にアクセスすると、昔のデータが表示されてしまいます。どうやったら新しいデータを表示できますか？&lt;/p&gt;
&lt;h3 id="回答"&gt;
回答&lt;a href="#%e5%9b%9e%e7%ad%94"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ローカルホストのページに古いデータが表示されるという問題は、一般的にキャッシュの問題や、動的に更新されるデータが正しく更新されていないなど、いくつかの可能性が考えられます。以下の手順で問題の解決を試みてみてください。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;キャッシュをクリアする&lt;/strong&gt;: Braveブラウザでは、キャッシュとブラウジングデータをクリアすることができます。以下の手順に従ってください：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Braveブラウザを開きます。&lt;/li&gt;
&lt;li&gt;右上にある「その他」ボタン（三つの水平線アイコン）をクリックします。&lt;/li&gt;
&lt;li&gt;メニューから「設定」を選択します。&lt;/li&gt;
&lt;li&gt;「プライバシーとセキュリティ」セクションをクリックします。&lt;/li&gt;
&lt;li&gt;「ブラウジングデータをクリア」をクリックします。&lt;/li&gt;
&lt;li&gt;「時間範囲」を「すべての時間」に設定し、「キャッシュされた画像とファイル」のチェックボックスをオンにします。&lt;/li&gt;
&lt;li&gt;最後に、「データをクリア」をクリックします。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ページをハードリロードする&lt;/strong&gt;: キャッシュが原因である場合、キャッシュをクリアした後にページをハードリロードすることで、問題が解決する可能性があります。ハードリロードは、ページをリロードする際にブラウザのキャッシュを無視します。Braveブラウザでは、Ctrl + Shift + R（Windows）または Command + Shift + R（Mac）を押すことでハードリロードを実行できます。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ローカルサーバーをリスタートする&lt;/strong&gt;: 動的に更新されるデータが正しく更新されていない可能性があります。これは特に、データベースに対する変更がリアルタイムで反映されない場合に発生します。この場合、ローカルサーバーをリスタートすることで問題が解決する可能性があります。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;これらの手順を試した後でも問題が解決しない場合は、更に詳細な情報が必要になるかもしれません。例えば、使用している開発ツールやフレームワーク、データがどのように更新されるべきかなど、具体的なシナリオについての詳細が役立つでしょう。&lt;/p&gt;
&lt;h2 id="解決策"&gt;
解決策&lt;a href="#%e8%a7%a3%e6%b1%ba%e7%ad%96"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ChatGPTに言われたように、過去7日間の閲覧履歴・Cookie・キャッシュを削除したのち、&lt;code&gt;http://localhost:3000/&lt;/code&gt;でCtrl + Shift + Rしてハードリセットしたら直った。&lt;/p&gt;
&lt;p&gt;ありがとうChatGPT。&lt;/p&gt;</description></item><item><title>Ubuntu + 任意バージョンのPython3環境をDockerで構築する</title><link>https://notes.nakurei.com/post/build-python3-environment-with-docker-ubuntu/</link><pubDate>Sun, 21 May 2023 09:35:27 +0900</pubDate><guid>https://notes.nakurei.com/post/build-python3-environment-with-docker-ubuntu/</guid><description>&lt;img src="https://notes.nakurei.com/icons/brand-docker.svg" alt="Featured image of post Ubuntu + 任意バージョンのPython3環境をDockerで構築する" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ubuntu 18.04 + Python 3.7の環境を作らなければならなかったときに、Dockerで環境を構築したときの備忘録。&lt;/p&gt;
&lt;h2 id="最終的なdockerfile"&gt;
最終的なDockerfile&lt;a href="#%e6%9c%80%e7%b5%82%e7%9a%84%e3%81%aadockerfile"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;先に結論を示す。以下のDockerfileをビルドすれば、Ubuntu 18.04 + Python 3.7の環境を構築できる。Ubuntuのバージョンを変えたい場合は、&lt;code&gt;FROM ubuntu:18.04&lt;/code&gt;を&lt;a class="link" href="https://hub.docker.com/_/ubuntu" target="_blank" rel="noopener"
&gt;Ubuntu Official Image&lt;/a&gt;にある任意のバージョンのタグに変更する。Pythonのバージョンを変えたい場合は、&lt;code&gt;ARG python_version=&amp;quot;3.7.16&amp;quot;&lt;/code&gt;を、&lt;a class="link" href="https://www.python.org/ftp/python/" target="_blank" rel="noopener"
&gt;Pythonのソースコード置き場&lt;/a&gt;にある任意のバージョンに変更する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;Dockerfile&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;ubuntu:18.04&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&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;ARG&lt;/span&gt; &lt;span class="nv"&gt;python_version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;3.7.16&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Set locale&lt;/span&gt;&lt;span class="err"&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;RUN&lt;/span&gt; apt update -y &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt install -y --no-install-recommends &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; language-pack-en&lt;span class="err"&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;ENV&lt;/span&gt; LANG en_US.UTF-8&lt;span class="err"&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;ENV&lt;/span&gt; LANGUAGE en_US:en&lt;span class="err"&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;ENV&lt;/span&gt; LC_ALL en_US.UTF-8&lt;span class="err"&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;RUN&lt;/span&gt; ln -snf /usr/share/zoneinfo/America/New_York /etc/localtime&lt;span class="err"&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;RUN&lt;/span&gt; apt update -y &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt install -y --no-install-recommends &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; tzdata&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Install packages&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Ref: https://github.com/pyenv/pyenv/wiki#suggested-build-environment&lt;/span&gt;&lt;span class="err"&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;RUN&lt;/span&gt; apt update -y &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt install -y --no-install-recommends &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; git &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; wget &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; xz-utils &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; build-essential libssl-dev zlib1g-dev &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; libbz2-dev libreadline-dev libsqlite3-dev curl &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; libgdbm-dev libdb-dev uuid-dev&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Install Python&lt;/span&gt;&lt;span class="err"&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;RUN&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; /usr/local/src &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; wget --no-check-certificate https://www.python.org/ftp/python/&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;python_version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/Python-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;python_version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;.tar.xz &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; tar -Jxvf Python-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;python_version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;.tar.xz &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; Python-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;python_version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ./configure --with-ensurepip &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make install&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Set alias&lt;/span&gt;&lt;span class="err"&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;RUN&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;alias python=python3&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; ~/.bashrc&lt;span class="err"&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;RUN&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;alias pip=pip3&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; ~/.bashrc&lt;span class="err"&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;RUN&lt;/span&gt; . ~/.bashrc&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&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;RUN&lt;/span&gt; apt autoremove -y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="dockerfileの説明"&gt;
Dockerfileの説明&lt;a href="#dockerfile%e3%81%ae%e8%aa%ac%e6%98%8e"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Dockerfileでやっていることを説明する。&lt;/p&gt;
&lt;h3 id="localeとタイムゾーンを設定する"&gt;
localeとタイムゾーンを設定する&lt;a href="#locale%e3%81%a8%e3%82%bf%e3%82%a4%e3%83%a0%e3%82%be%e3%83%bc%e3%83%b3%e3%82%92%e8%a8%ad%e5%ae%9a%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;最初にlocaleとタイムゾーンを設定している。この設定は任意だが、設定しておかないと後々面倒になる（と個人的に思っている）ので設定している。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Dockerfile" data-lang="Dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Set locale&lt;/span&gt;&lt;span class="err"&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;RUN&lt;/span&gt; apt update -y &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt install -y --no-install-recommends &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; language-pack-en&lt;span class="err"&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;ENV&lt;/span&gt; LANG en_US.UTF-8&lt;span class="err"&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;ENV&lt;/span&gt; LANGUAGE en_US:en&lt;span class="err"&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;ENV&lt;/span&gt; LC_ALL en_US.UTF-8&lt;span class="err"&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;RUN&lt;/span&gt; ln -snf /usr/share/zoneinfo/America/New_York /etc/localtime&lt;span class="err"&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;RUN&lt;/span&gt; apt update -y &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt install -y --no-install-recommends &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; tzdata&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/build-python3-environment-with-docker-ubuntu/20230521123058.png"
width="793"
height="85"
srcset="https://notes.nakurei.com/post/build-python3-environment-with-docker-ubuntu/20230521123058_hu_98a5c0e6f277303e.png 480w, https://notes.nakurei.com/post/build-python3-environment-with-docker-ubuntu/20230521123058_hu_5ab5dced14b07671.png 1024w"
loading="lazy"
alt="タイムゾーンを設定"
class="gallery-image"
data-flex-grow="932"
data-flex-basis="2239px"
&gt;&lt;/p&gt;
&lt;p&gt;日本語かつ日本時間に設定する場合は、以下のようになる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Dockerfile" data-lang="Dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Set locale&lt;/span&gt;&lt;span class="err"&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;RUN&lt;/span&gt; apt update -y &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt install -y --no-install-recommends &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; language-pack-ja-base&lt;span class="err"&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;ENV&lt;/span&gt; LANG ja_JP.UTF-8&lt;span class="err"&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;ENV&lt;/span&gt; LANGUAGE ja_JP:ja&lt;span class="err"&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;ENV&lt;/span&gt; LC_ALL ja_JP.UTF-8&lt;span class="err"&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;RUN&lt;/span&gt; ln -snf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime&lt;span class="err"&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;RUN&lt;/span&gt; apt update -y &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt install -y --no-install-recommends &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; tzdata&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ちなみに、localeだけ設定してタイムゾーンを設定しないと、&lt;code&gt;docker build&lt;/code&gt;がタイムゾーンの入力で止まってしまうので注意。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://notes.nakurei.com/post/avoid-docker-build-timezone-pause/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="Dockerfileのビルドがタイムゾーンの入力で止まってしまう問題を回避する方法 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Dockerfileのビルドがタイムゾーンの入力で止まってしまう問題を回避する方法
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-1eff5ad74ed7b442dfa6826d07982b3bff45afb2.png"
style="margin-right: 2px;"
alt="notes.nakurei.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
notes.nakurei.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;h3 id="ubuntuに任意のバージョンのpythonをインストールする"&gt;
Ubuntuに任意のバージョンのPythonをインストールする&lt;a href="#ubuntu%e3%81%ab%e4%bb%bb%e6%84%8f%e3%81%ae%e3%83%90%e3%83%bc%e3%82%b8%e3%83%a7%e3%83%b3%e3%81%aepython%e3%82%92%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;apt upgrade&lt;/code&gt;や&lt;code&gt;apt install python3&lt;/code&gt;だと、任意バージョンのPythonや最新バージョンのPythonをインストールできない。よって、今回はPythonのソースコードをビルドしてインストールしている。&lt;/p&gt;
&lt;h4 id="ソースコードのビルドに必要なパッケージをインストールする"&gt;
ソースコードのビルドに必要なパッケージをインストールする&lt;a href="#%e3%82%bd%e3%83%bc%e3%82%b9%e3%82%b3%e3%83%bc%e3%83%89%e3%81%ae%e3%83%93%e3%83%ab%e3%83%89%e3%81%ab%e5%bf%85%e8%a6%81%e3%81%aa%e3%83%91%e3%83%83%e3%82%b1%e3%83%bc%e3%82%b8%e3%82%92%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Pythonのソースコードをビルドするのに必要なパッケージをインストールする。
今回は、&lt;a class="link" href="https://github.com/pyenv/pyenv/wiki#suggested-build-environment" target="_blank" rel="noopener"
&gt;pyenvが推奨するビルド環境&lt;/a&gt;を参考にパッケージをインストールしている。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Install packages&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Ref: https://github.com/pyenv/pyenv/wiki#suggested-build-environment&lt;/span&gt;&lt;span class="err"&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;RUN&lt;/span&gt; apt update -y &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt install -y --no-install-recommends &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; git &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; wget &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; build-essential libssl-dev zlib1g-dev &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; libbz2-dev libreadline-dev libsqlite3-dev curl &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; libgdbm-dev libdb-dev uuid-dev&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 id="ソースコードをダウンロードする"&gt;
ソースコードをダウンロードする&lt;a href="#%e3%82%bd%e3%83%bc%e3%82%b9%e3%82%b3%e3%83%bc%e3%83%89%e3%82%92%e3%83%80%e3%82%a6%e3%83%b3%e3%83%ad%e3%83%bc%e3%83%89%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;以下の部分でPythonのソースコードをダウンロードしている。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Install Python&lt;/span&gt;&lt;span class="err"&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;RUN&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; /usr/local/src &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; wget --no-check-certificate https://www.python.org/ftp/python/&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;python_version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/Python-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;python_version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;.tar.xz &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; tar -Jxvf Python-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;python_version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;.tar.xz &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; Python-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;python_version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ./configure --with-ensurepip &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make install&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;特定のバージョンのPythonのソースコードは、&lt;code&gt;https://www.python.org/ftp/python/&lt;/code&gt;から入手できる。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://www.python.org/ftp/python/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="Index of /ftp/python/ image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Index of /ftp/python/
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-5f9885c1e2f9f513dddfe9c1683e0b3797c28dbb.png"
style="margin-right: 2px;"
alt="www.python.org favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
www.python.org
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;たとえば、Python 3.7.16なら、&lt;code&gt;https://www.python.org/ftp/python/3.7.16/&lt;/code&gt;からダウンロードできる。今回は&lt;code&gt;Python-3.7.16.tar.xz&lt;/code&gt;をダウンロードしている。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget --no-check-certificate https://www.python.org/ftp/python/3.7.16/Python-3.7.16.tar.xz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ダウンロードしたら&lt;code&gt;tar&lt;/code&gt;コマンドで解凍する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tar -Jxvf Python-3.7.16.tar.xz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 id="ソースコードをビルドする"&gt;
ソースコードをビルドする&lt;a href="#%e3%82%bd%e3%83%bc%e3%82%b9%e3%82%b3%e3%83%bc%e3%83%89%e3%82%92%e3%83%93%e3%83%ab%e3%83%89%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;以下の部分で、ダウンロードしたPythonのソースコードをビルドしている。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Install Python&lt;/span&gt;&lt;span class="err"&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;RUN&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; /usr/local/src &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; wget --no-check-certificate https://www.python.org/ftp/python/&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;python_version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/Python-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;python_version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;.tar.xz &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; tar -Jxvf Python-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;python_version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;.tar.xz &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; Python-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;python_version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ./configure --with-ensurepip &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make install&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;まず、&lt;code&gt;configure&lt;/code&gt;を実行する。これにより、設定に応じた&lt;code&gt;Makefile&lt;/code&gt;が生成される。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;configure&lt;/code&gt;を実行する際にはオプションを指定できる。
オプションは以下のコマンドで確認できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./configure --help&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;今回は&lt;code&gt;--with-ensurepip&lt;/code&gt;というオプションを指定している。これによりビルド時にpipを有効化できる。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Makefile&lt;/code&gt;ができたら、&lt;code&gt;make&lt;/code&gt;コマンドでソースコードをビルドし、&lt;code&gt;make install&lt;/code&gt;コマンドでコンパイルする。&lt;/p&gt;
&lt;h3 id="エイリアスを設定する"&gt;
エイリアスを設定する&lt;a href="#%e3%82%a8%e3%82%a4%e3%83%aa%e3%82%a2%e3%82%b9%e3%82%92%e8%a8%ad%e5%ae%9a%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;この設定は任意。&lt;code&gt;python&lt;/code&gt;コマンドで&lt;code&gt;python3&lt;/code&gt;を実行するように指定している。また、&lt;code&gt;pip&lt;/code&gt;コマンドで&lt;code&gt;pip3&lt;/code&gt;を実行するように指定している。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Set alias&lt;/span&gt;&lt;span class="err"&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;RUN&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;alias python=python3&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; ~/.bashrc&lt;span class="err"&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;RUN&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;alias pip=pip3&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; ~/.bashrc&lt;span class="err"&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;RUN&lt;/span&gt; . ~/.bashrc&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://www.python.jp/install/ubuntu/index.html"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/9084053d7fe53e8d2658ac2258f72ec8510c5595_hu_400241886b155af5.webp"
alt="Ubuntu環境のPython - python.jp image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Ubuntu環境のPython - python.jp
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Ubuntu には最初からPythonがインストールされており、そのまま利用可能です。 しかし、このPython は、 OS がさまざまな機能を提供するために使用しています。ユーザが勝手にパッケージを導入したりすると、 OS の安定性を損なうことも考えられますので、別途&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-fb32ae74b76fabfa448452e94adc8602f98b6777.png"
style="margin-right: 2px;"
alt="www.python.jp favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
www.python.jp
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://self-development.info/ubuntu%E3%81%AB%E6%9C%80%E6%96%B0%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%AEpython%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/a58eb986c96233c80254d41a674aa0d7544aea73_hu_169425c3fc11f595.webp"
alt="Ubuntuに最新バージョンのPythonをインストールする image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Ubuntuに最新バージョンのPythonをインストールする
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Ubuntu（Linuxすべて）にデフォルトでインストールされているPythonをそのまま使っていませんか？それは、ヤバイことだと知っていましたか？この記事では、デフォルトのPythonを使うことのリスクを説明して、新しいPythonをインストールする方法を解説しています。&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-3e4f21cb3c74b87d0146d6feecfb83ce6a78f435.png"
style="margin-right: 2px;"
alt="self-development.info favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
self-development.info
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://qiita.com/yniji/items/8e392103a6f2a4152606"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/eed2f8266a40fff1dab61973949ee0afc6ba123f_hu_7719d3c54ad45583.webp"
alt="UbuntuでPythonをソースからインストール - Qiita image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
UbuntuでPythonをソースからインストール - Qiita
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Python 3.8 が公開されました。Ubuntu 18.04 の場合、Python 3.8 のパッケージが用意されることはないので、Ubuntu の LTS で Python 3.8 を使おうとしたら来年の4月に公開される Ubuntu 20.04 まで待つ必要がありま...&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7dfa4a32e8b8dd3b8a6b654e1cd55932c6a19262.png"
style="margin-right: 2px;"
alt="qiita.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
qiita.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>WSL2内のDockerコンテナでGPUを使えるようにする</title><link>https://notes.nakurei.com/post/using-gpu-with-wsl2-and-docker/</link><pubDate>Sun, 21 May 2023 00:40:02 +0900</pubDate><guid>https://notes.nakurei.com/post/using-gpu-with-wsl2-and-docker/</guid><description>&lt;img src="https://notes.nakurei.com/icons/brand-docker.svg" alt="Featured image of post WSL2内のDockerコンテナでGPUを使えるようにする" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;WSL2内のDockerコンテナからNVIDIA GPUを利用するための設定方法のメモ。&lt;/p&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;OS: Windows 11&lt;/li&gt;
&lt;li&gt;WSL2 : Ubuntu distribution (22.04.1 LTS)&lt;/li&gt;
&lt;li&gt;GPU: RTX 3060Ti&lt;/li&gt;
&lt;li&gt;Docker Desktop for Windows、またはDocker Engine in WSL2&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="wsl2のdockerでgpuを活用するための環境構築手順"&gt;
WSL2のDockerでGPUを活用するための環境構築手順&lt;a href="#wsl2%e3%81%aedocker%e3%81%a7gpu%e3%82%92%e6%b4%bb%e7%94%a8%e3%81%99%e3%82%8b%e3%81%9f%e3%82%81%e3%81%ae%e7%92%b0%e5%a2%83%e6%a7%8b%e7%af%89%e6%89%8b%e9%a0%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="前提条件を満たすか確認する"&gt;
前提条件を満たすか確認する&lt;a href="#%e5%89%8d%e6%8f%90%e6%9d%a1%e4%bb%b6%e3%82%92%e6%ba%80%e3%81%9f%e3%81%99%e3%81%8b%e7%a2%ba%e8%aa%8d%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;まずは、WSL2とDockerでGPUを使用できるようにするための前提条件を確認する。
以下のサイトに前提条件が書かれている。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="docs.nvidia.com image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
docs.nvidia.com
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-140a201f4cb6153b9232826ecbcb7af0d65660a1.png"
style="margin-right: 2px;"
alt="docs.nvidia.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
docs.nvidia.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;執筆当時の前提条件は以下のとおりだった。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;GNU/Linux x86_64 with kernel version &amp;gt; 3.10&lt;/li&gt;
&lt;li&gt;Docker &amp;gt;= 19.03 (recommended, but some distributions may include older versions of Docker. The minimum supported version is 1.12)&lt;/li&gt;
&lt;li&gt;NVIDIA GPU with Architecture &amp;gt;= Kepler (or compute capability 3.0)&lt;/li&gt;
&lt;li&gt;NVIDIA Linux drivers &amp;gt;= 418.81.07 (Note that older driver releases or branches are unsupported.)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;よって、前提条件を満たすかコマンドで確認する。&lt;/p&gt;
&lt;p&gt;Linux kernelのバージョンは、WSLのバージョンの確認でわかる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;PowerShell&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ wsl --version
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WSL バージョン: 1.2.5.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;カーネル バージョン: 5.15.90.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WSLg バージョン: 1.0.51
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MSRDC バージョン: 1.2.3770
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Direct3D バージョン: 1.608.2-61064218
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Windows バージョン: 10.0.22621.1702&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Dockerのバージョンは&lt;code&gt;docker&lt;/code&gt;コマンドで表示できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;WSL2&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker -v
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker version 23.0.5, build bc4487a&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;NVIDIA Driverが入っているかどうかと、そのバージョンの確認は、&lt;code&gt;nvidia-smi&lt;/code&gt;コマンドで確認できる。何も表示されない場合はNVIDIA Driverが入っていないので、&lt;a class="link" href="https://www.nvidia.com/Download/index.aspx" target="_blank" rel="noopener"
&gt;NVIDIAの公式サイト&lt;/a&gt;からダウンロードしてインストールする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;WSL2&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ nvidia-smi
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Sun May &lt;span class="m"&gt;21&lt;/span&gt; 01:06:40 &lt;span class="m"&gt;2023&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="p"&gt;|&lt;/span&gt; NVIDIA-SMI 530.50 Driver Version: 531.79 CUDA Version: 12.1 &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt;-----------------------------------------+----------------------+----------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; GPU Name Persistence-M&lt;span class="p"&gt;|&lt;/span&gt; Bus-Id Disp.A &lt;span class="p"&gt;|&lt;/span&gt; Volatile Uncorr. ECC &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; Fan Temp Perf Pwr:Usage/Cap&lt;span class="p"&gt;|&lt;/span&gt; Memory-Usage &lt;span class="p"&gt;|&lt;/span&gt; GPU-Util Compute M. &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; MIG M. &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="o"&gt;=========================================&lt;/span&gt;+&lt;span class="o"&gt;======================&lt;/span&gt;+&lt;span class="o"&gt;======================&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; NVIDIA GeForce RTX &lt;span class="m"&gt;3060&lt;/span&gt; Ti On &lt;span class="p"&gt;|&lt;/span&gt; 00000000:01:00.0 On &lt;span class="p"&gt;|&lt;/span&gt; N/A &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; 60% 53C P5 29W / 200W&lt;span class="p"&gt;|&lt;/span&gt; 2855MiB / 8192MiB &lt;span class="p"&gt;|&lt;/span&gt; 24% Default &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; N/A &lt;span class="p"&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&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="p"&gt;|&lt;/span&gt; Processes: &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; GPU GI CI PID Type Process name GPU Memory &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; ID ID Usage &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="o"&gt;=======================================================================================&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; No running processes found &lt;span class="p"&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;それぞれのツールのインストールとバージョンが前提条件を満たしていることを確認したら、次へ進む。&lt;/p&gt;
&lt;h3 id="nvidia-container-toolkitをインストールする"&gt;
NVIDIA Container Toolkitをインストールする&lt;a href="#nvidia-container-toolkit%e3%82%92%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;次に、NVIDIA Container Toolkitをインストールする。
このToolkitはDockerと密接に連携し、コンテナからNVIDIA GPUを活用できるようにする。&lt;/p&gt;
&lt;p&gt;インストールは&lt;a class="link" href="https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#docker" target="_blank" rel="noopener"
&gt;公式ドキュメント&lt;/a&gt;の手順に従う。
公式ドキュメントの方法が最新の方法なので、それに従うのがベストである。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="docs.nvidia.com image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
docs.nvidia.com
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-140a201f4cb6153b9232826ecbcb7af0d65660a1.png"
style="margin-right: 2px;"
alt="docs.nvidia.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
docs.nvidia.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;details&gt;
&lt;summary&gt;念のため執筆時のインストール方法を残しておく&lt;/summary&gt;
&lt;p&gt;&lt;p&gt;パッケージリポジトリとGPGキーをセットアップする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;distribution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;. /etc/os-release&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$ID$VERSION_ID&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey &lt;span class="p"&gt;|&lt;/span&gt; sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; curl -s -L https://nvidia.github.io/libnvidia-container/&lt;span class="nv"&gt;$distribution&lt;/span&gt;/libnvidia-container.list &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sed &lt;span class="s1"&gt;&amp;#39;s#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;パッケージリストを更新する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;nvidia-container-toolkitパッケージ（および依存関係）をインストールする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install -y nvidia-container-toolkit&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;NVIDIA Container Toolkitのインストールを確認する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nvidia-container-cli info&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;DockerデーモンがNVIDIA Container Runtimeを認識するように設定する。
Docker Desktop for Windowsを利用している場合は、この手順だけ飛ばしてよい。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo nvidia-ctk runtime configure --runtime&lt;span class="o"&gt;=&lt;/span&gt;docker&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;最後に、Dockerデーモンを再起動する。
Docker Desktop for Windowsを利用している場合は、コマンドではなくDocker DesktopのほうでDockerデーモンを再起動する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl restart docker&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ちなみに、&lt;code&gt;systemctl&lt;/code&gt;が使えない場合は次のエラーが出る。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo systemctl restart docker
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;System has not been booted with systemd as init system &lt;span class="o"&gt;(&lt;/span&gt;PID 1&lt;span class="o"&gt;)&lt;/span&gt;. Can&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;t operate.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Failed to connect to bus: Host is down&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;この場合は下記リンクの内容に従って対処すること。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://kyrieee.com/wsl-error/2109/" target="_blank" rel="noopener"
&gt;https://kyrieee.com/wsl-error/2109/&lt;/a&gt;
&lt;a class="link" href="https://shikiyura.com/2022/11/systemd_supported_in_wsl/" target="_blank" rel="noopener"
&gt;https://shikiyura.com/2022/11/systemd_supported_in_wsl/&lt;/a&gt;&lt;/p&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;h3 id="gpuが認識されるか確認する"&gt;
GPUが認識されるか確認する&lt;a href="#gpu%e3%81%8c%e8%aa%8d%e8%ad%98%e3%81%95%e3%82%8c%e3%82%8b%e3%81%8b%e7%a2%ba%e8%aa%8d%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;環境が正しく設定され、DockerコンテナからGPUが適切に認識されるか確認する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo docker run --rm --runtime&lt;span class="o"&gt;=&lt;/span&gt;nvidia --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;docker: Error response from daemon: unknown or invalid runtime name: nvidia.&lt;/code&gt;というエラーが出る場合は、&lt;code&gt;--runtime=nvidia&lt;/code&gt;を削除して実行する。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://qiita.com/gyuta/items/51b6b629e78c46b1b812"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/9d3dcd28fb71213d201062dae4e956662017da9d_hu_86e9ded75b69c30d.webp"
alt="[WSL2]docker: Error response from daemon: Unknown runtime specified nvidia. の対処法 - Qiita image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
[WSL2]docker: Error response from daemon: Unknown runtime specified nvidia. の対処法 - Qiita
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;--runtime=nvidia を --gpus all に変更する。 参考: https://github.com/NVIDIA/nvidia-docker/issues/838#issuecomment-558962338 他にもいろいろな解決法が書いてある 環境 ...&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7dfa4a32e8b8dd3b8a6b654e1cd55932c6a19262.png"
style="margin-right: 2px;"
alt="qiita.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
qiita.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;以下のように結果が表示されれば成功。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&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="p"&gt;|&lt;/span&gt; NVIDIA-SMI 530.41.03 Driver Version: 531.41 CUDA Version: 12.1 &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt;-----------------------------------------+----------------------+----------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; GPU Name Persistence-M&lt;span class="p"&gt;|&lt;/span&gt; Bus-Id Disp.A &lt;span class="p"&gt;|&lt;/span&gt; Volatile Uncorr. ECC &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; Fan Temp Perf Pwr:Usage/Cap&lt;span class="p"&gt;|&lt;/span&gt; Memory-Usage &lt;span class="p"&gt;|&lt;/span&gt; GPU-Util Compute M. &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; MIG M. &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="o"&gt;=========================================&lt;/span&gt;+&lt;span class="o"&gt;======================&lt;/span&gt;+&lt;span class="o"&gt;======================&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; NVIDIA GeForce RTX &lt;span class="m"&gt;3060&lt;/span&gt; Ti On &lt;span class="p"&gt;|&lt;/span&gt; 00000000:01:00.0 On &lt;span class="p"&gt;|&lt;/span&gt; N/A &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; 0% 55C P8 24W / 200W&lt;span class="p"&gt;|&lt;/span&gt; 1846MiB / 8192MiB &lt;span class="p"&gt;|&lt;/span&gt; 11% Default &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; N/A &lt;span class="p"&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&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="p"&gt;|&lt;/span&gt; Processes: &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; GPU GI CI PID Type Process name GPU Memory &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; ID ID Usage &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="o"&gt;=======================================================================================&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; N/A N/A &lt;span class="m"&gt;23&lt;/span&gt; G /Xwayland N/A &lt;span class="p"&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="dockerコンテナからgpuを利用する"&gt;
DockerコンテナからGPUを利用する&lt;a href="#docker%e3%82%b3%e3%83%b3%e3%83%86%e3%83%8a%e3%81%8b%e3%82%89gpu%e3%82%92%e5%88%a9%e7%94%a8%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;あとは、GPUを利用したいコンテナを実行するときに、以下のコマンドのように&lt;code&gt;--gpus all&lt;/code&gt;あるいは&lt;code&gt;--gpus=all&lt;/code&gt;のオプションをつけて実行すればよい。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo docker run --rm --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://qiita.com/tatsuya11bbs/items/3af03e704812b6c89965"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/5c593e2962a50f70b0461b525d37c6755835f645_hu_e843163abc50c9bd.webp"
alt="Dockerを使って爆速でGPUを設定する方法 - Qiita image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Dockerを使って爆速でGPUを設定する方法 - Qiita
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;はじめに 機械学習をやろうと思ったら、まずやってくるのが GPUの設定 ですよね。ドライバインストールしてCUDAとcudnnインストールして、、、。これが本当にめんどくさい！そんな方には Dockerを用いた設定をオススメします。マジで爆速です。しかも、PyTorchや...&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7dfa4a32e8b8dd3b8a6b654e1cd55932c6a19262.png"
style="margin-right: 2px;"
alt="qiita.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
qiita.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://ksknw.hatenablog.com/entry/2019/08/31/212322"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/fb37e6a6c85240478de11e9901ccdbb2c0237397_hu_bb4c566a6733467e.webp"
alt="Dockerを使ってpytorch&amp;#43;cudaの環境を構築する - やったことの説明 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Dockerを使ってpytorch+cudaの環境を構築する - やったことの説明
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;はじめに 研究をやっていると 査読対応のために実験を追加したいが，環境をいじってしまっている 既存手法を実行するために，tensorflowの特定のバージョンを使いたい．それに伴って特定のバージョンのcudaをインストールしなければならない みたいなことが発生する． pythonだけならcondaやpipenvでなんとかなるが，cudaなどが絡んでくると色々めんどくさくなる． そこで，Dockerを使って環境を構築することでこの問題を解決することを試みる． もう1台のパソコンや会社のPCで同じことをやるので記録を残す． cuda+dockerで検索するとnvidia-docker2を使うように…&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-e275114fe19e9267ad9dc3ed87ac6a5afb5c8c08.png"
style="margin-right: 2px;"
alt="ksknw.hatenablog.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
ksknw.hatenablog.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>Nuxt 3にVuetify 3を追加した後の細かい設定のメモ</title><link>https://notes.nakurei.com/post/nuxt3-vuetify3-customization-note/</link><pubDate>Sat, 20 May 2023 13:09:46 +0900</pubDate><guid>https://notes.nakurei.com/post/nuxt3-vuetify3-customization-note/</guid><description>&lt;img src="https://notes.nakurei.com/post/nuxt3-vuetify3-customization-note/20230520124907.webp" alt="Featured image of post Nuxt 3にVuetify 3を追加した後の細かい設定のメモ" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Nuxt 3にVuetify 3を導入した後に設定した、細かい設定のメモ。&lt;/p&gt;
&lt;p&gt;Vuetify自体の導入については、以下の記事を参照のこと。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="http://notes.nakurei.com/post/nuxt3-vuetify3-setup-guide/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="Nuxt 3の環境にVuetify 3を追加する image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Nuxt 3の環境にVuetify 3を追加する
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
notes.nakurei.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;h2 id="変更前のvuetifyの設定"&gt;
変更前のVuetifyの設定&lt;a href="#%e5%a4%89%e6%9b%b4%e5%89%8d%e3%81%aevuetify%e3%81%ae%e8%a8%ad%e5%ae%9a"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Vuetifyのコンポーネントと&lt;a class="link" href="https://vuetifyjs.com/en/directives/ripple/" target="_blank" rel="noopener"
&gt;directives&lt;/a&gt;を読み込み、Material Design Iconsのうち必要なアイコンだけをインポートする設定をしている。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;plugins/vuetify.ts&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createVuetify&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;vuetify&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="kr"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;components&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;vuetify/components&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="kr"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;directives&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;vuetify/directives&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;aliases&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mdi&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;vuetify/iconsets/mdi-svg&amp;#39;&lt;/span&gt;&lt;span class="p"&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="kr"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;defineNuxtPlugin&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;nuxtApp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;vuetify&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;createVuetify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;ssr&lt;/span&gt;: &lt;span class="kt"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;components&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;directives&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;icons&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;defaultSet&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;mdi&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;aliases&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;sets&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;mdi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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="nx"&gt;nuxtApp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vueApp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;vuetify&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="blueprintを指定"&gt;
blueprintを指定&lt;a href="#blueprint%e3%82%92%e6%8c%87%e5%ae%9a"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Vuetifyはマテリアルデザインに準拠している。マテリアルデザインは、2014年に&lt;a class="link" href="https://m1.material.io/" target="_blank" rel="noopener"
&gt;Material Design&lt;/a&gt;が定義されたのち、2017年に&lt;a class="link" href="https://m2.material.io/" target="_blank" rel="noopener"
&gt;Material Design 2&lt;/a&gt;へ仕様が変更され、2022年には&lt;a class="link" href="https://m3.material.io/" target="_blank" rel="noopener"
&gt;Material Design 3&lt;/a&gt;が登場した。Vuetifyでは、これらのデザインの仕様のうちどれを利用するかを、&lt;code&gt;blueprint&lt;/code&gt;というconfigで変更できる。たとえば、Material Design 3を利用する場合は、以下のように&lt;code&gt;md3&lt;/code&gt;を指定する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;plugins/vuetify.ts&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;md3&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;vuetify/blueprints&amp;#39;&lt;/span&gt;&lt;span class="p"&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="kr"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;defineNuxtPlugin&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;nuxtApp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;vuetify&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;createVuetify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;blueprint&lt;/span&gt;: &lt;span class="kt"&gt;md3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;blueprint&lt;/code&gt;の指定によってどのようにデザインが変わるかに関する詳細は、以下のリンクを参照してほしい。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://vuetifyjs.com/en/features/blueprints/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/2249647607c4cc3253a4605ab967c5cbc8c98ab9_hu_639cfd6d6d82a685.webp"
alt="Blueprints — Vuetify image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Blueprints — Vuetify
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Setup your entire application with pre-made or custom styling and designs&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-5b177a14dd4d4397e56e375dcbfa447cd73601a7.png"
style="margin-right: 2px;"
alt="vuetifyjs.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
vuetifyjs.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;h2 id="テーマの色を変更"&gt;
テーマの色を変更&lt;a href="#%e3%83%86%e3%83%bc%e3%83%9e%e3%81%ae%e8%89%b2%e3%82%92%e5%a4%89%e6%9b%b4"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="カラーテーマを変更"&gt;
カラーテーマを変更&lt;a href="#%e3%82%ab%e3%83%a9%e3%83%bc%e3%83%86%e3%83%bc%e3%83%9e%e3%82%92%e5%a4%89%e6%9b%b4"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;カラーテーマの色を変更する。公式のやり方に準じる。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://next.vuetifyjs.com/en/features/theme/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/2249647607c4cc3253a4605ab967c5cbc8c98ab9_hu_639cfd6d6d82a685.webp"
alt="Theme — Vuetify image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Theme — Vuetify
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Setup your application's theme and supplemental colors in a flash.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-d30bd4f7fa72ccb9f03a21946e5f3919a4406034.png"
style="margin-right: 2px;"
alt="next.vuetifyjs.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
next.vuetifyjs.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;まず、任意のディレクトリに&lt;code&gt;theme.ts&lt;/code&gt;を作成する。
&lt;code&gt;theme.ts&lt;/code&gt;にテーマを以下のように定義する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;theme.ts&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ThemeDefinition&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;vuetify&amp;#39;&lt;/span&gt;&lt;span class="p"&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="c1"&gt;// #689F38
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lightTheme&lt;/span&gt;: &lt;span class="kt"&gt;ThemeDefinition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;dark&lt;/span&gt;: &lt;span class="kt"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;colors&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;background&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#fdfdf5&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;surface&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#fdfdf5&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;primary&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#386b01&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;secondary&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#57624a&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;success&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#386664&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;warning&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#ffdad6&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#ba1a1a&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#bbece9&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;on-background&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#1a1c18&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;on-surface&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#1a1c18&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;on-primary&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#ffffff&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;on-secondary&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#ffffff&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;on-success&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#ffffff&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;on-warning&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#410002&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;on-error&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#ffffff&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;on-info&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#00201f&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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="kr"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;darkTheme&lt;/span&gt;: &lt;span class="kt"&gt;ThemeDefinition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;dark&lt;/span&gt;: &lt;span class="kt"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;colors&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;background&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#1a1c18&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;surface&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#1a1c18&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;primary&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#9cd769&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;secondary&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#becbae&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;success&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#a0cfcd&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;warning&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#93000a&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#ffb4ab&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#1e4e4d&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;on-background&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#e3e3dc&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;on-surface&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#e3e3dc&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;on-primary&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#1a3700&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;on-secondary&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#29341f&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;on-success&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#003736&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;on-warning&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#ffdad6&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;on-error&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#690005&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;on-info&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#bbece9&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;上で示したコードの色のkey（&lt;code&gt;background&lt;/code&gt;とか&lt;code&gt;surface&lt;/code&gt;とか）は&lt;code&gt;ThemeDefinition&lt;/code&gt;で定義されているもので、Vuetifyのコンポーネントで自動的に利用される。なお、すべての色を定義する必要はないし、&lt;code&gt;ThemeDefinition&lt;/code&gt;で定義されているkeyのほかに任意のkeyも設定できる。&lt;/p&gt;
&lt;p&gt;ちなみに、テーマの色決めには以下のサイトが有用である。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://m3.material.io/theme-builder"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="Material Theme Builder image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Material Theme Builder
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Theming for Material Design 3&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-1de0c6d0e3c0336335183e5775425b5b11ac247d.png"
style="margin-right: 2px;"
alt="m3.material.io favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
m3.material.io
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;テーマを定義したら、それを利用するために、定義したテーマを&lt;code&gt;createVuetify&lt;/code&gt;に渡す。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;plugins/vuetify.ts&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createVuetify&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;vuetify&amp;#39;&lt;/span&gt;&lt;span class="p"&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="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;lightTheme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;darkTheme&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;@/helpers/vuetify/themes&amp;#39;&lt;/span&gt;&lt;span class="p"&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="kr"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;defineNuxtPlugin&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;nuxtApp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;vuetify&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;createVuetify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;defaultTheme&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;light&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;themes&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;light&lt;/span&gt;: &lt;span class="kt"&gt;lightTheme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;dark&lt;/span&gt;: &lt;span class="kt"&gt;darkTheme&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;このテーマをアプリ全体に適用するには、&lt;code&gt;theme.global.name.value&lt;/code&gt;の値を設定したテーマ名（上記の場合は&lt;code&gt;light&lt;/code&gt;か&lt;code&gt;dark&lt;/code&gt;）に変更する。例を下記に示す。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;app.vue&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-vue" data-lang="vue"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useTheme&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;vuetify&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;mdiWeatherNight&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mdiWeatherSunny&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;@mdi/js&amp;#39;&lt;/span&gt;&lt;span class="p"&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="c1"&gt;// params
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useTheme&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;themeIcon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;global&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dark&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;mdiWeatherNight&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;mdiWeatherSunny&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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="c1"&gt;// functions
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;toggleTheme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;global&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;global&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dark&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;light&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;dark&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-app&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-main&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-container&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt; &lt;span class="nt"&gt;:icon&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;themeIcon&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;@click&lt;/span&gt;&lt;span class="s"&gt;=&amp;#34;toggleTheme()&amp;#34;&lt;/span&gt;&lt;span class="p"&gt; /&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;v-container&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;v-main&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;v-app&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;上記のコードを実行すると、ボタンクリックでテーマを変更できる。&lt;/p&gt;
&lt;div class="video-wrapper"&gt;
&lt;video
controls
src="http://notes.nakurei.com/post/nuxt3-vuetify3-customization-note/ChangeTheme1.webm"
autoplay
loop
&gt;
&lt;p&gt;
Your browser doesn't support HTML5 video. Here is a
&lt;a href="http://notes.nakurei.com/post/nuxt3-vuetify3-customization-note/ChangeTheme1.webm"&gt;link to the video&lt;/a&gt; instead.
&lt;/p&gt;
&lt;/video&gt;
&lt;/div&gt;
&lt;p&gt;また、テーマは特定のコンポーネントだけにも適用できる。たとえば以下のように&lt;code&gt;v-btn&lt;/code&gt;の&lt;code&gt;theme&lt;/code&gt;に&lt;code&gt;&amp;quot;light&amp;quot;&lt;/code&gt;を指定すると、そのボタンには常に&lt;code&gt;&amp;quot;light&amp;quot;&lt;/code&gt;テーマが適用される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-vue" data-lang="vue"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt; &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;light&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;TEST&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;この書き方だと常に&lt;code&gt;&amp;quot;light&amp;quot;&lt;/code&gt;テーマが適用されるため、&lt;code&gt;theme.global.name.value&lt;/code&gt;の変更の影響を受けなくなる。&lt;/p&gt;
&lt;div class="video-wrapper"&gt;
&lt;video
controls
src="http://notes.nakurei.com/post/nuxt3-vuetify3-customization-note/ChangeTheme2.webm"
autoplay
loop
&gt;
&lt;p&gt;
Your browser doesn't support HTML5 video. Here is a
&lt;a href="http://notes.nakurei.com/post/nuxt3-vuetify3-customization-note/ChangeTheme2.webm"&gt;link to the video&lt;/a&gt; instead.
&lt;/p&gt;
&lt;/video&gt;
&lt;/div&gt;
&lt;h3 id="validationを定義"&gt;
Validationを定義&lt;a href="#validation%e3%82%92%e5%ae%9a%e7%be%a9"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Vuetifyのカラーシステムを利用すると、テーマの色に対して、色のバリエーションを任意の数生成できる。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://next.vuetifyjs.com/en/features/theme/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/2249647607c4cc3253a4605ab967c5cbc8c98ab9_hu_639cfd6d6d82a685.webp"
alt="Theme — Vuetify image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Theme — Vuetify
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Setup your application's theme and supplemental colors in a flash.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-d30bd4f7fa72ccb9f03a21946e5f3919a4406034.png"
style="margin-right: 2px;"
alt="next.vuetifyjs.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
next.vuetifyjs.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;たとえば、以下のように書くと、&lt;code&gt;primary&lt;/code&gt;、&lt;code&gt;secondary&lt;/code&gt;、&lt;code&gt;success&lt;/code&gt;のそれぞれの色に対して、6つのlightenと3つのdarkenのValidationが定義される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;plugins/vuetify.ts&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createVuetify&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;vuetify&amp;#39;&lt;/span&gt;&lt;span class="p"&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="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;lightTheme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;darkTheme&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;@/helpers/vuetify/themes&amp;#39;&lt;/span&gt;&lt;span class="p"&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="kr"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;defineNuxtPlugin&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;nuxtApp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;vuetify&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;createVuetify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;defaultTheme&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;light&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;variations&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;colors&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;primary&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;secondary&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;success&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;lighten&lt;/span&gt;: &lt;span class="kt"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;darken&lt;/span&gt;: &lt;span class="kt"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;themes&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;light&lt;/span&gt;: &lt;span class="kt"&gt;lightTheme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;dark&lt;/span&gt;: &lt;span class="kt"&gt;darkTheme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;生成したValidationは&lt;code&gt;class&lt;/code&gt;で利用できる。
たとえば、以下のようにボタンを定義すると、それぞれ色が変わる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;index.vue&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mb-5&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mr-3 bg-primary-lighten-6&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;test&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mr-3 bg-primary-lighten-5&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;test&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mr-3 bg-primary-lighten-4&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;test&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mr-3 bg-primary-lighten-3&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;test&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mr-3 bg-primary-lighten-2&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;test&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mr-3 bg-primary-lighten-1&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;test&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mr-3 bg-primary&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;test&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mr-3 bg-primary-darken-1&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;test&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mr-3 bg-primary-darken-2&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;test&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mr-3 bg-primary-darken-3&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;test&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mb-5&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mr-3 bg-secondary-lighten-6&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;test&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mr-3 bg-secondary-lighten-5&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;test&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mr-3 bg-secondary-lighten-4&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;test&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mr-3 bg-secondary-lighten-3&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;test&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mr-3 bg-secondary-lighten-2&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;test&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mr-3 bg-secondary-lighten-1&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;test&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mr-3 bg-secondary&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;test&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mr-3 bg-secondary-darken-1&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;test&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mr-3 bg-secondary-darken-2&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;test&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mr-3 bg-secondary-darken-3&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;test&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mb-5&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt; &lt;span class="na"&gt;v-for&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;n in 6&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;:key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt; &lt;span class="na"&gt;:class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#39;mr-3 bg-success-lighten-&amp;#39;+(7-n)&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;test&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mr-3 bg-success&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;test&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt; &lt;span class="na"&gt;v-for&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;n in 3&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;:key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt; &lt;span class="na"&gt;:class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#39;mr-3 bg-success-darken-&amp;#39;+n&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;test&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/nuxt3-vuetify3-customization-note/20230520124907.png"
width="1404"
height="278"
srcset="https://notes.nakurei.com/post/nuxt3-vuetify3-customization-note/20230520124907_hu_392a0e4534fcc19f.png 480w, https://notes.nakurei.com/post/nuxt3-vuetify3-customization-note/20230520124907_hu_d23f4739628d01e9.png 1024w"
loading="lazy"
alt="Validation buttons"
class="gallery-image"
data-flex-grow="505"
data-flex-basis="1212px"
&gt;&lt;/p&gt;
&lt;h2 id="vuetifyのコンポーネントのカスタマイズファイルを作成"&gt;
Vuetifyのコンポーネントのカスタマイズファイルを作成&lt;a href="#vuetify%e3%81%ae%e3%82%b3%e3%83%b3%e3%83%9d%e3%83%bc%e3%83%8d%e3%83%b3%e3%83%88%e3%81%ae%e3%82%ab%e3%82%b9%e3%82%bf%e3%83%9e%e3%82%a4%e3%82%ba%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92%e4%bd%9c%e6%88%90"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Vuetifyのコンポーネントは、個々の属性を付与することでスタイルを変更できる。このスタイルをコンポーネントごとに一括で変更できるようにする。&lt;/p&gt;
&lt;p&gt;まず、Vuetifyのコンポーネントのデフォルトを設定するファイルを作成する。今回は&lt;code&gt;defaults.ts&lt;/code&gt;という名前で作成した。次に、そこにデフォルトの設定を書き込む。設定の例を以下に示す。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;defaults.ts&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;DefaultsInstance&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;vuetify/lib/framework.mjs&amp;#39;&lt;/span&gt;&lt;span class="p"&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="kr"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;defaults&lt;/span&gt;: &lt;span class="kt"&gt;DefaultsInstance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;VBtn&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;density&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;compact&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;elevation&lt;/span&gt;: &lt;span class="kt"&gt;1&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;そして、作成した設定を&lt;code&gt;createVuetify&lt;/code&gt;に渡して読み込む。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;plugins/vuetify.ts&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createVuetify&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;vuetify&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="kr"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;components&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;vuetify/components&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="kr"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;directives&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;vuetify/directives&amp;#39;&lt;/span&gt;&lt;span class="p"&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="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defaults&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;@/helpers/vuetify/defaults&amp;#39;&lt;/span&gt;&lt;span class="p"&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="kr"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;defineNuxtPlugin&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;nuxtApp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;vuetify&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;createVuetify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;components&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;directives&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;defaults&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これにより、Vuetifyのコンポーネントに一括で設定を付与できる。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/nuxt3-vuetify3-customization-note/20230520130246.png"
width="1405"
height="303"
srcset="https://notes.nakurei.com/post/nuxt3-vuetify3-customization-note/20230520130246_hu_44561457928a7da6.png 480w, https://notes.nakurei.com/post/nuxt3-vuetify3-customization-note/20230520130246_hu_52b2501456326552.png 1024w"
loading="lazy"
alt="VBtnの設定が一括で付与されたようす"
class="gallery-image"
data-flex-grow="463"
data-flex-basis="1112px"
&gt;&lt;/p&gt;
&lt;h2 id="最終的なvuetifyの設定"&gt;
最終的なVuetifyの設定&lt;a href="#%e6%9c%80%e7%b5%82%e7%9a%84%e3%81%aavuetify%e3%81%ae%e8%a8%ad%e5%ae%9a"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;最後に、設定ファイル全体を示しておく。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;plugins/vuetify.ts&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createVuetify&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;vuetify&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="kr"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;components&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;vuetify/components&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="kr"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;directives&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;vuetify/directives&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;aliases&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mdi&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;vuetify/iconsets/mdi-svg&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;md3&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;vuetify/blueprints&amp;#39;&lt;/span&gt;&lt;span class="p"&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="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;lightTheme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;darkTheme&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;@/helpers/vuetify/themes&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defaults&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;@/helpers/vuetify/defaults&amp;#39;&lt;/span&gt;&lt;span class="p"&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="kr"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;defineNuxtPlugin&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;nuxtApp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;vuetify&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;createVuetify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;ssr&lt;/span&gt;: &lt;span class="kt"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;blueprint&lt;/span&gt;: &lt;span class="kt"&gt;md3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;components&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;directives&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;defaults&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;icons&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;defaultSet&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;mdi&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;aliases&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;sets&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;mdi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;defaultTheme&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;light&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;variations&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;colors&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;primary&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;secondary&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;success&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;lighten&lt;/span&gt;: &lt;span class="kt"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;darken&lt;/span&gt;: &lt;span class="kt"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;themes&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;light&lt;/span&gt;: &lt;span class="kt"&gt;lightTheme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;dark&lt;/span&gt;: &lt;span class="kt"&gt;darkTheme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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="nx"&gt;nuxtApp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vueApp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;vuetify&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://vuetifyjs.com/en/features/blueprints/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/2249647607c4cc3253a4605ab967c5cbc8c98ab9_hu_639cfd6d6d82a685.webp"
alt="Blueprints — Vuetify image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Blueprints — Vuetify
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Setup your entire application with pre-made or custom styling and designs&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-5b177a14dd4d4397e56e375dcbfa447cd73601a7.png"
style="margin-right: 2px;"
alt="vuetifyjs.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
vuetifyjs.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://next.vuetifyjs.com/en/features/theme/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/2249647607c4cc3253a4605ab967c5cbc8c98ab9_hu_639cfd6d6d82a685.webp"
alt="Theme — Vuetify image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Theme — Vuetify
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Setup your application's theme and supplemental colors in a flash.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-d30bd4f7fa72ccb9f03a21946e5f3919a4406034.png"
style="margin-right: 2px;"
alt="next.vuetifyjs.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
next.vuetifyjs.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://zenn.dev/coedo/articles/nuxt3-vuetify3"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/0af9107edaf41eb8de4ef4bcf2cb384f797279e4_hu_6ae59f69a7f80665.webp"
alt="Nuxt 3 で Vuetify 3 を使う image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Nuxt 3 で Vuetify 3 を使う
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-8299b9ca5170247061175f654bfc883ff1cc2440.png"
style="margin-right: 2px;"
alt="zenn.dev favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
zenn.dev
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>Dockerfileのビルドがタイムゾーンの入力で止まってしまう問題を回避する方法</title><link>https://notes.nakurei.com/post/avoid-docker-build-timezone-pause/</link><pubDate>Thu, 18 May 2023 21:21:56 +0900</pubDate><guid>https://notes.nakurei.com/post/avoid-docker-build-timezone-pause/</guid><description>&lt;img src="https://notes.nakurei.com/icons/brand-docker.svg" alt="Featured image of post Dockerfileのビルドがタイムゾーンの入力で止まってしまう問題を回避する方法" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Dockerfileをビルドした際に、&lt;code&gt;docker build&lt;/code&gt;がタイムゾーンの入力で止まってしまう問題に遭遇した。これを回避する方法のメモ。&lt;/p&gt;
&lt;h2 id="問題を再現する"&gt;
問題を再現する&lt;a href="#%e5%95%8f%e9%a1%8c%e3%82%92%e5%86%8d%e7%8f%be%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;以下のDockerfileをビルドする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;Dockerfile&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Dockerfile" data-lang="Dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;ubuntu:18.04&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&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;RUN&lt;/span&gt; apt update -y &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt install -y --no-install-recommends &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; language-pack-en&lt;span class="err"&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;ENV&lt;/span&gt; LANG en_US.UTF-8&lt;span class="err"&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;ENV&lt;/span&gt; LANGUAGE en_US.en&lt;span class="err"&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;ENV&lt;/span&gt; LC_ALL en_US.UTF-8&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&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;RUN&lt;/span&gt; apt update -y &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt install -y --no-install-recommends &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; tk-dev&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;すると、localeを設定した後の&lt;code&gt;apt install&lt;/code&gt;で、以下のようにタイムゾーンの入力を要求されてしまい、ビルドが途中で止まってしまう。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; =&amp;gt; [dev_container_auto_added_stage_label 3/3] RUN apt update -y &amp;amp;&amp;amp; apt instal 425.7s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; =&amp;gt; =&amp;gt; # questions will narrow this down by presenting a list of cities, representing
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; =&amp;gt; =&amp;gt; # the time zones in which they are located.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; =&amp;gt; =&amp;gt; # 1. Africa 4. Australia 7. Atlantic 10. Pacific 13. Etc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; =&amp;gt; =&amp;gt; # 2. America 5. Arctic 8. Europe 11. SystemV
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; =&amp;gt; =&amp;gt; # 3. Antarctica 6. Asia 9. Indian 12. US
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; =&amp;gt; =&amp;gt; # Geographic area:&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ちなみにlocaleを設定しない場合は、タイムゾーンの設定も要求されないため、ビルドが途中で止まる事態にはならない。&lt;/p&gt;
&lt;h2 id="回避方法"&gt;
回避方法&lt;a href="#%e5%9b%9e%e9%81%bf%e6%96%b9%e6%b3%95"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="回避方法1--debian_frontendnoninteractiveをつける"&gt;
回避方法1 | DEBIAN_FRONTEND=noninteractiveをつける&lt;a href="#%e5%9b%9e%e9%81%bf%e6%96%b9%e6%b3%951--debian_frontendnoninteractive%e3%82%92%e3%81%a4%e3%81%91%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ビルドが途中で止まってしまう原因は入力のダイアログが表示されてしまうことである。そのため、&lt;code&gt;apt install&lt;/code&gt;の前に&lt;code&gt;DEBIAN_FRONTEND=noninteractive&lt;/code&gt;をつける。これをつけると対話式の命令をスキップできる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;Dockerfile&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FROM ubuntu:18.04
&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;RUN apt update -y \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;amp;&amp;amp; apt install -y --no-install-recommends \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; language-pack-en
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ENV LANG en_US.UTF-8
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ENV LANGUAGE en_US.en
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ENV LC_ALL en_US.UTF-8
&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;RUN apt update -y \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;- &amp;amp;&amp;amp; apt install -y --no-install-recommends \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ &amp;amp;&amp;amp; DEBIAN_FRONTEND=noninteractive apt install -y --no-install-recommends \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; tk-dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;DEBIAN_FRONTEND&lt;/code&gt;は、&lt;code&gt;apt&lt;/code&gt;のユーザーインターフェースを構成するために使用される環境変数である。
そのため、&lt;code&gt;DEBIAN_FRONTEND&lt;/code&gt;の値は環境変数としても指定できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Dockerfile" data-lang="Dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ENV&lt;/span&gt; &lt;span class="nv"&gt;DEBIAN_FRONTEND&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;noninteractive&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ただし、環境変数で指定する方法は、そのDockerイメージで生成されるすべてのコンテナに影響を与えてしまう。そのため、たとえばそのイメージを使う人がソフトウェアをインタラクティブに設定する際、ダイアログが表示されず、問題が生じうる。&lt;a class="link" href="https://docs.docker.com/engine/faq/#why-is-debian_frontendnoninteractive-discouraged-in-dockerfiles" target="_blank" rel="noopener"
&gt;公式のドキュメント&lt;/a&gt;でも推奨されていない。&lt;/p&gt;
&lt;div
style="
display: flex;
align-items: center;
justify-content: center;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
cursor: not-allowed;
"&gt;
&lt;div&gt;docs.docker.com にアクセスできません&lt;/div&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;よって、&lt;code&gt;DEBIAN_FRONTEND=noninteractive apt install&lt;/code&gt;として一時的に変更し使用するのが良い。
万が一環境変数で指定する場合は、必ず最後に&lt;code&gt;DEBIAN_FRONTEND&lt;/code&gt;を&lt;a class="link" href="https://www.debian.org/releases/bookworm/s390x/ch05s02.en.html" target="_blank" rel="noopener"
&gt;デフォルト値&lt;/a&gt;に戻す。&lt;/p&gt;
&lt;h3 id="回避方法2--タイムゾーンを設定する"&gt;
回避方法2 | タイムゾーンを設定する&lt;a href="#%e5%9b%9e%e9%81%bf%e6%96%b9%e6%b3%952--%e3%82%bf%e3%82%a4%e3%83%a0%e3%82%be%e3%83%bc%e3%83%b3%e3%82%92%e8%a8%ad%e5%ae%9a%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;今回はタイムゾーンの設定ダイアログによってビルドが途中で止まってしまっている。そのため、その前にタイムゾーンを設定すれば回避できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;Dockerfile&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FROM ubuntu:18.04
&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;RUN apt update -y \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;amp;&amp;amp; apt install -y --no-install-recommends \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; language-pack-en
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ENV LANG en_US.UTF-8
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ENV LANGUAGE en_US.en
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ENV LC_ALL en_US.UTF-8
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ RUN ln -snf /usr/share/zoneinfo/America/New_York /etc/localtime
&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;RUN apt update -y \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;amp;&amp;amp; apt install -y --no-install-recommends \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; tk-dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;タイムゾーンの設定方法は複数あるが、今回は&lt;code&gt;/etc/localtime&lt;/code&gt;に&lt;code&gt;/usr/share/zoneinfo/&lt;/code&gt;ディレクトリのファイルのシンボリックリンクを貼ってタイムゾーンを設定した。Ubuntuのタイムゾーンを設定する方法は下記の記事が参考になる。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://zenn.dev/kumamoto/articles/51bf0893620f0c"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/6ad57077393cf1a1190df0543adbf98f47281384_hu_2256152b793c5344.webp"
alt="[Linux(Ubuntu)]タイムゾーンを日本時間にする5つの方法まとめ image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
[Linux(Ubuntu)]タイムゾーンを日本時間にする5つの方法まとめ
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-8299b9ca5170247061175f654bfc883ff1cc2440.png"
style="margin-right: 2px;"
alt="zenn.dev favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
zenn.dev
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
style="
display: flex;
align-items: center;
justify-content: center;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
cursor: not-allowed;
"&gt;
&lt;div&gt;docs.docker.com にアクセスできません&lt;/div&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
style="
display: flex;
align-items: center;
justify-content: center;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
cursor: not-allowed;
"
&gt;
&lt;div
style="
display: flex;
align-items: center;
justify-content: center;
height: 120px;
width: 120px;
max-width: 200px;
"
&gt;
&lt;img src="https://notes.nakurei.com/icons/link-off.svg" alt="No Image" width="100%" height="100%" style="object-fit: cover; margin: 0; flex-shrink: 0;"&gt;
&lt;/div&gt;
&lt;div
style="
display: flex;
flex-direction: column;
flex: 1 1 0%;
"
&gt;
&lt;div&gt;
mukiudo.dev にアクセスできません
&lt;/div&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
"
&gt;
&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
mukiudo.dev
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://zenn.dev/flyingbarbarian/scraps/1275681132babd"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/55f047b9da0275576168985df724fc1122d37c41_hu_fcdfa278ba546451.webp"
alt="DEBIAN_FRONTEND=noninteractive image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
DEBIAN_FRONTEND=noninteractive
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;flyingbarbarianさんのスクラップ&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-8299b9ca5170247061175f654bfc883ff1cc2440.png"
style="margin-right: 2px;"
alt="zenn.dev favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
zenn.dev
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://linuc.org/study/knowledge/516/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="linuc.org image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
linuc.org
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-162d09d0e2f554ac7c312681ff53386e96ca5b8f.png"
style="margin-right: 2px;"
alt="linuc.org favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
linuc.org
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://zenn.dev/kumamoto/articles/51bf0893620f0c"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/6ad57077393cf1a1190df0543adbf98f47281384_hu_2256152b793c5344.webp"
alt="[Linux(Ubuntu)]タイムゾーンを日本時間にする5つの方法まとめ image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
[Linux(Ubuntu)]タイムゾーンを日本時間にする5つの方法まとめ
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-8299b9ca5170247061175f654bfc883ff1cc2440.png"
style="margin-right: 2px;"
alt="zenn.dev favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
zenn.dev
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>Vuetifyのコンポーネントでリンクがnuxt-linkであると指定する</title><link>https://notes.nakurei.com/post/vuetify-nuxt-link-component/</link><pubDate>Tue, 16 May 2023 00:04:46 +0900</pubDate><guid>https://notes.nakurei.com/post/vuetify-nuxt-link-component/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Vuetifyのコンポーネントでリンクがnuxt-linkであると指定する方法のメモ。&lt;/p&gt;
&lt;h2 id="メモ"&gt;
メモ&lt;a href="#%e3%83%a1%e3%83%a2"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Vuetifyのコンポーネントで、&lt;code&gt;to&lt;/code&gt;による遷移を&lt;code&gt;&amp;lt;NuxtLink&amp;gt;&lt;/code&gt;による遷移と同じ扱いにするには、そのコンポーネントに&lt;code&gt;nuxt&lt;/code&gt;属性を追加する。
たとえば、&lt;code&gt;&amp;lt;v-list-item&amp;gt;&lt;/code&gt;の&lt;code&gt;to&lt;/code&gt;で指定したリンクを&lt;code&gt;NuxtLink&lt;/code&gt;と同じ扱いにするには、&lt;code&gt;&amp;lt;v-list-item&amp;gt;&lt;/code&gt;に&lt;code&gt;nuxt&lt;/code&gt;属性を追加すればよい。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-vue" data-lang="vue"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-list-item&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;nuxt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;about&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;:value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;about&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;:to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/about&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これによりリンクがnuxt-linkであると指定でき、ページの中で更新が必要な箇所だけ更新されるようになる。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://v2.vuetifyjs.com/ja/api/v-list-item/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="Vuetify — A Material Design Framework for Vue.js image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Vuetify — A Material Design Framework for Vue.js
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Vuetify is a Material Design component framework for Vue.js. It aims to provide all the tools necessary to create beautiful content rich applications.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-2cb08a7af115b12d87c9a8996b816e750d1efb4d.png"
style="margin-right: 2px;"
alt="v2.vuetifyjs.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
v2.vuetifyjs.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://minerva.mamansoft.net/Notes/Vuetify%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%82%92nuxt-link%E3%81%AE%E8%A6%81%E7%B4%A0%E3%81%BF%E3%81%9F%E3%81%8F%E6%89%B1%E3%81%86"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="Vuetifyのコンポーネントをnuxt-linkの要素みたく扱う - Minerva image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Vuetifyのコンポーネントをnuxt-linkの要素みたく扱う - Minerva
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Vuetifyのコンポーネントをnuxt-linkの要素みたく扱う - Minerva&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-5ade43dd5395cb074b473616bef3063b92493455.png"
style="margin-right: 2px;"
alt="minerva.mamansoft.net favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
minerva.mamansoft.net
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>Nuxt3開発環境にStylelintを導入する</title><link>https://notes.nakurei.com/post/nuxt3-stylelint-setup-guide/</link><pubDate>Sat, 13 May 2023 20:23:02 +0900</pubDate><guid>https://notes.nakurei.com/post/nuxt3-stylelint-setup-guide/</guid><description>&lt;img src="https://notes.nakurei.com/img/header/nuxt_full_logo.webp" alt="Featured image of post Nuxt3開発環境にStylelintを導入する" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="link" href="https://nuxt.com/docs/getting-started/installation" target="_blank" rel="noopener"
&gt;Nuxt3&lt;/a&gt;で構築したWebアプリの環境に&lt;a class="link" href="https://stylelint.io/" target="_blank" rel="noopener"
&gt;Stylelint&lt;/a&gt;をインストールし設定する方法のメモ。
VS Codeで自動実行までさせる。&lt;/p&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Nuxt 3.4.3&lt;/li&gt;
&lt;li&gt;Stylelint 15.6.1&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="インストール"&gt;
インストール&lt;a href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Stylelintパッケージをインストールする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm i -D stylelint&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;.vue&lt;/code&gt;ファイル内の&lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt;タグ内もリントできるように、以下のパッケージも入れる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm i -D postcss-html&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Stylelintの設定presetも入れる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm i -D stylelint-config-standard stylelint-config-recommended-vue&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="stylelintの設定"&gt;
Stylelintの設定&lt;a href="#stylelint%e3%81%ae%e8%a8%ad%e5%ae%9a"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Stylelintの設定ファイル&lt;code&gt;.stylelintrc.json&lt;/code&gt;を作成し、以下の内容を記入する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.stylelintrc.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;extends&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;stylelint-config-standard&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;stylelint-config-recommended-vue&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;overrides&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;files&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;**/*.vue&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;customSyntax&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;postcss-html&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Stylelintを実行するコマンドを、&lt;code&gt;package.json&lt;/code&gt;に追加する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;package.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;scripts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;lint&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;stylelint --ignore-path .gitignore **/*.{css,vue}&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;fix&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;stylelint --fix --ignore-path .gitignore **/*.{css,vue}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これで、&lt;code&gt;npm run lint&lt;/code&gt;および&lt;code&gt;npm run fix&lt;/code&gt;でStylelintを実行できる。&lt;/p&gt;
&lt;h2 id="vs-codeの設定"&gt;
VS Codeの設定&lt;a href="#vs-code%e3%81%ae%e8%a8%ad%e5%ae%9a"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;開発にVS Codeを利用している場合は、VS Codeで保存時に修正とフォーマットを自動実行できる。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=stylelint.vscode-stylelint" target="_blank" rel="noopener"
&gt;Stylelintの拡張機能&lt;/a&gt;をVS Codeにインストールし、以下の設定をVS Codeの設定ファイルに追記する。今回のプロジェクトのみに適用したい場合は、プロジェクトのルートディレクトリに&lt;code&gt;.vscode/setting.json&lt;/code&gt;を作成し、そこに下記の内容を記入すればよい。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;editor.codeActionsOnSave&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;source.fixAll&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;never&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;source.fixAll.stylelint&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;explicit&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;stylelint.validate&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;vue&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;css&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;less&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;postcss&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;プロジェクトのルートディレクトリよりも深い階層にStylelintをインストールした場合は、&lt;code&gt;stylelint.configBasedir&lt;/code&gt;にStylelintをインストールしたディレクトリを指定する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;stylelint.configBasedir&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./app&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://github.com/nuxt-modules/stylelint"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/020fe1f3e5e2b5a08d22bd7b9b7acc2b79c90aec_hu_92821116fd26397d.webp"
alt="GitHub - nuxt-modules/stylelint: Stylelint module for Nuxt.js image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
GitHub - nuxt-modules/stylelint: Stylelint module for Nuxt.js
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Stylelint module for Nuxt.js. Contribute to nuxt-modules/stylelint development by creating an account on GitHub.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-ffd1aa80239afc78c1628dfb5e08cff1205f22d5.png"
style="margin-right: 2px;"
alt="github.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
github.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="http://notes.nakurei.com/post/add-prettier-and-stylelint-to-vuetify-3-web-app/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="Vuetify 3&amp;#43;TypeScript&amp;#43;ESLintのWebアプリにPrettierとStyleLintを導入する image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Vuetify 3&amp;#43;TypeScript&amp;#43;ESLintのWebアプリにPrettierとStyleLintを導入する
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
notes.nakurei.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://b.0218.jp/202111152315.html"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/246812c2e3e5f2d1be4c6916d618899ca4d56f83_hu_2b0292f0bc04c1fe.webp"
alt="[Stylelint] tsxファイルの解析でCssSyntaxErrorが発生する場合の対処方法 | 零弐壱蜂 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
[Stylelint] tsxファイルの解析でCssSyntaxErrorが発生する場合の対処方法 | 零弐壱蜂
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;状況stylelint ./components//.tsx stylelintを tsx ファイルに対して実行すると下記のようなエラーが発生した。/components/TheHeader.tsx: When linting something other than CSS, you should install a&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-5b55aef0ec81dddd6a24ef95b4addc637bf1df82.png"
style="margin-right: 2px;"
alt="b.0218.jp favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
b.0218.jp
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>Nuxt3開発環境にESLintを導入する</title><link>https://notes.nakurei.com/post/nuxt3-eslint-setup-guide/</link><pubDate>Sat, 13 May 2023 20:22:51 +0900</pubDate><guid>https://notes.nakurei.com/post/nuxt3-eslint-setup-guide/</guid><description>&lt;img src="https://notes.nakurei.com/img/header/nuxt_full_logo.webp" alt="Featured image of post Nuxt3開発環境にESLintを導入する" /&gt;&lt;p&gt;本記事の内容は古くなっている。
最新版は&lt;a class="link" href="https://zenn.dev/nakurei/articles/nuxt3-eslint-setup-guide" target="_blank" rel="noopener"
&gt;こちら&lt;/a&gt;を参照してほしい。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://zenn.dev/nakurei/articles/nuxt3-eslint-setup-guide"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/fcc63dadbe86d5c7df9e04d1a92eea75dbab3184_hu_9734e6502c0a371b.webp"
alt="Nuxt 3の開発環境にESLintを導入する image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Nuxt 3の開発環境にESLintを導入する
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-8299b9ca5170247061175f654bfc883ff1cc2440.png"
style="margin-right: 2px;"
alt="zenn.dev favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
zenn.dev
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="link" href="https://nuxt.com/docs/getting-started/installation" target="_blank" rel="noopener"
&gt;Nuxt3&lt;/a&gt;で構築したWebアプリの環境にESLintをインストールし設定する方法のメモ。
VS Codeで自動実行までさせる。&lt;/p&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Nuxt 3.4.3&lt;/li&gt;
&lt;li&gt;ESLint 8.40.0&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="インストールと設定方法"&gt;
インストールと設定方法&lt;a href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%a8%e8%a8%ad%e5%ae%9a%e6%96%b9%e6%b3%95"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="link" href="https://nuxt.com/docs/community/contribution#use-eslint" target="_blank" rel="noopener"
&gt;Nuxtのドキュメント&lt;/a&gt;では、LintとFormatの両方を、&lt;a class="link" href="https://github.com/nuxt/eslint-config" target="_blank" rel="noopener"
&gt;&lt;code&gt;@nuxt/eslint-config&lt;/code&gt;&lt;/a&gt;を用いたESLintで実施することが推奨されている。
また、開発ツールとしてVS Codeを使用している場合は、&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint" target="_blank" rel="noopener"
&gt;ESLint拡張機能&lt;/a&gt;の利用が推奨されている。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://nuxt.com/docs/community/contribution"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/c80b2b97096010e351649517236e4a4c77fda1eb_hu_602f6ef3c59f0c27.webp"
alt="Contribution · Nuxt Community v4 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Contribution · Nuxt Community v4
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Nuxt is a community project - and so we love contributions of all kinds! ❤️&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-99bde38c149c358b7dfab3b37e4fb64ec722c402.png"
style="margin-right: 2px;"
alt="nuxt.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
nuxt.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;そのため、&lt;code&gt;@nuxt/eslint-config&lt;/code&gt;のReadmeに従ってESLintを設定する。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://github.com/nuxt/eslint-config"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/08546119c6db069b673fcd4b937630adf9a84b57_hu_9484069f238439a3.webp"
alt="GitHub - nuxt/eslint: Collection of ESLint-related packages for Nuxt image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
GitHub - nuxt/eslint: Collection of ESLint-related packages for Nuxt
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Collection of ESLint-related packages for Nuxt. Contribute to nuxt/eslint development by creating an account on GitHub.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-ffd1aa80239afc78c1628dfb5e08cff1205f22d5.png"
style="margin-right: 2px;"
alt="github.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
github.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;まず、必要なパッケージをインストールする。
Nuxt3はTypeScriptをサポートしているため、TypeScript用のconfigを入れる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm i -D eslint @nuxtjs/eslint-config-typescript&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;次に、ESLintの設定ファイル&lt;code&gt;.eslintrc.js&lt;/code&gt;を作成し、以下の内容を記述する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.eslintrc.js&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;root&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;extends&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;@nuxtjs/eslint-config-typescript&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;必要に応じて、ESLintのルールを変更する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.eslintrc.js&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;rules&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;comma-dangle&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;error&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;always-multiline&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;for-direction&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;error&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;error&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;SwitchCase&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;VariableDeclarator&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;first&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;max-len&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;error&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;code&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ignoreUrls&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;quotes&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;error&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;single&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;semi&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;error&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;always&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;その後、&lt;code&gt;package.json&lt;/code&gt;にLint用のコマンドを追加する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;package.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;scripts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;lint&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;eslint --ignore-path .gitignore ./**/*.{js,ts,vue}&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;fix&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;eslint --fix --ignore-path .gitignore ./**/*.{js,ts,vue}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これで、VS Codeのターミナルから&lt;code&gt;npm run lint&lt;/code&gt;でリントを実行、&lt;code&gt;npm run fix&lt;/code&gt;で自動修正が行えるようになる。&lt;/p&gt;
&lt;p&gt;しかし、毎回コマンドを打つのは面倒である。そのため、VS Codeに&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint" target="_blank" rel="noopener"
&gt;ESLintの拡張機能&lt;/a&gt;をインストールし、以下のVS Codeの設定を追記して、ファイル保存時に自動でESLintを実行させる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Linter
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;eslint.workingDirectories&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;./app&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;editor.codeActionsOnSave&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;source.fixAll&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&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;&amp;#34;source.fixAll.eslint&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;さらに、&lt;a class="link" href="https://nuxt.com/docs/community/contribution#use-eslint" target="_blank" rel="noopener"
&gt;Nuxtのドキュメント&lt;/a&gt;では、ESLintでフォーマットするため、Prettierは無効にすることが推奨されている。そのため、Prettierによるフォーマットを避けるために、&lt;code&gt;.prettierignore&lt;/code&gt;ですべてのファイルを指定する。&lt;code&gt;.prettierignore&lt;/code&gt;ファイルを作成し、以下の内容を記入する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.prettierignore&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&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;/div&gt;
&lt;/div&gt;
&lt;p&gt;以上で、Nuxt3を用いてWebアプリを開発する際のVS Code環境に、ESLintが適切に設定される。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://github.com/nuxt/eslint-config"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/08546119c6db069b673fcd4b937630adf9a84b57_hu_9484069f238439a3.webp"
alt="GitHub - nuxt/eslint: Collection of ESLint-related packages for Nuxt image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
GitHub - nuxt/eslint: Collection of ESLint-related packages for Nuxt
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Collection of ESLint-related packages for Nuxt. Contribute to nuxt/eslint development by creating an account on GitHub.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-ffd1aa80239afc78c1628dfb5e08cff1205f22d5.png"
style="margin-right: 2px;"
alt="github.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
github.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://zenn.dev/rescuenow/articles/e39b8272439f1a"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/fea56ac84ad6ea8faafe809571a15eb791d616d1_hu_56fb1255ab0e06f8.webp"
alt="Nuxt3環境でのコードチェック及び、コードフォーマットの設定 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Nuxt3環境でのコードチェック及び、コードフォーマットの設定
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-8299b9ca5170247061175f654bfc883ff1cc2440.png"
style="margin-right: 2px;"
alt="zenn.dev favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
zenn.dev
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://tech.isid.co.jp/entry/2022/12/08/Nuxt_3_%E3%81%AE_Stable_%E7%89%88%E3%81%8C%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%95%E3%82%8C%E3%81%9F%E3%81%AE%E3%81%A7%E8%A7%A6%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/5fcccbd570fd513242b9ce410df35c4ec36c681a_hu_5fcfd3aa2d727fe6.webp"
alt="Nuxt 3 の Stable 版がリリースされたので触ってみる - 電通総研 テックブログ image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Nuxt 3 の Stable 版がリリースされたので触ってみる - 電通総研 テックブログ
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;本記事は電通国際情報サービス Advent Calendar 2022の8日目の記事です。 執筆者は Xイノベーション本部 AI トランスフォーメーションセンター所属の山田です。 この記事では先日（2022年11月中旬）に安定版がリリースされた Nuxt 3 について紹介します。 なお、執筆時点での私たちのチームでは、本番プロジェクトへの Nuxt 3 の導入には至っていません。 本記事は、あくまで技術調査をしながら簡単なアプリケーションを開発してみた内容をまとめたものになります。 本記事で紹介するソースコードは以下のリポジトリで公開しています。 github.com Nuxt 3 について …&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-a8ca60f3aa7993d4ec3f1da4075a66af3862335f.png"
style="margin-right: 2px;"
alt="tech.isid.co.jp favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
tech.isid.co.jp
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>Nuxt 3の環境にVuetify 3を追加する</title><link>https://notes.nakurei.com/post/nuxt3-vuetify3-setup-guide/</link><pubDate>Fri, 12 May 2023 22:33:43 +0900</pubDate><guid>https://notes.nakurei.com/post/nuxt3-vuetify3-setup-guide/</guid><description>&lt;img src="https://notes.nakurei.com/img/header/nuxt_full_logo.webp" alt="Featured image of post Nuxt 3の環境にVuetify 3を追加する" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Nuxt 3のModulesに公式のVuetify 3モジュールがないので、自力で追加したときのメモ。&lt;/p&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Nuxt 3.4.3&lt;/li&gt;
&lt;li&gt;Vuetify 3.2.4&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="nuxt-3の環境作成"&gt;
Nuxt 3の環境作成&lt;a href="#nuxt-3%e3%81%ae%e7%92%b0%e5%a2%83%e4%bd%9c%e6%88%90"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Nuxt 3のアプリ実装環境は&lt;a class="link" href="https://nuxt.com/docs/getting-started/installation" target="_blank" rel="noopener"
&gt;Nuxtのドキュメント&lt;/a&gt;に従って作成した。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://nuxt.com/docs/getting-started/installation"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="nuxt.com image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
nuxt.com
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-99bde38c149c358b7dfab3b37e4fb64ec722c402.png"
style="margin-right: 2px;"
alt="nuxt.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
nuxt.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx nuxi init app
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; app
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run dev&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="vuetify-3のインストールと設定"&gt;
Vuetify 3のインストールと設定&lt;a href="#vuetify-3%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%a8%e8%a8%ad%e5%ae%9a"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="インストール"&gt;
インストール&lt;a href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Vuetify本体をインストールする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm i vuetify&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;sass&lt;/code&gt;パッケージを入れていない場合は追加する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm i -D sass&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="プラグインの作成"&gt;
プラグインの作成&lt;a href="#%e3%83%97%e3%83%a9%e3%82%b0%e3%82%a4%e3%83%b3%e3%81%ae%e4%bd%9c%e6%88%90"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;NuxtのプラグインとしてVuetifyを使う。
基本的には、&lt;a class="link" href="https://next.vuetifyjs.com/en/getting-started/installation/#manual-steps" target="_blank" rel="noopener"
&gt;VuetifyのManual steps&lt;/a&gt;に従う。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://next.vuetifyjs.com/en/getting-started/installation/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/2249647607c4cc3253a4605ab967c5cbc8c98ab9_hu_639cfd6d6d82a685.webp"
alt="Get started with Vuetify 4 — Vuetify image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Get started with Vuetify 4 — Vuetify
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Details for v4 release - faq, changes, and upgrading.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-d30bd4f7fa72ccb9f03a21946e5f3919a4406034.png"
style="margin-right: 2px;"
alt="next.vuetifyjs.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
next.vuetifyjs.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;&lt;code&gt;plugins&lt;/code&gt;ディレクトリに&lt;code&gt;vuetify.ts&lt;/code&gt;を作成し、以下の設定を書き込む。&lt;code&gt;plugins&lt;/code&gt;ディレクトリがない場合は作成する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;plugins/vuetify.ts&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createVuetify&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;vuetify&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="kr"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;components&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;vuetify/components&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="kr"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;directives&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;vuetify/directives&amp;#39;&lt;/span&gt;&lt;span class="p"&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="kr"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;defineNuxtPlugin&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;nuxtApp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;vuetify&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;createVuetify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;ssr&lt;/span&gt;: &lt;span class="kt"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;components&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;directives&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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="nx"&gt;nuxtApp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vueApp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;vuetify&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a class="link" href="https://next.vuetifyjs.com/en/getting-started/installation/#ssr" target="_blank" rel="noopener"
&gt;Vue3にはSSRが使用されているかどうかを自動的に検出する方法がない&lt;/a&gt;。そのため、&lt;code&gt;ssr&lt;/code&gt;の値は、手動で&lt;code&gt;nuxt.config.ts&lt;/code&gt;の&lt;code&gt;ssr&lt;/code&gt;と同じにする必要がある。&lt;code&gt;nuxt.config.ts&lt;/code&gt;の&lt;code&gt;ssr&lt;/code&gt;はデフォルトで&lt;code&gt;true&lt;/code&gt;なので、&lt;code&gt;nuxt.config.ts&lt;/code&gt;の&lt;code&gt;ssr&lt;/code&gt;が何も設定されていないなら、&lt;code&gt;plugins/vuetify.ts&lt;/code&gt;の&lt;code&gt;ssr&lt;/code&gt;を&lt;code&gt;true&lt;/code&gt;にする。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;'vuetify/styles'&lt;/code&gt;は、後述する&lt;code&gt;nuxt.config.ts&lt;/code&gt;の修正で追加する。&lt;/p&gt;
&lt;p&gt;ちなみに、Nuxt3では、&lt;code&gt;plugins&lt;/code&gt;ディレクトリにプラグインファイルを作成すると、アプケーションの起動時に自動で登録してくれる。そのため、&lt;code&gt;plugins/vuetify.ts&lt;/code&gt;を読み込むような記述は不要である。&lt;/p&gt;
&lt;h3 id="nuxtconfigtsの修正"&gt;
nuxt.config.tsの修正&lt;a href="#nuxtconfigts%e3%81%ae%e4%bf%ae%e6%ad%a3"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Vuetifyを追加したことをNuxtに知らせるため、&lt;code&gt;nuxt.config.ts&lt;/code&gt;に以下の内容を追記する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;nuxt.config.ts&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// https://nuxt.com/docs/api/configuration/nuxt-config
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;defineNuxtConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;build&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;transpile&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;vuetify&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;css&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;vuetify/styles&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;vite&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;ssr&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;noExternal&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;vuetify&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;build.transpile&lt;/code&gt;にVuetifyを追加して、Nuxtにこれらのライブラリをインポートしようとしないように指示する。&lt;/li&gt;
&lt;/ul&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://nuxt.com/docs/guide/concepts/esm"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/92b2086311aa07e51b5cec4b017791815fce690b_hu_1e06cd30ec23332a.webp"
alt="ES Modules · Nuxt Concepts v4 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
ES Modules · Nuxt Concepts v4
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Nuxt uses native ES modules.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-99bde38c149c358b7dfab3b37e4fb64ec722c402.png"
style="margin-right: 2px;"
alt="nuxt.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
nuxt.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;css&lt;/code&gt;にVuetifyのCSSファイルを指定し、読み込ませる。これは先ほどスキップした&lt;code&gt;'vuetify/styles'&lt;/code&gt;の追加に当たる。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;vite.ssr.noExternal&lt;/code&gt;にVuetifyを追加して、VuetifyがSSRのために外部化されるのを防ぐ。（&lt;code&gt;ssr: true&lt;/code&gt;のときに設定する）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://vitejs.dev/config/ssr-options.html"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/1f619718d4d65d44b4713920a4a1bac0d5503604_hu_5341ad9e4b60dd0f.webp"
alt="SSR Options image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
SSR Options
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Next Generation Frontend Tooling&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-f29dddc7b8420599ff00e2ea166dbb26946ccc1f.png"
style="margin-right: 2px;"
alt="vitejs.dev favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
vitejs.dev
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;ここまでの設定で、Vuetifyのコンポーネントは利用できるようになる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-vue" data-lang="vue"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mx-5 my-2&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;primary&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;my-btn&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/nuxt3-vuetify3-setup-guide/20230515112554.png"
width="278"
height="112"
srcset="https://notes.nakurei.com/post/nuxt3-vuetify3-setup-guide/20230515112554_hu_de415c42a14b587.png 480w, https://notes.nakurei.com/post/nuxt3-vuetify3-setup-guide/20230515112554_hu_2d5770d141b1347e.png 1024w"
loading="lazy"
alt="v-btnが正常に表示されたようす"
class="gallery-image"
data-flex-grow="248"
data-flex-basis="595px"
&gt;&lt;/p&gt;
&lt;p&gt;ただし、ここまでだとアイコンボタンなどのアイコンを利用したコンポーネントは正常に処理されないため、アイコンを追加する。&lt;/p&gt;
&lt;h3 id="アイコンの設定"&gt;
アイコンの設定&lt;a href="#%e3%82%a2%e3%82%a4%e3%82%b3%e3%83%b3%e3%81%ae%e8%a8%ad%e5%ae%9a"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;今回はMaterial Design Iconsを利用する。また、利用するアイコンだけ読み込む形でアイコンを設定する。基本的に&lt;a class="link" href="https://next.vuetifyjs.com/en/features/icon-fonts/#icon-fonts" target="_blank" rel="noopener"
&gt;公式が提示するやり方&lt;/a&gt;のとおりに設定すれば問題ない。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://next.vuetifyjs.com/en/features/icon-fonts/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/2249647607c4cc3253a4605ab967c5cbc8c98ab9_hu_639cfd6d6d82a685.webp"
alt="Icon Fonts — Vuetify image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Icon Fonts — Vuetify
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Vuetify supports Material Design Icons, Font awesome and other icon sets through prefixes and global options.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-d30bd4f7fa72ccb9f03a21946e5f3919a4406034.png"
style="margin-right: 2px;"
alt="next.vuetifyjs.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
next.vuetifyjs.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;p&gt;まず、&lt;code&gt;plugins/vuetify.ts&lt;/code&gt;に、アイコンの設定を追記する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;plugins/vuetify.ts&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import { createVuetify } from &amp;#39;vuetify&amp;#39;;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import * as components from &amp;#39;vuetify/components&amp;#39;;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import * as directives from &amp;#39;vuetify/directives&amp;#39;;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ import { aliases, mdi } from &amp;#39;vuetify/iconsets/mdi-svg&amp;#39;;
&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;export default defineNuxtPlugin((nuxtApp) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; const vuetify = createVuetify({
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ssr: true,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; components,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; directives,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ icons: {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ defaultSet: &amp;#39;mdi&amp;#39;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ aliases,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ sets: {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ mdi,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ },
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; nuxtApp.vueApp.use(vuetify);
&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;/div&gt;
&lt;/div&gt;
&lt;p&gt;次に、アイコンのパッケージをインストールする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm i -D @mdi/js&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;そして、アイコンを利用したい&lt;code&gt;.vue&lt;/code&gt;ファイルで、利用したいアイコンを&lt;code&gt;import&lt;/code&gt;して使う。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-vue" data-lang="vue"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;mdiHome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mdiDotsVertical&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;@mdi/js&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mx-5 my-2&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;:icon&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mdiDotsVertical&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-icon&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mx-5 my-2&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;:icon&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mdiHome&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/nuxt3-vuetify3-setup-guide/20230515112956.png"
width="268"
height="107"
srcset="https://notes.nakurei.com/post/nuxt3-vuetify3-setup-guide/20230515112956_hu_776a7521482dbce9.png 480w, https://notes.nakurei.com/post/nuxt3-vuetify3-setup-guide/20230515112956_hu_93ba9aac05a77257.png 1024w"
loading="lazy"
alt="iconが正常に表示されたようす"
class="gallery-image"
data-flex-grow="250"
data-flex-basis="601px"
&gt;&lt;/p&gt;
&lt;h2 id="vuetifyに関するその他の設定"&gt;
Vuetifyに関するその他の設定&lt;a href="#vuetify%e3%81%ab%e9%96%a2%e3%81%99%e3%82%8b%e3%81%9d%e3%81%ae%e4%bb%96%e3%81%ae%e8%a8%ad%e5%ae%9a"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;長くなったので別記事にまとめた。&lt;/p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://notes.nakurei.com/post/nuxt3-vuetify3-customization-note/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="Nuxt 3にVuetify 3を追加した後の細かい設定のメモ image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Nuxt 3にVuetify 3を追加した後の細かい設定のメモ
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-1eff5ad74ed7b442dfa6826d07982b3bff45afb2.png"
style="margin-right: 2px;"
alt="notes.nakurei.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
notes.nakurei.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://next.vuetifyjs.com/en/features/icon-fonts/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/2249647607c4cc3253a4605ab967c5cbc8c98ab9_hu_639cfd6d6d82a685.webp"
alt="Icon Fonts — Vuetify image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Icon Fonts — Vuetify
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Vuetify supports Material Design Icons, Font awesome and other icon sets through prefixes and global options.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-d30bd4f7fa72ccb9f03a21946e5f3919a4406034.png"
style="margin-right: 2px;"
alt="next.vuetifyjs.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
next.vuetifyjs.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://zenn.dev/ichii731/articles/66b4cf79d2cae6"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/540f4a664d59bf9660bb0f1a9d7b7837be5ec490_hu_b81baa55fbaac710.webp"
alt="Vuetify3でマテリアルアイコン(mdi)を使う際のベストプラクティス image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Vuetify3でマテリアルアイコン(mdi)を使う際のベストプラクティス
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-8299b9ca5170247061175f654bfc883ff1cc2440.png"
style="margin-right: 2px;"
alt="zenn.dev favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
zenn.dev
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://zenn.dev/iga3/articles/e7f5e00d8b458b"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/0576e75d7992e86315917d6c00f606d517249c62_hu_f840ce558d276888.webp"
alt="Nuxt3でVuetify3の環境構築をする image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Nuxt3でVuetify3の環境構築をする
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-8299b9ca5170247061175f654bfc883ff1cc2440.png"
style="margin-right: 2px;"
alt="zenn.dev favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
zenn.dev
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://qiita.com/yuta-katayama-23/items/a40775326914ee9ed89a"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/f3583a15df227d65485d17c4dd730a5cd2089d72_hu_1bffed97c3985419.webp"
alt="Vite&amp;#43;Vue3&amp;#43;Vuetify3&amp;#43;Expressのプロジェクトを1から作成する（ESLint、Prettier、Node.jsをPJに含めたモノレポ？構成） - Qiita image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Vite+Vue3+Vuetify3+Expressのプロジェクトを1から作成する（ESLint、Prettier、Node.jsをPJに含めたモノレポ？構成） - Qiita
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;はじめに 個人開発で使うプロジェクトをVue-CLIから移行して、Vueも3.xに上げて新しくテンプレ化してみようと思った。その新プロジェクトの作成時の手順を備忘録として残しておきたく。 完成したプロジェクトは以下。 yarn create viteで初期プロジェ...&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7dfa4a32e8b8dd3b8a6b654e1cd55932c6a19262.png"
style="margin-right: 2px;"
alt="qiita.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
qiita.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>Nuxt 3のcomponentsディレクトリ内のサブディレクトリを自動インポートの対象にする方法</title><link>https://notes.nakurei.com/post/nuxt3-component-subdir-import/</link><pubDate>Thu, 11 May 2023 10:38:26 +0900</pubDate><guid>https://notes.nakurei.com/post/nuxt3-component-subdir-import/</guid><description>&lt;img src="https://notes.nakurei.com/img/header/nuxt_full_logo.webp" alt="Featured image of post Nuxt 3のcomponentsディレクトリ内のサブディレクトリを自動インポートの対象にする方法" /&gt;&lt;p&gt;Nuxt 3のデフォルトでは、&lt;code&gt;~/components&lt;/code&gt;ディレクトリのみが自動でスキャンされ、自動インポートされる。この&lt;code&gt;~/components&lt;/code&gt;ディレクトリ内にサブディレクトリを作成して階層を掘っても、そのディレクトリは自動インポートの対象にならない。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;~/components&lt;/code&gt;ディレクトリ内のサブディレクトリも自動インポートの対象にするには、nuxt.config.tsに追加のディレクトリを記述する必要がある。
たとえば、&lt;code&gt;~/components&lt;/code&gt;内に&lt;code&gt;layouts&lt;/code&gt;ディレクトリを作成した場合は、nuxt.config.tsに下記を追記する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;nuxt.config.ts&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;defineNuxtConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;components&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;~/components/layouts&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;~/components&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://nuxt.com/docs/guide/directory-structure/components"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="nuxt.com image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
nuxt.com
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-99bde38c149c358b7dfab3b37e4fb64ec722c402.png"
style="margin-right: 2px;"
alt="nuxt.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
nuxt.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>Dockerコンテナで構築したNuxt 3製Webアプリでホットリロードが効かないときの対処法</title><link>https://notes.nakurei.com/post/solving-hot-reload-issue-in-nuxt-docker/</link><pubDate>Thu, 11 May 2023 08:43:06 +0900</pubDate><guid>https://notes.nakurei.com/post/solving-hot-reload-issue-in-nuxt-docker/</guid><description>&lt;img src="https://notes.nakurei.com/img/header/nuxt_full_logo.webp" alt="Featured image of post Dockerコンテナで構築したNuxt 3製Webアプリでホットリロードが効かないときの対処法" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Docker Desktop for Windows&lt;/strong&gt;で&lt;strong&gt;Nuxt.js&lt;/strong&gt;を用いてWebアプリケーションを作成した際に、&lt;strong&gt;ホットリロード&lt;/strong&gt;が効かなかった際の対処法を残す。&lt;/p&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Windows 11&lt;/li&gt;
&lt;li&gt;Docker Desktop for Windows v4.19.0&lt;/li&gt;
&lt;li&gt;Nuxt.js 3.4.3&lt;/li&gt;
&lt;li&gt;Node.js v19.9.0&lt;/li&gt;
&lt;li&gt;npm 9.6.3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;どうやらDocker Desktop for Windowsを利用してホストマシン（Windows）でNuxtアプリケーションを実行すると発生する問題のようだ。ホストマシンがWindowsでも、WSL2内でDockerコンテナを立てWSL2内のコンテナから実行する場合は、ホットリロードが効かない問題は発生していない。&lt;/p&gt;
&lt;h2 id="忙しい人のための結論"&gt;
忙しい人のための結論&lt;a href="#%e5%bf%99%e3%81%97%e3%81%84%e4%ba%ba%e3%81%ae%e3%81%9f%e3%82%81%e3%81%ae%e7%b5%90%e8%ab%96"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;まず、24678番のポートをポートフォワーディングする。
たとえば、&lt;code&gt;docker run&lt;/code&gt;の際に&lt;code&gt;-p 24678:24678&lt;/code&gt;のオプションを追加すればよい。&lt;/p&gt;
&lt;p&gt;次に、nuxt.config.tsに以下の記述を追加する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;nuxt.config.ts&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;defineNuxtConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;vite&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;watch&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;usePolling&lt;/span&gt;: &lt;span class="kt"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これでホットリロードが効くようになる。&lt;/p&gt;
&lt;h2 id="ホットリロードとは"&gt;
ホットリロードとは&lt;a href="#%e3%83%9b%e3%83%83%e3%83%88%e3%83%aa%e3%83%ad%e3%83%bc%e3%83%89%e3%81%a8%e3%81%af"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;ホットリロード&lt;/strong&gt;とは、コードを変更したときに自動的に反映してくれる機能のことである。コードを書いている最中に、ブラウザの画面が自動的に更新されるので、変更内容をすぐに確認できる。&lt;/p&gt;
&lt;h2 id="ホットリロードが効かない問題を再現する最小限の手順"&gt;
ホットリロードが効かない問題を再現する最小限の手順&lt;a href="#%e3%83%9b%e3%83%83%e3%83%88%e3%83%aa%e3%83%ad%e3%83%bc%e3%83%89%e3%81%8c%e5%8a%b9%e3%81%8b%e3%81%aa%e3%81%84%e5%95%8f%e9%a1%8c%e3%82%92%e5%86%8d%e7%8f%be%e3%81%99%e3%82%8b%e6%9c%80%e5%b0%8f%e9%99%90%e3%81%ae%e6%89%8b%e9%a0%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;まず、&lt;strong&gt;Nuxt.js&lt;/strong&gt;でWebアプリケーションを開発するための環境を&lt;strong&gt;Docker Desktop for Windows&lt;/strong&gt;で構築する。以下のDockerfileをつくる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;Dockerfile&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Dockerfile" data-lang="Dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:19-bullseye-slim&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&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;USER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node&lt;/span&gt;&lt;span class="err"&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;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/home/node&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&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;EXPOSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;3000&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;作ったDockerfileをビルドする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker build -t test-nuxt .&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ビルドしたイメージを用いてコンテナを立ち上げる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run --name test-nuxt-app -it --rm -p 3000:3000 -v &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;:/home/node test-nuxt /bin/bash&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;次に、&lt;strong&gt;Nuxt.js&lt;/strong&gt;のWebアプリケーションを生成し起動する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;コンテナ内で実行する&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx nuxi init my-nuxt-app
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; my-nuxt-app
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run dev&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;この時点で、ソースコードを変更し、ホットリロードが効くか確認する。ソースコードの変更がリアルタイムで反映されない場合、ホットリロードが機能していないとわかる。&lt;/p&gt;
&lt;h2 id="解決法"&gt;
解決法&lt;a href="#%e8%a7%a3%e6%b1%ba%e6%b3%95"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;まず、24678番のポートをポートフォワーディングする。Nuxt3では、ホットリロード用に24678ポートで接続を待ち受けるためである。
ポートフォワーディングは、たとえば、&lt;code&gt;docker run&lt;/code&gt;の際に&lt;code&gt;-p 24678:24678&lt;/code&gt;のオプションを追加すればよい。Docker Composeを利用しているなら、portsに&lt;code&gt;24678:24678&lt;/code&gt;を追加する&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run --name test-nuxt-app -it --rm -p 3000:3000 24678:24678 -v &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;:/home/node test-nuxt /bin/bash&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;次に、nuxt.config.tsに以下の記述を追加する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;nuxt.config.ts&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;defineNuxtConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;vite&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;watch&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;usePolling&lt;/span&gt;: &lt;span class="kt"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;このコードにより、ホットリロードが有効化され、ソースコードの変更がリアルタイムで反映されるようになる。&lt;/p&gt;
&lt;p&gt;手順が正しく行われ、ホットリロードが有効になったかを確認するには、&lt;code&gt;npm run dev&lt;/code&gt;でアプリケーションを起動し、ソースコードを変更してみれば良い。ソースコードを変更すると、その変更がリアルタイムで反映され、手動でリロードすることなくアプリケーションの挙動を確認できる。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://qiita.com/rockinruuula1227/items/efc54e5f43911b336f3d"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/fd63f5f269f636eb94c29f40d2311c417f5995a0_hu_3ade45a1a7d5a0d7.webp"
alt="Nuxt3で実務想定の実装環境を構築する - Qiita image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Nuxt3で実務想定の実装環境を構築する - Qiita
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;TL;DR 実際に案件で使うであろうモジュールを導入して、 実務用の環境整備を行うための手順メモです。 今回使えるようにするもの Nuxt3 Scss TypeScript ESLint Storybook Vitest 手順 Nuxt3のインストール $ np...&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7dfa4a32e8b8dd3b8a6b654e1cd55932c6a19262.png"
style="margin-right: 2px;"
alt="qiita.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
qiita.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;ついでに、Dockerfileに&lt;code&gt;EXPOSE 24678&lt;/code&gt;を書いておくと親切である。&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>UbuntuのTeXLiveでLuaLaTeXにフォントを追加する方法</title><link>https://notes.nakurei.com/post/add-fonts-lualatex-guide/</link><pubDate>Sun, 07 May 2023 17:38:23 +0900</pubDate><guid>https://notes.nakurei.com/post/add-fonts-lualatex-guide/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ubuntu上のTeXLiveで、Lua$\LaTeX$にフォントを追加する方法について説明する。&lt;/p&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;TeX Live 2023&lt;/li&gt;
&lt;li&gt;Ubuntu 20.04 LTS&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="事前準備--フォントをダウンロードする"&gt;
事前準備 | フォントをダウンロードする&lt;a href="#%e4%ba%8b%e5%89%8d%e6%ba%96%e5%82%99--%e3%83%95%e3%82%a9%e3%83%b3%e3%83%88%e3%82%92%e3%83%80%e3%82%a6%e3%83%b3%e3%83%ad%e3%83%bc%e3%83%89%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;まずは、使用したいフォントをダウンロードする。
Lua$\LaTeX$がサポートしているフォント形式は次のとおりである。これらのいずれかの形式のフォントをダウンロードする。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;名称&lt;/th&gt;
&lt;th style="text-align: left"&gt;拡張子&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;TrueType&lt;/td&gt;
&lt;td style="text-align: left"&gt;.ttf&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;OpenType&lt;/td&gt;
&lt;td style="text-align: left"&gt;.otf&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Type 1&lt;/td&gt;
&lt;td style="text-align: left"&gt;pfb, .pfm&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="フォントをインストールする"&gt;
フォントをインストールする&lt;a href="#%e3%83%95%e3%82%a9%e3%83%b3%e3%83%88%e3%82%92%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;$\LaTeX$を含むすべてのアプリケーションでフォントを使いたい場合は、システムにフォントをインストールする。$\LaTeX$のみでのフォント利用で問題ない場合は、システムにフォントをインストールしない方法を取る。&lt;/p&gt;
&lt;h3 id="システムにフォントをインストールする場合"&gt;
システムにフォントをインストールする場合&lt;a href="#%e3%82%b7%e3%82%b9%e3%83%86%e3%83%a0%e3%81%ab%e3%83%95%e3%82%a9%e3%83%b3%e3%83%88%e3%82%92%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%99%e3%82%8b%e5%a0%b4%e5%90%88"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Ubuntuでシステムにフォントをインストールするには、次のいずれかの場所にフォントファイルをコピーする。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;パス&lt;/th&gt;
&lt;th style="text-align: left"&gt;用途&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;code&gt;/usr/share/fonts&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;システムフォント&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;code&gt;/usr/local/share/fonts&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;共有フォント&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;code&gt;~/.fonts&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;個人フォント&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;フォントファイルを配置したら、以下のコマンドを実行してフォントキャッシュを更新する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo fc-cache -f -v&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これで、フォントがシステムにインストールされ、フォントに対応したすべてのアプリケーションで利用可能になる。&lt;/p&gt;
&lt;h3 id="システムにインストールせずtex-liveのみで利用する場合"&gt;
システムにインストールせず、TeX Liveのみで利用する場合&lt;a href="#%e3%82%b7%e3%82%b9%e3%83%86%e3%83%a0%e3%81%ab%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%9b%e3%81%9atex-live%e3%81%ae%e3%81%bf%e3%81%a7%e5%88%a9%e7%94%a8%e3%81%99%e3%82%8b%e5%a0%b4%e5%90%88"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;システムにフォントをインストールせず、TeX Liveだけでそのフォントが利用できればいい場合は、追加したいフォントを&lt;code&gt;$TEXMFLOCAL/fonts/&lt;/code&gt;ディレクトリ下に入れる。
&lt;code&gt;$TEXMFLOCAL&lt;/code&gt;ディレクトリは&lt;code&gt;kpsewhich&lt;/code&gt;コマンドで調べられる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kpsewhich -var-value&lt;span class="o"&gt;=&lt;/span&gt;TEXMFLOCAL
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/usr/local/texlive/texmf-local&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;$TEXMFLOCAL/fonts/&lt;/code&gt;ディレクトリ下にフォントを配置したら、&lt;code&gt;mktexlsr&lt;/code&gt;コマンドを実行して、ls-R&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;を更新する。これにより$\LaTeX$がフォントを認識できるようになる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mktexlsr
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mktexlsr: Updating /usr/local/texlive/2023/texmf-config/ls-R...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mktexlsr: Updating /usr/local/texlive/2023/texmf-dist/ls-R...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mktexlsr: Updating /usr/local/texlive/2023/texmf-var/ls-R...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mktexlsr: Updating /usr/local/texlive/texmf-local/ls-R...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mktexlsr: Done.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;$\LaTeX$がフォントを認識しているか確認する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kpsewhich RictyDiminished-Regular.ttf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/usr/local/texlive/texmf-local/fonts/truetype/public/RictyDiminished-Regular.ttf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="lualatexにフォントを認識させる"&gt;
Lua$\LaTeX$にフォントを認識させる&lt;a href="#lualatex%e3%81%ab%e3%83%95%e3%82%a9%e3%83%b3%e3%83%88%e3%82%92%e8%aa%8d%e8%ad%98%e3%81%95%e3%81%9b%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;次に、以下のコマンドを実行して、Lua$\LaTeX$のフォントキャッシュを更新する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;luaotfload-tool --update&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;フォントが認識されているか確認する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ luaotfload-tool --fuzzy --find&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;RictyDiminished&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;luaotfload &lt;span class="p"&gt;|&lt;/span&gt; resolve : Font &lt;span class="s2"&gt;&amp;#34;RictyDiminished&amp;#34;&lt;/span&gt; found!
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;luaotfload &lt;span class="p"&gt;|&lt;/span&gt; resolve : Resolved file name &lt;span class="s2"&gt;&amp;#34;/usr/share/fonts/ttf/RictyDiminished-Regular.ttf&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="フォントをテストする"&gt;
フォントをテストする&lt;a href="#%e3%83%95%e3%82%a9%e3%83%b3%e3%83%88%e3%82%92%e3%83%86%e3%82%b9%e3%83%88%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;フォントが正しくインストールされているかを確認するために、新しいLua$\LaTeX$ドキュメントを作成し、以下のコードを追加する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-latex" data-lang="latex"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;\documentclass&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;article&lt;span class="nb"&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;\usepackage&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;fontspec&lt;span class="nb"&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;\setmainfont&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;RictyDiminished-Regular&lt;span class="nb"&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="k"&gt;\begin&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;document&lt;span class="nb"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;This is a test document.
&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="k"&gt;\end&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;document&lt;span class="nb"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;\setmainfont&lt;/code&gt;の&lt;code&gt;{}&lt;/code&gt;内に、テストしたいフォントの名前を入力する。その後、ドキュメントを保存し、Lua$\LaTeX$でコンパイルする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lualatex test_doc.tex&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;エラーがなく、テキストが新しいフォントで表示されれば、フォントが正しくインストールされている。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;
まとめ&lt;a href="#%e3%81%be%e3%81%a8%e3%82%81"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;本記事では、Lua$\LaTeX$でフォントを追加する方法について説明した。ぜひ、好みのフォントをLua$\LaTeX$で使用してほしい。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://texwiki.texjp.org/?LaTeX%E5%85%A5%E9%96%80%2F%E5%90%84%E7%A8%AE%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E5%88%A9%E7%94%A8" target="_blank" rel="noopener"
&gt;LaTeX入門/各種パッケージの利用 - TeX Wiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://text.baldanders.info/remark/2021/09/lualatex-with-firge-font/" target="_blank" rel="noopener"
&gt;Firge フォントを使って LuaLaTeX でコードを書く | text.Baldanders.info&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;ls-Rとは、$\LaTeX$がファイルを読み込む際に利用するファイルの一覧表である。TeX Liveでは、このls-Rを利用してファイルを管理している。そのため、新しいパッケージなどをインストールした際にls-Rを更新しないと利用できない。&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>LaTeXで足りないパッケージをtlmgr installでインストールできない場合の解決法</title><link>https://notes.nakurei.com/post/latex-package-install-guide/</link><pubDate>Mon, 01 May 2023 13:18:41 +0900</pubDate><guid>https://notes.nakurei.com/post/latex-package-install-guide/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;この記事では、$\LaTeX$でドキュメントをコンパイルする際に足りないパッケージがインストールできない場合の解決方法を解説する。具体的には、&lt;code&gt;tlmgr install&lt;/code&gt;コマンドでパッケージがインストールできない場合の対処法を紹介する。&lt;/p&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Ubuntu 20.04 LTS&lt;/li&gt;
&lt;li&gt;TexLive 2023&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="背景"&gt;
背景&lt;a href="#%e8%83%8c%e6%99%af"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;$\LaTeX$でドキュメントをコンパイルする際に、次のようなエラーに遭遇することがある。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;! LaTeX Error: File &lt;span class="sb"&gt;`&lt;/span&gt;tikz.sty&lt;span class="err"&gt;&amp;#39;&lt;/span&gt; not found.
&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;Type X to quit or &amp;lt;RETURN&amp;gt; to proceed,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;or enter new name. &lt;span class="o"&gt;(&lt;/span&gt;Default extension: sty&lt;span class="o"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;このエラーメッセージは、not foundとなっているパッケージ（上記の例では&lt;code&gt;tikz.sty&lt;/code&gt;）がインストールされていないことを示す。
このとき、大抵はコマンド&lt;code&gt;tlmgr install {足りないパッケージ名}&lt;/code&gt;で、足らない$\LaTeX$パッケージをインストールできる。
しかし、&lt;code&gt;tikz.sky&lt;/code&gt;については、&lt;code&gt;tlmgr install tikz&lt;/code&gt;を実行しても、次のようなメッセージが出るだけでインストールできなかった。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ tlmgr install tikz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tlmgr: package repository https://ftp.yz.yamagata-u.ac.jp/pub/CTAN/systems/texlive/tlnet &lt;span class="o"&gt;(&lt;/span&gt;not verified: gpg unavailable&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tlmgr install: package tikz not present in repository.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tlmgr: action install returned an error&lt;span class="p"&gt;;&lt;/span&gt; continuing.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tlmgr: An error has occurred. See above messages. Exiting.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="解決方法"&gt;
解決方法&lt;a href="#%e8%a7%a3%e6%b1%ba%e6%96%b9%e6%b3%95"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;この場合は、&lt;code&gt;tikz.sky&lt;/code&gt;が含まれる$\LaTeX$パッケージを探す必要がある。
探すには、次のコマンドを実行する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tlmgr search --global --file &lt;span class="s2"&gt;&amp;#34;/tikz.sty&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;実行結果を次に示す。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ tlmgr search --global --file &lt;span class="s2"&gt;&amp;#34;/tikz.sty&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tlmgr: package repository https://ftp.yz.yamagata-u.ac.jp/pub/CTAN/systems/texlive/tlnet &lt;span class="o"&gt;(&lt;/span&gt;not verified: gpg unavailable&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pgf:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これにより、&lt;code&gt;pgf&lt;/code&gt;パッケージに&lt;code&gt;tikz.sty&lt;/code&gt;が含まれているとわかる。
ゆえに、&lt;code&gt;tlmgr install pgf&lt;/code&gt;を実行すれば、&lt;code&gt;tikz.sty&lt;/code&gt;をインストールできる。&lt;/p&gt;
&lt;p&gt;ちなみに、&lt;code&gt;tlmgr search&lt;/code&gt;で探すファイルを&lt;code&gt;&amp;quot;tikz.sty&amp;quot;&lt;/code&gt;ではなく&lt;code&gt;&amp;quot;/tikz.sty&amp;quot;&lt;/code&gt;としたのには意味がある。
&lt;code&gt;&amp;quot;tikz.sty&amp;quot;&lt;/code&gt;をtlmgr search`で探すと、次のような結果が得られる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ tlmgr search --global --file &lt;span class="s2"&gt;&amp;#34;tikz.sty&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tlmgr: package repository https://ftp.yz.yamagata-u.ac.jp/pub/CTAN/systems/texlive/tlnet &lt;span class="o"&gt;(&lt;/span&gt;not verified: gpg unavailable&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;biblatex-ext:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; texmf-dist/tex/latex/biblatex-ext/biblatex-ext-oasymb-tikz.sty
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;circuitikz:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; texmf-dist/tex/latex/circuitikz/circuitikz.sty
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hf-tikz:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; texmf-dist/tex/latex/hf-tikz/hf-tikz.sty
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;interfaces:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; texmf-dist/tex/latex/interfaces/interfaces-tikz.sty
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kinematikz:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; texmf-dist/tex/latex/kinematikz/kinematikz.sty
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lwarp:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; texmf-dist/tex/latex/lwarp/lwarp-tikz.sty
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;moderncv:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; texmf-dist/tex/latex/moderncv/moderncviconstikz.sty
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pgf:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pinoutikz:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; texmf-dist/tex/latex/pinoutikz/pinoutikz.sty
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;puyotikz:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; texmf-dist/tex/latex/puyotikz/puyotikz.sty
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;quantikz:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; texmf-dist/tex/latex/quantikz/quantikz.sty
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sa-tikz:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; texmf-dist/tex/latex/sa-tikz/sa-tikz.sty&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;このように、&lt;code&gt;tlmgr search&lt;/code&gt;で探すファイルを&lt;code&gt;&amp;quot;tikz.sty&amp;quot;&lt;/code&gt;としてしまうと、&lt;code&gt;tikz.sty&lt;/code&gt;という単語を含むパッケージがすべて探されてしまう。
よって、&lt;code&gt;tikz.sty&lt;/code&gt;のみを探したい場合は、&lt;code&gt;tlmgr search&lt;/code&gt;で探すファイルを&lt;code&gt;&amp;quot;/tikz.sty&amp;quot;&lt;/code&gt;にするとよい。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://tex.stackexchange.com/questions/597025/latex-error-file-tikz-sty-not-found-in-r-studio-macbook-air"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/d927feb29da8be53b2c53997b3c9019d29de02f7_hu_163d7aa12ade2200.webp"
alt="! LaTeX Error: File `tikz.sty&amp;#39; not found in R Studio MacBook Air image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
! LaTeX Error: File `tikz.sty' not found in R Studio MacBook Air
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;This is a new user of R.
TikzDevice and ggplot2 have been installed in R Studio on MacBook Air.
An error occurred when trying to run the blue code in the screenshot.
I tried to use tikzTest() to ch...&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-ebd915f38ee7ea42b7704b8dff8e6de0728a9f4e.png"
style="margin-right: 2px;"
alt="tex.stackexchange.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
tex.stackexchange.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>シェルスクリプトにおいて変数を定義する際の注意点</title><link>https://notes.nakurei.com/post/shell-script-variable-definition-tips/</link><pubDate>Sun, 23 Apr 2023 19:38:51 +0900</pubDate><guid>https://notes.nakurei.com/post/shell-script-variable-definition-tips/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;シェルスクリプトにおいて変数を定義する際に、個人的に気を付けている点のまとめ。シェルスクリプトを書く際に毎回調べている気がするのでまとめておく。&lt;/p&gt;
&lt;h2 id="変数の定義方法"&gt;
変数の定義方法&lt;a href="#%e5%a4%89%e6%95%b0%e3%81%ae%e5%ae%9a%e7%be%a9%e6%96%b9%e6%b3%95"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;変数を定義する際には、以下の点に気を付けよう。&lt;/p&gt;
&lt;h3 id="変数名に空白文字を使わない"&gt;
変数名に空白文字を使わない&lt;a href="#%e5%a4%89%e6%95%b0%e5%90%8d%e3%81%ab%e7%a9%ba%e7%99%bd%e6%96%87%e5%ad%97%e3%82%92%e4%bd%bf%e3%82%8f%e3%81%aa%e3%81%84"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;変数名と値の間には空白文字（スペースやタブ）を入れないようにしよう。変数の定義では、&lt;code&gt;=&lt;/code&gt;の前後に空白文字があるとエラーが発生する。&lt;/p&gt;
&lt;p&gt;例 : &lt;code&gt;variable_name=value&lt;/code&gt;（正）、&lt;code&gt;variable_name = value&lt;/code&gt;（誤）。&lt;/p&gt;
&lt;h3 id="変数名のルールを守る"&gt;
変数名のルールを守る&lt;a href="#%e5%a4%89%e6%95%b0%e5%90%8d%e3%81%ae%e3%83%ab%e3%83%bc%e3%83%ab%e3%82%92%e5%ae%88%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;変数名は英字（大文字・小文字）で始め、英字、数字、アンダースコアが続くようにしよう。変数名に空白文字や特殊文字、ハイフンを使用しないこと。&lt;/p&gt;
&lt;h3 id="予約語を回避する"&gt;
予約語を回避する&lt;a href="#%e4%ba%88%e7%b4%84%e8%aa%9e%e3%82%92%e5%9b%9e%e9%81%bf%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;シェルや環境変数で予約されている語を変数名として使用しない。たとえば、&lt;code&gt;PATH&lt;/code&gt;、&lt;code&gt;HOME&lt;/code&gt;などは予約語であるため、変数名に使用することは避けよう。&lt;/p&gt;
&lt;h3 id="関数内の変数はローカル変数を使う"&gt;
関数内の変数はローカル変数を使う&lt;a href="#%e9%96%a2%e6%95%b0%e5%86%85%e3%81%ae%e5%a4%89%e6%95%b0%e3%81%af%e3%83%ad%e3%83%bc%e3%82%ab%e3%83%ab%e5%a4%89%e6%95%b0%e3%82%92%e4%bd%bf%e3%81%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;関数内でのみ使用する変数は、&lt;code&gt;local&lt;/code&gt;キーワードを使ってローカル変数として宣言する。これによって、スクリプト内で変数名が衝突することを防げる。&lt;/p&gt;
&lt;p&gt;適切なスコープで変数を定義することは重要である。関数外で宣言された変数は、グローバルスコープになるため、スクリプト全体で参照できる。よって、グローバル変数を使用する場合は、名前の衝突に注意しなければならない。&lt;/p&gt;
&lt;h3 id="変数をダブルクオートで展開する"&gt;
変数をダブルクオートで展開する&lt;a href="#%e5%a4%89%e6%95%b0%e3%82%92%e3%83%80%e3%83%96%e3%83%ab%e3%82%af%e3%82%aa%e3%83%bc%e3%83%88%e3%81%a7%e5%b1%95%e9%96%8b%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;変数を展開する際には、空白文字を含む値が正しく展開されるように、ダブルクオートで囲む。例 : &lt;code&gt;echo &amp;quot;$variable_name&amp;quot;&lt;/code&gt;。特殊文字（e.g. &lt;code&gt;$&lt;/code&gt;, &lt;code&gt;\&lt;/code&gt;）を含む場合はエスケープする必要がある。&lt;/p&gt;
&lt;h3 id="未定義変数の参照でエラーを発生させる"&gt;
未定義変数の参照でエラーを発生させる&lt;a href="#%e6%9c%aa%e5%ae%9a%e7%be%a9%e5%a4%89%e6%95%b0%e3%81%ae%e5%8f%82%e7%85%a7%e3%81%a7%e3%82%a8%e3%83%a9%e3%83%bc%e3%82%92%e7%99%ba%e7%94%9f%e3%81%95%e3%81%9b%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;スクリプト内で未定義の変数が参照されると、予期しない挙動を引き起こすことがある。そのため、&lt;code&gt;set -u&lt;/code&gt;を使用し、未定義変数が参照された際にエラーが発生するようにしよう。&lt;/p&gt;
&lt;h3 id="定数は大文字で定義しreadonlyをつける"&gt;
定数は大文字で定義し、&lt;code&gt;readonly&lt;/code&gt;をつける&lt;a href="#%e5%ae%9a%e6%95%b0%e3%81%af%e5%a4%a7%e6%96%87%e5%ad%97%e3%81%a7%e5%ae%9a%e7%be%a9%e3%81%97readonly%e3%82%92%e3%81%a4%e3%81%91%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;変更されるべきでない値は、大文字の変数名で定義し、変数名に &lt;code&gt;readonly&lt;/code&gt;を付けて、値が変更されないようにする。例 : &lt;code&gt;readonly API_KEY=&amp;quot;your_api_key&amp;quot;&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;
まとめ&lt;a href="#%e3%81%be%e3%81%a8%e3%82%81"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;シェルスクリプトにおいて、変数の定義方法には注意が必要である。本記事では、変数の定義方法と注意点について解説した。正しい変数の使い方を身につけ、スクリプトを安定的に動作させよう。&lt;/p&gt;</description></item><item><title>高品質なシェルスクリプトを書くためのベストプラクティス</title><link>https://notes.nakurei.com/post/best-shell-scripting-practices/</link><pubDate>Sun, 23 Apr 2023 19:23:04 +0900</pubDate><guid>https://notes.nakurei.com/post/best-shell-scripting-practices/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;シェルスクリプトを書く際に個人的に意識していることのまとめ。&lt;/p&gt;
&lt;h2 id="チェックリスト"&gt;
チェックリスト&lt;a href="#%e3%83%81%e3%82%a7%e3%83%83%e3%82%af%e3%83%aa%e3%82%b9%e3%83%88"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; シバンを書いた。&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; setコマンド（e.g. &lt;code&gt;set -euo pipefail&lt;/code&gt;）を記述した。&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; エラー発生時に、ユーザーに意味のあるエラーメッセージを表示して処理を終了するようにした。&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 必要な引数が指定されているか、コマンドライン引数をチェックした。&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 変数名や関数名を、その目的を明確に示す名前にした。&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 繰り返し使用するコードを関数にまとめた。&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 関数ではローカル変数を用いた。&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 定数に&lt;code&gt;readonly&lt;/code&gt;を付けた。&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 定数と変数が一目でわかる命名規則を採用した。&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 変数を展開する際にダブルクオートを用いた。&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; スクリプトの冒頭にコードの目的・使用方法・依存関係を記述した。&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 複雑なコードに説明をコメントで追加した。&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; インデントをそろえた。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ベストプラクティス"&gt;
ベストプラクティス&lt;a href="#%e3%83%99%e3%82%b9%e3%83%88%e3%83%97%e3%83%a9%e3%82%af%e3%83%86%e3%82%a3%e3%82%b9"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="必ずシバンから始める"&gt;
必ずシバンから始める&lt;a href="#%e5%bf%85%e3%81%9a%e3%82%b7%e3%83%90%e3%83%b3%e3%81%8b%e3%82%89%e5%a7%8b%e3%82%81%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;必ずシェルスクリプトの先頭にシバン&lt;/strong&gt;（Shebang）（e.g. &lt;code&gt;#!/bin/sh&lt;/code&gt;、&lt;code&gt;#!/bin/bash&lt;/code&gt;）&lt;strong&gt;を記述し、スクリプトを実行するシェルを明示的に指定しよう&lt;/strong&gt;。これにより、異なるシステムや環境でも正しいシェルの使用が保証され、一貫してスクリプトが実行されるようになる。言い換えれば、スクリプトの互換性と実行の一貫性が向上し、意図しない動作を防げる。シバンを使わないと、スクリプトがデフォルトのシェルで実行されてしまい、意図しない動作が発生する可能性を生じさせてしまう。&lt;/p&gt;
&lt;h3 id="set--euo-pipefailを使う"&gt;
&lt;code&gt;set -euo pipefail&lt;/code&gt;を使う&lt;a href="#set--euo-pipefail%e3%82%92%e4%bd%bf%e3%81%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;set&lt;/code&gt;コマンドを利用して、エラー時の挙動を適切に設定しよう&lt;/strong&gt;。適切に設定しないと、スクリプト実行中にエラーが発生してもスクリプトが停止せず、意図しない動作が発生する可能性を生じさせる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;基本的には&lt;code&gt;set -euo pipefail&lt;/code&gt;を使用すればよい&lt;/strong&gt;。それぞれのオプションは以下の意味を持つ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-e&lt;/code&gt; (errexit): このオプションが設定されている場合、スクリプト内のコマンドがエラー（非ゼロの終了ステータス）で終了した場合に、スクリプト全体が直ちに終了する。これにより、エラーが無視されることなく、問題が発生した時点でスクリプトが停止する。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-u&lt;/code&gt; (nounset): このオプションが設定されている場合、未定義の変数を参照しようとすると、スクリプトが終了する。これにより、誤って未定義の変数を使用してしまう問題を防げる。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-o pipefail&lt;/code&gt;: このオプションが設定されている場合、パイプでつながれたコマンドのいずれかがエラー（非ゼロの終了ステータス）で終了した場合に、パイプ全体がエラーとして扱われる。これにより、パイプの途中で問題が発生しても、適切にエラーハンドリングできる。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;つまり、スクリプトでエラーが発生した際にすぐ停止するよう&lt;code&gt;set -e&lt;/code&gt;を用いる。未定義の変数が参照された場合にエラーを出すため&lt;code&gt;set -u&lt;/code&gt;を用いる。そして、パイプの途中でエラーが発生した場合にも終了ステータスを正しく返すために&lt;code&gt;set -o pipefail&lt;/code&gt;を使う。これらにより、バグの発見と修正が容易になり、スクリプトの安全性と信頼性が向上する。&lt;/p&gt;
&lt;h3 id="エラー処理を実装する"&gt;
エラー処理を実装する&lt;a href="#%e3%82%a8%e3%83%a9%e3%83%bc%e5%87%a6%e7%90%86%e3%82%92%e5%ae%9f%e8%a3%85%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;エラーが発生した場合に、適切なエラーメッセージを表示して処理を終了するようにしよう&lt;/strong&gt;。さもなければ、エラーが発生してもスクリプトが正常終了するかのように振る舞い、問題の特定が困難になってしまう。スクリプトにエラー処理を実装して、予期せぬ問題を捕捉し、ユーザーに意味のあるエラーメッセージを提供しよう。&lt;/p&gt;
&lt;h3 id="コマンドライン引数をチェックする"&gt;
コマンドライン引数をチェックする&lt;a href="#%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89%e3%83%a9%e3%82%a4%e3%83%b3%e5%bc%95%e6%95%b0%e3%82%92%e3%83%81%e3%82%a7%e3%83%83%e3%82%af%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;必要な引数が指定されているかコマンドライン引数をチェック&lt;/strong&gt;し、&lt;strong&gt;不足している場合はエラーメッセージを表示して終了するようにしよう&lt;/strong&gt;。そうしないと、必要な引数が指定されていない場合でも、スクリプトが実行され、意図しない動作が発生してしまう。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;getopts&lt;/code&gt;コマンドを使用して、スクリプトのオプションと引数を適切に処理しよう。&lt;code&gt;getopts&lt;/code&gt;を使用することで、オプションや引数の処理が簡潔かつ安全に行える。エラーチェックも自動で行われる。&lt;/p&gt;
&lt;p&gt;ユーザー入力は予測できないことが多いため、処理前のバリデーションが不可欠である。これは、スクリプトのエラーやセキュリティの脆弱性を防ぐのに役立つ。条件文や正規表現を使って、入力が予想されるパターンや値であるかどうかをチェックしよう。&lt;/p&gt;
&lt;p&gt;なお、コマンドライン引数を使用すると、ユーザーはスクリプトに直接入力を渡せるため、より柔軟で使いやすいスクリプトになる。よって、コマンドライン引数は活用しよう。&lt;/p&gt;
&lt;h3 id="変数名と関数名を説明的な名前にする"&gt;
変数名と関数名を説明的な名前にする&lt;a href="#%e5%a4%89%e6%95%b0%e5%90%8d%e3%81%a8%e9%96%a2%e6%95%b0%e5%90%8d%e3%82%92%e8%aa%ac%e6%98%8e%e7%9a%84%e3%81%aa%e5%90%8d%e5%89%8d%e3%81%ab%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;変数名や関数名は、その目的を明確に示す名前を選ぼう&lt;/strong&gt;。これにより、他の開発者がコードを理解しやすくなり、保守性が向上する。また、誤解やバグの発生を減らせる。とくに、1文字の変数や、混乱を招くような略語の使用は避けよう。&lt;/p&gt;
&lt;p&gt;また、一貫した命名規則を使用しよう。シェルスクリプトの命名規則を統一して、識別しやすく、保守しやすいようにしよう。&lt;/p&gt;
&lt;h3 id="なるべく関数を使う"&gt;
なるべく関数を使う&lt;a href="#%e3%81%aa%e3%82%8b%e3%81%b9%e3%81%8f%e9%96%a2%e6%95%b0%e3%82%92%e4%bd%bf%e3%81%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;関数は、スクリプト内で複数回呼び出せる、再利用可能なコードブロックである。関数を使用することで、コードの再利用性を高め、重複を減らし、スクリプトをより効率的でメンテナンスしやすくできる。&lt;strong&gt;とくに、繰り返し使用するコードは関数にまとめよう&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="ローカル変数を活用する"&gt;
ローカル変数を活用する&lt;a href="#%e3%83%ad%e3%83%bc%e3%82%ab%e3%83%ab%e5%a4%89%e6%95%b0%e3%82%92%e6%b4%bb%e7%94%a8%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;とくに関数では、ローカル変数を使おう&lt;/strong&gt;。さもなくば、変数のスコープが不明確になり、グローバル変数への誤ったアクセスや予期しない変更が発生してしまう。&lt;/p&gt;
&lt;p&gt;たとえば、次のスクリプトでは、変数&lt;code&gt;message&lt;/code&gt;がローカル変数でないため、&lt;code&gt;print_message&lt;/code&gt;関数によって変数&lt;code&gt;message&lt;/code&gt;が意図せず定義され、変更されてしまう。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;sample.sh&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -euo pipefail
&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="k"&gt;function&lt;/span&gt; print_message &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Hello, &lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$message&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Alice&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print_message &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$message&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;# 本来は定義されていない変数として扱われるはず&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;よって、このスクリプトは問題なく実行できてしまう。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sh sample.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hello, Alice
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hello, Alice&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;このような事態を防ぐため、関数内の定数はローカル変数にしよう。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set -euo pipefail
&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;function print_message {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;- message=&amp;#34;Hello, $1&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ local message=&amp;#34;Hello, $1&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; echo &amp;#34;$message&amp;#34;
&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;name=&amp;#34;Alice&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print_message &amp;#34;$name&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;echo &amp;#34;$message&amp;#34; # 本来は定義されていない変数として扱われるはず
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これにより、関数とメインコードの変数の共有化を防げる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sample.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hello, Alice
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sample.sh: line 10: message: unbound variable&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="定数はreadonlyにする"&gt;
定数は&lt;code&gt;readonly&lt;/code&gt;にする&lt;a href="#%e5%ae%9a%e6%95%b0%e3%81%afreadonly%e3%81%ab%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;readonly&lt;/code&gt;キーワードを使用して定数を定義&lt;/strong&gt;し、値が変更されないようにしよう。 変更されるべきでない値が変更されてしまうと、意図しない動作が生じてしまう。&lt;/p&gt;
&lt;p&gt;また、定数と変数がわかるように命名しよう。たとえば、定数を&lt;code&gt;UPPER_SNAKE_CASE&lt;/code&gt;、変数を&lt;code&gt;lower_snake_case&lt;/code&gt;で命名すると、定数と変数の違いがわかりやすくなる。&lt;/p&gt;
&lt;h3 id="ダブルクオートで変数を展開する"&gt;
ダブルクオートで変数を展開する&lt;a href="#%e3%83%80%e3%83%96%e3%83%ab%e3%82%af%e3%82%aa%e3%83%bc%e3%83%88%e3%81%a7%e5%a4%89%e6%95%b0%e3%82%92%e5%b1%95%e9%96%8b%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;変数を展開する際には、ダブルクォート（&amp;quot;）を使用しよう&lt;/strong&gt;。ダブルクォートを使用することで、変数内の空白文字や特殊文字が適切に扱われ、意図しない動作を防げる。たとえば、以下のように変数を展開している場合を考える。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;file with spaces.txt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm &lt;span class="nv"&gt;$filename&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;上記のスクリプトは、空白文字を含むファイル名を正しく扱えず、エラーが発生する。これを避けるためには、ダブルクォートを使用して変数を展開する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;file with spaces.txt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$filename&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="コメントでコードを説明する"&gt;
コメントでコードを説明する&lt;a href="#%e3%82%b3%e3%83%a1%e3%83%b3%e3%83%88%e3%81%a7%e3%82%b3%e3%83%bc%e3%83%89%e3%82%92%e8%aa%ac%e6%98%8e%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;コードの目的や動作を説明するコメントを適切に記述しよう&lt;/strong&gt;。コメントを使用して、スクリプトの目的と、コードの複雑な部分を説明しよう。&lt;/p&gt;
&lt;p&gt;スクリプトの冒頭には、目的、使用方法、依存関係の概要を説明するヘッダーコメントを付けよう。また、複雑なコードやわかりにくいコードを説明するために、明確で簡潔なコメントを付けよう。スクリプトに適切に配置されたコメントは、貴重な文脈を提供し、コードの目的や機能を他の人が理解するのに役立つ。&lt;/p&gt;
&lt;p&gt;ただし、過剰なコメントや、明らかなコードを説明するためにコメントを使用することは避けなければならない。良いコードは、自分で説明できるものであるべきである。&lt;/p&gt;
&lt;h3 id="インデントをそろえる"&gt;
インデントをそろえる&lt;a href="#%e3%82%a4%e3%83%b3%e3%83%87%e3%83%b3%e3%83%88%e3%82%92%e3%81%9d%e3%82%8d%e3%81%88%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;関数や制御構造（if、while、forなど）の内部はインデントし、&lt;strong&gt;ネストされた構造を明確にしよう&lt;/strong&gt;。スクリプトの構造を把握しやすくするために、&lt;strong&gt;インデントの幅はスクリプト内で統一しよう&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;また、異なる処理やセクションの間には改行を入れ、コードの見た目を整え、可読性を向上させるとより良い。&lt;/p&gt;</description></item><item><title>Hugoで見出しにアンカーリンクを設置する方法</title><link>https://notes.nakurei.com/post/adding-anchor-links-to-headings-in-hugo/</link><pubDate>Thu, 06 Apr 2023 20:34:24 +0900</pubDate><guid>https://notes.nakurei.com/post/adding-anchor-links-to-headings-in-hugo/</guid><description>&lt;img src="https://notes.nakurei.com/img/header/website_img.webp" alt="Featured image of post Hugoで見出しにアンカーリンクを設置する方法" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Hugoを使ってブログを運営している際に、見出しにアンカーリンクを設置したい場合がある。本記事では、HugoでMarkdownから生成される記事の見出しの横に、自動でアンカーリンクを設置する方法について解説する。&lt;/p&gt;
&lt;h2 id="アンカーリンクの基本とその機能"&gt;
アンカーリンクの基本とその機能&lt;a href="#%e3%82%a2%e3%83%b3%e3%82%ab%e3%83%bc%e3%83%aa%e3%83%b3%e3%82%af%e3%81%ae%e5%9f%ba%e6%9c%ac%e3%81%a8%e3%81%9d%e3%81%ae%e6%a9%9f%e8%83%bd"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;アンカーリンクとは、Webページ内の別の箇所へジャンプするためのリンクである。通常、リンクのURLには「#」と続けて、リンク先の要素のIDを指定する。たとえば、&lt;code&gt;&amp;lt;a href=&amp;quot;#section2&amp;quot;&amp;gt;Section 2に移動&amp;lt;/a&amp;gt;&lt;/code&gt;というリンクは、ページ内の「section2」というIDを持つ要素へジャンプするリンクとなる。&lt;/p&gt;
&lt;h2 id="hugoでの見出しにアンカーリンクを追加する具体的な手順"&gt;
Hugoでの見出しにアンカーリンクを追加する具体的な手順&lt;a href="#hugo%e3%81%a7%e3%81%ae%e8%a6%8b%e5%87%ba%e3%81%97%e3%81%ab%e3%82%a2%e3%83%b3%e3%82%ab%e3%83%bc%e3%83%aa%e3%83%b3%e3%82%af%e3%82%92%e8%bf%bd%e5%8a%a0%e3%81%99%e3%82%8b%e5%85%b7%e4%bd%93%e7%9a%84%e3%81%aa%e6%89%8b%e9%a0%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Hugoで見出しにアンカーリンクを設置するには、&lt;code&gt;.Content&lt;/code&gt;内の&lt;code&gt;h&lt;/code&gt;タグに、&lt;code&gt;href=&amp;quot;#見出しの文章&amp;quot;&lt;/code&gt;を持つリンクを追加すればよい。&lt;a class="link" href="https://nananao-dev.hatenablog.com/entry/hugo-htag-add-atag" target="_blank" rel="noopener"
&gt;こちらのサイト&lt;/a&gt;を参考に、アンカーリンクを自動で付ける設定をする。&lt;/p&gt;
&lt;p&gt;まず、記事の内容&lt;code&gt;.Content&lt;/code&gt;を表示するlayoutファイルを開く。筆者は&lt;a class="link" href="https://stack.jimmycai.com/" target="_blank" rel="noopener"
&gt;Stack&lt;/a&gt;というテーマを使っているが、このテーマの場合は&lt;code&gt;themes/hugo-theme-stack/layouts/partials/article/components/content.html&lt;/code&gt;が&lt;code&gt;.Content&lt;/code&gt;を表示するファイルだった。そのため、そのファイルを&lt;code&gt;layouts/partials/article/components/content.html&lt;/code&gt;にコピーし、コピーしたものを開く。この時点では、内容は次のとおりだった。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;layouts/partials/article/components/content.html&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;section&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;article-content&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;&amp;lt;!-- Refer to https://discourse.gohugo.io/t/responsive-tables-in-markdown/10639/5 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {{ $wrappedTable := printf &amp;#34;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;\&amp;#34;table-wrapper\&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;${1}&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&amp;#34; }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {{ .Content | replaceRE &amp;#34;(&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;table&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;(?:.|\n)+?&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;table&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;)&amp;#34; $wrappedTable | safeHTML }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;section&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;このうちの&lt;code&gt;.Content&lt;/code&gt;に対して、&lt;code&gt;.Content&lt;/code&gt;内の&lt;code&gt;h&lt;/code&gt;タグをアンカーリンク付きの&lt;code&gt;h&lt;/code&gt;タグに置換する処理を追加する。
置換処理は下記で記述される。この記述では、&lt;code&gt;${1}&lt;/code&gt;には&lt;code&gt;h&lt;/code&gt;タグ、&lt;code&gt;${2}&lt;/code&gt;には見出しについているID、&lt;code&gt;${3}&lt;/code&gt;は&lt;code&gt;h&lt;/code&gt;タグより後の内容が自動で入る。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ .Content | replaceRE &amp;#34;(&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h&lt;/span&gt;&lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="na"&gt;2-9&lt;/span&gt;&lt;span class="err"&gt;]&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;\&amp;#34;([^\&amp;#34;]+)\&amp;#34;.+)(&amp;lt;/h[2-9]+&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;)&amp;#34; &amp;#34;${1}&lt;span class="ni"&gt;&amp;amp;nbsp;&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;\&amp;#34;headline-hash\&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;\&amp;#34;#${2}\&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;#&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; ${3}&amp;#34; | safeHTML }}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;以上により、&lt;code&gt;content.html&lt;/code&gt;の内容は以下のように変更される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;layouts/partials/article/components/content.html&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;section&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;article-content&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;&amp;lt;!-- Refer to https://discourse.gohugo.io/t/responsive-tables-in-markdown/10639/5 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {{ $wrappedTable := printf &amp;#34;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;\&amp;#34;table-wrapper\&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;${1}&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&amp;#34; }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {{ .Content | replaceRE &amp;#34;(&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;table&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;(?:.|\n)+?&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;table&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;)&amp;#34; $wrappedTable
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | replaceRE &amp;#34;(&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h&lt;/span&gt;&lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="na"&gt;1-9&lt;/span&gt;&lt;span class="err"&gt;]&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;\&amp;#34;([^\&amp;#34;]+)\&amp;#34;.+)(&amp;lt;/h[1-9]+&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;)&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;aria-hidden&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;\&amp;#34;true\&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;\&amp;#34;#${2}\&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;${1}&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;\&amp;#34;/icons/link.svg\&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;\&amp;#34;width:&lt;/span&gt; &lt;span class="na"&gt;0&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;9em&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt; &lt;span class="na"&gt;margin-left:&lt;/span&gt; &lt;span class="na"&gt;0&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;25em&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt; &lt;span class="na"&gt;margin-bottom:&lt;/span&gt; &lt;span class="na"&gt;-0&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;12em&lt;/span&gt;&lt;span class="err"&gt;;\&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; ${3}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | safeHTML }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;section&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ここで、&lt;code&gt;img&lt;/code&gt;タグは、アンカーリンクのためのアイコン&lt;code&gt;/icons/link.svg&lt;/code&gt;をアンカーリンクとして機能させるための記述である。&lt;code&gt;img&lt;/code&gt;タグを&lt;code&gt;#&lt;/code&gt;などの文字列にすれば、その文字&lt;code&gt;#&lt;/code&gt;にアンカーリンクが設定される。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://suihan74.github.io/posts/2019/12_26_00_theme_customize/#%E8%BF%BD%E8%A8%98-20200222-1515" target="_blank" rel="noopener"
&gt;Hugoテーマのカスタマイズ箇所メモ - すいはんぶろぐ.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/suihan74/github-style/blob/master/layouts/partials/post.html" target="_blank" rel="noopener"
&gt;github-style/post.html at master · suihan74/github-style&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://nananao-dev.hatenablog.com/entry/hugo-htag-add-atag" target="_blank" rel="noopener"
&gt;Hugo で markdown の hタグに自動で anchorタグをつける - nao blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://discourse.gohugo.io/t/adding-a-link-icon-to-headings/11551/4" target="_blank" rel="noopener"
&gt;Adding a link icon to headings - support - HUGO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Pythonで複数枚のPNG画像から動画をつくる方法</title><link>https://notes.nakurei.com/post/video-from-pngs-python-opencv-tutorial/</link><pubDate>Thu, 06 Apr 2023 20:24:55 +0900</pubDate><guid>https://notes.nakurei.com/post/video-from-pngs-python-opencv-tutorial/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;この記事では、Pythonの&lt;code&gt;opencv&lt;/code&gt;というライブラリを用いて、複数の画像ファイルを結合し、パラパラ漫画のような動画ファイルに変換する方法を紹介する。&lt;/p&gt;
&lt;h2 id="画像から動画を作成する手順"&gt;
画像から動画を作成する手順&lt;a href="#%e7%94%bb%e5%83%8f%e3%81%8b%e3%82%89%e5%8b%95%e7%94%bb%e3%82%92%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b%e6%89%8b%e9%a0%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;最初に、必要なライブラリである&lt;code&gt;opencv&lt;/code&gt;と&lt;code&gt;glob&lt;/code&gt;をインストールする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install opencv-python
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install opencv-python-headless
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install glob2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;次に、以下のPythonスクリプトを使って、画像を動画ファイルに変換する。このPythonスクリプトは、指定されたディレクトリ内の画像ファイルを読み込み、順番に動画へ追加する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;cv2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;glob&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_video_from_image_folder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;image_folder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;output_file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;image_extension&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;png&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;frame_rate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; Create a video file from a sequence of image files in the specified folder.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; Parameters
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; ----------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; image_folder : str
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; The path to the folder containing the image files.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; output_file : str
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; The filename of the video file to be created.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; image_extension : str, optional, default=&amp;#34;png&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; The file extension of the image files (default is &amp;#34;png&amp;#34;).
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; frame_rate : int, optional, default=24
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; The desired frame rate of the output video (default is 24).
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; Raises
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; ------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; ValueError
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; If no image files are found in the specified folder.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; &amp;#34;&amp;#34;&amp;#34;&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="c1"&gt;# Get a list of image file paths in the specified folder, sorted in ascending order&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;image_filepaths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;glob&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image_folder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;*.&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;image_extension&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;image_filepaths&lt;/span&gt;&lt;span class="p"&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;raise&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;No image files found.&amp;#34;&lt;/span&gt;&lt;span class="p"&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="c1"&gt;# Read the first image to get its dimensions (height and width)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;first_image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;imread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image_filepaths&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;first_image&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&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="c1"&gt;# Initialize the video writer with the specified output file,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# codec, frame rate, and dimensions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;video_writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VideoWriter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;output_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VideoWriter_fourcc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;mp4v&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;frame_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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="c1"&gt;# Iterate over the image file paths, read each image, and write it to the video&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;image_filepath&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;image_filepaths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;current_image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;imread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image_filepath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;video_writer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current_image&lt;/span&gt;&lt;span class="p"&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="c1"&gt;# Release the video writer and close the output file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;video_writer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Video file created: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;output_file&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Set the required variables for creating the video&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;image_folder_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/path/to/your/image/folder&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;output_video_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;output_video.mp4&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;image_file_extension&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;png&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;video_frame_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;24&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="c1"&gt;# Call the function with the specified variables to create the video&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;create_video_from_image_folder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;image_folder_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;output_video_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;image_file_extension&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;video_frame_rate&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;このスクリプトを実行すると、指定したディレクトリ内のPNG画像を順番に読み込み、出力動画ファイルに追加する。動画のフレームレートはデフォルトで24fpsに設定しているが、異なるフレームレートも使用できる。&lt;/p&gt;
&lt;h2 id="動画にテキストを追加する方法"&gt;
動画にテキストを追加する方法&lt;a href="#%e5%8b%95%e7%94%bb%e3%81%ab%e3%83%86%e3%82%ad%e3%82%b9%e3%83%88%e3%82%92%e8%bf%bd%e5%8a%a0%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;動画作成時に、各画像に異なるテキストを追加できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;cv2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;glob&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;overlay_text_on_image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Mat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FONT_HERSHEY_SIMPLEX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;font_scale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;thickness&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Mat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; Overlay the given text on an image at the specified position.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; Parameters
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; ----------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; image : cv2.Mat
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; The image to overlay text on.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; text : str
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; The text to overlay.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; position : tuple[int, int]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; The x and y coordinates of the text position.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; font : int, optional
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; Font type, by default cv2.FONT_HERSHEY_SIMPLEX.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; font_scale : float, optional
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; Font scale, by default 1.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; color : tuple[int, int, int], optional
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; Text color in BGR format, by default (255, 255, 255).
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; thickness : int, optional
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; Text thickness, by default 2.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; Returns
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; -------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; cv2.Mat
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; The image with the text overlay.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;img_with_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;putText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img_with_text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;font_scale&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;thickness&lt;/span&gt;&lt;span class="p"&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;return&lt;/span&gt; &lt;span class="n"&gt;img_with_text&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_video_from_images&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;img_folder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;output_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;img_format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;png&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;titles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; Create a video from images in the specified folder.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; Parameters
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; ----------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; img_folder : str
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; The folder containing the images.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; output_path : str
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; The path to save the output video file.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; img_format : str, optional
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; The image file format, by default &amp;#34;png&amp;#34;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; fps : int, optional
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; The frames per second for the output video, by default 24.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; titles : list[str] | None, optional
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; A list of titles for each image, by default None.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; Raises
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; ------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; ValueError
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; If no image files are found
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; or if the number of titles does not match the number of images.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Get image files in the specified folder and sort by filename&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;img_files&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;glob&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img_folder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;*.&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;img_format&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&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="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;img_files&lt;/span&gt;&lt;span class="p"&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;raise&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;No image files found.&amp;#34;&lt;/span&gt;&lt;span class="p"&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="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;titles&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;titles&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img_files&lt;/span&gt;&lt;span class="p"&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;raise&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Number of titles does not match the number of image files.&amp;#34;&lt;/span&gt;&lt;span class="p"&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="n"&gt;frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;imread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img_files&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&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="n"&gt;video&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VideoWriter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;output_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VideoWriter_fourcc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;mp4v&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;# Specify the video file codec&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;img_file&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img_files&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;imread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img_file&lt;/span&gt;&lt;span class="p"&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="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;titles&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;titles&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;overlay_text_on_image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;font_scale&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;thickness&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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="n"&gt;video&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&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="n"&gt;video&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Video created: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;output_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;img_folder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/path/to/your/image/folder&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;# Path to the image folder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;output_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;output_video.mp4&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;# Name of the output video file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;img_format&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;png&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;# Image file format&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="c1"&gt;# Frame rate&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;titles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Title 1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Title 2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Title 3&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# List of titles for each image. Set to None to skip adding text.&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="n"&gt;create_video_from_images&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img_folder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;output_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;img_format&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;titles&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;テキストの色を変更したい場合は、&lt;code&gt;color&lt;/code&gt;の値を変更する。&lt;/p&gt;</description></item><item><title>ElectronとTypeScriptの開発環境にESLint、Prettier、StyleLintを導入する方法</title><link>https://notes.nakurei.com/post/setup-eslint-prettier-stylelint-electron-ts/</link><pubDate>Sun, 02 Apr 2023 20:24:02 +0900</pubDate><guid>https://notes.nakurei.com/post/setup-eslint-prettier-stylelint-electron-ts/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ElectronとTypeScriptの環境にLinterとFormatterを導入する方法を説明する。
導入するのはESLint, Prettier, StyleLintである。&lt;/p&gt;
&lt;h2 id="導入に必要な条件"&gt;
導入に必要な条件&lt;a href="#%e5%b0%8e%e5%85%a5%e3%81%ab%e5%bf%85%e8%a6%81%e3%81%aa%e6%9d%a1%e4%bb%b6"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;前提条件は次のとおりである。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Node.jsがインストールされていること&lt;/li&gt;
&lt;li&gt;TypeScriptとElectronの基本的なプロジェクト構成が整っていること&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="eslintの導入方法と設定手順"&gt;
ESLintの導入方法と設定手順&lt;a href="#eslint%e3%81%ae%e5%b0%8e%e5%85%a5%e6%96%b9%e6%b3%95%e3%81%a8%e8%a8%ad%e5%ae%9a%e6%89%8b%e9%a0%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;このセクションでは、ESLintのインストール方法と設定方法について説明する。&lt;/p&gt;
&lt;h3 id="eslintのインストール"&gt;
ESLintのインストール&lt;a href="#eslint%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;プロジェクトのルートディレクトリで、以下のコマンドを実行し、ESLintと関連パッケージをインストールする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin eslint-plugin-electron --save-dev&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;インストールしたパッケージの詳細は下記のとおりである。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;パッケージ名&lt;/th&gt;
&lt;th style="text-align: left"&gt;説明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;eslint&lt;/td&gt;
&lt;td style="text-align: left"&gt;ESLintのコア機能を提供する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;@typescript-eslint/parser&lt;/td&gt;
&lt;td style="text-align: left"&gt;TypeScriptの構文や機能をESLintで正しく解析・検証するために必要&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;@typescript-eslint/eslint-plugin&lt;/td&gt;
&lt;td style="text-align: left"&gt;TypeScript固有のルールと推奨設定を提供する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;eslint-plugin-electron&lt;/td&gt;
&lt;td style="text-align: left"&gt;Electronアプリケーション開発に特化したESLintのプラグイン&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;とくに、&lt;code&gt;eslint-plugin-electron&lt;/code&gt;パッケージは、以下のようなElectron固有のルールを提供する。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;メインプロセスとレンダラープロセスのコードを適切に分離することに関するルール&lt;/li&gt;
&lt;li&gt;セキュリティリスクを最小限に抑えるためのルール（例：ウェブコンテンツのセキュリティポリシーを適切に設定する）&lt;/li&gt;
&lt;li&gt;Electron APIのベストプラクティスに関するルール&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="eslintの設定ファイル作成"&gt;
ESLintの設定ファイル作成&lt;a href="#eslint%e3%81%ae%e8%a8%ad%e5%ae%9a%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e4%bd%9c%e6%88%90"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;プロジェクトのルートディレクトリに&lt;code&gt;.eslintrc.json&lt;/code&gt;という名前の設定ファイルを作成する。
そして、以下の内容を設定ファイルに記述する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.eslintrc.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;parser&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;@typescript-eslint/parser&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;extends&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;eslint:recommended&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;plugin:@typescript-eslint/recommended&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;plugin:electron/recommended&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;plugins&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@typescript-eslint&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;electron&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;env&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;browser&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;node&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;rules&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// ここにカスタムルールを追加する
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;とくに、&lt;code&gt;&amp;quot;env&amp;quot;&lt;/code&gt;の設定を追加することで、Electronのメインプロセスとレンダラープロセスの両方にESLintを適用できる。レンダラープロセスで使用されるブラウザのグローバル変数や、Node.jsのグローバル変数がESLintで認識されるようになる。&lt;/p&gt;
&lt;p&gt;次に、プロジェクトのルートディレクトリに&lt;code&gt;.eslintignore&lt;/code&gt;ファイルを作成し、チェックを無視したいファイルやディレクトリを指定する。下記に例を示す。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.eslintignore&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;node_modules/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dist/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="eslintを実行する"&gt;
ESLintを実行する&lt;a href="#eslint%e3%82%92%e5%ae%9f%e8%a1%8c%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;package.json&lt;/code&gt;の&lt;code&gt;scripts&lt;/code&gt;にlintコマンドとfixコマンドを追加する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;package.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;scripts&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;lint&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;eslint . --ext .ts,.tsx,.js,.jsx &amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;fix&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;eslint . --fix --ext .ts,.tsx,.js,.jsx&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;この設定を追加した後、以下のコマンドでプロジェクト内のすべてのJavaScriptとTypeScriptファイルを対象にESLintを実行できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run lint&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="prettierの導入方法と設定手順"&gt;
Prettierの導入方法と設定手順&lt;a href="#prettier%e3%81%ae%e5%b0%8e%e5%85%a5%e6%96%b9%e6%b3%95%e3%81%a8%e8%a8%ad%e5%ae%9a%e6%89%8b%e9%a0%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;このセクションでは、Prettierのインストール方法と設定方法について説明する。&lt;/p&gt;
&lt;h3 id="prettierのインストール"&gt;
Prettierのインストール&lt;a href="#prettier%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;プロジェクトのルートディレクトリで、以下のコマンドを実行してPrettierと関連パッケージをインストールする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install prettier eslint-config-prettier --save-dev&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;インストールしたパッケージの詳細は下記のとおりである。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;パッケージ名&lt;/th&gt;
&lt;th style="text-align: left"&gt;説明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;prettier&lt;/td&gt;
&lt;td style="text-align: left"&gt;Prettierのコア機能を提供する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;eslint-config-prettier&lt;/td&gt;
&lt;td style="text-align: left"&gt;Prettierと競合するESLintの設定を無効化するconfig&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;最近のESLintとPrettierの統合に関するベストプラクティスでは、ESLintとPrettierを別々に実行することが推奨されている。そのため&lt;code&gt;eslint-plugin-prettier&lt;/code&gt;はインストールしない。&lt;/p&gt;
&lt;h3 id="prettierの設定ファイル作成"&gt;
Prettierの設定ファイル作成&lt;a href="#prettier%e3%81%ae%e8%a8%ad%e5%ae%9a%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e4%bd%9c%e6%88%90"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;既存の&lt;code&gt;.eslintrc.json&lt;/code&gt;ファイルを開き、&amp;ldquo;extends&amp;quot;セクションにPrettier関連の設定を追加する。最終的に以下のようになる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&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;#34;parser&amp;#34;: &amp;#34;@typescript-eslint/parser&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;extends&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;eslint:recommended&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;plugin:@typescript-eslint/recommended&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ &amp;#34;prettier&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;plugin:electron/recommended&amp;#34;
&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;#34;plugins&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;@typescript-eslint&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;electron&amp;#34;
&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;#34;env&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;browser&amp;#34;: true,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;node&amp;#34;: true
&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;#34;rules&amp;#34;: {
&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;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;次に、プロジェクトのルートディレクトリに&lt;code&gt;.prettierrc.json&lt;/code&gt;を作成し、Prettierの設定を追加する。設定できるオプションの詳細は&lt;a class="link" href="https://prettier.io/docs/en/options.html" target="_blank" rel="noopener"
&gt;Prettier公式&lt;/a&gt;を参照してほしい。下記に例を示す。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.prettierrc.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;semi&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;trailingComma&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;all&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;singleQuote&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;printWidth&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&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;&amp;#34;tabWidth&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="prettierを実行する"&gt;
Prettierを実行する&lt;a href="#prettier%e3%82%92%e5%ae%9f%e8%a1%8c%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;package.json&lt;/code&gt;ファイルを開き、&amp;ldquo;scripts&amp;quot;セクションに以下のformatスクリプトを追加する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;package.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;scripts&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;format&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;prettier --write \&amp;#34;./**/*.{ts,tsx,js,jsx,json,css,md}\&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;この設定を追加した後、以下のコマンドでプロジェクト全体のコードをフォーマットできる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run format&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="stylelintの導入方法と設定手順"&gt;
Stylelintの導入方法と設定手順&lt;a href="#stylelint%e3%81%ae%e5%b0%8e%e5%85%a5%e6%96%b9%e6%b3%95%e3%81%a8%e8%a8%ad%e5%ae%9a%e6%89%8b%e9%a0%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;このセクションでは、Stylelintのインストール方法と設定方法について説明する。&lt;/p&gt;
&lt;h3 id="stylelintのインストール"&gt;
Stylelintのインストール&lt;a href="#stylelint%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;プロジェクトのルートディレクトリで以下のコマンドを実行し、Stylelintと関連パッケージをインストールする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install stylelint stylelint-config-standard --save-dev&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;インストールしたパッケージの詳細は下記のとおりである。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;パッケージ名&lt;/th&gt;
&lt;th style="text-align: left"&gt;説明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;stylelint&lt;/td&gt;
&lt;td style="text-align: left"&gt;Stylelintのコア機能を提供する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;stylelint-config-standard&lt;/td&gt;
&lt;td style="text-align: left"&gt;StyleLint公式の設定preset&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Stylelint v14までは、StyleLintとPrettierが競合しないように、&lt;code&gt;stylelint-config-prettier&lt;/code&gt;も導入していた。しかし、&lt;a class="link" href="https://github.com/prettier/stylelint-config-prettier/releases/tag/v9.0.5" target="_blank" rel="noopener"
&gt;Prettier 9.0.5のリリースノート&lt;/a&gt;によると、Stylelint v15では必要ないらしいので入れていない。&lt;/p&gt;
&lt;h3 id="stylelintの設定ファイル作成"&gt;
Stylelintの設定ファイル作成&lt;a href="#stylelint%e3%81%ae%e8%a8%ad%e5%ae%9a%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e4%bd%9c%e6%88%90"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;プロジェクトのルートディレクトリに&lt;code&gt;.stylelintrc.json&lt;/code&gt;という名前のファイルを作成し、Stylelintの設定を追加する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.stylelintrc.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;extends&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;stylelint-config-standard&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;rules&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// ここにカスタムルールを追加する
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;加えて、プロジェクトのルートディレクトリに&lt;code&gt;.stylelintignore&lt;/code&gt;ファイルを作成し、チェックを無視したいファイルやディレクトリを指定する。例を次に示す。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.stylelintignore&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;node_modules/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dist/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="stylelintを実行する"&gt;
Stylelintを実行する&lt;a href="#stylelint%e3%82%92%e5%ae%9f%e8%a1%8c%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;package.json&lt;/code&gt;ファイルを開き、&amp;ldquo;scripts&amp;quot;セクションのlintスクリプトを、ESLintとStylelintが同時に動作するように変更する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;package.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;scripts&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;lint&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;eslint . --ext .ts,.tsx,.js,.jsx &amp;amp;&amp;amp; stylelint \&amp;#34;./**/*.{css,scss}\&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;fix&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;eslint . --fix --ext .ts,.tsx,.js,.jsx &amp;amp;&amp;amp; stylelint \&amp;#34;./**/*.{css,scss}\&amp;#34; --fix&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;以上で設定は完了である。次のコマンドを実行して、プロジェクト全体のスタイルファイルをlintチェックする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run lint&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="まとめ"&gt;
まとめ&lt;a href="#%e3%81%be%e3%81%a8%e3%82%81"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;この記事では、ElectronとTypeScriptの環境にESLint、Prettier、およびStyleLintを導入する方法を詳細に解説した。これらのツールを導入することで、コードの品質向上やチーム内でのコーディングスタイルの統一が実現でき、効果的な開発環境を整えられる。ぜひ、この機会に開発環境を改善して、より高品質なコードを書くことを目指そう。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://rinoguchi.net/2021/12/prettier-eslint-stylelint.html"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="PrettierとESLint・Stylelintの併用 &amp;amp;#8211; rinoguchi&amp;amp;#039;s techlog image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
PrettierとESLint・Stylelintの併用 &amp;amp;#8211; rinoguchi&amp;amp;#039;s techlog
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-2888ea5c9627ddf073c311caac0ce257733da533.png"
style="margin-right: 2px;"
alt="rinoguchi.net favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
rinoguchi.net
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>Hugoで日本語のページ内リンクが正常に動かない問題の解決方法</title><link>https://notes.nakurei.com/post/fixing-hugos-japanese-internal-linking-problem/</link><pubDate>Sun, 02 Apr 2023 19:26:44 +0900</pubDate><guid>https://notes.nakurei.com/post/fixing-hugos-japanese-internal-linking-problem/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;静的サイトジェネレーターHugoで、ページ内リンクが日本語の際にうまく動作しない問題について解説し、その解決方法を述べる。&lt;/p&gt;
&lt;h2 id="発生した問題"&gt;
発生した問題&lt;a href="#%e7%99%ba%e7%94%9f%e3%81%97%e3%81%9f%e5%95%8f%e9%a1%8c"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Hugoを使用して、本文中で日本語の小見出しをリンク参照したい場合に、次のように記述する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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;#発生した問題&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;こうすることで、クリックして小見出しを参照できるリンクが生成されるはずである。
しかし、筆者の環境では、このリンクが正常に動作しなかった。&lt;/p&gt;
&lt;h2 id="問題の原因"&gt;
問題の原因&lt;a href="#%e5%95%8f%e9%a1%8c%e3%81%ae%e5%8e%9f%e5%9b%a0"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;この問題は、Hugoがリンクのアンカータグ（&lt;!-- raw HTML omitted --&gt;タグ）を生成する際に、日本語の文字列を正しく扱えていないことが原因である。Hugoは、ページ内リンクのアンカータグを生成する際に、リンク先の見出しのテキストを元にID属性を付与し、そのID属性に基づいて&lt;code&gt;a&lt;/code&gt;タグの&lt;code&gt;href&lt;/code&gt;属性を生成する。このとき、生成された&lt;code&gt;a&lt;/code&gt;タグの&lt;code&gt;href&lt;/code&gt;属性がエンコードされてしまったため、リンクが正常に動作しなかった。&lt;/p&gt;
&lt;p&gt;つまり、筆者の環境で日本語を含むリンクがエンコードされてしまうことが問題の原因だった。&lt;/p&gt;
&lt;h2 id="解決方法の実行"&gt;
解決方法の実行&lt;a href="#%e8%a7%a3%e6%b1%ba%e6%96%b9%e6%b3%95%e3%81%ae%e5%ae%9f%e8%a1%8c"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;この問題を解決するために、リンクを貼った際にエンコードしないように設定した。
まず、元のテーマから&lt;code&gt;layouts/_default/_markup/render-link.html&lt;/code&gt;をコピーする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp ./themes/hugo-theme-stack/layouts/_default/_markup/render-link.html ./layouts/_default/_markup/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;元のファイルでは、次のように記述されていた。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;render-link.html&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;link&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{{ .Destination | safeURL }}&amp;#34;&lt;/span&gt; &lt;span class="err"&gt;{{&lt;/span&gt; &lt;span class="na"&gt;with&lt;/span&gt; &lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Title&lt;/span&gt;&lt;span class="err"&gt;}}&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{{ . }}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;{{&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt; &lt;span class="err"&gt;}}{{&lt;/span&gt; &lt;span class="na"&gt;if&lt;/span&gt; &lt;span class="na"&gt;strings&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;HasPrefix&lt;/span&gt; &lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Destination&lt;/span&gt; &lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="na"&gt;http&lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt; &lt;span class="err"&gt;}}&lt;/span&gt; &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;_blank&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;noopener&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;{{&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt; &lt;span class="err"&gt;}}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;{{ .Text | safeHTML }}&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;この&lt;code&gt;href=&amp;quot;{{ .Destination | safeURL }}&amp;quot;&lt;/code&gt;を、&lt;code&gt;{{ printf &amp;quot;href=%q&amp;quot; .Destination | safeHTMLAttr }}&lt;/code&gt;に変更する。変更後の記述は次のようになる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;render-link.html&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;link&amp;#34;&lt;/span&gt; &lt;span class="err"&gt;{{&lt;/span&gt; &lt;span class="na"&gt;printf&lt;/span&gt; &lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;%q&amp;#34;&lt;/span&gt; &lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Destination&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="na"&gt;safeHTMLAttr&lt;/span&gt; &lt;span class="err"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;{{&lt;/span&gt; &lt;span class="na"&gt;with&lt;/span&gt; &lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Title&lt;/span&gt;&lt;span class="err"&gt;}}&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{{ . }}&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;{{&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt; &lt;span class="err"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;{{&lt;/span&gt; &lt;span class="na"&gt;if&lt;/span&gt; &lt;span class="na"&gt;strings&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;HasPrefix&lt;/span&gt; &lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Destination&lt;/span&gt; &lt;span class="err"&gt;&amp;#34;&lt;/span&gt;&lt;span class="na"&gt;http&lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt; &lt;span class="err"&gt;}}&lt;/span&gt; &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;_blank&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;noopener&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;{{&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt; &lt;span class="err"&gt;}}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;{{ .Text | safeHTML }}&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;{{ printf &amp;quot;href=%q&amp;quot; .Destination | safeHTMLAttr }}&lt;/code&gt;にすることで、日本語の文字列がエンコードされずに&lt;code&gt;href&lt;/code&gt;属性へ設定される。これにより、日本語のページ内リンクが正常に動作するようになる。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;
まとめ&lt;a href="#%e3%81%be%e3%81%a8%e3%82%81"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;この記事では、Hugoで日本語のページ内リンクが正常に動作しない問題とその解決方法を紹介した。問題の原因は、Hugoが日本語の文字列を正しく扱えないことであり、&lt;code&gt;layouts/_default/_markup/render-link.html&lt;/code&gt;の&lt;code&gt;href&lt;/code&gt;属性の設定を変更することで解決した。Hugoを使用して日本語のページ内リンクを設定する際にお悩みの方は、ぜひこの解決方法を試してみてほしい。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://suihan74.github.io/posts/2021/01_27_00_hugo_noencode_render_link/#%E3%83%91%E3%83%BC%E3%82%BB%E3%83%B3%E3%83%88%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%92%E5%9B%9E%E9%81%BF%E3%81%99%E3%82%8B" target="_blank" rel="noopener"
&gt;Hugoのrender-linkでURLエンコードしないリンクを挿入する - すいはんぶろぐ.io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ElectronとTypeScriptを使ったデスクトップアプリ開発環境の構築</title><link>https://notes.nakurei.com/post/build-desktop-app-env-with-electron-and-typescript/</link><pubDate>Sat, 01 Apr 2023 12:54:14 +0900</pubDate><guid>https://notes.nakurei.com/post/build-desktop-app-env-with-electron-and-typescript/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ElectronとTypeScriptを使ったデスクトップアプリの開発環境を構築する方法について説明する。&lt;/p&gt;
&lt;h3 id="electronとは"&gt;
Electronとは&lt;a href="#electron%e3%81%a8%e3%81%af"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a class="link" href="https://www.electronjs.org/" target="_blank" rel="noopener"
&gt;Electron&lt;/a&gt;は、ウェブ技術を用いてデスクトップアプリケーションを開発するためのフレームワークである。HTML、CSS、JavaScriptを使ってアプリケーションを構築できるため、ウェブ開発者にとって非常に手軽な開発環境が提供されている。&lt;/p&gt;
&lt;h3 id="typescriptとは"&gt;
TypeScriptとは&lt;a href="#typescript%e3%81%a8%e3%81%af"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a class="link" href="https://www.typescriptlang.org/" target="_blank" rel="noopener"
&gt;TypeScript&lt;/a&gt;は、JavaScriptのスーパーセットであり、型システムやクラスベースのオブジェクト指向プログラミングを導入した言語である。TypeScriptはコンパイルされるとJavaScriptに変換されるため、ブラウザやNode.js環境で実行できる。&lt;/p&gt;
&lt;h2 id="環境構築手順"&gt;
環境構築手順&lt;a href="#%e7%92%b0%e5%a2%83%e6%a7%8b%e7%af%89%e6%89%8b%e9%a0%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="全体の流れ"&gt;
全体の流れ&lt;a href="#%e5%85%a8%e4%bd%93%e3%81%ae%e6%b5%81%e3%82%8c"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a class="link" href="#%e5%bf%85%e8%a6%81%e3%81%aa%e9%96%8b%e7%99%ba%e3%83%84%e3%83%bc%e3%83%ab%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" &gt;必要な開発ツールのインストール&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="#electron%e3%83%97%e3%83%ad%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%81%ae%e4%bd%9c%e6%88%90%e3%81%a8%e5%88%9d%e6%9c%9f%e8%a8%ad%e5%ae%9a" &gt;Electronプロジェクトの作成と初期設定&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="#typescript%e3%81%ae%e8%a8%ad%e5%ae%9a" &gt;TypeScriptの設定&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="#electron%e3%81%ae%e8%a8%ad%e5%ae%9a" &gt;Electronの設定&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="#html%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e4%bd%9c%e6%88%90" &gt;HTMLファイルの作成&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="#%e5%ae%9f%e8%a1%8c%e3%82%b9%e3%82%af%e3%83%aa%e3%83%97%e3%83%88%e3%81%ae%e8%a8%ad%e5%ae%9a" &gt;実行スクリプトの設定&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="#%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e5%ae%9f%e8%a1%8c" &gt;アプリケーションの実行&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="必要な開発ツールのインストール"&gt;
必要な開発ツールのインストール&lt;a href="#%e5%bf%85%e8%a6%81%e3%81%aa%e9%96%8b%e7%99%ba%e3%83%84%e3%83%bc%e3%83%ab%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;開発環境を構築するには以下のツールが必要である。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;npm（Node.jsのパッケージマネージャ）&lt;/li&gt;
&lt;li&gt;Visual Studio Code（エディタ）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらのツールがインストールされていることを確認し、最新バージョンにアップデートする。&lt;/p&gt;
&lt;p&gt;本記事執筆時の環境は次のとおりである。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ node -v
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v18.15.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ npm -v
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;9.6.3&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="electronプロジェクトの作成と初期設定"&gt;
Electronプロジェクトの作成と初期設定&lt;a href="#electron%e3%83%97%e3%83%ad%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%81%ae%e4%bd%9c%e6%88%90%e3%81%a8%e5%88%9d%e6%9c%9f%e8%a8%ad%e5%ae%9a"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;新しいプロジェクトディレクトリを作成し、次のコマンドを実行してnpmプロジェクトを初期化する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir my-electron-app
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; my-electron-app
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm init -y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これにより、package.jsonファイルが生成される。
次に、ElectronとTypeScriptの依存関係をインストールする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install --save-dev electron typescript @types/node&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;@types/node&lt;/code&gt;は、Node.jsのTypeScript型定義を提供するパッケージである。TypeScriptでNode.jsの機能を使用する場合に役立つ。今回のプロジェクトでは主にElectronを使用しているが、Node.jsのAPIを使用する場合がある。そのため、型定義が正確であることを確認するために、このパッケージのインストールを推奨する。&lt;/p&gt;
&lt;p&gt;また、いくつかの記事では&lt;code&gt;ts-node&lt;/code&gt;をインストールしている。&lt;code&gt;ts-node&lt;/code&gt;は、TypeScriptコードをコンパイルせずに直接実行できるツールである。これにより、開発プロセスが簡略化され、コンパイルにかかる時間が節約される。ただし、今回のプロジェクトでは、Webpackを使用してコンパイルとバンドルを行っているため、ts-nodeを使わなくても開発できる。よって&lt;code&gt;ts-node&lt;/code&gt;はインストールしない。&lt;/p&gt;
&lt;h3 id="typescriptの設定"&gt;
TypeScriptの設定&lt;a href="#typescript%e3%81%ae%e8%a8%ad%e5%ae%9a"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;TypeScriptをプロジェクトで使用するための設定をする。
&lt;code&gt;tsconfig.json&lt;/code&gt;ファイルをプロジェクトのルートディレクトリに作成し、以下の内容を記述する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;tsconfig.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;compilerOptions&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;module&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;CommonJS&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;&amp;#34;target&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ES2022&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// コンパイルされたJavaScriptのバージョンを指定
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;outDir&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;dist&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;&amp;#34;sourceMap&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// デバッグ時にTypeScriptファイルを参照できるようにする
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;moduleResolution&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;node&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// モジュールのインポートを解決する方法をnode_modulesディレクトリを再帰的に探索するように指定
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;esModuleInterop&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// TypeScriptとECMAScriptモジュールとの相互運用性を向上させるための設定。インポート時の記述が簡潔になる。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;strict&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;&amp;#34;forceConsistentCasingInFileNames&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;&amp;#34;noUnusedLocals&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;&amp;#34;noUnusedParameters&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&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;&amp;#34;noFallthroughCasesInSwitch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// switch文でbreakなしのフォールスルーがある場合、エラーを発生させる
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;resolveJsonModule&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// JSONファイルをモジュールとしてインポートできるようにする
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;include&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;src/**/*.ts&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="electronの設定"&gt;
Electronの設定&lt;a href="#electron%e3%81%ae%e8%a8%ad%e5%ae%9a"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Electronを設定する。&lt;code&gt;src&lt;/code&gt;ディレクトリを作成し、その中に&lt;code&gt;main.ts&lt;/code&gt;ファイルを作成する。次に、Electronのメインプロセスとなる以下のコードを&lt;code&gt;main.ts&lt;/code&gt;に追加する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;src/main.ts&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;BrowserWindow&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;electron&amp;#39;&lt;/span&gt;&lt;span class="p"&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="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;createWindow() {&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mainWindow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;BrowserWindow&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;width&lt;/span&gt;: &lt;span class="kt"&gt;800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;height&lt;/span&gt;: &lt;span class="kt"&gt;600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;webPreferences&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;nodeIntegration&lt;/span&gt;: &lt;span class="kt"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;contextIsolation&lt;/span&gt;: &lt;span class="kt"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;webviewTag&lt;/span&gt;: &lt;span class="kt"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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="nx"&gt;mainWindow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;loadFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;index.html&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;whenReady&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;createWindow&lt;/span&gt;&lt;span class="p"&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="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;window-all-closed&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&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;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;platform&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;darwin&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;quit&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;activate&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&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;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;BrowserWindow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getAllWindows&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;createWindow&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="htmlファイルの作成"&gt;
HTMLファイルの作成&lt;a href="#html%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e4%bd%9c%e6%88%90"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;index.html&lt;/code&gt;ファイルをプロジェクトのルートディレクトリに作成し、次の内容を記述する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;en&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt; &lt;span class="na"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;viewport&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;width=device-width, initial-scale=1.0&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;My Electron App&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hello, Electron and TypeScript!&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="実行スクリプトの設定"&gt;
実行スクリプトの設定&lt;a href="#%e5%ae%9f%e8%a1%8c%e3%82%b9%e3%82%af%e3%83%aa%e3%83%97%e3%83%88%e3%81%ae%e8%a8%ad%e5%ae%9a"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;package.jsonファイルを開き、scriptsセクションに以下の行を追加する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;package.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;scripts&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;start&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;tsc &amp;amp;&amp;amp; electron .&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これで、アプリケーションを起動する準備が整った。&lt;/p&gt;
&lt;h3 id="アプリケーションの実行"&gt;
アプリケーションの実行&lt;a href="#%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e5%ae%9f%e8%a1%8c"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;コマンドラインから次のコマンドを実行して、アプリケーションを起動する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm start&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;デスクトップアプリが起動する。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/build-desktop-app-env-with-electron-and-typescript/20230401135911.png"
width="1581"
height="1185"
srcset="https://notes.nakurei.com/post/build-desktop-app-env-with-electron-and-typescript/20230401135911_hu_1d3a8f417361b5df.png 480w, https://notes.nakurei.com/post/build-desktop-app-env-with-electron-and-typescript/20230401135911_hu_d406362b091c9093.png 1024w"
loading="lazy"
alt="起動したデスクトップアプリ"
class="gallery-image"
data-flex-grow="133"
data-flex-basis="320px"
&gt;&lt;/p&gt;
&lt;h2 id="おまけ--アプリケーションのパッケージング"&gt;
おまけ : アプリケーションのパッケージング&lt;a href="#%e3%81%8a%e3%81%be%e3%81%91--%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e3%83%91%e3%83%83%e3%82%b1%e3%83%bc%e3%82%b8%e3%83%b3%e3%82%b0"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;アプリケーションの配布のために、パッケージング環境も整える。&lt;/p&gt;
&lt;h3 id="electron-builderのインストール"&gt;
electron-builderのインストール&lt;a href="#electron-builder%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;アプリケーションのパッケージングには、electron-builderを使用する。
以下のコマンドでインストールする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install electron-builder --save-dev&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="packagejsonにパッケージング設定を追加"&gt;
package.jsonにパッケージング設定を追加&lt;a href="#packagejson%e3%81%ab%e3%83%91%e3%83%83%e3%82%b1%e3%83%bc%e3%82%b8%e3%83%b3%e3%82%b0%e8%a8%ad%e5%ae%9a%e3%82%92%e8%bf%bd%e5%8a%a0"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;package.json&lt;/code&gt;に、electron-builderの設定を追加する。
以下の内容を追記する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;package.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;scripts&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;build:win&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;electron-builder --win --x64&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;build&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;appId&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;com.example.yourapp&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;files&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;dist/**/*&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;mac&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;category&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;public.app-category.utilities&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;target&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;dmg&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;win&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;target&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;nsis&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;nsis&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;oneClick&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&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;&amp;#34;allowToChangeInstallationDirectory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;linux&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;target&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;AppImage&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="パッケージングの実行"&gt;
パッケージングの実行&lt;a href="#%e3%83%91%e3%83%83%e3%82%b1%e3%83%bc%e3%82%b8%e3%83%b3%e3%82%b0%e3%81%ae%e5%ae%9f%e8%a1%8c"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;以下のコマンドを実行して、アプリケーションをパッケージングする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run build:win&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これで、ElectronとTypeScriptを使ったデスクトップアプリケーションの開発環境の構築から、パッケージングまでの一連の手順が完了した。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.electronjs.org/" target="_blank" rel="noopener"
&gt;Electron公式サイト&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.typescriptlang.org/" target="_blank" rel="noopener"
&gt;TypeScript公式サイト&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.electron.build/configuration/configuration.html" target="_blank" rel="noopener"
&gt;Common Configuration - electron-builder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://maku.blog/p/2tcs8n2/" target="_blank" rel="noopener"
&gt;Electron アプリの配布パッケージを作る (electron-builder)｜まくろぐ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Next.js + Docker環境でhot reloadが効かないときの対処法</title><link>https://notes.nakurei.com/post/how-2-fix-hot-reload-not-working-in-next-docker/</link><pubDate>Fri, 17 Feb 2023 00:25:15 +0900</pubDate><guid>https://notes.nakurei.com/post/how-2-fix-hot-reload-not-working-in-next-docker/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Next.js 13の環境をDockerで作ってNextアプリを実行したらホットリロードされなかった。
そのときの対処法を残す。&lt;/p&gt;
&lt;h2 id="どうすればよいのか"&gt;
どうすればよいのか&lt;a href="#%e3%81%a9%e3%81%86%e3%81%99%e3%82%8c%e3%81%b0%e3%82%88%e3%81%84%e3%81%ae%e3%81%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;2つのことをする必要がある。&lt;/p&gt;
&lt;p&gt;まず、環境変数に&lt;code&gt;WATCHPACK_POLLING=true&lt;/code&gt;を追加する。
Docker Composerを使っているなら、&lt;code&gt;docker-compose.yaml&lt;/code&gt;の&lt;code&gt;environment&lt;/code&gt;に渡せばよい。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;docker-compose.yaml&lt;/div&gt;
&lt;div class="code-block-content"&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="nt"&gt;frontend&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;WATCHPACK_POLLING=true&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;devcontainerを使っているなら、&lt;code&gt;devcontainer.json&lt;/code&gt;の&lt;code&gt;containerEnv&lt;/code&gt;に渡せばよい。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;devcontainer.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;containerEnv&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;WATCHPACK_POLLING&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;次に、&lt;code&gt;next.config.js&lt;/code&gt;に&lt;code&gt;webpack&lt;/code&gt;プロパティを追加する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;next.config.js&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/** @type {import(&amp;#39;next&amp;#39;).NextConfig} */
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;const nextConfig = {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; reactStrictMode: true,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ // hot reload
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ webpack: (config, { dev }) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ if (dev) {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ config.watchOptions = {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ poll: 1000,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ aggregateTimeout: 200,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ };
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ return config;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;module.exports = nextConfig
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これでホットリロードが効くようになる。ただし、0.5秒程度の遅延が入る。&lt;/p&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;next : 13.1.6&lt;/li&gt;
&lt;li&gt;react : 18.2.0&lt;/li&gt;
&lt;li&gt;typescript : 4.9.5&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="効果がなかった方法"&gt;
効果がなかった方法&lt;a href="#%e5%8a%b9%e6%9e%9c%e3%81%8c%e3%81%aa%e3%81%8b%e3%81%a3%e3%81%9f%e6%96%b9%e6%b3%95"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;環境変数に&lt;code&gt;CHOKIDAR_USEPOLLING=true&lt;/code&gt;を追加→解決しなかった&lt;/li&gt;
&lt;li&gt;&lt;code&gt;next.config.js&lt;/code&gt;に下記を追加→そんなプロパティはないとwarningが出た&lt;/li&gt;
&lt;/ul&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;next.config.js&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/** @type {import(&amp;#39;next&amp;#39;).NextConfig} */
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;const nextConfig = {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; reactStrictMode: true,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ // hot reload
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ webpackDevMiddleware: config =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ config.watchOptions = {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ poll: 800,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ aggregateTimeout: 300,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ return config
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;module.exports = nextConfig
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;表示された警告を下記に示しておく。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ yarn dev
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yarn run v1.22.19
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ next dev
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ready - started server on 0.0.0.0:3000, url: http://localhost:3000
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;warn - Invalid next.config.js options detected:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - The root value has an unexpected property, webpackDevMiddleware, which is not in the list of allowed properties &lt;span class="o"&gt;(&lt;/span&gt;amp, analyticsId, assetPrefix, basePath, cleanDistDir, compiler, compress, crossOrigin, devIndicators, distDir, env, eslint, excludeDefaultMomentLocales, experimental, exportPathMap, generateBuildId, generateEtags, headers, httpAgentOptions, i18n, images, modularizeImports, onDemandEntries, optimizeFonts, output, outputFileTracing, pageExtensions, poweredByHeader, productionBrowserSourceMaps, publicRuntimeConfig, reactStrictMode, redirects, rewrites, sassOptions, serverRuntimeConfig, skipMiddlewareUrlNormalize, skipTrailingSlashRedirect, staticPageGenerationTimeout, swcMinify, trailingSlash, transpilePackages, typescript, useFileSystemPublicRoutes, webpack&lt;span class="o"&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;See more info here: https://nextjs.org/docs/messages/invalid-next-config&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://qiita.com/SDTakeuchi/items/694fe7545396246da573" target="_blank" rel="noopener"
&gt;【Next.js / TypeScript】ホットリロードを有効にする方法 - Qiita&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://pgmemo.tokyo/data/archives/2154.html" target="_blank" rel="noopener"
&gt;Next.js で ホットリロードが聞かない時の変更箇所｜プログラムメモ&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://laby-tech.com/column/94/" target="_blank" rel="noopener"
&gt;next.jsでホットリロードされないときの対処法 | laby&amp;rsquo;s Tech Blog&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://nao-uc.site/pg/next-js-docker-not-hot-reload/" target="_blank" rel="noopener"
&gt;next.js docker環境でhot reloadできない | UCPGブログ&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Python + matplotlibを使ってプレゼン資料向けの折れ線グラフを作る</title><link>https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/</link><pubDate>Sun, 12 Feb 2023 00:31:51 +0900</pubDate><guid>https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/</guid><description>&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/012.webp" alt="Featured image of post Python + matplotlibを使ってプレゼン資料向けの折れ線グラフを作る" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pythonのmatplotlibライブラリを利用して、プレゼン資料へ載せるのに適した折れ線グラフを描いた。
その際に取った過程を残しておくもの。&lt;/p&gt;
&lt;p&gt;これをこうじゃ。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/000.png"
width="640"
height="480"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/000_hu_a059cd7bca52e01d.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/000_hu_ac7979e1c2afbc40.png 1024w"
loading="lazy"
alt="Before"
class="gallery-image"
data-flex-grow="133"
data-flex-basis="320px"
&gt;
&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/012.png"
width="630"
height="529"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/012_hu_88abc492c277c2e0.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/012_hu_8af0ecac02cfa742.png 1024w"
loading="lazy"
alt="After"
class="gallery-image"
data-flex-grow="119"
data-flex-basis="285px"
&gt;&lt;/p&gt;
&lt;h2 id="はじめに"&gt;
はじめに&lt;a href="#%e3%81%af%e3%81%98%e3%82%81%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;似たようなことは下記ですでにやられている。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/skotaro/items/cdb0732ad1ad2a4b6236" target="_blank" rel="noopener"
&gt;「データ視覚化のデザイン #1」をmatplotlibで実装する - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://myenigma.hatenablog.com/entry/2018/06/03/091557" target="_blank" rel="noopener"
&gt;かっこいいグラフを作るPythonモジュールPyCoolPlotを作った - MyEnigma&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;また、&lt;a class="link" href="https://pypi.org/project/rei-preso-plot/" target="_blank" rel="noopener"
&gt;この記事で描いたグラフを簡単に描くためのパッケージ「rei-preso-plot」もPyPIで公開している&lt;/a&gt;。
この先の長い文章を読むのが面倒になったら使ってみてほしい。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/NakuRei/plot-line-graph-with-matplotlib" target="_blank" rel="noopener"
&gt;本稿のコードはすべてGitHubで公開している&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id="結論--最終的にできたコード"&gt;
結論 | 最終的にできたコード&lt;a href="#%e7%b5%90%e8%ab%96--%e6%9c%80%e7%b5%82%e7%9a%84%e3%81%ab%e3%81%a7%e3%81%8d%e3%81%9f%e3%82%b3%e3%83%bc%e3%83%89"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;先にAfterのグラフを表示するコードを示しておく。とても長いので折りたたんでいる。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Afterのグラフを表示するコード&lt;/summary&gt;
&lt;p&gt;&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;matplotlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pyplot&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;numpy.typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ArrayLike&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;cycler&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cycler&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="n"&gt;fontsize_title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;32.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;24.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fontsize_legend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;24.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fontsize_tick&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;18.0&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="n"&gt;color_face&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#fafafa&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;color_title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#282828&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;color_label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#282828&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;color_legend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#282828&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;color_grid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#c0c0c0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;color_tick&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#424242&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#005aff&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#f6aa00&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#03af7a&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#ff4b00&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#9467bd&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#804000&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#ff8082&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#84919e&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#fff100&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#4dc4ff&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;focus_indexes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;focus_color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;not_focus_color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#c3c3c3&amp;#34;&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="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;font.family&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ricty diminished&amp;#34;&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="n"&gt;data_num&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;not_focus_color&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;data_num&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;z_orders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;data_num&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;font_weights&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;normal&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;data_num&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="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;focus_indexes&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;focus_indexes&lt;/span&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;focus_index&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;focus_indexes&lt;/span&gt;&lt;span class="p"&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;if&lt;/span&gt; &lt;span class="n"&gt;data_num&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;focus_index&lt;/span&gt;&lt;span class="p"&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;raise&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#34;focus_index&amp;#34; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;focus_index&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt; is out of range.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;focus_index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;focus_color&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;z_orders&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;focus_index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;font_weights&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;focus_index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;bold&amp;#34;&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="n"&gt;fig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;facecolor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_face&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_subplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;111&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_facecolor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color_face&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_prop_cycle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cycler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;linewidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;marker&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;o&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;markersize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;8.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;zorder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;z_orders&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_title&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mf"&gt;0.45&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;labelpad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;y_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;labelpad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;legend&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;legends&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x_loc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.04&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x_loc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_data&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;center&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_legend&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fontweight&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;font_weights&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;zorder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;z_orders&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labelsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_tick&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;4.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_tick&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labelsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_tick&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;4.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_tick&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;both&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_grid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_axisbelow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;which&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;both&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;direction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;in&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;top&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_visible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;right&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_visible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_linewidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;bottom&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_linewidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color_tick&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;bottom&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color_tick&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;result/012.png&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;bbox_inches&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;tight&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pad_inches&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;変遷の過程は次のとおりである。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/001.png"
width="640"
height="480"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/001_hu_767efdd60044c3c5.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/001_hu_9041e3bcfc066a4d.png 1024w"
loading="lazy"
alt="1. フォント"
class="gallery-image"
data-flex-grow="133"
data-flex-basis="320px"
&gt;
&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/002.png"
width="640"
height="480"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/002_hu_555c469e3a2328e8.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/002_hu_18a7d2f8166e6e13.png 1024w"
loading="lazy"
alt="2. 線の幅とマーカーサイズ"
class="gallery-image"
data-flex-grow="133"
data-flex-basis="320px"
&gt;
&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/003.png"
width="640"
height="480"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/003_hu_b2b21a197720bfe0.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/003_hu_e5bd1bc6a3d1e12f.png 1024w"
loading="lazy"
alt="3. 補助線"
class="gallery-image"
data-flex-grow="133"
data-flex-basis="320px"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/004.png"
width="640"
height="480"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/004_hu_752a6587a015f24e.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/004_hu_3050c3de7c9f84bd.png 1024w"
loading="lazy"
alt="4. 枠を消す"
class="gallery-image"
data-flex-grow="133"
data-flex-basis="320px"
&gt;
&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/005.png"
width="640"
height="480"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/005_hu_b678a1e9d944cc99.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/005_hu_3dc3d61e75e3e185.png 1024w"
loading="lazy"
alt="5. 枠線を太く"
class="gallery-image"
data-flex-grow="133"
data-flex-basis="320px"
&gt;
&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/006.png"
width="640"
height="480"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/006_hu_b5f958227a75a7d7.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/006_hu_db620ef3f2a7dea7.png 1024w"
loading="lazy"
alt="6. 目盛りを内側に"
class="gallery-image"
data-flex-grow="133"
data-flex-basis="320px"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/007.png"
width="640"
height="480"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/007_hu_38f493afe4170aff.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/007_hu_1055083753f6b41a.png 1024w"
loading="lazy"
alt="7. 凡例を埋め込む"
class="gallery-image"
data-flex-grow="133"
data-flex-basis="320px"
&gt;
&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/008.png"
width="609"
height="488"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/008_hu_3b9c6c1bd3ecac15.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/008_hu_55fd12eb075af6e4.png 1024w"
loading="lazy"
alt="8. 文字の大きさ"
class="gallery-image"
data-flex-grow="124"
data-flex-basis="299px"
&gt;
&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/009.png"
width="630"
height="534"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/009_hu_209089463971ba72.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/009_hu_59ad07c32b279df2.png 1024w"
loading="lazy"
alt="9. 文字とグラフの間隔"
class="gallery-image"
data-flex-grow="117"
data-flex-basis="283px"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/010.png"
width="630"
height="534"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/010_hu_b24603b015cfda4b.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/010_hu_88fd6091ee71feb9.png 1024w"
loading="lazy"
alt="10. 色"
class="gallery-image"
data-flex-grow="117"
data-flex-basis="283px"
&gt;
&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/011.png"
width="630"
height="534"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/011_hu_620eb9caa68b7ee1.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/011_hu_df3e8c502a104906.png 1024w"
loading="lazy"
alt="11. あるデータだけ強調"
class="gallery-image"
data-flex-grow="117"
data-flex-basis="283px"
&gt;
&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/012.png"
width="630"
height="529"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/012_hu_88abc492c277c2e0.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/012_hu_8af0ecac02cfa742.png 1024w"
loading="lazy"
alt="12. タイトルを下に"
class="gallery-image"
data-flex-grow="119"
data-flex-basis="285px"
&gt;&lt;/p&gt;
&lt;h2 id="本稿で初期設定する値"&gt;
本稿で初期設定する値&lt;a href="#%e6%9c%ac%e7%a8%bf%e3%81%a7%e5%88%9d%e6%9c%9f%e8%a8%ad%e5%ae%9a%e3%81%99%e3%82%8b%e5%80%a4"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;使うパッケージは次のとおりである。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;matplotlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pyplot&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;numpy.typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ArrayLike&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;cycler&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cycler&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;本稿のすべてのグラフについて、グラフとして表示するデータは下記とする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;グラフに表示するデータ&lt;/div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;y_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ArrayLike&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;95&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ArrayLike&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;April&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;May&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;June&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;July&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;August&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;legends&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ArrayLike&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;A&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;B&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;C&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Test Scores&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;x_label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Month held&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;y_label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Score [points]&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="グラフの改変過程"&gt;
グラフの改変過程&lt;a href="#%e3%82%b0%e3%83%a9%e3%83%95%e3%81%ae%e6%94%b9%e5%a4%89%e9%81%8e%e7%a8%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="デフォルトのグラフ"&gt;
デフォルトのグラフ&lt;a href="#%e3%83%87%e3%83%95%e3%82%a9%e3%83%ab%e3%83%88%e3%81%ae%e3%82%b0%e3%83%a9%e3%83%95"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Beforeのグラフを表示するコード。matplotlibで特に何も設定せずグラフを描くとこうなる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;Beforeのグラフを表示するコード&lt;/div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_subplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;111&lt;/span&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;y_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;marker&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;o&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;legends&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;result/000.png&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/000.png"
width="640"
height="480"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/000_hu_a059cd7bca52e01d.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/000_hu_ac7979e1c2afbc40.png 1024w"
loading="lazy"
alt="デフォルトのグラフ"
class="gallery-image"
data-flex-grow="133"
data-flex-basis="320px"
&gt;&lt;/p&gt;
&lt;h3 id="フォントを変更する"&gt;
フォントを変更する&lt;a href="#%e3%83%95%e3%82%a9%e3%83%b3%e3%83%88%e3%82%92%e5%a4%89%e6%9b%b4%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;プレゼンで使うフォントと、グラフで使うフォントを統一する。
筆者はコードの表示に&lt;a class="link" href="https://github.com/edihbrandon/RictyDiminished" target="_blank" rel="noopener"
&gt;Ricty diminished&lt;/a&gt;を使うため、それに合わせている。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;追加したコード&lt;/div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;font.family&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ricty diminished&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;details&gt;
&lt;summary&gt;フォントを変更したコード全体&lt;/summary&gt;
&lt;p&gt;&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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 hl"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;font.family&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ricty diminished&amp;#34;&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="n"&gt;fig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_subplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;111&lt;/span&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;y_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;marker&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;o&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;legends&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;result/001.png&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/000.png"
width="640"
height="480"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/000_hu_a059cd7bca52e01d.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/000_hu_ac7979e1c2afbc40.png 1024w"
loading="lazy"
alt="Before : デフォルトのグラフ"
class="gallery-image"
data-flex-grow="133"
data-flex-basis="320px"
&gt;
&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/001.png"
width="640"
height="480"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/001_hu_767efdd60044c3c5.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/001_hu_9041e3bcfc066a4d.png 1024w"
loading="lazy"
alt="After : フォントを変更したグラフ"
class="gallery-image"
data-flex-grow="133"
data-flex-basis="320px"
&gt;&lt;/p&gt;
&lt;h3 id="線の幅とマーカーの大きさを変更する"&gt;
線の幅とマーカーの大きさを変更する&lt;a href="#%e7%b7%9a%e3%81%ae%e5%b9%85%e3%81%a8%e3%83%9e%e3%83%bc%e3%82%ab%e3%83%bc%e3%81%ae%e5%a4%a7%e3%81%8d%e3%81%95%e3%82%92%e5%a4%89%e6%9b%b4%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;線の幅とマーカーの大きさを見やすいサイズに変更する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;変更したコード&lt;/div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;y_data&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="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;linewidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;marker&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;o&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;markersize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;8.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;details&gt;
&lt;summary&gt;線の幅とマーカーの大きさを変更したコード全体&lt;/summary&gt;
&lt;p&gt;&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;font.family&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ricty diminished&amp;#34;&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="n"&gt;fig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_subplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;111&lt;/span&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;y_data&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="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;linewidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;marker&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;o&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;markersize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;8.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;legends&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;result/002.png&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/001.png"
width="640"
height="480"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/001_hu_767efdd60044c3c5.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/001_hu_9041e3bcfc066a4d.png 1024w"
loading="lazy"
alt="Before : フォントを変更したグラフ"
class="gallery-image"
data-flex-grow="133"
data-flex-basis="320px"
&gt;
&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/002.png"
width="640"
height="480"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/002_hu_555c469e3a2328e8.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/002_hu_18a7d2f8166e6e13.png 1024w"
loading="lazy"
alt="After : 線の幅とマーカーの大きさを変更したグラフ"
class="gallery-image"
data-flex-grow="133"
data-flex-basis="320px"
&gt;&lt;/p&gt;
&lt;h3 id="補助線を引く"&gt;
補助線を引く&lt;a href="#%e8%a3%9c%e5%8a%a9%e7%b7%9a%e3%82%92%e5%bc%95%e3%81%8f"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;具体的数値をきちんと示したいグラフの場合は、補助線を引いたほうが見やすくなる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;追加したコード&lt;/div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;both&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_axisbelow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# グラフの上に補助線が来ないようにする&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;details&gt;
&lt;summary&gt;補助線を引いたコード全体&lt;/summary&gt;
&lt;p&gt;&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;font.family&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ricty diminished&amp;#34;&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="n"&gt;fig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_subplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;111&lt;/span&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;y_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;linewidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;marker&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;o&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;markersize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;8.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;legends&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;both&amp;#34;&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_axisbelow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;result/003.png&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/002.png"
width="640"
height="480"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/002_hu_555c469e3a2328e8.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/002_hu_18a7d2f8166e6e13.png 1024w"
loading="lazy"
alt="Before : 線の幅とマーカーの大きさを変更したグラフ"
class="gallery-image"
data-flex-grow="133"
data-flex-basis="320px"
&gt;
&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/003.png"
width="640"
height="480"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/003_hu_b2b21a197720bfe0.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/003_hu_e5bd1bc6a3d1e12f.png 1024w"
loading="lazy"
alt="After : 補助線を引いたグラフ"
class="gallery-image"
data-flex-grow="133"
data-flex-basis="320px"
&gt;&lt;/p&gt;
&lt;h3 id="枠を消す"&gt;
枠を消す&lt;a href="#%e6%9e%a0%e3%82%92%e6%b6%88%e3%81%99"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;上と右の枠線を消す。これだけでも見た目がシンプルになる。
もし数値が重要でないなら、補助線を引かず、左の枠線も消すとよりよくなる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;追加したコード&lt;/div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;top&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_visible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;right&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_visible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;details&gt;
&lt;summary&gt;枠を消したコード全体&lt;/summary&gt;
&lt;p&gt;&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;font.family&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ricty diminished&amp;#34;&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="n"&gt;fig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_subplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;111&lt;/span&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;y_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;linewidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;marker&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;o&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;markersize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;8.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;legends&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;both&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_axisbelow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;top&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_visible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;False&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;right&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_visible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;result/004.png&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/003.png"
width="640"
height="480"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/003_hu_b2b21a197720bfe0.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/003_hu_e5bd1bc6a3d1e12f.png 1024w"
loading="lazy"
alt="Before : 補助線を引いたグラフ"
class="gallery-image"
data-flex-grow="133"
data-flex-basis="320px"
&gt;
&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/004.png"
width="640"
height="480"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/004_hu_752a6587a015f24e.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/004_hu_3050c3de7c9f84bd.png 1024w"
loading="lazy"
alt="After : 枠を消したグラフ"
class="gallery-image"
data-flex-grow="133"
data-flex-basis="320px"
&gt;&lt;/p&gt;
&lt;h3 id="枠線を太くする"&gt;
枠線を太くする&lt;a href="#%e6%9e%a0%e7%b7%9a%e3%82%92%e5%a4%aa%e3%81%8f%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;逆に表示する枠線は、枠線が引いてあるのがわかりやすくなるよう太くする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;追加したコード&lt;/div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_linewidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;bottom&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_linewidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;details&gt;
&lt;summary&gt;枠線を太くしたコード全体&lt;/summary&gt;
&lt;p&gt;&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;font.family&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ricty diminished&amp;#34;&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="n"&gt;fig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_subplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;111&lt;/span&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;y_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;linewidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;marker&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;o&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;markersize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;8.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;legends&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;both&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_axisbelow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;top&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_visible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;right&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_visible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;False&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_linewidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;bottom&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_linewidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;result/005.png&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/004.png"
width="640"
height="480"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/004_hu_752a6587a015f24e.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/004_hu_3050c3de7c9f84bd.png 1024w"
loading="lazy"
alt="Before : 枠を消したグラフ"
class="gallery-image"
data-flex-grow="133"
data-flex-basis="320px"
&gt;
&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/005.png"
width="640"
height="480"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/005_hu_b678a1e9d944cc99.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/005_hu_3dc3d61e75e3e185.png 1024w"
loading="lazy"
alt="After : 枠線を太くしたグラフ"
class="gallery-image"
data-flex-grow="133"
data-flex-basis="320px"
&gt;&lt;/p&gt;
&lt;h3 id="目盛りを内側にする"&gt;
目盛りを内側にする&lt;a href="#%e7%9b%ae%e7%9b%9b%e3%82%8a%e3%82%92%e5%86%85%e5%81%b4%e3%81%ab%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;デフォルトでは外側になっている目盛り線を内側にする。
正直これは好みだと思う。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;追加したコード&lt;/div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;which&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;both&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;direction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;in&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;details&gt;
&lt;summary&gt;目盛りを内側にしたコード全体&lt;/summary&gt;
&lt;p&gt;&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;font.family&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ricty diminished&amp;#34;&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="n"&gt;fig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_subplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;111&lt;/span&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;y_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;linewidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;marker&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;o&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;markersize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;8.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;legends&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;both&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_axisbelow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;which&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;both&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;direction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;in&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;top&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_visible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;right&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_visible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_linewidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;bottom&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_linewidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;result/006.png&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/005.png"
width="640"
height="480"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/005_hu_b678a1e9d944cc99.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/005_hu_3dc3d61e75e3e185.png 1024w"
loading="lazy"
alt="Before : 枠線を太くしたグラフ"
class="gallery-image"
data-flex-grow="133"
data-flex-basis="320px"
&gt;
&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/006.png"
width="640"
height="480"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/006_hu_b5f958227a75a7d7.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/006_hu_db620ef3f2a7dea7.png 1024w"
loading="lazy"
alt="After : 目盛りを内側にしたグラフ"
class="gallery-image"
data-flex-grow="133"
data-flex-basis="320px"
&gt;&lt;/p&gt;
&lt;h3 id="凡例をグラフに埋め込む"&gt;
凡例をグラフに埋め込む&lt;a href="#%e5%87%a1%e4%be%8b%e3%82%92%e3%82%b0%e3%83%a9%e3%83%95%e3%81%ab%e5%9f%8b%e3%82%81%e8%be%bc%e3%82%80"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;プレゼンでは、凡例とグラフを行ったり来たりするのはあまりよくない。そのため、凡例をグラフに埋め込む。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;削除したコード&lt;/div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="c1"&gt;# ax.legend(legends)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;追加したコード&lt;/div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;colors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;axes.prop_cycle&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;by_key&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;legend&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;legends&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x_loc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.04&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x_loc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_data&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;center&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;details&gt;
&lt;summary&gt;凡例をグラフに埋め込んだコード全体&lt;/summary&gt;
&lt;p&gt;&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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 hl"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;colors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;axes.prop_cycle&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;by_key&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&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="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;font.family&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ricty diminished&amp;#34;&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="n"&gt;fig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_subplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;111&lt;/span&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;y_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;linewidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;marker&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;o&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;markersize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;8.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_label&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="cl"&gt;&lt;span class="c1"&gt;# ax.legend(legends)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;legend&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;legends&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="cl"&gt; &lt;span class="n"&gt;x_loc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.04&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&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="cl"&gt; &lt;span class="n"&gt;x_loc&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="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_data&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&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="cl"&gt; &lt;span class="n"&gt;legend&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="cl"&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&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="cl"&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;center&amp;#34;&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="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;both&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_axisbelow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;which&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;both&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;direction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;in&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;top&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_visible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;right&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_visible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_linewidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;bottom&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_linewidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;result/007.png&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/006.png"
width="640"
height="480"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/006_hu_b5f958227a75a7d7.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/006_hu_db620ef3f2a7dea7.png 1024w"
loading="lazy"
alt="Before : 目盛りを内側にしたグラフ"
class="gallery-image"
data-flex-grow="133"
data-flex-basis="320px"
&gt;
&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/007.png"
width="640"
height="480"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/007_hu_38f493afe4170aff.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/007_hu_1055083753f6b41a.png 1024w"
loading="lazy"
alt="After : 凡例を埋め込んだグラフ"
class="gallery-image"
data-flex-grow="133"
data-flex-basis="320px"
&gt;&lt;/p&gt;
&lt;h3 id="文字の大きさを変更する"&gt;
文字の大きさを変更する&lt;a href="#%e6%96%87%e5%ad%97%e3%81%ae%e5%a4%a7%e3%81%8d%e3%81%95%e3%82%92%e5%a4%89%e6%9b%b4%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;文字の大きさを見やすいように変更する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;追加したコード&lt;/div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;fontsize_title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;32.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;24.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fontsize_legend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;24.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fontsize_tick&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;18.0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;変更したコード&lt;/div&gt;
&lt;div class="code-block-content"&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 hl"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_title&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;legend&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;legends&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x_loc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.04&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x_loc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_data&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;center&amp;#34;&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="cl"&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_legend&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labelsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_tick&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labelsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_tick&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;なお、文字の大きさを変更すると、&lt;code&gt;fig.savefig&lt;/code&gt;で保存した際に見切れてしまう。
それを阻止するために、&lt;code&gt;fig.savefig&lt;/code&gt;する際は下記を追記する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;変更したコード&lt;/div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;result/008.png&amp;#34;&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="cl"&gt; &lt;span class="n"&gt;bbox_inches&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;tight&amp;#34;&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="cl"&gt; &lt;span class="n"&gt;pad_inches&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;details&gt;
&lt;summary&gt;文字の大きさを変更したコード全体&lt;/summary&gt;
&lt;p&gt;&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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 hl"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fontsize_title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;32.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;24.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fontsize_legend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;24.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fontsize_tick&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;18.0&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="n"&gt;colors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;axes.prop_cycle&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;by_key&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&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="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;font.family&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ricty diminished&amp;#34;&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="n"&gt;fig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_subplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;111&lt;/span&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;y_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;linewidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;marker&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;o&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;markersize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;8.0&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_title&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;legend&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;legends&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x_loc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.04&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x_loc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_data&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;center&amp;#34;&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="cl"&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_legend&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labelsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_tick&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labelsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_tick&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;both&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_axisbelow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;which&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;both&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;direction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;in&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;top&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_visible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;right&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_visible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_linewidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;bottom&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_linewidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;result/008.png&amp;#34;&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="cl"&gt; &lt;span class="n"&gt;bbox_inches&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;tight&amp;#34;&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="cl"&gt; &lt;span class="n"&gt;pad_inches&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/007.png"
width="640"
height="480"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/007_hu_38f493afe4170aff.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/007_hu_1055083753f6b41a.png 1024w"
loading="lazy"
alt="Before : 凡例を埋め込んだグラフ"
class="gallery-image"
data-flex-grow="133"
data-flex-basis="320px"
&gt;
&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/008.png"
width="609"
height="488"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/008_hu_3b9c6c1bd3ecac15.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/008_hu_55fd12eb075af6e4.png 1024w"
loading="lazy"
alt="After : 文字の大きさを変更したグラフ"
class="gallery-image"
data-flex-grow="124"
data-flex-basis="299px"
&gt;&lt;/p&gt;
&lt;h3 id="文字とグラフの間隔を変更する"&gt;
文字とグラフの間隔を変更する&lt;a href="#%e6%96%87%e5%ad%97%e3%81%a8%e3%82%b0%e3%83%a9%e3%83%95%e3%81%ae%e9%96%93%e9%9a%94%e3%82%92%e5%a4%89%e6%9b%b4%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;文字とグラフが詰まっている感じをなくす。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;変更したコード&lt;/div&gt;
&lt;div class="code-block-content"&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 hl"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_title&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.75&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labelpad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.75&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labelpad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&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 hl"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labelsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_tick&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;4.5&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labelsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_tick&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;4.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;details&gt;
&lt;summary&gt;文字とグラフの間隔を変更したコード全体&lt;/summary&gt;
&lt;p&gt;&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;fontsize_title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;32.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;24.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fontsize_legend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;24.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fontsize_tick&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;18.0&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="n"&gt;colors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;axes.prop_cycle&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;by_key&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&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="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;font.family&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ricty diminished&amp;#34;&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="n"&gt;fig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_subplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;111&lt;/span&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;y_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;linewidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;marker&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;o&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;markersize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;8.0&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_title&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.75&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labelpad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.75&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labelpad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;legend&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;legends&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x_loc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.04&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x_loc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_data&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;center&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_legend&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labelsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_tick&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;4.5&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labelsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_tick&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;4.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;both&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_axisbelow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;which&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;both&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;direction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;in&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;top&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_visible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;right&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_visible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_linewidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;bottom&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_linewidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;result/009.png&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;bbox_inches&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;tight&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pad_inches&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/008.png"
width="609"
height="488"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/008_hu_3b9c6c1bd3ecac15.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/008_hu_55fd12eb075af6e4.png 1024w"
loading="lazy"
alt="Before : 文字の大きさを変更したグラフ"
class="gallery-image"
data-flex-grow="124"
data-flex-basis="299px"
&gt;
&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/009.png"
width="630"
height="534"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/009_hu_209089463971ba72.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/009_hu_59ad07c32b279df2.png 1024w"
loading="lazy"
alt="After : 文字とグラフの間隔を変更したグラフ"
class="gallery-image"
data-flex-grow="117"
data-flex-basis="283px"
&gt;&lt;/p&gt;
&lt;h3 id="色を変更する"&gt;
色を変更する&lt;a href="#%e8%89%b2%e3%82%92%e5%a4%89%e6%9b%b4%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;背景色やグラフの色などを見やすい色に変更する。&lt;/p&gt;
&lt;p&gt;今回、グラフの色には、&lt;a class="link" href="https://jfly.uni-koeln.de/colorset/" target="_blank" rel="noopener"
&gt;カラーユニバーサルデザイン推奨配色セット制作委員会&lt;/a&gt;により制作された、&lt;a class="link" href="https://jfly.uni-koeln.de/colorset/CUD_color_set_GuideBook_2018.pdf" target="_blank" rel="noopener"
&gt;カラーユニバーサルデザイン推奨配色セットver.4&lt;/a&gt;を採用した&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;削除したコード&lt;/div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="c1"&gt;# colors = plt.rcParams[&amp;#34;axes.prop_cycle&amp;#34;].by_key()[&amp;#34;color&amp;#34;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;追加したコード&lt;/div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;color_face&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#fafafa&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;color_title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#282828&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;color_label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#282828&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;color_legend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#282828&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;color_grid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#c0c0c0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;color_tick&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#424242&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#005aff&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#f6aa00&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#03af7a&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#ff4b00&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#9467bd&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#804000&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#ff8082&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#84919e&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#fff100&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#4dc4ff&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color_tick&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;bottom&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color_tick&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;変更したコード&lt;/div&gt;
&lt;div class="code-block-content"&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 hl"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;facecolor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_face&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_subplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;111&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_facecolor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color_face&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_prop_cycle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cycler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&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="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_title&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.75&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="cl"&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;labelpad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.75&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="cl"&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;y_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;labelpad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.75&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="cl"&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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 hl"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labelsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_tick&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;4.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_tick&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labelsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_tick&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;4.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_tick&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;both&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_grid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;details&gt;
&lt;summary&gt;色を変更したコード全体&lt;/summary&gt;
&lt;p&gt;&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;fontsize_title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;32.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;24.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fontsize_legend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;24.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fontsize_tick&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;18.0&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 hl"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;color_face&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#fafafa&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;color_title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#282828&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;color_label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#282828&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;color_legend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#282828&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;color_grid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#c0c0c0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;color_tick&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#424242&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# NOTE: Reference :&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# https://www3.dic-global.com/dic-graphics/navi/color/pdf/cud_guidebook.pdf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&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="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#005aff&amp;#34;&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="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#f6aa00&amp;#34;&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="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#03af7a&amp;#34;&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="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#ff4b00&amp;#34;&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="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#9467bd&amp;#34;&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="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#804000&amp;#34;&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="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#ff8082&amp;#34;&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="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#84919e&amp;#34;&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="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#fff100&amp;#34;&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="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#4dc4ff&amp;#34;&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="cl"&gt;&lt;span class="p"&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="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;font.family&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ricty diminished&amp;#34;&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 hl"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;facecolor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_face&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_subplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;111&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_facecolor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color_face&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_prop_cycle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cycler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;y_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;linewidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;marker&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;o&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;markersize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;8.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_title&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.75&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="cl"&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;labelpad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.75&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="cl"&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;y_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;labelpad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.75&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="cl"&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;legend&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;legends&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x_loc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.04&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x_loc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_data&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;center&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_legend&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labelsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_tick&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;4.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_tick&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labelsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_tick&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;4.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_tick&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;both&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_grid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_axisbelow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;which&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;both&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;direction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;in&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;top&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_visible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;right&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_visible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_linewidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;bottom&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_linewidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color_tick&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;bottom&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color_tick&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;result/010.png&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;bbox_inches&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;tight&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pad_inches&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/009.png"
width="630"
height="534"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/009_hu_209089463971ba72.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/009_hu_59ad07c32b279df2.png 1024w"
loading="lazy"
alt="Before : 文字とグラフの間隔を変更したグラフ"
class="gallery-image"
data-flex-grow="117"
data-flex-basis="283px"
&gt;
&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/010.png"
width="630"
height="534"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/010_hu_b24603b015cfda4b.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/010_hu_88fd6091ee71feb9.png 1024w"
loading="lazy"
alt="After : 色を変更したグラフ"
class="gallery-image"
data-flex-grow="117"
data-flex-basis="283px"
&gt;&lt;/p&gt;
&lt;h3 id="あるデータだけ強調する"&gt;
あるデータだけ強調する&lt;a href="#%e3%81%82%e3%82%8b%e3%83%87%e3%83%bc%e3%82%bf%e3%81%a0%e3%81%91%e5%bc%b7%e8%aa%bf%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;折れ線グラフの中で注目してほしいデータにだけ色を付ける。
こうすることで、グラフによるメッセージを明確にしやすくなる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;追加したコード&lt;/div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;focus_indexes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;focus_color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;not_focus_color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#c3c3c3&amp;#34;&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="n"&gt;data_num&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;not_focus_color&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;data_num&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;z_orders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;data_num&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;font_weights&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;normal&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;data_num&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="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;focus_indexes&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;focus_indexes&lt;/span&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;focus_index&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;focus_indexes&lt;/span&gt;&lt;span class="p"&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;if&lt;/span&gt; &lt;span class="n"&gt;data_num&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;focus_index&lt;/span&gt;&lt;span class="p"&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;raise&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#34;focus_index&amp;#34; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;focus_index&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt; is out of range.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;focus_index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;focus_color&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;z_orders&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;focus_index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;font_weights&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;focus_index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;bold&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;変更したコード&lt;/div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;linewidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;marker&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;o&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;markersize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;8.0&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="cl"&gt; &lt;span class="n"&gt;zorder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;z_orders&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;legend&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;legends&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x_loc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.04&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x_loc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_data&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;center&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_legend&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="cl"&gt; &lt;span class="n"&gt;fontweight&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;font_weights&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&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="cl"&gt; &lt;span class="n"&gt;zorder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;z_orders&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;details&gt;
&lt;summary&gt;あるデータだけ強調したコード全体&lt;/summary&gt;
&lt;p&gt;&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;fontsize_title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;32.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;24.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fontsize_legend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;24.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fontsize_tick&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;18.0&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="n"&gt;color_face&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#fafafa&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;color_title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#282828&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;color_label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#282828&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;color_legend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#282828&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;color_grid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#c0c0c0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;color_tick&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#424242&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#005aff&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#f6aa00&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#03af7a&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#ff4b00&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#9467bd&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#804000&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#ff8082&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#84919e&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#fff100&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#4dc4ff&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;focus_indexes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&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="cl"&gt;&lt;span class="n"&gt;focus_color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&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="cl"&gt;&lt;span class="n"&gt;not_focus_color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#c3c3c3&amp;#34;&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="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;font.family&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ricty diminished&amp;#34;&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 hl"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;data_num&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_data&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="cl"&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;not_focus_color&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;data_num&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;z_orders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;data_num&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;font_weights&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;normal&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;data_num&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;focus_indexes&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;focus_indexes&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="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;focus_index&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;focus_indexes&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="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;data_num&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;focus_index&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="cl"&gt; &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#34;focus_index&amp;#34; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;focus_index&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt; is out of range.&amp;#39;&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="cl"&gt; &lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;focus_index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;focus_color&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;z_orders&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;focus_index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;font_weights&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;focus_index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;bold&amp;#34;&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="n"&gt;fig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;facecolor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_face&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_subplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;111&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_facecolor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color_face&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_prop_cycle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cycler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;linewidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;marker&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;o&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;markersize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;8.0&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="cl"&gt; &lt;span class="n"&gt;zorder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;z_orders&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_title&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;labelpad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;y_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;labelpad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;legend&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;legends&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x_loc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.04&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x_loc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_data&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;center&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_legend&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="cl"&gt; &lt;span class="n"&gt;fontweight&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;font_weights&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&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="cl"&gt; &lt;span class="n"&gt;zorder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;z_orders&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labelsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_tick&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;4.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_tick&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labelsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_tick&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;4.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_tick&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;both&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_grid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_axisbelow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;which&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;both&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;direction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;in&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;top&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_visible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;right&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_visible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_linewidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;bottom&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_linewidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color_tick&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;bottom&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color_tick&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;result/011.png&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;bbox_inches&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;tight&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pad_inches&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/010.png"
width="630"
height="534"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/010_hu_b24603b015cfda4b.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/010_hu_88fd6091ee71feb9.png 1024w"
loading="lazy"
alt="Before : 色を変更したグラフ"
class="gallery-image"
data-flex-grow="117"
data-flex-basis="283px"
&gt;
&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/011.png"
width="630"
height="534"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/011_hu_620eb9caa68b7ee1.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/011_hu_df3e8c502a104906.png 1024w"
loading="lazy"
alt="After : あるデータだけ強調したグラフ"
class="gallery-image"
data-flex-grow="117"
data-flex-basis="283px"
&gt;&lt;/p&gt;
&lt;h3 id="タイトルの位置を下にする"&gt;
タイトルの位置を下にする&lt;a href="#%e3%82%bf%e3%82%a4%e3%83%88%e3%83%ab%e3%81%ae%e4%bd%8d%e7%bd%ae%e3%82%92%e4%b8%8b%e3%81%ab%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;グラフのタイトルは下に表示するのが慣例であるため、タイトルの位置を上から下に変更する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;変更したコード&lt;/div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_title&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_title&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="cl"&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mf"&gt;0.45&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;なお、&lt;code&gt;matplotlib&lt;/code&gt;では、タイトルの位置はグラフに対する相対位置でしか指定できない。
そのため、文字の大きさやグラフの大きさによってちょうどいいタイトルの位置は変化してしまう。
ゆえに、これに関しては、グラフごとに適宜指定するしかない。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;タイトルの位置を下にしたコード全体&lt;/summary&gt;
&lt;p&gt;&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;fontsize_title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;32.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;24.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fontsize_legend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;24.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fontsize_tick&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;18.0&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="n"&gt;color_face&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#fafafa&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;color_title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#282828&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;color_label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#282828&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;color_legend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#282828&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;color_grid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#c0c0c0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;color_tick&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#424242&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#005aff&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#f6aa00&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#03af7a&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#ff4b00&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#9467bd&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#804000&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#ff8082&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#84919e&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#fff100&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#4dc4ff&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;focus_indexes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;focus_color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;not_focus_color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#c3c3c3&amp;#34;&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="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;font.family&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ricty diminished&amp;#34;&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="n"&gt;data_num&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;not_focus_color&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;data_num&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;z_orders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;data_num&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;font_weights&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;normal&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;data_num&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="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;focus_indexes&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;focus_indexes&lt;/span&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;focus_index&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;focus_indexes&lt;/span&gt;&lt;span class="p"&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;if&lt;/span&gt; &lt;span class="n"&gt;data_num&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;focus_index&lt;/span&gt;&lt;span class="p"&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;raise&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#34;focus_index&amp;#34; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;focus_index&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt; is out of range.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;focus_index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;focus_color&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;z_orders&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;focus_index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;font_weights&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;focus_index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;bold&amp;#34;&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="n"&gt;fig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;facecolor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_face&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_subplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;111&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_facecolor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color_face&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_prop_cycle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cycler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;linewidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;marker&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;o&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;markersize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;8.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;zorder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;z_orders&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_title&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_title&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="cl"&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mf"&gt;0.45&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;labelpad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;y_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;labelpad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;legend&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;legends&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x_loc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.04&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x_loc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_data&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;center&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_legend&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fontweight&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;font_weights&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;zorder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;z_orders&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labelsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_tick&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;4.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_tick&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labelsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_tick&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;4.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_tick&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;both&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_grid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_axisbelow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;which&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;both&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;direction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;in&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;top&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_visible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;right&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_visible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_linewidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;bottom&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_linewidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color_tick&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;bottom&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color_tick&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;result/012.png&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;bbox_inches&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;tight&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pad_inches&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/011.png"
width="630"
height="534"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/011_hu_620eb9caa68b7ee1.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/011_hu_df3e8c502a104906.png 1024w"
loading="lazy"
alt="Before : あるデータだけ強調したグラフ"
class="gallery-image"
data-flex-grow="117"
data-flex-basis="283px"
&gt;
&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/012.png"
width="630"
height="529"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/012_hu_88abc492c277c2e0.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/012_hu_8af0ecac02cfa742.png 1024w"
loading="lazy"
alt="After : タイトルの位置を下にしたグラフ"
class="gallery-image"
data-flex-grow="119"
data-flex-basis="285px"
&gt;&lt;/p&gt;
&lt;h2 id="最終的にできたコード"&gt;
最終的にできたコード&lt;a href="#%e6%9c%80%e7%b5%82%e7%9a%84%e3%81%ab%e3%81%a7%e3%81%8d%e3%81%9f%e3%82%b3%e3%83%bc%e3%83%89"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;これで最初に示した結論と同じコードができた。とても長い。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Afterのグラフを表示するコード&lt;/summary&gt;
&lt;p&gt;&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;matplotlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pyplot&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;numpy.typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ArrayLike&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;cycler&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cycler&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="n"&gt;fontsize_title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;32.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;24.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fontsize_legend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;24.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fontsize_tick&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;18.0&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="n"&gt;color_face&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#fafafa&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;color_title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#282828&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;color_label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#282828&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;color_legend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#282828&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;color_grid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#c0c0c0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;color_tick&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#424242&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#005aff&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#f6aa00&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#03af7a&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#ff4b00&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#9467bd&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#804000&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#ff8082&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#84919e&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#fff100&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#4dc4ff&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;focus_indexes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;focus_color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;not_focus_color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#c3c3c3&amp;#34;&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="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;font.family&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ricty diminished&amp;#34;&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="n"&gt;data_num&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;not_focus_color&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;data_num&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;z_orders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;data_num&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;font_weights&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;normal&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;data_num&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="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;focus_indexes&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;focus_indexes&lt;/span&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;focus_index&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;focus_indexes&lt;/span&gt;&lt;span class="p"&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;if&lt;/span&gt; &lt;span class="n"&gt;data_num&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;focus_index&lt;/span&gt;&lt;span class="p"&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;raise&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#34;focus_index&amp;#34; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;focus_index&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt; is out of range.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;focus_index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;focus_color&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;z_orders&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;focus_index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;font_weights&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;focus_index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;bold&amp;#34;&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="n"&gt;fig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;facecolor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_face&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_subplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;111&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_facecolor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color_face&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_prop_cycle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cycler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;linewidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;marker&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;o&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;markersize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;8.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;zorder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;z_orders&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_title&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mf"&gt;0.45&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;labelpad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;y_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;labelpad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_label&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;legend&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;legends&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x_loc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.04&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x_loc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_data&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;center&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_legend&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fontweight&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;font_weights&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;zorder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;z_orders&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labelsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_tick&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;4.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_tick&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labelsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_tick&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;4.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_tick&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;both&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_grid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_axisbelow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;which&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;both&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;direction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;in&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;top&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_visible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;right&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_visible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_linewidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;bottom&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_linewidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;left&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color_tick&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;bottom&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color_tick&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;result/012.png&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;bbox_inches&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;tight&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pad_inches&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/012.png"
width="630"
height="529"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/012_hu_88abc492c277c2e0.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/012_hu_8af0ecac02cfa742.png 1024w"
loading="lazy"
alt="最終的にできたグラフ"
class="gallery-image"
data-flex-grow="119"
data-flex-basis="285px"
&gt;&lt;/p&gt;
&lt;h2 id="ちなみに"&gt;
ちなみに&lt;a href="#%e3%81%a1%e3%81%aa%e3%81%bf%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="凡例を埋め込みたくない場合"&gt;
凡例を埋め込みたくない場合&lt;a href="#%e5%87%a1%e4%be%8b%e3%82%92%e5%9f%8b%e3%82%81%e8%be%bc%e3%81%bf%e3%81%9f%e3%81%8f%e3%81%aa%e3%81%84%e5%a0%b4%e5%90%88"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;凡例をグラフに埋め込みたくない場合は、凡例を外に出すとよい。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;削除したコード&lt;/div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="c1"&gt;# for index, legend in enumerate(legends):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# x_loc: float = (len(x_data) - 1.0) + len(x_data) * 0.04&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ax.text(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# x_loc,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ax.lines[index].get_data()[1][-1],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# legend,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# color=colors[index],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# va=&amp;#34;center&amp;#34;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# fontsize=fontsize_legend,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# fontweight=font_weights[index],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# zorder=z_orders[index],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# )&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;追加したコード&lt;/div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;legends&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fancybox&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;bbox_to_anchor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.02&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;upper left&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fontsize_legend&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;facecolor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_face&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;labelcolor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_legend&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;edgecolor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color_tick&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;framealpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/012.png"
width="630"
height="529"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/012_hu_88abc492c277c2e0.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/012_hu_8af0ecac02cfa742.png 1024w"
loading="lazy"
alt="凡例を埋め込んだグラフ"
class="gallery-image"
data-flex-grow="119"
data-flex-basis="285px"
&gt;
&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/013-a.png"
width="776"
height="529"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/013-a_hu_fa2d0ddc4eae2c8c.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/013-a_hu_84b7cb7fb04596bf.png 1024w"
loading="lazy"
alt="凡例を埋め込まず外に出したグラフ"
class="gallery-image"
data-flex-grow="146"
data-flex-basis="352px"
&gt;&lt;/p&gt;
&lt;h3 id="背景を透明にしたい場合"&gt;
背景を透明にしたい場合&lt;a href="#%e8%83%8c%e6%99%af%e3%82%92%e9%80%8f%e6%98%8e%e3%81%ab%e3%81%97%e3%81%9f%e3%81%84%e5%a0%b4%e5%90%88"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;背景をプレゼン資料の背景と合わせるには、背景色を指定するほかに、保存時に背景を透明にするという手もある。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;変更したコード&lt;/div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;result/013-b.&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;fig_ext&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;bbox_inches&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;tight&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pad_inches&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.1&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="cl"&gt; &lt;span class="n"&gt;transparent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/012.png"
width="630"
height="529"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/012_hu_88abc492c277c2e0.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/012_hu_8af0ecac02cfa742.png 1024w"
loading="lazy"
alt="背景色を指定したグラフ"
class="gallery-image"
data-flex-grow="119"
data-flex-basis="285px"
&gt;
&lt;img src="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/013-b.png"
width="630"
height="529"
srcset="https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/013-b_hu_6c859a02533cd7b9.png 480w, https://notes.nakurei.com/post/create-line-graph-4-presentation-using-matplotlib/013-b_hu_59eb48c376a8e649.png 1024w"
loading="lazy"
alt="背景を透明にしたグラフ"
class="gallery-image"
data-flex-grow="119"
data-flex-basis="285px"
&gt;&lt;/p&gt;
&lt;h2 id="おわりに"&gt;
おわりに&lt;a href="#%e3%81%8a%e3%82%8f%e3%82%8a%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="link" href="https://pypi.org/project/rei-preso-plot/" target="_blank" rel="noopener"
&gt;この長々したコードをいちいちコピペして加工するのが面倒になったので、パッケージ化した&lt;/a&gt;。
&lt;a class="link" href="https://pypi.org/project/PyCoolPlot/#description" target="_blank" rel="noopener"
&gt;PyCoolPlot&lt;/a&gt;もいいぞ。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://tsutawarudesign.com/miyasuku1.html" target="_blank" rel="noopener"
&gt;表とグラフ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://twitter.com/i/events/1023047114689892353?lang=el" target="_blank" rel="noopener"
&gt;(1) データ視覚化のデザイン図解まとめ / Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://towardsdatascience.com/customizing-plots-with-python-matplotlib-bcf02691931f" target="_blank" rel="noopener"
&gt;Customizing Plots with Python Matplotlib | by Carolina Bento | Towards Data Science&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/MENDY/items/fe9b0c50383d8b2fd919" target="_blank" rel="noopener"
&gt;Matplotlibで綺麗な論文用のグラフを作る - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;これは&lt;a class="link" href="https://jfly.uni-koeln.de/colorset/CUD_color_set_GuideBook_2018.pdf" target="_blank" rel="noopener"
&gt;カラーユニバーサルデザイン推奨配色セット ガイドブック 第2版&lt;/a&gt;に載っている。&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Hugoの記事で画像を横に2枚以上並べる方法</title><link>https://notes.nakurei.com/post/how-2-arrange-images-side-by-side-in-hugo/</link><pubDate>Sat, 04 Feb 2023 18:41:24 +0900</pubDate><guid>https://notes.nakurei.com/post/how-2-arrange-images-side-by-side-in-hugo/</guid><description>&lt;img src="https://notes.nakurei.com/img/header/website_img.webp" alt="Featured image of post Hugoの記事で画像を横に2枚以上並べる方法" /&gt;&lt;p&gt;Hugoの記事で画像を横に2枚以上並べるには、画像の記述を空行を入れずに並べればよい。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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;![](a.png)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;![](b.png)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;たったこれだけのことなのに無駄に調べるのに時間をかけたため、備忘録として残しておく。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://discourse.gohugo.io/t/putting-image-side-by-side/3926/2" target="_blank" rel="noopener"
&gt;Putting image side by side - support - HUGO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>初心者が取り組むはじめてのPythonコードデバッグ @ VS Code</title><link>https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/</link><pubDate>Sat, 04 Feb 2023 08:56:34 +0900</pubDate><guid>https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/</guid><description>&lt;img src="https://notes.nakurei.com/img/header/python_img.webp" alt="Featured image of post 初心者が取り組むはじめてのPythonコードデバッグ @ VS Code" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;VS Codeに&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=ms-python.python" target="_blank" rel="noopener"
&gt;Pythonの拡張機能&lt;/a&gt;を入れると、VS CodeでPythonコードをデバッグできるようになる。
ただ、この機能をきちんと使ったことがないため、すこし使ってみた。
その際やったことを記録しておく。&lt;/p&gt;
&lt;h2 id="環境--前提条件"&gt;
環境 | 前提条件&lt;a href="#%e7%92%b0%e5%a2%83--%e5%89%8d%e6%8f%90%e6%9d%a1%e4%bb%b6"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Visual Studio Code
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=ms-python.python" target="_blank" rel="noopener"
&gt;Pythonの拡張機能&lt;/a&gt;をインストール済み&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Python 3.11.1
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/NakuRei/python-base-env-with-docker" target="_blank" rel="noopener"
&gt;すべてのコード/環境はこちら&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="対象とするpythonコード"&gt;
対象とするPythonコード&lt;a href="#%e5%af%be%e8%b1%a1%e3%81%a8%e3%81%99%e3%82%8bpython%e3%82%b3%e3%83%bc%e3%83%89"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;次のPythonコードをデバッグの対象とする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;src/main.py&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_to_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i_list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&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;list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;i_list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&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;return&lt;/span&gt; &lt;span class="n"&gt;i_list&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;add_to_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;add_to_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;add_to_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;リストに値を追加するだけの関数である。
追加用のリストが指定されない場合は、空のリストに与えられた値を追加したい。
すなわち、理想の出力は下記である。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;理想の出力&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ python src/main.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;2&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;3&lt;span class="o"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;しかし、これをそのまま実行すると下記の結果が得られる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;実際の出力&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ python src/main.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;1, 2&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;1, 2, 3&lt;span class="o"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;おかしいなあ…。なんでぇ…？&lt;/p&gt;
&lt;h2 id="デバッグする"&gt;
デバッグする&lt;a href="#%e3%83%87%e3%83%90%e3%83%83%e3%82%b0%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;何が想定通りに動いていないのかを見る。&lt;/p&gt;
&lt;h3 id="ブレークポイントを打つ"&gt;
ブレークポイントを打つ&lt;a href="#%e3%83%96%e3%83%ac%e3%83%bc%e3%82%af%e3%83%9d%e3%82%a4%e3%83%b3%e3%83%88%e3%82%92%e6%89%93%e3%81%a4"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;最初に、詳細を確認したいところにブレークポイントというものを打つ。
VS Codeでブレークポイントを打つには、打ちたい行の左側をクリックするか、その行にカーソルを合わせてF9を押す。&lt;/p&gt;
&lt;p&gt;今回は、&lt;code&gt;add_to_list()&lt;/code&gt;の結果を&lt;code&gt;print&lt;/code&gt;するところに打ってみる。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204092914.png"
width="866"
height="407"
srcset="https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204092914_hu_5d9a08da7d1a077c.png 480w, https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204092914_hu_2caf4a74230e0892.png 1024w"
loading="lazy"
alt="ブレークポイントを打つ前"
class="gallery-image"
data-flex-grow="212"
data-flex-basis="510px"
&gt;
&lt;img src="https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204092942.png"
width="902"
height="410"
srcset="https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204092942_hu_a455275beac741da.png 480w, https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204092942_hu_ded2d559640ab584.png 1024w"
loading="lazy"
alt="ブレークポイントを打った後"
class="gallery-image"
data-flex-grow="220"
data-flex-basis="528px"
&gt;&lt;/p&gt;
&lt;h3 id="デバッグモードで実行する"&gt;
デバッグモードで実行する&lt;a href="#%e3%83%87%e3%83%90%e3%83%83%e3%82%b0%e3%83%a2%e3%83%bc%e3%83%89%e3%81%a7%e5%ae%9f%e8%a1%8c%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;VS Codeに&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=ms-python.python" target="_blank" rel="noopener"
&gt;Pythonの拡張機能&lt;/a&gt;を入れていれば、エディタの左タブにある「デバッグして実行（Run and Debug）」タブが使える。Ctrl + Shift + Dでも開ける。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204095842.png"
width="758"
height="488"
srcset="https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204095842_hu_42415922369a3362.png 480w, https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204095842_hu_5bd29a4a5bef343.png 1024w"
loading="lazy"
alt="VS Codeのデバッグして実行（Run and Debug）タブ"
class="gallery-image"
data-flex-grow="155"
data-flex-basis="372px"
&gt;&lt;/p&gt;
&lt;p&gt;このタブの「デバッグして実行（Run and Debug）」ボタンをクリックすると、デバッグ構成を指定するよういわれる。
今回は「Pythonファイル」を選ぶ。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204095947.png"
width="1226"
height="558"
srcset="https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204095947_hu_bdd873c6d53458ae.png 480w, https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204095947_hu_c4b39f01c6e4072a.png 1024w"
loading="lazy"
alt="デバッグ構成の指定"
class="gallery-image"
data-flex-grow="219"
data-flex-basis="527px"
&gt;&lt;/p&gt;
&lt;p&gt;すると、Pythonコードが最初のブレークポイントの手前まで実行される。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204102238.png"
width="2048"
height="430"
srcset="https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204102238_hu_ac3d3dafe2cc8793.png 480w, https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204102238_hu_9c41f9fbfab5092c.png 1024w"
loading="lazy"
alt="最初のデバッグ実行時"
class="gallery-image"
data-flex-grow="476"
data-flex-basis="1143px"
&gt;&lt;/p&gt;
&lt;h3 id="コードをデバッグする"&gt;
コードをデバッグする&lt;a href="#%e3%82%b3%e3%83%bc%e3%83%89%e3%82%92%e3%83%87%e3%83%90%e3%83%83%e3%82%b0%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;デバッグモードで実行した時点では、まだ&lt;code&gt;print(add_to_list(1))&lt;/code&gt;が実行されていない。そのため、関数&lt;code&gt;add_to_list&lt;/code&gt;の変数などは定義されておらず、何も表示されない。&lt;/p&gt;
&lt;p&gt;この状態になったら、F11を押すか、下図のツールボックスの「ステップイン（Step Into）」をクリックする。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204100405.png"
width="409"
height="94"
srcset="https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204100405_hu_6d18b3540d3d684d.png 480w, https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204100405_hu_153544675f440e79.png 1024w"
loading="lazy"
alt="デバッグ用ツールボックス。左から3番目の下矢印がステップイン。"
class="gallery-image"
data-flex-grow="435"
data-flex-basis="1044px"
&gt;&lt;/p&gt;
&lt;p&gt;「ステップイン」は、その行が関数の場合、関数の中に入り、その関数の1行目の実行前まで進む。
その行が関数でない場合は、1行だけ実行し次の行へ進む。&lt;/p&gt;
&lt;p&gt;今回は&lt;code&gt;add_to_list&lt;/code&gt;関数でステップインを実行するため、&lt;code&gt;add_to_list&lt;/code&gt;の中に入り、その関数の1行目の実行前まで進むことになる。
すなわち、&lt;code&gt;i&lt;/code&gt;と&lt;code&gt;i_list&lt;/code&gt;が定義された状態に移行する。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204102658.png"
width="1561"
height="417"
srcset="https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204102658_hu_cfae222fec9a71c0.png 480w, https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204102658_hu_f8fd2837c505f991.png 1024w"
loading="lazy"
alt="ステップインした状態"
class="gallery-image"
data-flex-grow="374"
data-flex-basis="898px"
&gt;&lt;/p&gt;
&lt;p&gt;左側の&lt;code&gt;VARIABLES&lt;/code&gt;で、&lt;code&gt;i&lt;/code&gt;が&lt;code&gt;1&lt;/code&gt;、&lt;code&gt;i_list&lt;/code&gt;が&lt;code&gt;[]&lt;/code&gt;であると確認できる。
これは想定通りの動作である。&lt;/p&gt;
&lt;p&gt;次に、この状態で「ステップオーバー」を実行する。
「ステップオーバー」を実行するには、F10を押すか、下図のツールボックスの「ステップオーバー（Step Over）」をクリックする。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204101859.png"
width="429"
height="105"
srcset="https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204101859_hu_44614284a64b262d.png 480w, https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204101859_hu_514f6356c09d4539.png 1024w"
loading="lazy"
alt="デバッグ用ツールボックス。左から2番目の時計回り矢印がステップオーバー。"
class="gallery-image"
data-flex-grow="408"
data-flex-basis="980px"
&gt;&lt;/p&gt;
&lt;p&gt;「ステップオーバー」を実行すると、その行が関数か否かにかかわらず1行を実行し、次の行の実行前まで進む。
今回の場合は&lt;code&gt;i_list.append(i)&lt;/code&gt;だけが実行される。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204102737.png"
width="1553"
height="418"
srcset="https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204102737_hu_e7d64607a9a86cff.png 480w, https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204102737_hu_8ecf6fa89320a3d4.png 1024w"
loading="lazy"
alt="ステップオーバーした状態"
class="gallery-image"
data-flex-grow="371"
data-flex-basis="891px"
&gt;&lt;/p&gt;
&lt;p&gt;左側の&lt;code&gt;VARIABLES&lt;/code&gt;で、&lt;code&gt;i_list&lt;/code&gt;が&lt;code&gt;[]&lt;/code&gt;から&lt;code&gt;[1]&lt;/code&gt;に変化した。
&lt;code&gt;i&lt;/code&gt;が&lt;code&gt;i_list&lt;/code&gt;にきちんと追加されている。&lt;/p&gt;
&lt;p&gt;最初の呼び出しでは&lt;code&gt;add_to_list&lt;/code&gt;がきちんと動作しているとわかったため、次の呼び出しに進む。
次のブレークポイントまで進むには「続行」を実行する。「続行」を実行すると、現在の行から次のブレークポイントまでのコードを実行し、次のブレークポイントの前まで進める。&lt;/p&gt;
&lt;p&gt;「続行」するには、F5を押すか、「続行（Continue）」をクリックする。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230205154059.png"
width="370"
height="74"
srcset="https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230205154059_hu_55f0eaa14e8478d4.png 480w, https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230205154059_hu_7cb4fa55563e778f.png 1024w"
loading="lazy"
alt="デバッグ用ツールボックス。一番左の右矢印が続行。"
class="gallery-image"
data-flex-grow="500"
data-flex-basis="1200px"
&gt;&lt;/p&gt;
&lt;p&gt;これで、次のブレークポイント、すなわち2回目の&lt;code&gt;add_to_list&lt;/code&gt;呼び出し前まで進む。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204102825.png"
width="1553"
height="407"
srcset="https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204102825_hu_49153a643b9dc042.png 480w, https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204102825_hu_fd0d3534b531a57a.png 1024w"
loading="lazy"
alt="続行した後の状態"
class="gallery-image"
data-flex-grow="381"
data-flex-basis="915px"
&gt;&lt;/p&gt;
&lt;p&gt;2回目の&lt;code&gt;add_to_list&lt;/code&gt;呼び出し前まで進んだので、「ステップイン」して呼び出しの中身を見てみる。F11を押すか、ツールボックスの「ステップイン（Step Into）」をクリックする。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204103954.png"
width="1543"
height="400"
srcset="https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204103954_hu_a0fe0481a998c974.png 480w, https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204103954_hu_b1eb4d0b59129c7f.png 1024w"
loading="lazy"
alt="2回目の呼び出しにステップインした状態"
class="gallery-image"
data-flex-grow="385"
data-flex-basis="925px"
&gt;&lt;/p&gt;
&lt;p&gt;左側の&lt;code&gt;VARIABLES&lt;/code&gt;を見る。すると、2回目の&lt;code&gt;add_to_list&lt;/code&gt;呼び出しでは、初期値の&lt;code&gt;i&lt;/code&gt;は&lt;code&gt;2&lt;/code&gt;だが、&lt;code&gt;i_list&lt;/code&gt;は空ではなく&lt;code&gt;[1]&lt;/code&gt;になってしまっているとわかる。
これは想定動作と異なる。想定では、&lt;code&gt;i_list&lt;/code&gt;を引数で指定していない場合は空のリストになってほしいのに、そうなっていないのだ。&lt;/p&gt;
&lt;p&gt;ちなみに、この状態でステップオーバーすると、&lt;code&gt;i_list&lt;/code&gt;に&lt;code&gt;2&lt;/code&gt;が追加され、&lt;code&gt;i_list&lt;/code&gt;は&lt;code&gt;[1, 2]&lt;/code&gt;となる。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204104819.png"
width="1564"
height="404"
srcset="https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204104819_hu_d958a6386f0263a8.png 480w, https://notes.nakurei.com/post/python-code-debugging-4-beginners-in-vs-code/20230204104819_hu_68891fe50b742a5c.png 1024w"
loading="lazy"
alt="ステップオーバーした状態"
class="gallery-image"
data-flex-grow="387"
data-flex-basis="929px"
&gt;&lt;/p&gt;
&lt;p&gt;すなわち、関数&lt;code&gt;add_to_list&lt;/code&gt;が想定通りの動作をしなかったのは、少なくとも2回目の&lt;code&gt;add_to_list&lt;/code&gt;の呼び出しの時点で、&lt;code&gt;i_list&lt;/code&gt;が空のリストに初期化されていないからだとわかる。&lt;/p&gt;
&lt;h3 id="コードを修正する"&gt;
コードを修正する&lt;a href="#%e3%82%b3%e3%83%bc%e3%83%89%e3%82%92%e4%bf%ae%e6%ad%a3%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;i_list&lt;/code&gt;が空のリストにきちんと初期化されていないのが原因であるから、きちんと初期化されるようにすればよい。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;src/main.py&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="hl"&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;/span&gt;&lt;span class="hl"&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;/span&gt;&lt;span class="hl"&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_to_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i_list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&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;list&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="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;i_list&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="kc"&gt;None&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="cl"&gt; &lt;span class="n"&gt;i_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;i_list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&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;return&lt;/span&gt; &lt;span class="n"&gt;i_list&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;add_to_list_2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;add_to_list_2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;add_to_list_2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これで想定通りの結果が得られる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;コード修正後の実際の出力&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ python src/main.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;2&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;3&lt;span class="o"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;やったね！&lt;/p&gt;
&lt;h2 id="おわりに"&gt;
おわりに&lt;a href="#%e3%81%8a%e3%82%8f%e3%82%8a%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;あくまで使ってみた機能は少しだけである。WATCHとかCALL STACKとかは使ってないのでよくわからない。
ただ、今回使ってみた機能だけでもわざわざ&lt;code&gt;print&lt;/code&gt;しなくてよくなるため、デバッグ効率が上がりそう。&lt;/p&gt;
&lt;h2 id="ちなみに"&gt;
ちなみに&lt;a href="#%e3%81%a1%e3%81%aa%e3%81%bf%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;今回のデバッグ対象コードの元ネタはこれ。&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;Python、値がリファレンスであるのと、デフォルト実引数が一度しか評価されないという仕様があいまって最悪の落とし穴が生まれている。&lt;a href="https://t.co/s7OqNfVxPw"&gt;https://t.co/s7OqNfVxPw&lt;/a&gt;&lt;/p&gt;&amp;mdash; 江添亮 (@EzoeRyou) &lt;a href="https://twitter.com/EzoeRyou/status/1529310828503044096?ref_src=twsrc%5Etfw"&gt;May 25, 2022&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;p&gt;この仕様を初めて知ったときは恐怖を覚えた。&lt;/p&gt;</description></item><item><title>Visual Studio CodeとDockerを使ってPython開発環境をちゃちゃっと構築する</title><link>https://notes.nakurei.com/post/how-2-set-up-python-env-with-docker-and-vs-code/</link><pubDate>Wed, 01 Feb 2023 19:42:18 +0900</pubDate><guid>https://notes.nakurei.com/post/how-2-set-up-python-env-with-docker-and-vs-code/</guid><description>&lt;img src="https://notes.nakurei.com/img/header/python_img.webp" alt="Featured image of post Visual Studio CodeとDockerを使ってPython開発環境をちゃちゃっと構築する" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="link" href="https://azure.microsoft.com/ja-jp/products/visual-studio-code" target="_blank" rel="noopener"
&gt;Visual Studio Code&lt;/a&gt;と&lt;a class="link" href="https://www.docker.com/" target="_blank" rel="noopener"
&gt;Docker&lt;/a&gt;を使った、&lt;a class="link" href="https://www.python.org/" target="_blank" rel="noopener"
&gt;Python&lt;/a&gt;開発環境の構築方法を述べる。&lt;/p&gt;
&lt;p&gt;本稿で説明する方法により構築した環境は&lt;a class="link" href="https://github.com/NakuRei/python-base-env-with-docker" target="_blank" rel="noopener"
&gt;GitHub&lt;/a&gt;にあげているため、参照してほしい。&lt;/p&gt;
&lt;h2 id="前提条件"&gt;
前提条件&lt;a href="#%e5%89%8d%e6%8f%90%e6%9d%a1%e4%bb%b6"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://azure.microsoft.com/ja-jp/products/visual-studio-code" target="_blank" rel="noopener"
&gt;Visual Studio Code&lt;/a&gt;をインストールしている&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.docker.com/" target="_blank" rel="noopener"
&gt;Docker&lt;/a&gt;を利用できる環境が整っている&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="筆者の環境"&gt;
筆者の環境&lt;a href="#%e7%ad%86%e8%80%85%e3%81%ae%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Visual Studio Code&lt;/li&gt;
&lt;li&gt;Docker Desktop for Windows&lt;/li&gt;
&lt;li&gt;Windows 11&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="環境構築方法"&gt;
環境構築方法&lt;a href="#%e7%92%b0%e5%a2%83%e6%a7%8b%e7%af%89%e6%96%b9%e6%b3%95"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;構築の流れは下記のとおりである。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;必要となるVS Codeの拡張機能をインストールする&lt;/li&gt;
&lt;li&gt;requirements.txtをつくる&lt;/li&gt;
&lt;li&gt;Dockerfileとdevcontainer.jsonをつくる&lt;/li&gt;
&lt;li&gt;VS Codeの機能でDockerfileをbuild&amp;amp;run&amp;amp;attachする&lt;/li&gt;
&lt;li&gt;開発を開始する&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="必要となるvs-codeの拡張機能をインストールする"&gt;
必要となるVS Codeの拡張機能をインストールする&lt;a href="#%e5%bf%85%e8%a6%81%e3%81%a8%e3%81%aa%e3%82%8bvs-code%e3%81%ae%e6%8b%a1%e5%bc%b5%e6%a9%9f%e8%83%bd%e3%82%92%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;今回はDockerコンテナ内にPython環境を構築し、VS Codeで開発する。
そのため、VS Codeを簡単にDockerコンテナにアタッチできるように、下記の拡張機能を入れる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers" target="_blank" rel="noopener"
&gt;Dev Containers - Visual Studio Marketplace&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="requirementstxtをつくる"&gt;
requirements.txtをつくる&lt;a href="#requirementstxt%e3%82%92%e3%81%a4%e3%81%8f%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;すでにインストールしたいPythonパッケージが決まっている場合、&lt;code&gt;requirements.txt&lt;/code&gt;ファイルを作成して、そこにパッケージ名を書き込む。
&lt;code&gt;requirements.txt&lt;/code&gt;ファイルを作成することで、&lt;code&gt;pip install -r requirements.txt&lt;/code&gt;コマンドにより、一括でPythonパッケージをインストールできる。
たとえば、``numpy&lt;code&gt;と&lt;/code&gt;matplotlib&lt;code&gt;をインストールしたいなら、&lt;/code&gt;requirements.txt`は次のようになる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;requirements.txt&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;numpy
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;matplotlib&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="dockerfileとdevcontainerjsonをつくる"&gt;
Dockerfileとdevcontainer.jsonをつくる&lt;a href="#dockerfile%e3%81%a8devcontainerjson%e3%82%92%e3%81%a4%e3%81%8f%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;.devcontainer&lt;/code&gt;ディレクトリを作り、そこに&lt;code&gt;Dockerfile&lt;/code&gt;をつくる。拡張子は要らない。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Dockerfile&lt;/code&gt;には下記の内容をコピペする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;Dockerfile&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Dockerfile" data-lang="Dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# ベースとなるDockerイメージ&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Pythonのバージョンを変更したい場合は&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# https://hub.docker.com/_/python から該当するものを指定する&lt;/span&gt;&lt;span class="err"&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;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;python:3.11-slim&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Dockerコンテナ内のユーザー名。好きな名前に変えて良い。&lt;/span&gt;&lt;span class="err"&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;ARG&lt;/span&gt; &lt;span class="nv"&gt;USERNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;user
&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="c"&gt;# この行以降はrootユーザーで実行される&lt;/span&gt;&lt;span class="err"&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;USER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;root&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 必要なパッケージをインストールする&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# locales : 言語の設定に必要&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# tzdata : タイムゾーンの設定に必要&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# git, ca-certificates, openssh-client : Dockerコンテナ内でgitを使うために必要&lt;/span&gt;&lt;span class="err"&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;RUN&lt;/span&gt; apt-get update -y &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;DEBIAN_FRONTEND&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;noninteractive &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; apt-get install -y --no-install-recommends &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; locales &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; tzdata &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; git &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ca-certificates &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; openssh-client &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get clean &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; rm -rf /var/lib/apt/lists/*&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 言語とタイムゾーンを日本に設定&lt;/span&gt;&lt;span class="err"&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;RUN&lt;/span&gt; locale-gen ja_JP.UTF-8 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; localedef -f UTF-8 -i ja_JP ja_JP.UTF-8&lt;span class="err"&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;ENV&lt;/span&gt; &lt;span class="nv"&gt;TZ&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Asia/Tokyo &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;LANG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ja_JP.UTF-8 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;LANGUAGE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ja_JP:jp &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;LC_ALL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ja_JP.UTF-8&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# pip関連update&lt;/span&gt;&lt;span class="err"&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;RUN&lt;/span&gt; pip install --upgrade pip&lt;span class="err"&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;RUN&lt;/span&gt; pip install --upgrade setuptools&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# この行以降は`WORKDIR`のディレクトリで実行される&lt;/span&gt;&lt;span class="err"&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;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/workspaces&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# requirements.txtに書かれたパッケージをインストール&lt;/span&gt;&lt;span class="err"&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;COPY&lt;/span&gt; ./requirements.txt requirements.txt&lt;span class="err"&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;RUN&lt;/span&gt; pip install -r requirements.txt&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# ユーザー作成&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# ユーザーを作成して設定しないとrootで作業してしまうため&lt;/span&gt;&lt;span class="err"&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;RUN&lt;/span&gt; groupadd -r &lt;span class="nv"&gt;$USERNAME&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; useradd -r -g &lt;span class="nv"&gt;$USERNAME&lt;/span&gt; &lt;span class="nv"&gt;$USERNAME&lt;/span&gt;&lt;span class="err"&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;RUN&lt;/span&gt; mkdir /home/&lt;span class="nv"&gt;$USERNAME&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# この行以降は`$USERNAME`ユーザーで実行される&lt;/span&gt;&lt;span class="err"&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;USER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;$USERNAME&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Dockerfileをビルドする際に必ずbashを起動する&lt;/span&gt;&lt;span class="err"&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;ENTRYPOINT&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/bin/bash&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;途中でGitをインストールしているが、これは必要なければ削除してよい。&lt;/p&gt;
&lt;p&gt;次に、同じ&lt;code&gt;.devcontainer&lt;/code&gt;ディレクトリに&lt;code&gt;devcontainer.json&lt;/code&gt;を作成し、下記をコピペする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;devcontainer.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;python-base-env-with-docker&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;build&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;dockerfile&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./Dockerfile&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;context&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;..&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;customizations&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;vscode&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;extensions&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;ms-python.python&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;ms-python.black-formatter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;ms-python.flake8&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;ms-python.isort&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;ms-python.mypy-type-checker&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;name&amp;quot;&lt;/code&gt;は任意の名前でよい。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;extensions&amp;quot;&lt;/code&gt;には、使いたいVS Codeの拡張機能を入れる。
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;ms-python.python&amp;quot;&lt;/code&gt; : Pythonの実行に必須&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;ms-python.black-formatter&amp;quot;&lt;/code&gt;: Pythonのフォーマッター&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;ms-python.flake8&amp;quot;&lt;/code&gt;: Pythonのリンター&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;ms-python.isort&amp;quot;&lt;/code&gt;: Pythonのimport順を整理するツール&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;ms-python.mypy-type-checker&amp;quot;&lt;/code&gt;: Pythonの静的解析ツール&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;devcontainer.json&lt;/code&gt;に記入した拡張機能はDockerコンテナを立てる際に必ずインストールされる。&lt;/p&gt;
&lt;p&gt;必要ではない拡張機能を推奨したい場合は、&lt;code&gt;.vscode/extensions.json&lt;/code&gt;を作成するとよい。
&lt;code&gt;extensions.json&lt;/code&gt;の例を下記に示す。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.vscode/extensions.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;recommendations&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;streetsidesoftware.code-spell-checker&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;oderwat.indent-rainbow&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;.vscode/extensions.json&lt;/code&gt;があると、そのディレクトリをVS Codeで開いた際に、推奨される拡張機能をインストールするか聞かれる。
また、拡張機能のタブに&lt;code&gt;@recommended&lt;/code&gt;と入力すると、推奨される拡張機能を一覧でき、まとめてインストールできる。&lt;/p&gt;
&lt;h3 id="vs-codeの設定ファイルを作成する"&gt;
VS Codeの設定ファイルを作成する&lt;a href="#vs-code%e3%81%ae%e8%a8%ad%e5%ae%9a%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;VS Codeの拡張機能を有効にするため、VS Codeの設定ファイルを作成する。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.vscode&lt;/code&gt;ディレクトリを作成し、その中に&lt;code&gt;settings.json&lt;/code&gt;を作成する。
&lt;code&gt;settings.json&lt;/code&gt;には下記をコピペする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;settings.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 改行コードをLFにする
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;files.eol&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Pythonファイルの設定
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;[python]&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;editor.tabSize&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// フォーマッターをblackに設定する
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;editor.defaultFormatter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ms-python.black-formatter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&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;&amp;#34;editor.formatOnSave&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// flake8とblackで競合する設定を合わせる
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 参照 : https://black.readthedocs.io/en/stable/guides/using_black_with_other_tools.html#flake8
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;flake8.args&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;--ignore=E203,W503&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;--max-line-length=80&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;black-formatter.args&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;--line-length=80&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// isortにblackを利用していることを伝える
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;isort.args&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;--profile&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;black&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="vs-codeの機能でdockerfileをbuildrunattachする"&gt;
VS Codeの機能でDockerfileをbuild&amp;amp;run&amp;amp;attachする&lt;a href="#vs-code%e3%81%ae%e6%a9%9f%e8%83%bd%e3%81%a7dockerfile%e3%82%92buildrunattach%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ここまでできたら、先ほど入れたVS Codeの拡張機能&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers" target="_blank" rel="noopener"
&gt;Dev Containers&lt;/a&gt;を利用して、Dockerコンテナをビルドし起動する。&lt;/p&gt;
&lt;p&gt;VS CodeでCtrl + Shift + Pを押すと、コマンドパレットが出てくる。
そのコマンドパレットで「Dev Containers: Reopen in Container」を検索し実行する。
すると、VS CodeでDockerfileをビルドし、コンテナを立て、そのコンテナにVS Codeをアタッチしてくれる。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/how-2-set-up-python-env-with-docker-and-vs-code/20230201212814.png"
width="1217"
height="216"
srcset="https://notes.nakurei.com/post/how-2-set-up-python-env-with-docker-and-vs-code/20230201212814_hu_e3a20d3db3b7d7c.png 480w, https://notes.nakurei.com/post/how-2-set-up-python-env-with-docker-and-vs-code/20230201212814_hu_4e2c4103bf219c4b.png 1024w"
loading="lazy"
alt="VS Codeで実行するコマンド"
class="gallery-image"
data-flex-grow="563"
data-flex-basis="1352px"
&gt;&lt;/p&gt;
&lt;h3 id="開発を開始する"&gt;
開発を開始する&lt;a href="#%e9%96%8b%e7%99%ba%e3%82%92%e9%96%8b%e5%a7%8b%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ここまでできたら、あとはPythonコードを書いて実行するだけである。
試しに実行してみる。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;main.py&lt;/code&gt;ファイルを作成し、下記コードをコピペする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;main.py&lt;/div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_to_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i_list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&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;list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;i_list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&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;return&lt;/span&gt; &lt;span class="n"&gt;i_list&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;add_to_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;add_to_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;add_to_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_to_list_2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i_list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&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;list&lt;/span&gt;&lt;span class="p"&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;if&lt;/span&gt; &lt;span class="n"&gt;i_list&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;i_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;i_list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&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;return&lt;/span&gt; &lt;span class="n"&gt;i_list&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;add_to_list_2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;add_to_list_2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;add_to_list_2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;コピペしたら、&lt;code&gt;main.py&lt;/code&gt;ファイルを開いた状態で右上にある右向き三角ボタンをクリックする。
すると、&lt;code&gt;main.py&lt;/code&gt;が実行される。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/how-2-set-up-python-env-with-docker-and-vs-code/20230201204939.png"
width="594"
height="170"
srcset="https://notes.nakurei.com/post/how-2-set-up-python-env-with-docker-and-vs-code/20230201204939_hu_2c80784065296054.png 480w, https://notes.nakurei.com/post/how-2-set-up-python-env-with-docker-and-vs-code/20230201204939_hu_2d54857b2d0002c7.png 1024w"
loading="lazy"
alt="Pythonコード実行ボタン"
class="gallery-image"
data-flex-grow="349"
data-flex-basis="838px"
&gt;&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;得られる出力&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@51db8ff21947:/workspaces/python-test# /usr/local/bin/python /workspaces/python-debug-test/src/main.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;1, 2&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;1, 2, 3&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;2&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;3&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@51db8ff21947:/workspaces/python-test#&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;以上の動作確認ができれば、環境構築は完了である。&lt;/p&gt;
&lt;h2 id="おわりに"&gt;
おわりに&lt;a href="#%e3%81%8a%e3%82%8f%e3%82%8a%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;この環境構築手法は一部VS Codeに特化しているため、万人向けとは言えない。
しかし、Python環境をDockerで構築すると、環境構築や環境共有が簡単になる。&lt;/p&gt;
&lt;p&gt;この内容が誰かの参考になれば幸いである。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/jhorikawa_err/items/fb9c03c0982c29c5b6d5" target="_blank" rel="noopener"
&gt;DockerでPython実行環境を作ってみる - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://zuma-lab.com/posts/docker-python-settings" target="_blank" rel="noopener"
&gt;DockerとDocker ComposeでPythonの実行環境を作成する | ZUMA Lab&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://note.com/digiangler777/n/n1f575a8de92a" target="_blank" rel="noopener"
&gt;Docker + Python の実行環境を作ってみた｜おおとろ | フルスタック・ウェブ系エンジニア｜note&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Vue 3.x + Vuetify 3.x + Vue Routerでいい感じのアプリレイアウトをを実装する</title><link>https://notes.nakurei.com/post/how-to-implement-good-app-layout-using-vuetify/</link><pubDate>Sat, 28 Jan 2023 09:03:18 +0900</pubDate><guid>https://notes.nakurei.com/post/how-to-implement-good-app-layout-using-vuetify/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Vuetify 3で下図のようなアプリのひな型を作る。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/how-to-implement-good-app-layout-using-vuetify/20230128034651.png"
width="1455"
height="877"
srcset="https://notes.nakurei.com/post/how-to-implement-good-app-layout-using-vuetify/20230128034651_hu_94f545423817200b.png 480w, https://notes.nakurei.com/post/how-to-implement-good-app-layout-using-vuetify/20230128034651_hu_e217ab22f2d0070.png 1024w"
loading="lazy"
alt="完成図"
class="gallery-image"
data-flex-grow="165"
data-flex-basis="398px"
&gt;&lt;/p&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Vue 3.2.45&lt;/li&gt;
&lt;li&gt;Vuetify 3.1.1&lt;/li&gt;
&lt;li&gt;TypeScript 4.9.4&lt;/li&gt;
&lt;li&gt;Vue Router 4.1.6&lt;/li&gt;
&lt;li&gt;Vite 3.2.5&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vuetify 3、TypeScript、Vue Routerは導入済みとする。&lt;/p&gt;
&lt;h2 id="とりあえず使いたい場合"&gt;
とりあえず使いたい場合&lt;a href="#%e3%81%a8%e3%82%8a%e3%81%82%e3%81%88%e3%81%9a%e4%bd%bf%e3%81%84%e3%81%9f%e3%81%84%e5%a0%b4%e5%90%88"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/NakuRei/vuetify3-app-wireframe-base" target="_blank" rel="noopener"
&gt;ひな形として使えるVuetify 3のプロジェクトをGitHubに置いています&lt;/a&gt;。
クローンするなどご自由にどうぞ。&lt;/p&gt;
&lt;h2 id="流れ"&gt;
流れ&lt;a href="#%e6%b5%81%e3%82%8c"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;ヘッダ（v-app-bar）を作る&lt;/li&gt;
&lt;li&gt;ナビゲーションメニューを作る&lt;/li&gt;
&lt;li&gt;ページ切り替え部を作る&lt;/li&gt;
&lt;li&gt;フッタを作る&lt;/li&gt;
&lt;li&gt;すべてのパーツを組み合わせる&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="ヘッダを作る"&gt;
ヘッダを作る&lt;a href="#%e3%83%98%e3%83%83%e3%83%80%e3%82%92%e4%bd%9c%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;アプリのヘッダとなる上部のバーを作る。&lt;code&gt;&amp;lt;v-app-bar&amp;gt;&lt;/code&gt;で作成できる。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;v-app-bar&amp;gt;&lt;/code&gt;には、&lt;code&gt;&amp;lt;v-app-bar-nav-icon&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;v-app-bar-title&amp;gt;&lt;/code&gt;、そして&lt;code&gt;&amp;lt;v-btn&amp;gt;&lt;/code&gt;を配置する。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;コンポーネント名&lt;/th&gt;
&lt;th style="text-align: left"&gt;役割&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;v-app-bar-nav-icon&lt;/td&gt;
&lt;td style="text-align: left"&gt;後で出てくる&lt;code&gt;v-navigation-drawer&lt;/code&gt;を制御するためのアイコンボタン&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;v-app-bar-title&lt;/td&gt;
&lt;td style="text-align: left"&gt;ヘッダに表示するタイトル文字列&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;v-btn&lt;/td&gt;
&lt;td style="text-align: left"&gt;ダークテーマ制御用のアイコンボタン&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;components/app/AppBar.vue&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-vue" data-lang="vue"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// props
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Props&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;isDarkTheme&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;withDefaults&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;defineProps&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;Props&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(),&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;title&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;isDarkTheme&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// emits
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Emits&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;clickBarNavIcon&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;clickThemeIcon&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;emits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;defineEmits&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;Emits&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;onClickBarNavIcon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;emits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;clickBarNavIcon&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;onClickThemeIcon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;emits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;clickThemeIcon&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-app-bar&lt;/span&gt; &lt;span class="na"&gt;density&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;compact&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;elevation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="na"&gt;prepend&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-app-bar-nav-icon&lt;/span&gt; &lt;span class="nt"&gt;@click&lt;/span&gt;&lt;span class="s"&gt;=&amp;#34;onClickBarNavIcon()&amp;#34;&lt;/span&gt;&lt;span class="p"&gt; /&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-app-bar-title&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;{{&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="p"&gt;}}&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;v-app-bar-title&lt;/span&gt;&lt;span class="p"&gt;&amp;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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="na"&gt;append&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt; &lt;span class="na"&gt;icon&lt;/span&gt; &lt;span class="nt"&gt;@click&lt;/span&gt;&lt;span class="s"&gt;=&amp;#34;onClickThemeIcon()&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-icon&lt;/span&gt; &lt;span class="nt"&gt;v-if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;isDarkTheme&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;mdi&lt;/span&gt;&lt;span class="nt"&gt;-weather-night&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;v-icon&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-icon&lt;/span&gt; &lt;span class="nt"&gt;v-else&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;mdi&lt;/span&gt;&lt;span class="nt"&gt;-weather-sunny&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;v-icon&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;v-app-bar&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ちなみに、これだけを&lt;code&gt;App.vue&lt;/code&gt;に配置すると、下図のようになる。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/how-to-implement-good-app-layout-using-vuetify/20230128034849.png"
width="1458"
height="881"
srcset="https://notes.nakurei.com/post/how-to-implement-good-app-layout-using-vuetify/20230128034849_hu_4c1f001f9371ddb6.png 480w, https://notes.nakurei.com/post/how-to-implement-good-app-layout-using-vuetify/20230128034849_hu_665e0ee769f4acc.png 1024w"
loading="lazy"
alt="ヘッダだけ配置した図"
class="gallery-image"
data-flex-grow="165"
data-flex-basis="397px"
&gt;&lt;/p&gt;
&lt;h2 id="ナビゲーションメニューを作る"&gt;
ナビゲーションメニューを作る&lt;a href="#%e3%83%8a%e3%83%93%e3%82%b2%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%83%a1%e3%83%8b%e3%83%a5%e3%83%bc%e3%82%92%e4%bd%9c%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;v-navigation-drawer&amp;gt;&lt;/code&gt;で作成できる。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;v-navigation-drawer&amp;gt;&lt;/code&gt;に&lt;code&gt;&amp;lt;v-list&amp;gt;&lt;/code&gt;および&lt;code&gt;&amp;lt;v-list-item&amp;gt;&lt;/code&gt;を配置することで、メニュー項目を作成できる。
作成するメニュー項目は&lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;で配列として定義し、&lt;code&gt;v-for&lt;/code&gt;で生成する。
こうするとメニューの追加や変更が楽になる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;components/app/NavigationDrawer.vue&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-vue" data-lang="vue"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// params
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;navs&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;prependIcon&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;prependIcon&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;mdi-home&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Home&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;home&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;prependIcon&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;mdi-information&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;About&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;about&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/about&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-navigation-drawer&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-list&lt;/span&gt; &lt;span class="na"&gt;nav&lt;/span&gt; &lt;span class="na"&gt;density&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;comfortable&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt; &lt;span class="nt"&gt;v-for&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;nav in navs&amp;#34; :key=&amp;#34;nav.value&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-list-item&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;density&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;compact&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;:prepend-icon&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;nav.prependIcon&amp;#34;&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="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;nav.title&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;:value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;nav.value&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;:to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;nav.to&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;v-list&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;v-navigation-drawer&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ヘッダとナビゲーションメニューを置くと、下図のようになる。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/how-to-implement-good-app-layout-using-vuetify/20230128040027.png"
width="1469"
height="880"
srcset="https://notes.nakurei.com/post/how-to-implement-good-app-layout-using-vuetify/20230128040027_hu_82de4f2ff676b23.png 480w, https://notes.nakurei.com/post/how-to-implement-good-app-layout-using-vuetify/20230128040027_hu_db78c58520879aa6.png 1024w"
loading="lazy"
alt="ヘッダとナビゲーションメニューを置いた図"
class="gallery-image"
data-flex-grow="166"
data-flex-basis="400px"
&gt;&lt;/p&gt;
&lt;h2 id="ページ切り替え部を作る"&gt;
ページ切り替え部を作る&lt;a href="#%e3%83%9a%e3%83%bc%e3%82%b8%e5%88%87%e3%82%8a%e6%9b%bf%e3%81%88%e9%83%a8%e3%82%92%e4%bd%9c%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Vue Routerによるページ切り替え部を作る。
Vue Routerによる切り替え部分は&lt;code&gt;&amp;lt;router-view /&amp;gt;&lt;/code&gt;だけで足りる。
これを&lt;code&gt;&amp;lt;v-main&amp;gt;&lt;/code&gt;で囲うと、ヘッダ、ナビゲーションメニュー、フッタによる表示サイズ変更を切り替え部分に適用できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;components/app/MainView.vue&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-vue" data-lang="vue"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-main&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;router-view&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;v-main&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="フッタを作る"&gt;
フッタを作る&lt;a href="#%e3%83%95%e3%83%83%e3%82%bf%e3%82%92%e4%bd%9c%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;v-footer&amp;gt;&lt;/code&gt;に&lt;code&gt;app&lt;/code&gt;属性を追加して作成する。
&lt;code&gt;&amp;lt;v-footer&amp;gt;&lt;/code&gt;の&lt;code&gt;order&lt;/code&gt;属性を&lt;code&gt;order=&amp;quot;-1&amp;quot;&lt;/code&gt;とすると、ナビゲーションメニューよりも上にフッタを表示できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;components/app/Footer.vue&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-vue" data-lang="vue"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// props
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Props&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;ownerName&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;publishedYear&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;defineProps&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;Props&lt;/span&gt;&lt;span class="p"&gt;&amp;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="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nowYear&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;getFullYear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-footer&lt;/span&gt; &lt;span class="na"&gt;app&lt;/span&gt; &lt;span class="na"&gt;order&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;-1&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;elevation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-row&lt;/span&gt; &lt;span class="na"&gt;justify&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;center&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;no&lt;/span&gt;&lt;span class="nt"&gt;-gutters&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-col&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;text-center&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;cols&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;12&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;©&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="nt"&gt;v-if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;publishedYear &amp;lt; nowYear&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="na"&gt;publishedYear&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt; &lt;span class="err"&gt;—&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mr-2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;{{&lt;/span&gt; &lt;span class="nx"&gt;nowYear&lt;/span&gt; &lt;span class="p"&gt;}}&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;strong&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;{{&lt;/span&gt; &lt;span class="nx"&gt;ownerName&lt;/span&gt; &lt;span class="p"&gt;}}&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;strong&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;v-col&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;v-row&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;v-footer&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="すべてのパーツを組み合わせる"&gt;
すべてのパーツを組み合わせる&lt;a href="#%e3%81%99%e3%81%b9%e3%81%a6%e3%81%ae%e3%83%91%e3%83%bc%e3%83%84%e3%82%92%e7%b5%84%e3%81%bf%e5%90%88%e3%82%8f%e3%81%9b%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;すべてのパーツを組み合わせて、全体を完成させる。&lt;/p&gt;
&lt;p&gt;ナビゲーションメニューの表示を切り替えるため、変数&lt;code&gt;drawer&lt;/code&gt;を&lt;code&gt;&amp;lt;NavigationDrawer&amp;gt;&lt;/code&gt;にバインドし、&lt;code&gt;&amp;lt;AppBar&amp;gt;&lt;/code&gt;のボタンで変更している。&lt;/p&gt;
&lt;p&gt;また、ダークテーマへの切り替えのため、変数&lt;code&gt;theme&lt;/code&gt;を&lt;code&gt;&amp;lt;v-app&amp;gt;&lt;/code&gt;にバインドし、&lt;code&gt;&amp;lt;AppBar&amp;gt;&lt;/code&gt;のボタンで変更している。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;App.vue&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-vue" data-lang="vue"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;vue&amp;#39;&lt;/span&gt;&lt;span class="p"&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="kr"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;AppBar&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;@/components/app/AppBar.vue&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;NavigationDrawer&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;@/components/app/NavigationDrawer.vue&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;MainView&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;@/components/app/MainView.vue&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Footer&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;@/components/app/Footer.vue&amp;#39;&lt;/span&gt;&lt;span class="p"&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="c1"&gt;// params
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Example title&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ownerName&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Example owner mame&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;publishedYear&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2023&lt;/span&gt;&lt;span class="p"&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="c1"&gt;// refs
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;drawer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;THEMES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;Light&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;light&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;Dark&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;dark&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;THEMES&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Light&lt;/span&gt;&lt;span class="p"&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="c1"&gt;// functions
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;switchTheme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;THEMES&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Light&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;THEMES&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Dark&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;THEMES&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Light&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-app&lt;/span&gt; &lt;span class="nt"&gt;:theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;theme&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;AppBar&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="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;primary&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;click&lt;/span&gt;&lt;span class="nt"&gt;-bar-nav-icon&lt;/span&gt;&lt;span class="err"&gt;=&amp;#34;&lt;/span&gt;&lt;span class="na"&gt;drawer &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;!&lt;/span&gt;&lt;span class="na"&gt;drawer&lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;click&lt;/span&gt;&lt;span class="nt"&gt;-theme-icon&lt;/span&gt;&lt;span class="err"&gt;=&amp;#34;&lt;/span&gt;&lt;span class="na"&gt;switchTheme&lt;/span&gt;&lt;span class="err"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;NavigationDrawer&lt;/span&gt; &lt;span class="nt"&gt;v-model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;drawer&amp;#34;&lt;/span&gt;&lt;span class="p"&gt; /&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;MainView&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;Footer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;:owner-name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ownerName&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;:published-year&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;publishedYear&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;primary&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;v-app&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;以上で、アプリのひな型が完成する。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/how-to-implement-good-app-layout-using-vuetify/20230128034651.png"
width="1455"
height="877"
srcset="https://notes.nakurei.com/post/how-to-implement-good-app-layout-using-vuetify/20230128034651_hu_94f545423817200b.png 480w, https://notes.nakurei.com/post/how-to-implement-good-app-layout-using-vuetify/20230128034651_hu_e217ab22f2d0070.png 1024w"
loading="lazy"
alt="完成図"
class="gallery-image"
data-flex-grow="165"
data-flex-basis="398px"
&gt;&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://reffect.co.jp/vue/vuetify-for-beginner#i" target="_blank" rel="noopener"
&gt;【vue.js】Vuetifyをマスターする(1) | アールエフェクト&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Vuetify 2の記述のため、&lt;code&gt;&amp;lt;v-app-bar-title&amp;gt;&lt;/code&gt;が&lt;code&gt;&amp;lt;v-toolbar-title&amp;gt;&lt;/code&gt;で記述されているなど多少古いが、かなりわかりやすく参考になった。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://next.vuetifyjs.com/en/" target="_blank" rel="noopener"
&gt;Vuetify公式&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://next.vuetifyjs.com/en/components/application/" target="_blank" rel="noopener"
&gt;Application — Vuetify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://next.vuetifyjs.com/en/components/app-bars/" target="_blank" rel="noopener"
&gt;App-bar component — Vuetify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://next.vuetifyjs.com/en/components/navigation-drawers/" target="_blank" rel="noopener"
&gt;Navigation drawer component — Vuetify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://next.vuetifyjs.com/en/components/footers/" target="_blank" rel="noopener"
&gt;Footer component — Vuetify&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>個人的textlintルール設定メモ</title><link>https://notes.nakurei.com/post/my-textlint-rules-settings/</link><pubDate>Mon, 23 Jan 2023 01:54:47 +0900</pubDate><guid>https://notes.nakurei.com/post/my-textlint-rules-settings/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;個人的textlint設定メモ。
いろいろなところで環境を作るときにいちいち調べなおすのが面倒になったため、メモを残しておく。&lt;/p&gt;
&lt;h2 id="結論"&gt;
結論&lt;a href="#%e7%b5%90%e8%ab%96"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a class="link" href="https://nodejs.org/ja/" target="_blank" rel="noopener"
&gt;Node.js&lt;/a&gt;を入れる&lt;/li&gt;
&lt;li&gt;textlintを入れる&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install -g --save-dev textlint&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol start="3"&gt;
&lt;li&gt;下記のtextlintルールをすべて入れる&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install -g --save-dev textlint-rule-preset-ja-technical-writing textlint-rule-no-mixed-zenkaku-and-hankaku-alphabet textlint-rule-prefer-tari-tari @textlint-ja/textlint-rule-no-insert-dropping-sa textlint-rule-ja-no-orthographic-variants textlint-rule-preset-ja-spacing textlint-rule-ja-no-inappropriate-words @textlint-ja/textlint-rule-no-dropping-i @textlint-ja/textlint-rule-no-insert-re textlint-rule-no-doubled-conjunction textlint-rule-ja-hiragana-keishikimeishi textlint-rule-ja-hiragana-fukushi textlint-rule-ja-hiragana-hojodoushi @textlint-ja/textlint-rule-no-synonyms sudachi-synonyms-dictionary textlint-rule-no-todo textlint-rule-no-hoso-kinshi-yogo&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol start="4"&gt;
&lt;li&gt;「まさしく」と「ただしく」の誤認識対策のため、&lt;code&gt;fukushi.yml&lt;/code&gt;をコピーしてローカルに配置し、「まさしく」の項をコメントアウトする&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.textlintrc&lt;/code&gt;を作る。&lt;code&gt;fukushi.yml&lt;/code&gt;へのパスは前項で作成したものを指すようにする。&lt;/li&gt;
&lt;/ol&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.textlintrc&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;filters&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;rules&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;preset-ja-technical-writing&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;no-mixed-zenkaku-and-hankaku-alphabet&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;prefer-tari-tari&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;@textlint-ja/textlint-rule-no-insert-dropping-sa&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;ja-no-orthographic-variants&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;preset-ja-spacing&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;ja-no-inappropriate-words&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;@textlint-ja/textlint-rule-no-dropping-i&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;@textlint-ja/textlint-rule-no-insert-re&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;no-doubled-conjunction&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;ja-hiragana-keishikimeishi&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;ja-hiragana-fukushi&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;rulePath&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./fukushi.yml&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;ja-hiragana-hojodoushi&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;@textlint-ja/no-synonyms&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;no-todo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;no-hoso-kinshi-yogo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol start="6"&gt;
&lt;li&gt;動作を確認する&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="入れているtextlint-ruleの紹介"&gt;
入れているtextlint ruleの紹介&lt;a href="#%e5%85%a5%e3%82%8c%e3%81%a6%e3%81%84%e3%82%8btextlint-rule%e3%81%ae%e7%b4%b9%e4%bb%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;個人的に日本語文書の執筆に必要を思ったものを入れている。
ほとんどは技術文書向けだが、一部メールのドラフト用に入れているものもある。&lt;/p&gt;
&lt;h3 id="textlint-rule-preset-ja-technical-writing"&gt;
&lt;a class="link" href="https://github.com/textlint-ja/textlint-rule-preset-ja-technical-writing" target="_blank" rel="noopener"
&gt;textlint-rule-preset-ja-technical-writing&lt;/a&gt;&lt;a href="#textlint-rule-preset-ja-technical-writing"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;技術文書向けのtextlintルールプリセット。
複数のルールが1つになっている。
詳細はリンク先のREADMEを参照のこと。
厳しめの内容だが、とりあえず入れておいていいと思っている。&lt;/p&gt;
&lt;h3 id="textlint-rule-no-mixed-zenkaku-and-hankaku-alphabet"&gt;
&lt;a class="link" href="https://github.com/textlint-ja/textlint-rule-no-mixed-zenkaku-and-hankaku-alphabet" target="_blank" rel="noopener"
&gt;textlint-rule-no-mixed-zenkaku-and-hankaku-alphabet&lt;/a&gt;&lt;a href="#textlint-rule-no-mixed-zenkaku-and-hankaku-alphabet"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;全角アルファベットをチェックするtextlintルール。
全角アルファベットを使う機会は全くないため入れている。&lt;/p&gt;
&lt;h3 id="textlint-rule-prefer-tari-tari"&gt;
&lt;a class="link" href="https://github.com/textlint-ja/textlint-rule-prefer-tari-tari" target="_blank" rel="noopener"
&gt;textlint-rule-prefer-tari-tari&lt;/a&gt;&lt;a href="#textlint-rule-prefer-tari-tari"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;「～たり」をきちんと2回連続で使っているかチェックするtextlintルール。
正しい日本語を使う手助けをしてくれる。&lt;/p&gt;
&lt;h3 id="textlint-rule-no-insert-dropping-sa"&gt;
&lt;a class="link" href="https://github.com/textlint-ja/textlint-rule-no-insert-dropping-sa" target="_blank" rel="noopener"
&gt;textlint-rule-no-insert-dropping-sa&lt;/a&gt;&lt;a href="#textlint-rule-no-insert-dropping-sa"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;さ抜き、さ入れ言葉をチェックするtextlintルール。
違反することは全くといっていいほどないが、念のため入れている。&lt;/p&gt;
&lt;h3 id="textlint-rule-ja-no-orthographic-variants"&gt;
&lt;a class="link" href="https://github.com/textlint-ja/textlint-rule-ja-no-orthographic-variants" target="_blank" rel="noopener"
&gt;textlint-rule-ja-no-orthographic-variants&lt;/a&gt;&lt;a href="#textlint-rule-ja-no-orthographic-variants"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;表記ゆれをチェックするtextlintルール。
ひらがな/漢字の表記ゆれや略語の表記ゆれをチェックしてくれる。便利。&lt;/p&gt;
&lt;h3 id="textlint-rule-preset-ja-spacing"&gt;
&lt;a class="link" href="https://github.com/textlint-ja/textlint-rule-preset-ja-spacing" target="_blank" rel="noopener"
&gt;textlint-rule-preset-ja-spacing&lt;/a&gt;&lt;a href="#textlint-rule-preset-ja-spacing"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;スペース関連のtextlintルール。
複数のルールが定義されているため、詳細はリンク先のREADMEを参照のこと。
たとえば、半角文字と全角文字の間にスペースを入れていないか確認できる（筆者は入れない派だが、入れる派のチェックもできる）。&lt;/p&gt;
&lt;h3 id="textlint-rule-ja-no-inappropriate-words"&gt;
&lt;a class="link" href="https://github.com/textlint-ja/textlint-rule-ja-no-inappropriate-words" target="_blank" rel="noopener"
&gt;textlint-rule-ja-no-inappropriate-words&lt;/a&gt;&lt;a href="#textlint-rule-ja-no-inappropriate-words"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;不適切表現をチェックするtextlintルール。
引っ掛かることはないが、安心を得るために入れている。&lt;/p&gt;
&lt;h3 id="textlint-rule-no-dropping-i"&gt;
&lt;a class="link" href="https://github.com/textlint-ja/textlint-rule-no-dropping-i" target="_blank" rel="noopener"
&gt;textlint-rule-no-dropping-i&lt;/a&gt;&lt;a href="#textlint-rule-no-dropping-i"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;い抜き言葉をチェックするtextlintルール。
い抜き言葉を文書では使いたくないスタンスなので。
大変助かっている。&lt;/p&gt;
&lt;h3 id="textlint-rule-no-insert-re"&gt;
&lt;a class="link" href="https://github.com/textlint-ja/textlint-rule-no-insert-re" target="_blank" rel="noopener"
&gt;textlint-rule-no-insert-re&lt;/a&gt;&lt;a href="#textlint-rule-no-insert-re"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;れ足す言葉をチェックするtextlintルール。
違反することは全くといっていいほどないが、念のため入れている。&lt;/p&gt;
&lt;h3 id="textlint-rule-no-doubled-conjunction"&gt;
&lt;a class="link" href="https://github.com/textlint-ja/textlint-rule-no-doubled-conjunction" target="_blank" rel="noopener"
&gt;textlint-rule-no-doubled-conjunction&lt;/a&gt;&lt;a href="#textlint-rule-no-doubled-conjunction"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;同じ接続詞が連続していないかチェックするtextlintルール。
まれに油断して「しかし」を連続して使ってしまうことがあるため入れている。
とくに長い文章を短くしたときに引っ掛かりやすい。&lt;/p&gt;
&lt;h3 id="textlint-rule-ja-hiragana-keishikimeishi"&gt;
&lt;a class="link" href="https://github.com/lostandfound/textlint-rule-ja-hiragana-keishikimeishi" target="_blank" rel="noopener"
&gt;textlint-rule-ja-hiragana-keishikimeishi&lt;/a&gt;&lt;a href="#textlint-rule-ja-hiragana-keishikimeishi"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ひらがなのほうが読みやすい形式名詞を自動修正してくれるtextlintルール。
「～するほう」とか「～するとき」とかを検出/修正してくれる。&lt;/p&gt;
&lt;h3 id="textlint-rule-ja-hiragana-fukushi"&gt;
&lt;a class="link" href="https://github.com/lostandfound/textlint-rule-ja-hiragana-fukushi" target="_blank" rel="noopener"
&gt;textlint-rule-ja-hiragana-fukushi&lt;/a&gt;&lt;a href="#textlint-rule-ja-hiragana-fukushi"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ひらがなのほうが読みやすい副詞を自動修正してくれるtextlintルール。
ただし、「まさしく」は「ただしく」にも引っかかってしまうことが多いため、その部分だけ個人的に無効化している。&lt;/p&gt;
&lt;h3 id="textlint-rule-ja-hiragana-hojodoushi"&gt;
&lt;a class="link" href="https://github.com/lostandfound/textlint-rule-ja-hiragana-hojodoushi" target="_blank" rel="noopener"
&gt;textlint-rule-ja-hiragana-hojodoushi&lt;/a&gt;&lt;a href="#textlint-rule-ja-hiragana-hojodoushi"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ひらがなのほうが読みやすい補助動詞を自動修正してくれるtextlintルール。
技術文書で引っ掛かることはないが、メールだと引っ掛かりやすい。&lt;/p&gt;
&lt;h3 id="textlint-jatextlint-rule-no-synonyms"&gt;
&lt;a class="link" href="https://github.com/textlint-ja/textlint-rule-no-synonyms" target="_blank" rel="noopener"
&gt;@textlint-ja/textlint-rule-no-synonyms&lt;/a&gt;&lt;a href="#textlint-jatextlint-rule-no-synonyms"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;同義語の表記ゆれをチェックしてくれるtextlintルール。
最後に伸ばし棒を入れたり入れなかったりが揺れやすいため助かっている。&lt;/p&gt;
&lt;h3 id="textlint-rule-no-todo"&gt;
&lt;a class="link" href="https://github.com/textlint-rule/textlint-rule-no-todo" target="_blank" rel="noopener"
&gt;textlint-rule-no-todo&lt;/a&gt;&lt;a href="#textlint-rule-no-todo"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;TODO&lt;/code&gt;がないかチェックしてくれるtextlintルール。
公開する文書に&lt;code&gt;TODO&lt;/code&gt;はないはずなので入れている。&lt;/p&gt;
&lt;h3 id="textlint-rule-no-hoso-kinshi-yogo"&gt;
&lt;a class="link" href="https://github.com/hata6502/textlint-rule-no-hoso-kinshi-yogo" target="_blank" rel="noopener"
&gt;textlint-rule-no-hoso-kinshi-yogo&lt;/a&gt;&lt;a href="#textlint-rule-no-hoso-kinshi-yogo"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;放送禁止用語をチェックするtextlintルール。
引っ掛かることはないが、安心を得るために入れている。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://github.com/textlint-ja"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/4889a0deaf6c05120f6c7f35e0b4371e0d43c07a_hu_d7e36e6942ce6210.webp"
alt="textlint-ja image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
textlint-ja
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;textlint japanese community. textlintの日本語ルールを扱うOrganizationです - textlint-ja&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-ffd1aa80239afc78c1628dfb5e08cff1205f22d5.png"
style="margin-right: 2px;"
alt="github.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
github.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://qiita.com/k8uwall/items/3c29ef2dce153e13bd1d"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/f7e97537f273fa372a996695e2fbf99288ba594e_hu_4ec0bf427d82371d.webp"
alt="俺俺textlintルールを検討してみた - Qiita image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
俺俺textlintルールを検討してみた - Qiita
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;https://github.com/textlint/textlint/wiki/Collection-of-textlint-rule から必要そうなものをピックアップして.textlintrcを作成 ◯：必要とする △：プリセットに含まれるので不要とする －：不要とす...&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7dfa4a32e8b8dd3b8a6b654e1cd55932c6a19262.png"
style="margin-right: 2px;"
alt="qiita.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
qiita.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://github.com/textlint/textlint/wiki/Collection-of-textlint-rule"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/e5d437e0d56eabb435e08aa92a2031fad1505625_hu_4b40a2b6a32b4f7f.webp"
alt="Collection of textlint rule image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Collection of textlint rule
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;textlint is the pluggable linter for natural language text. - textlint/textlint&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-ffd1aa80239afc78c1628dfb5e08cff1205f22d5.png"
style="margin-right: 2px;"
alt="github.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
github.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;globalに入れているのは、VS Codeの拡張機能でどこでも使えるようにするためである。&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;globalに入れているのは、VS Codeの拡張機能でどこでも使えるようにするためである。&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Vue 3 + Vuetify 3で作成したWebアプリをPWAに対応させる</title><link>https://notes.nakurei.com/post/vue-3-and-vuetify-3-to-support-pwa/</link><pubDate>Mon, 16 Jan 2023 22:48:26 +0900</pubDate><guid>https://notes.nakurei.com/post/vue-3-and-vuetify-3-to-support-pwa/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Vue 3 + Vuetify 3で作成したWebアプリをPWA（Progressive Web Apps）に対応させる方法のまとめ。&lt;/p&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Vue 3.2.45&lt;/li&gt;
&lt;li&gt;Vuetify 3.1.1&lt;/li&gt;
&lt;li&gt;TypeScript 4.9.4&lt;/li&gt;
&lt;li&gt;Vue Router 4.1.6&lt;/li&gt;
&lt;li&gt;Vite 3.2.5&lt;/li&gt;
&lt;li&gt;vite-plugin-pwa 0.14.1&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="方法"&gt;
方法&lt;a href="#%e6%96%b9%e6%b3%95"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="パッケージをインストールする"&gt;
パッケージをインストールする&lt;a href="#%e3%83%91%e3%83%83%e3%82%b1%e3%83%bc%e3%82%b8%e3%82%92%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a class="link" href="https://vite-pwa-org.netlify.app/" target="_blank" rel="noopener"
&gt;vite-plugin-pwa&lt;/a&gt;をインストールする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;yarn add vite-plugin-pwa -D
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="vitepwaをプラグインとして追加する"&gt;
VitePWAをプラグインとして追加する&lt;a href="#vitepwa%e3%82%92%e3%83%97%e3%83%a9%e3%82%b0%e3%82%a4%e3%83%b3%e3%81%a8%e3%81%97%e3%81%a6%e8%bf%bd%e5%8a%a0%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;vite.config.tsを編集する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;vite.config.ts&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ import { VitePWA } from &amp;#39;vite-plugin-pwa&amp;#39;
&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;export default defineConfig({
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; plugins: [
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; vue({
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; template: { transformAssetUrls },
&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; vuetify({
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; autoImport: true,
&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="gi"&gt;+ VitePWA({
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ registerType: &amp;#39;autoUpdate&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="service-workerをアプリに登録する"&gt;
Service Workerをアプリに登録する&lt;a href="#service-worker%e3%82%92%e3%82%a2%e3%83%97%e3%83%aa%e3%81%ab%e7%99%bb%e9%8c%b2%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;main.tsでService Workerをアプリに追加する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;main.ts&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import App from &amp;#39;./App.vue&amp;#39;;
&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;// Composables
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import { createApp } from &amp;#39;vue&amp;#39;;
&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;// Plugins
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import { registerPlugins } from &amp;#39;@/plugins&amp;#39;;
&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="gi"&gt;+ // Register service worker
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ import { registerSW } from &amp;#39;virtual:pwa-register&amp;#39;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ registerSW();
&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;const app = createApp(App);
&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;registerPlugins(app);
&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;app.mount(&amp;#39;#app&amp;#39;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;このとき、TypeScriptだと、&amp;ldquo;virtual:pwa-register&amp;quot;という名前のモジュールは存在しないというエラーを吐かれる。
これは&amp;quot;virtual:pwa-register&amp;quot;が型として登録されていないために起こる。
よって、tsconfig.jsonで型情報を追加する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;tsconfig.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&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;#34;compilerOptions&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ &amp;#34;types&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ &amp;#34;node&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ &amp;#34;vite-plugin-pwa/client&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&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;#34;include&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;src/**/*.ts&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;src/**/*.d.ts&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;src/**/*.tsx&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;src/**/*.vue&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ &amp;#34;node_modules/vite-plugin-pwa/client.d.ts&amp;#34;
&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="キャッシュするファイルを指定する"&gt;
キャッシュするファイルを指定する。&lt;a href="#%e3%82%ad%e3%83%a3%e3%83%83%e3%82%b7%e3%83%a5%e3%81%99%e3%82%8b%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92%e6%8c%87%e5%ae%9a%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;PWAでキャッシュさせるデータにico, png, svgなどを含めたい場合は、workboxの&lt;code&gt;globPatterns&lt;/code&gt;に含める必要がある。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;vite.config.ts&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import { VitePWA } from &amp;#39;vite-plugin-pwa&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;export default defineConfig({
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; plugins: [
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; VitePWA({
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; registerType: &amp;#39;autoUpdate&amp;#39;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ workbox: {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ globPatterns: [&amp;#39;**/*.{js,css,html,ico,png,svg}&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&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&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;/div&gt;
&lt;/div&gt;
&lt;h3 id="アイコン画像を用意する"&gt;
アイコン画像を用意する&lt;a href="#%e3%82%a2%e3%82%a4%e3%82%b3%e3%83%b3%e7%94%bb%e5%83%8f%e3%82%92%e7%94%a8%e6%84%8f%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;下記に示す画像をすべて用意する。
内容はすべて同じロゴ画像で問題ない。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;mask-icon.svg&lt;/li&gt;
&lt;li&gt;favicon.ico&lt;/li&gt;
&lt;li&gt;180 × 180 pxのpng画像（apple-touch-iconとして利用する）&lt;/li&gt;
&lt;li&gt;192 × 192 pxのpng画像&lt;/li&gt;
&lt;li&gt;256 × 256 pxのpng画像&lt;/li&gt;
&lt;li&gt;384 × 384 pxのpng画像&lt;/li&gt;
&lt;li&gt;512 × 512 pxのpng画像&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;mask-icon.svgは元のロゴ画像そのままでよい。&lt;/p&gt;
&lt;p&gt;260 x 260 pxの画像があれば、
&lt;a class="link" href="https://realfavicongenerator.net/" target="_blank" rel="noopener"
&gt;Favicon Generator for perfect icons on all browsers&lt;/a&gt;
で大体の必要なものは生成できる。&lt;/p&gt;
&lt;p&gt;また、512 x 512 pxのpng画像があれば、
&lt;a class="link" href="https://www.simicart.com/manifest-generator.html/" target="_blank" rel="noopener"
&gt;PWA Manifest Generator | SimiCart&lt;/a&gt;でも192 × 192 px, 256 × 256 px, 384 × 384 pxの画像を生成できる。&lt;/p&gt;
&lt;p&gt;favicon.icoはpngファイルから&lt;a class="link" href="https://convertio.co/ja/" target="_blank" rel="noopener"
&gt;Convertio — ファイルコンバーター&lt;/a&gt;でも生成できる。&lt;/p&gt;
&lt;p&gt;全ての画像はpublic直下に配置する。&lt;/p&gt;
&lt;h3 id="pwaの最低要件を満たさせる"&gt;
PWAの最低要件を満たさせる&lt;a href="#pwa%e3%81%ae%e6%9c%80%e4%bd%8e%e8%a6%81%e4%bb%b6%e3%82%92%e6%ba%80%e3%81%9f%e3%81%95%e3%81%9b%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="head内に必要情報を追記する"&gt;
head内に必要情報を追記する&lt;a href="#head%e5%86%85%e3%81%ab%e5%bf%85%e8%a6%81%e6%83%85%e5%a0%b1%e3%82%92%e8%bf%bd%e8%a8%98%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;アプリのエントリーポイントとなるファイル（大抵はindex.html）の&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;タグ内に、下記内容を含めなければならない。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;viewportのmeta情報&lt;/li&gt;
&lt;li&gt;タイトル&lt;/li&gt;
&lt;li&gt;説明&lt;/li&gt;
&lt;li&gt;favicon&lt;/li&gt;
&lt;li&gt;apple-touch-iconへのリンク&lt;/li&gt;
&lt;li&gt;mask-iconへのリンク&lt;/li&gt;
&lt;li&gt;theme-colorのmeta情報&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a class="link" href="https://realfavicongenerator.net/" target="_blank" rel="noopener"
&gt;Favicon Generator for perfect icons on all browsers&lt;/a&gt;
を使った場合は、&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;タグ内に追記すべき内容も生成されるため、それをコピペすればよい。&lt;/p&gt;
&lt;p&gt;最低情報だけ列挙すると下記のようになる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;viewport&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;width=device-width, initial-scale=1.0&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Example App&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Example description&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;link&lt;/span&gt; &lt;span class="na"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;icon&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/favicon.ico&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;link&lt;/span&gt; &lt;span class="na"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;apple-touch-icon&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/apple-touch-icon.png&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;sizes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;180x180&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;link&lt;/span&gt; &lt;span class="na"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mask-icon&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/mask-icon.svg&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#FFFFFF&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;theme-color&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#ffffff&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;筆者の環境では次のようになった。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;index.html&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt; &lt;span class="na"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;link&lt;/span&gt; &lt;span class="na"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;icon&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/favicon.ico&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;viewport&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;width=device-width, initial-scale=1.0&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;FF14 Collections Checker&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Final Fantasy 14 Collections Checker App&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;link&lt;/span&gt; &lt;span class="na"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;apple-touch-icon&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;sizes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;180x180&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/apple-touch-icon.png&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;link&lt;/span&gt; &lt;span class="na"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;icon&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;image/png&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;sizes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;32x32&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/favicon-32x32.png&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;link&lt;/span&gt; &lt;span class="na"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;icon&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;image/png&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;sizes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;16x16&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/favicon-16x16.png&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;link&lt;/span&gt; &lt;span class="na"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mask-icon&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/safari-pinned-tab.svg&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#5bbad5&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;msapplication-TileColor&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#da532c&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;theme-color&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#ffffff&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 id="vitepwaの必要事項を設定する"&gt;
VitePWAの必要事項を設定する&lt;a href="#vitepwa%e3%81%ae%e5%bf%85%e8%a6%81%e4%ba%8b%e9%a0%85%e3%82%92%e8%a8%ad%e5%ae%9a%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;VitePWAの必要事項である&lt;code&gt;includeAssets&lt;/code&gt;と&lt;code&gt;manifest&lt;/code&gt;をvite.config.tsに定義する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;vite.config.ts&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;VitePWA&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;includeAssets&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;favicon.ico&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;apple-touch-icon.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;mask-icon.svg&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;robots.txt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;manifest&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ja&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Web App Name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;short_name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;App Name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Example description&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;theme_color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#ffffff&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;background_color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#ffffff&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;display&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;standalone&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;start_url&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;icons&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/icon-192x192.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;sizes&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;192x192&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;type&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;image/png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/icon-256x256.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;sizes&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;256x256&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;type&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;image/png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/icon-384x384.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;sizes&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;384x384&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;type&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;image/png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/icon-512x512.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;sizes&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;512x512&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;type&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;image/png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/icon-512x512.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;sizes&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;512x512&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;type&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;image/png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;purpose&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;any maskable&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 id="robotstxtの追加"&gt;
robots.txtの追加&lt;a href="#robotstxt%e3%81%ae%e8%bf%bd%e5%8a%a0"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;検索エンジンがクロールできるようにrobots.txtを追加する。
publicファイル直下にrobots.txtを作成し、下記を記入する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;User-agent: *
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Allow: /&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="ビルドして確認する"&gt;
ビルドして確認する&lt;a href="#%e3%83%93%e3%83%ab%e3%83%89%e3%81%97%e3%81%a6%e7%a2%ba%e8%aa%8d%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;確認には、&lt;code&gt;yarn build &amp;amp;&amp;amp; yarn preview&lt;/code&gt;を実行する。
うまくいくと、リンクの横にダウンロードマークが表示される。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/vue-3-and-vuetify-3-to-support-pwa/20230117002852.png"
width="405"
height="38"
srcset="https://notes.nakurei.com/post/vue-3-and-vuetify-3-to-support-pwa/20230117002852_hu_aced4dc79abeaa17.png 480w, https://notes.nakurei.com/post/vue-3-and-vuetify-3-to-support-pwa/20230117002852_hu_c85fbe555a9938e.png 1024w"
loading="lazy"
alt="成功例"
class="gallery-image"
data-flex-grow="1065"
data-flex-basis="2557px"
&gt;&lt;/p&gt;
&lt;p&gt;なお、vite-plugin-pwaによるPWA機能は、本番環境でないと動作しない。
そのため、&lt;code&gt;yarn dev&lt;/code&gt;では動作しない。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://vite-pwa-org.netlify.app/" target="_blank" rel="noopener"
&gt;Vite PWA | Vite PWA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://vite-pwa-org.netlify.app/guide/" target="_blank" rel="noopener"
&gt;Getting Started | Guide | Vite PWA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/vite-pwa/vite-plugin-pwa/blob/main/examples/vue-router/vite.config.ts" target="_blank" rel="noopener"
&gt;vite-plugin-pwa/vite.config.ts at main · vite-pwa/vite-plugin-pwa&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://software.pitang1965.com/2022/04/23/how-to-make-a-vite-react-typescript-project-a-pwa/" target="_blank" rel="noopener"
&gt;Vite (React, TypeScript)プロジェクトをPWA化 | 定年後にWeb開発者目指す&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://zenn.dev/wintyo/articles/fce84e82d65a68" target="_blank" rel="noopener"
&gt;ViteでQRリーダーアプリを作る&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://bobbyhadz.com/blog/typescript-cannot-find-name-process" target="_blank" rel="noopener"
&gt;Cannot find name &amp;lsquo;process&amp;rsquo; Error in TypeScript | bobbyhadz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.vuemastery.com/blog/getting-started-with-pwas-and-vue3/" target="_blank" rel="noopener"
&gt;Getting started with PWAs and Vue 3 | Vue Mastery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://sunpot.note.osu.si/posts/2021/05/23-vite-pwa/" target="_blank" rel="noopener"
&gt;Vite を使った Vue 3 プロジェクトのPWA化 | タイトルをここに入力できない&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Netlifyで公開したサイトを独自ドメインへ301リダイレクトさせる設定方法</title><link>https://notes.nakurei.com/post/setting-up-a-301-redirect-on-netlify/</link><pubDate>Sun, 15 Jan 2023 12:50:41 +0900</pubDate><guid>https://notes.nakurei.com/post/setting-up-a-301-redirect-on-netlify/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Netlifyで公開したサイトを、Netlifyに設定した独自ドメインへ301リダイレクトさせる設定方法のメモ。&lt;/p&gt;
&lt;p&gt;Google Search Consoleを、Netlifyのデフォルトのリンク（&lt;code&gt;https://hogehoge.netlify.app&lt;/code&gt;）から独自ドメインへ移行させる際に必要だった。
具体的には、Google Search Consoleに「ホームページからの301リダイレクトができないよ！」と怒られたので、やり方を調べた。&lt;/p&gt;
&lt;h2 id="やりかた"&gt;
やりかた&lt;a href="#%e3%82%84%e3%82%8a%e3%81%8b%e3%81%9f"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="前提"&gt;
前提&lt;a href="#%e5%89%8d%e6%8f%90"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a class="link" href="https://docs.netlify.com/routing/redirects/" target="_blank" rel="noopener"
&gt;Netlify Docs&lt;/a&gt;によると、Netlifyでリダイレクトの設定をするには下記どちらかの方法をとる必要がある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;_redirects&lt;/code&gt;ファイルをサイトの公開ディレクトリ直下に置く&lt;/li&gt;
&lt;li&gt;&lt;code&gt;netlify.toml&lt;/code&gt;ファイルに記入する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回は前者の&lt;code&gt;_redirects&lt;/code&gt;ファイルを利用する方法をとる。&lt;/p&gt;
&lt;h4 id="hugoの場合"&gt;
Hugoの場合&lt;a href="#hugo%e3%81%ae%e5%a0%b4%e5%90%88"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Hugoでサイトを生成している場合は、staticディレクトリ内に&lt;code&gt;_redirects&lt;/code&gt;ファイルを置く。
そうすることで、ビルド時に公開ディレクトリ直下へ&lt;code&gt;_redirects&lt;/code&gt;ファイルが配置されるようになる。&lt;/p&gt;
&lt;h3 id="_redirectsファイルにリダイレクト設定を書く"&gt;
_redirectsファイルにリダイレクト設定を書く&lt;a href="#_redirects%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ab%e3%83%aa%e3%83%80%e3%82%a4%e3%83%ac%e3%82%af%e3%83%88%e8%a8%ad%e5%ae%9a%e3%82%92%e6%9b%b8%e3%81%8f"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;_redirectsファイルでは、リダイレクト指定を「&lt;code&gt;リダイレクト元のURL リダイレクト先のURL HTTPステータスコード&lt;/code&gt;」という形で記述する。
詳細は&lt;a class="link" href="https://docs.netlify.com/routing/redirects/redirect-options/" target="_blank" rel="noopener"
&gt;Netlify Docs&lt;/a&gt;を参照のこと。
国ごとに変えるなど、結構詳細な設定ができる。&lt;/p&gt;
&lt;p&gt;今回はドメインを移行するため、リダイレクト元のURLのすべてをリダイレクト先に移行させる。
この場合の書き方は下記のようになる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;_redirects&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;http://hogehoge.netlify.app/* https://new.domain.com/:splat 301!
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;https://hogehoge.netlify.app/* https://new.domain.com/:splat 301!&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ワイルドカードである&lt;code&gt;*&lt;/code&gt;と&lt;code&gt;:splat&lt;/code&gt;を用いることで、&lt;code&gt;*&lt;/code&gt;の部分をそのまま&lt;code&gt;:splat&lt;/code&gt;に引き継ぐ。
こうすることで、たとえば、&lt;code&gt;http://hogehoge.netlify.app/post/test/index.html&lt;/code&gt;は&lt;code&gt;https://new.domain.com/post/test/index.html&lt;/code&gt;へリダイレクトされる。&lt;/p&gt;
&lt;p&gt;HTTPステータスコードは301で、恒久的な移行を示す。
&lt;code&gt;!&lt;/code&gt;をつけると、アクセスされたURLのファイルの有無にかかわらず、常にリダイレクトするようになる&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;。
この&lt;code&gt;!&lt;/code&gt;がないと、想定通りのリダイレクトにならないので注意。&lt;/p&gt;
&lt;h3 id="書いたリダイレクト設定をチェックする"&gt;
書いたリダイレクト設定をチェックする&lt;a href="#%e6%9b%b8%e3%81%84%e3%81%9f%e3%83%aa%e3%83%80%e3%82%a4%e3%83%ac%e3%82%af%e3%83%88%e8%a8%ad%e5%ae%9a%e3%82%92%e3%83%81%e3%82%a7%e3%83%83%e3%82%af%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a class="link" href="https://play.netlify.com/redirects" target="_blank" rel="noopener"
&gt;Netlify&amp;rsquo;s playground&lt;/a&gt;でリダイレクト設定の書き方が正しいかチェックする。
&lt;code&gt;_redirects&lt;/code&gt;ファイルの中身をそのまま貼り付け、右上の「Test rules」ボタンをクリックするだけ。
エラーが出なければ問題ない。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://docs.netlify.com/routing/redirects/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/3d91405a4f5b94378b90dd77b08013aabce598d5_hu_b9dd44f3cf673db1.webp"
alt="Redirects and rewrites image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Redirects and rewrites
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Manage traffic to your site by defining redirect or rewrite rules in a _redirects file or a netlify.toml file.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-18f76252fa5eb245cc53ed78565cdd5c96fd9e37.png"
style="margin-right: 2px;"
alt="docs.netlify.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
docs.netlify.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://blog.microcms.io/netlify-redirect/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/078ef8382037fd335fb2dac3ed679a60f007a2c2_hu_69e174bace878517.webp"
alt="Netlifyでリダイレクトを実装する image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Netlifyでリダイレクトを実装する
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;こんにちは、柴田です。分かりやすいUIでかつ柔軟な機能設定が可能な点から、Netlifyをホスティング先として選択されている方も多いと思います。Netlifyでリダイレクトを設定するには2通り方法があります。&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-1ffcff14a1eb2e7aea221156a57ec61a8f7c98cd.png"
style="margin-right: 2px;"
alt="blog.microcms.io favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
blog.microcms.io
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://diwao.com/2017/07/netlify-redirect-settings-for-original-domain.html"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/5c822fdce2978ab769a519d3d7e2a49c8566e442_hu_68a20b577b43f503.webp"
alt="Netlifyを独自ドメインで使うときにやっておくべきリダイレクトの設定 image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Netlifyを独自ドメインで使うときにやっておくべきリダイレクトの設定
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-1b475c98020a9a8c26873bd979085e08524f346b.png"
style="margin-right: 2px;"
alt="diwao.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
diwao.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;&lt;code&gt;netlify.toml&lt;/code&gt;ファイルでいう&lt;code&gt;force = true&lt;/code&gt;にあたる。&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Vuetify 3の&lt;v-btn&gt;内で文字を改行させる</title><link>https://notes.nakurei.com/post/make-v-btn-text-line-break/</link><pubDate>Sun, 15 Jan 2023 04:34:27 +0900</pubDate><guid>https://notes.nakurei.com/post/make-v-btn-text-line-break/</guid><description>&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Vuetify 3.1.1&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="方法"&gt;
方法&lt;a href="#%e6%96%b9%e6%b3%95"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Vuetify 3の&lt;code&gt;&amp;lt;v-btn&amp;gt;&lt;/code&gt;内で文字を改行させるには、文字を&lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt;や&lt;code&gt;&amp;lt;dev&amp;gt;&lt;/code&gt;タグで囲って、その&lt;code&gt;style&lt;/code&gt;に&lt;code&gt;white-space: normal;&lt;/code&gt;を定義すればよい。
&lt;code&gt;&amp;lt;v-btn&amp;gt;&lt;/code&gt;タグに直接指定しても反映されないので注意。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-vue" data-lang="vue"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;white-space: normal&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Reset&lt;/span&gt; &lt;span class="nx"&gt;check&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これでボタン内の文字が入りきらなくなった際に、スペースで改行される。
ボタンのサイズも自動で変更される。
&lt;code&gt;overflow-wrap: anywhere;&lt;/code&gt;を定義すれば、単語の途中でも改行できる。&lt;/p&gt;
&lt;p&gt;ちなみに、&lt;code&gt;white-space: normal;&lt;/code&gt;だと改行した後中央揃え、&lt;code&gt;white-space: pre-wrap;&lt;/code&gt;だと左揃えになる。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://tech-blog.optim.co.jp/entry/2021/12/22/130000"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/2a4aa3d444ae88c44997777e6c1c756ea3918d4e_hu_641d58c0de22e7d1.webp"
alt="「v-btnコンポーネントのテキストが折り返されない問題」における戦いのいく末を覗く - OPTiM TECH BLOG image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
「v-btnコンポーネントのテキストが折り返されない問題」における戦いのいく末を覗く - OPTiM TECH BLOG
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;こんにちは、AI・IoTサービス開発部の岩丸です。 普段の業務では主に**Vue.js + TypeScript + Vuetify**と格闘しております。VuetifyやMUIなどのCSSライブラリを使用していると、非常に多くの恩恵を受ける反面デフォルトのCSS設定に悩まされることが多々あるかと思います。 今回はVuetifyが提供するButtons(v-btnコンポーネント)でハマったことについてご紹介したいと思います。&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-531f8aecf38565f2ee5d74b560e1eca50e3ee7be.png"
style="margin-right: 2px;"
alt="tech-blog.optim.co.jp favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
tech-blog.optim.co.jp
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>Vuetify 3でアプリを多言語対応させる</title><link>https://notes.nakurei.com/post/language-internationalization-with-vuetify-3/</link><pubDate>Sat, 14 Jan 2023 19:54:56 +0900</pubDate><guid>https://notes.nakurei.com/post/language-internationalization-with-vuetify-3/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Vue 3 + Vuetify 3で多言語対応するやり方のメモ。
Vuetify 3はデフォルトで多言語対応できるため、vue-i18nは使わない。&lt;/p&gt;
&lt;p&gt;基本的に&lt;a class="link" href="https://next.vuetifyjs.com/en/features/internationalization/" target="_blank" rel="noopener"
&gt;Vuetify公式のやり方&lt;/a&gt;に従う。&lt;/p&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Vue 3.2.45&lt;/li&gt;
&lt;li&gt;Vuetify 3.1.1&lt;/li&gt;
&lt;li&gt;TypeScript 4.9.4&lt;/li&gt;
&lt;li&gt;Vue Router 4.1.6&lt;/li&gt;
&lt;li&gt;Vite 3.2.5&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;yarn create vuetify&lt;/code&gt;でプロジェクトを作成した前提とする。&lt;/p&gt;
&lt;h2 id="ディレクトリ構造"&gt;
ディレクトリ構造&lt;a href="#%e3%83%87%e3%82%a3%e3%83%ac%e3%82%af%e3%83%88%e3%83%aa%e6%a7%8b%e9%80%a0"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;必要なファイルだけ示す。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;|-- package.json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;|-- src
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| |-- App.vue
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| |-- i18n
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| | `-- locale
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| | |-- en.ts
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| | `-- ja.ts
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| |-- main.ts
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| |-- plugins
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| | |-- index.ts
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| | |-- vuetify.ts
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| | `-- webfontloader.ts
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| `-- vite-env.d.ts
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;|-- tsconfig.json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;|-- tsconfig.node.json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;|-- vite.config.ts
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;`-- yarn.lock&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="言語ファイルを用意する"&gt;
言語ファイルを用意する&lt;a href="#%e8%a8%80%e8%aa%9e%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92%e7%94%a8%e6%84%8f%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;まず、言語ファイルを用意する。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;root/src/i18n/locale/&lt;/code&gt;内に、多言語対応したい言語のTypeScriptファイルを作成する。
今回は日本語と英語に対応させるため、&lt;code&gt;ja.ts&lt;/code&gt;と&lt;code&gt;en.ts&lt;/code&gt;をつくる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;root/src/i18n/locale/ja.ts&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ja&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;vuetify/locale&amp;#39;&lt;/span&gt;&lt;span class="p"&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="kr"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;ja&lt;/span&gt;&lt;span class="p"&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="nx"&gt;test&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;テストメッセージ1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;temp&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;テストメッセージ2&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;root/src/i18n/locale/en.ts&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;en&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;vuetify/locale&amp;#39;&lt;/span&gt;&lt;span class="p"&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="kr"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;en&lt;/span&gt;&lt;span class="p"&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="nx"&gt;test&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Test message 1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;temp&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Test message 2&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;'vuetify/locale'&lt;/code&gt;から&lt;code&gt;import&lt;/code&gt;しているのは、Vuetifyのコンポーネントで利用される言語定義ファイルである。
これを読み込み展開することで、Vuetifyのコンポーネントをいじることなく多言語化できる。&lt;/p&gt;
&lt;p&gt;それに加えて、独自の定義もできる。今回&lt;code&gt;test&lt;/code&gt;という名前で定義しているものがそれにあたる。
この名前&lt;code&gt;test&lt;/code&gt;およびその内容は任意に定義できる。また、&lt;code&gt;temp&lt;/code&gt;のように階層化しても定義できる。&lt;/p&gt;
&lt;h2 id="言語ファイルを読み込む"&gt;
言語ファイルを読み込む&lt;a href="#%e8%a8%80%e8%aa%9e%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92%e8%aa%ad%e3%81%bf%e8%be%bc%e3%82%80"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Vuetifyで言語ファイルを読み込むため、&lt;code&gt;root/src/plugins/vuetify.ts&lt;/code&gt;に下記を追記する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;root/src/plugins/vuetify.ts&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&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; * plugins/vuetify.ts
&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; * Framework documentation: https://vuetifyjs.com`
&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;// Styles
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import &amp;#39;@mdi/font/css/materialdesignicons.css&amp;#39;;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import &amp;#39;vuetify/styles&amp;#39;;
&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;// Composables
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import { createVuetify } from &amp;#39;vuetify&amp;#39;;
&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="gi"&gt;+ // i18n
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ import en from &amp;#39;@/i18n/locale/en&amp;#39;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ import ja from &amp;#39;@/i18n/locale/ja&amp;#39;;
&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;// https://vuetifyjs.com/en/introduction/why-vuetify/#feature-guides
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;export default createVuetify({
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ locale: {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ locale: &amp;#39;ja&amp;#39;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ fallback: &amp;#39;en&amp;#39;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ messages: { en, ja },
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ },
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; theme: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; themes: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; light: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; colors: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; primary: &amp;#39;#1867C0&amp;#39;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; secondary: &amp;#39;#5CBBF6&amp;#39;,
&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; },
&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;locale&lt;/code&gt;にはデフォルトの言語を、&lt;code&gt;fallback&lt;/code&gt;にはブラウザなどで言語が設定されていない場合に適用する言語を指定する&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;。
&lt;code&gt;messages&lt;/code&gt;には利用したいすべての言語を入れる。&lt;/p&gt;
&lt;h2 id="テキストを表示する"&gt;
テキストを表示する&lt;a href="#%e3%83%86%e3%82%ad%e3%82%b9%e3%83%88%e3%82%92%e8%a1%a8%e7%a4%ba%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;最後に、定義した言語のテキストを表示する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;root/src/App.vue&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-vue" data-lang="vue"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-app&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-main&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt; &lt;span class="nt"&gt;@click&lt;/span&gt;&lt;span class="s"&gt;=&amp;#34;$vuetify.locale.current = &amp;#39;ja&amp;#39;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="na"&gt;日本語&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt; &lt;span class="nt"&gt;@click&lt;/span&gt;&lt;span class="s"&gt;=&amp;#34;$vuetify.locale.current = &amp;#39;en&amp;#39;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="na"&gt;English&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;v-btn&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;{{&lt;/span&gt; &lt;span class="nx"&gt;$vuetify&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;$vuetify.test&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}}&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;{{&lt;/span&gt; &lt;span class="nx"&gt;$vuetify&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;$vuetify.temp.test&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}}&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;v-main&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;v-app&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;$vuetify.locale.current&lt;/code&gt;を変更することで、アプリの言語設定が変わる。
また、言語ファイルで定義したテキストは、&lt;code&gt;$vuetify.locale.t('$vuetify.test')&lt;/code&gt;の形で読み込める。
なお、今回は&lt;code&gt;App.vue&lt;/code&gt;に直接書いたが、これらの関数および値は任意のVueファイルで読み込める。&lt;/p&gt;
&lt;p&gt;ここまでできたら&lt;code&gt;yarn dev&lt;/code&gt;してアプリを立ち上げる。
ボタンをクリックして言語が変われば成功。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://next.vuetifyjs.com/en/features/internationalization/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/2249647607c4cc3253a4605ab967c5cbc8c98ab9_hu_639cfd6d6d82a685.webp"
alt="Internationalization (i18n) — Vuetify image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Internationalization (i18n) — Vuetify
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Vuetify supports language Internationalization (i18n) from a wide range of locales and easily integrates vue-i18n.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-d30bd4f7fa72ccb9f03a21946e5f3919a4406034.png"
style="margin-right: 2px;"
alt="next.vuetifyjs.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
next.vuetifyjs.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://vuetifyjs.com/ja/features/internationalization/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/2249647607c4cc3253a4605ab967c5cbc8c98ab9_hu_639cfd6d6d82a685.webp"
alt="国際化 (i18n) — Vuetify image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
国際化 (i18n) — Vuetify
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Vuetifyは、幅広いロケールの国際化(i18n)をサポートし、vue-i18nを簡単に統合できます。&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-5b177a14dd4d4397e56e375dcbfa447cd73601a7.png"
style="margin-right: 2px;"
alt="vuetifyjs.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
vuetifyjs.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;対応している言語は&lt;a class="link" href="https://next.vuetifyjs.com/en/features/internationalization/#supported-languages" target="_blank" rel="noopener"
&gt;Vuetify公式&lt;/a&gt;を参照。&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>husky + lint-stagedでコミット前にLinterを実行させる</title><link>https://notes.nakurei.com/post/linter-run-before-commit-with-husky-lint-staged/</link><pubDate>Thu, 12 Jan 2023 19:53:53 +0900</pubDate><guid>https://notes.nakurei.com/post/linter-run-before-commit-with-husky-lint-staged/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="link" href="https://typicode.github.io/husky/#/" target="_blank" rel="noopener"
&gt;husky&lt;/a&gt; + &lt;a class="link" href="https://github.com/okonet/lint-staged" target="_blank" rel="noopener"
&gt;lint-staged&lt;/a&gt;でコミット前にLinterを実行し、通らない場合はコミットできないようにする設定方法を記す。&lt;/p&gt;
&lt;h2 id="仕組み"&gt;
仕組み&lt;a href="#%e4%bb%95%e7%b5%84%e3%81%bf"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;git-hookをhuskyでハンドリングし、pre-commitのフックを利用して、コミット時に必ず&lt;code&gt;yarn lint-staged&lt;/code&gt;を実行させる&lt;/li&gt;
&lt;li&gt;&lt;code&gt;yarn lint-staged&lt;/code&gt;でLinterを実行させるように、package.jsonにスクリプトを定義する&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="設定のしかた"&gt;
設定のしかた&lt;a href="#%e8%a8%ad%e5%ae%9a%e3%81%ae%e3%81%97%e3%81%8b%e3%81%9f"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;必要なパッケージをインストールする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yarn add -D husky lint-staged&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;husky-initコマンドを実行する。
実行するコマンドの詳細は&lt;a class="link" href="https://typicode.github.io/husky/#/?id=usage" target="_blank" rel="noopener"
&gt;huskyの公式サイト&lt;/a&gt;を参照すること。
Yarn version 1の場合は下記になる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx husky-init &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; yarn&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;.gitディレクトリとpackage.jsonのファイルが同一階層にない場合は、下記のようなエラーが発生する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ npx husky-init &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; yarn
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Need to install the following packages:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; husky-init@8.0.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Ok to proceed? &lt;span class="o"&gt;(&lt;/span&gt;y&lt;span class="o"&gt;)&lt;/span&gt; y
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;husky-init updating package.json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; setting prepare script to &lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;husky install&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/root/.npm/_npx/1ab9c0f68ac2536e/node_modules/husky/lib/index.js:22
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; throw new Error&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;.git can&lt;span class="s1"&gt;&amp;#39;t be found (see ${url})`);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; ^
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;Error: .git can&amp;#39;&lt;/span&gt;t be found &lt;span class="o"&gt;(&lt;/span&gt;see https://typicode.github.io/husky/#/?id&lt;span class="o"&gt;=&lt;/span&gt;custom-directory&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at install &lt;span class="o"&gt;(&lt;/span&gt;/root/.npm/_npx/1ab9c0f68ac2536e/node_modules/husky/lib/index.js:22:15&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Object.&amp;lt;anonymous&amp;gt; &lt;span class="o"&gt;(&lt;/span&gt;/root/.npm/_npx/1ab9c0f68ac2536e/node_modules/husky-init/lib/bin.js:16:21&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Module._compile &lt;span class="o"&gt;(&lt;/span&gt;node:internal/modules/cjs/loader:1218:14&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Module._extensions..js &lt;span class="o"&gt;(&lt;/span&gt;node:internal/modules/cjs/loader:1272:10&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Module.load &lt;span class="o"&gt;(&lt;/span&gt;node:internal/modules/cjs/loader:1081:32&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Module._load &lt;span class="o"&gt;(&lt;/span&gt;node:internal/modules/cjs/loader:922:12&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Function.executeUserEntryPoint &lt;span class="o"&gt;[&lt;/span&gt;as runMain&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;node:internal/modules/run_main:82:12&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at node:internal/main/run_main_module:23:47
&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;Node.js v19.3.0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;このエラーへの対処法は、&lt;a class="link" href="https://typicode.github.io/husky/#/?id=custom-directory" target="_blank" rel="noopener"
&gt;huskyの公式サイト&lt;/a&gt;に書かれているとおりで、
package.jsonに追加されているprepareスクリプトを変更する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;app/package.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&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;#34;scripts&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;- &amp;#34;prepare&amp;#34;: &amp;#34;husky install&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ &amp;#34;prepare&amp;#34;: &amp;#34;cd .. &amp;amp;&amp;amp; husky install app/.husky&amp;#34;
&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;再度yarnコマンドを実行する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yarn&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;成功すると、&lt;code&gt;.husky&lt;/code&gt;ディレクトリが生成される。
ここにpre-commitファイルを作成する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx husky add .husky/pre-commit &amp;#34;&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;作成されたpre-commitファイルに、lint-staged（とその他実行したいスクリプト）を実行するコマンドを追記する。
.gitディレクトリとpackage.jsonのファイルが同一階層にない場合は、package.jsonのある階層に移動するコマンド（&lt;code&gt;cd app&lt;/code&gt;）も追記する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;app/.husky/pre-commit&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;. &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;dirname -- &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;/_/husky.sh&amp;#34;&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="nb"&gt;cd&lt;/span&gt; app &lt;span class="c1"&gt;# package.jsonのある階層に移動する&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;yarn lint-staged &lt;span class="c1"&gt;# これを必ず書く&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yarn build &lt;span class="c1"&gt;# ほかに実行したいスクリプトがあれば追記する&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;最後に、package.jsonにlint-stagedスクリプトと&lt;code&gt;lint-staged&lt;/code&gt;実行時のlintコマンドを追記する。
下記はVueプロジェクトの例。
&lt;code&gt;lint-staged&lt;/code&gt;でESLint, StyleLint, Prettierを実行させている。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;app/package.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;scripts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;lint-staged&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;lint-staged&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;lint-staged&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;*.{vue,js,jsx,cjs,mjs,ts,tsx,cts,mts}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;eslint --fix&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;*.{css,scss,vue}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;stylelint --fix&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;*&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;prettier -w -u&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;以上で、コミット時にLinterが実行され、エラーの場合はコミットされないようになる。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://typicode.github.io/husky/#/?id=usage" target="_blank" rel="noopener"
&gt;husky Usage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://typicode.github.io/husky/#/?id=custom-directory" target="_blank" rel="noopener"
&gt;husky Custom directory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/les-r-pan/items/c03f12bc1693983daa70" target="_blank" rel="noopener"
&gt;.git と package.json が同一ディレクトリにいないプロジェクトで husky をつかう - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://zenn.dev/seya/articles/c908d88df0a587" target="_blank" rel="noopener"
&gt;husky + lint-staged を動かしたメモ@2021年7月&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://miyauchi.dev/ja/posts/vite-vue3-typescript/" target="_blank" rel="noopener"
&gt;ViteでVue3のTypescript環境を構築する | miyauci.me&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>TypeScriptの命名規則の早見表</title><link>https://notes.nakurei.com/post/quick-look-at-typescripts-naming-rules/</link><pubDate>Thu, 12 Jan 2023 19:38:54 +0900</pubDate><guid>https://notes.nakurei.com/post/quick-look-at-typescripts-naming-rules/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="link" href="https://google.github.io/styleguide/tsguide.html#syntax" target="_blank" rel="noopener"
&gt;Google TypeScript Style Guide&lt;/a&gt;を基に作成した、個人的な命名規則の早見表。&lt;/p&gt;
&lt;h2 id="命名規則"&gt;
命名規則&lt;a href="#%e5%91%bd%e5%90%8d%e8%a6%8f%e5%89%87"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="使用する文字"&gt;
使用する文字&lt;a href="#%e4%bd%bf%e7%94%a8%e3%81%99%e3%82%8b%e6%96%87%e5%ad%97"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;名前にはASCII文字と数字のみを使用する&lt;/li&gt;
&lt;li&gt;アンダースコアは定数（&lt;code&gt;UPPER_SNAKE_CASE&lt;/code&gt;）のみ許される&lt;/li&gt;
&lt;li&gt;Observablesのみ&lt;code&gt;$&lt;/code&gt;を付けてもよい&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="命名のルール"&gt;
命名のルール&lt;a href="#%e5%91%bd%e5%90%8d%e3%81%ae%e3%83%ab%e3%83%bc%e3%83%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;名前に型名を付けない、 ハンガリー記法を使用しない&lt;/li&gt;
&lt;li&gt;インターフェースに&lt;code&gt;I&lt;/code&gt;や&lt;code&gt;Interface&lt;/code&gt;をつけない&lt;/li&gt;
&lt;li&gt;接頭辞または接尾辞に&lt;code&gt;_&lt;/code&gt;を使わない&lt;/li&gt;
&lt;li&gt;単語を省略しない、曖昧な略語/馴染みのない略語は使わない
&lt;ul&gt;
&lt;li&gt;もし、スコープが10行以下なら、短い（例えば1文字）変数名を使っても良い&lt;/li&gt;
&lt;li&gt;型パラメータは大文字1文字（e.g. &lt;code&gt;T&lt;/code&gt;）でもよい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;たとえ頭字語であっても、2文字目から小文字にする（e.g. &lt;code&gt;Url&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="記述スタイル"&gt;
記述スタイル&lt;a href="#%e8%a8%98%e8%bf%b0%e3%82%b9%e3%82%bf%e3%82%a4%e3%83%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;カテゴリ&lt;/th&gt;
&lt;th style="text-align: left"&gt;スタイル&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;変数&lt;/td&gt;
&lt;td style="text-align: left"&gt;camelCase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;関数&lt;/td&gt;
&lt;td style="text-align: left"&gt;camelCase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;クラス&lt;/td&gt;
&lt;td style="text-align: left"&gt;PascalCase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;メンバ変数&lt;/td&gt;
&lt;td style="text-align: left"&gt;camelCase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;メンバ関数&lt;/td&gt;
&lt;td style="text-align: left"&gt;camelCase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;インターフェース&lt;/td&gt;
&lt;td style="text-align: left"&gt;PascalCase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;型&lt;/td&gt;
&lt;td style="text-align: left"&gt;PascalCase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;名前空間&lt;/td&gt;
&lt;td style="text-align: left"&gt;PascalCase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Enum&lt;/td&gt;
&lt;td style="text-align: left"&gt;PascalCase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Enumメンバ&lt;/td&gt;
&lt;td style="text-align: left"&gt;UPPER_SNAKE_CASE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;グローバル定数&lt;/td&gt;
&lt;td style="text-align: left"&gt;UPPER_SNAKE_CASE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;ファイル名&lt;/td&gt;
&lt;td style="text-align: left"&gt;camelCase&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;技術的に変更できるが変更を意図していない定数には&lt;code&gt;UPPER_SNAKE_CASE&lt;/code&gt;を用いる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://google.github.io/styleguide/tsguide.html"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="Google TypeScript Style Guide image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Google TypeScript Style Guide
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-cd8f90e132d029d723cc11bc816bb9c5bddfa1c9.png"
style="margin-right: 2px;"
alt="google.github.io favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
google.github.io
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>Hugoで作ったサイトの更新日時がNetlifyでgitと連動しない問題を解決した</title><link>https://notes.nakurei.com/post/fixed-problem-not-working-with-git-on-lastmod/</link><pubDate>Sun, 01 Jan 2023 18:46:03 +0900</pubDate><guid>https://notes.nakurei.com/post/fixed-problem-not-working-with-git-on-lastmod/</guid><description>&lt;img src="https://notes.nakurei.com/img/header/website_img.webp" alt="Featured image of post Hugoで作ったサイトの更新日時がNetlifyでgitと連動しない問題を解決した" /&gt;&lt;h2 id="背景"&gt;
背景&lt;a href="#%e8%83%8c%e6%99%af"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Hugoで作ったサイトでは、変数&lt;code&gt;.Lastmod&lt;/code&gt;で更新日時を扱える。
たとえば、&lt;a class="link" href="https://themes.gohugo.io/themes/hugo-theme-stack/" target="_blank" rel="noopener"
&gt;Stack&lt;/a&gt;のテーマでは、
&lt;code&gt;layouts/partials/article/components/footer.html&lt;/code&gt;で&lt;code&gt;.Lastmod&lt;/code&gt;を用いて更新日時を表示している。&lt;/p&gt;
&lt;p&gt;変数&lt;code&gt;.Lastmod&lt;/code&gt;は、記事のヘッダで&lt;code&gt;lastmod&lt;/code&gt;を設定することで、任意の値に変更できる。
これを設定しない場合は、デフォルトで&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;下記が利用される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;config.yaml&lt;/div&gt;
&lt;div class="code-block-content"&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="nt"&gt;frontmatter&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;lastmod&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;- &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="l"&gt;git&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="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;lastmod&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="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;date&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="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;publishDate&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;このうち&lt;code&gt;:git&lt;/code&gt;は、Hugoで使える変数&lt;code&gt;.GitInfo.AuthorDate&lt;/code&gt;を指す。
この変数&lt;code&gt;.GitInfo.AuthorDate&lt;/code&gt;は、Hugoのconfigファイルで&lt;code&gt;enableGitInfo&lt;/code&gt;を&lt;code&gt;true&lt;/code&gt;にすると有効化される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;config.yaml&lt;/div&gt;
&lt;div class="code-block-content"&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="nt"&gt;enableGitInfo&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;つまりHugoでは、変数&lt;code&gt;.GitInfo.AuthorDate&lt;/code&gt;を利用することで、ファイルの更新日時を手動で変更せずとも、
gitの履歴からファイル更新日時を自動で取得してくれる。&lt;/p&gt;
&lt;h2 id="問題"&gt;
問題&lt;a href="#%e5%95%8f%e9%a1%8c"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;背景で述べたように、適切な設定をすれば、gitの履歴からファイル更新日時を自動で取得できる。
しかし、筆者の環境では、手元で&lt;code&gt;hugo serve&lt;/code&gt;するとgitの履歴が反映されるにもかかわらず、
Netlifyでホスティングして公開すると反映されない不具合が生じた。&lt;/p&gt;
&lt;h2 id="何が原因だったのか"&gt;
何が原因だったのか&lt;a href="#%e4%bd%95%e3%81%8c%e5%8e%9f%e5%9b%a0%e3%81%a0%e3%81%a3%e3%81%9f%e3%81%ae%e3%81%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Stackのテーマでは、&lt;code&gt;content/post/&amp;lt;folder name&amp;gt;/index.md&lt;/code&gt;に記事を格納する。
不具合の原因は、この&lt;code&gt;&amp;lt;folder name&amp;gt;&lt;/code&gt;に日本語が含まれていたことだった。
どうやらパスに日本語が含まれていると、gitの履歴をうまく取得できないらしい。&lt;/p&gt;
&lt;h2 id="解決策"&gt;
解決策&lt;a href="#%e8%a7%a3%e6%b1%ba%e7%ad%96"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;記事を格納するフォルダ名をASCII文字のみ&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;で構成されるように変更した。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://molina.jp/blog/hugo%E3%81%A6%E6%9B%B4%E6%96%B0%E6%97%A5%E6%99%82%E3%81%AE%E7%AE%A1%E7%90%86/" target="_blank" rel="noopener"
&gt;Hugoで更新日時の管理 | Molina&amp;rsquo;s Web Site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://shunyaueta.com/posts/2021-10-06/" target="_blank" rel="noopener"
&gt;Hugo で記事の更新日をgitと連携して自動的に取得して表示させる | hurutoriya&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://gohugo.io/variables/git/" target="_blank" rel="noopener"
&gt;Git Info Variables |Hugo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;このデフォルト値は、Hugoのconfigファイルで設定しなくても反映される。&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;より正確には、アルファベットとハイフンとアンダーバーのみにした。&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Windows起動時に実行されるアプリを追加する</title><link>https://notes.nakurei.com/post/add-apps-to-be-run-at-windows-startup/</link><pubDate>Sun, 01 Jan 2023 16:27:59 +0900</pubDate><guid>https://notes.nakurei.com/post/add-apps-to-be-run-at-windows-startup/</guid><description>&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Windows 10 or Windows 11&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="方法"&gt;
方法&lt;a href="#%e6%96%b9%e6%b3%95"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;エクスプローラを開く&lt;/li&gt;
&lt;li&gt;パス入力部に&lt;code&gt;shell:startup&lt;/code&gt;と入力してEnter
&lt;ol&gt;
&lt;li&gt;全ユーザー共通にしたい場合は&lt;code&gt;shell:common startup&lt;/code&gt;と入力してEnter&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;開かれたフォルダに任意のアプリのショートカットを入れる&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;これだけ。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://support.microsoft.com/ja-jp/windows/windows-10-%E3%81%AE%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%AB%E8%87%AA%E5%8B%95%E7%9A%84%E3%81%AB%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B-150da165-dcd9-7230-517b-cf3c295d89dd" target="_blank" rel="noopener"
&gt;Windows 10 の起動時に自動的に実行するアプリを追加する - Microsoft サポート&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://win10.jp/cmd19da019.htm" target="_blank" rel="noopener"
&gt;Win10コマンドで「スタートアップ\(システム側\)」を起動する - Win10jp「Windows10総合情報サイト」&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Hugoのサイトを構造化データ（JSON-LD）に対応させる</title><link>https://notes.nakurei.com/post/make-hugo-site-compatible-with-structured-data/</link><pubDate>Wed, 28 Dec 2022 09:58:07 +0900</pubDate><guid>https://notes.nakurei.com/post/make-hugo-site-compatible-with-structured-data/</guid><description>&lt;img src="https://notes.nakurei.com/img/header/website_img.webp" alt="Featured image of post Hugoのサイトを構造化データ（JSON-LD）に対応させる" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Hugoで作ったサイトをJSON-LD方式の構造化データに対応するためしたことのまとめ。&lt;/p&gt;
&lt;h2 id="構造化データとは"&gt;
構造化データとは&lt;a href="#%e6%a7%8b%e9%80%a0%e5%8c%96%e3%83%87%e3%83%bc%e3%82%bf%e3%81%a8%e3%81%af"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;構造化データとは、簡単に言うとウェブページの詳細をGoogleなどの検索エンジンに教えるためのデータである。
データには、たとえばタイトル、日付、記事の種類などが含まれる。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data" target="_blank" rel="noopener"
&gt;Google検索セントラルの「構造化データのマークアップの仕組み概要」&lt;/a&gt;
によると、構造化データの追加はGoogleに対するSEOの1つでもあるようだ。
少なくともGoogleでは、Google検索でリッチリザルトとして表示されるために、構造化データが必要である。&lt;/p&gt;
&lt;h3 id="構造化データの形式"&gt;
構造化データの形式&lt;a href="#%e6%a7%8b%e9%80%a0%e5%8c%96%e3%83%87%e3%83%bc%e3%82%bf%e3%81%ae%e5%bd%a2%e5%bc%8f"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;構造化データには複数の形式がある。
&lt;a class="link" href="https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data" target="_blank" rel="noopener"
&gt;Google検索セントラル&lt;/a&gt;
によると、Googleでは下記3種類の形式がサポートされている。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JSON-LD（Google推奨）&lt;/li&gt;
&lt;li&gt;microdata&lt;/li&gt;
&lt;li&gt;RDFa&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;また、構造化データの中にも種類がある。
&lt;a class="link" href="https://developers.google.com/search/docs/appearance/structured-data/search-gallery" target="_blank" rel="noopener"
&gt;Google 検索セントラルの「Google 検索がサポートする構造化データ マークアップ」&lt;/a&gt;
あたりが参考になるだろう。
今回は
「&lt;a class="link" href="https://developers.google.com/search/docs/appearance/structured-data/article" target="_blank" rel="noopener"
&gt;Article&lt;/a&gt;」
「&lt;a class="link" href="https://developers.google.com/search/docs/appearance/structured-data/breadcrumb" target="_blank" rel="noopener"
&gt;パンくずリスト（BreadcrumbList）&lt;/a&gt;」
「&lt;a class="link" href="https://developers.google.com/search/docs/appearance/site-names#how-to-add-structured-data" target="_blank" rel="noopener"
&gt;WebSite&lt;/a&gt;」
の3つを利用する。&lt;/p&gt;
&lt;h2 id="hugoのサイトをjson-ld方式の構造化データに対応させる方法"&gt;
HugoのサイトをJSON-LD方式の構造化データに対応させる方法&lt;a href="#hugo%e3%81%ae%e3%82%b5%e3%82%a4%e3%83%88%e3%82%92json-ld%e6%96%b9%e5%bc%8f%e3%81%ae%e6%a7%8b%e9%80%a0%e5%8c%96%e3%83%87%e3%83%bc%e3%82%bf%e3%81%ab%e5%af%be%e5%bf%9c%e3%81%95%e3%81%9b%e3%82%8b%e6%96%b9%e6%b3%95"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;本記事では、Googleが推奨しているJSON-LDの形式で、Hugoのサイトを構造化データに対応させる。
流れは下記のとおりである。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;schema.htmlを作成する&lt;/li&gt;
&lt;li&gt;schema.htmlをサイトに埋め込む&lt;/li&gt;
&lt;li&gt;構造化データが正常に作成されているか確認する&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="schemahtmlを作成する"&gt;
schema.htmlを作成する&lt;a href="#schemahtml%e3%82%92%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;layouts/partials/&lt;/code&gt;下に&lt;code&gt;schema.html&lt;/code&gt;を作成する。&lt;/p&gt;
&lt;p&gt;この&lt;code&gt;schema.html&lt;/code&gt;に、&lt;code&gt;&amp;lt;script type=&amp;quot;application/ld+json&amp;quot;&amp;gt;&lt;/code&gt;で始まる構造化データスクリプト記述を記述する。
たとえば、&lt;a class="link" href="https://developers.google.com/search/docs/appearance/structured-data/article" target="_blank" rel="noopener"
&gt;Google検索セントラル&lt;/a&gt;によると、
サイトの記事（Article）には下記の構造化データが推奨されている。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;application/ld+json&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@context&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://schema.org&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;NewsArticle&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;headline&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Title of a News Article&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;image&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;https://example.com/photos/1x1/photo.jpg&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;https://example.com/photos/4x3/photo.jpg&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;https://example.com/photos/16x9/photo.jpg&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;datePublished&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2015-02-05T08:00:00+08:00&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;dateModified&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2015-02-05T09:20:00+08:00&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;author&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Person&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Jane Doe&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://example.com/profile/janedoe123&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Person&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;John Doe&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://example.com/profile/johndoe123&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これを&lt;a class="link" href="https://gohugo.io/variables/" target="_blank" rel="noopener"
&gt;Hugoの変数&lt;/a&gt;を用いて
各記事に適応できるように変更すると、次のようになる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;application/ld+json&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@context&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://schema.org&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;BlogPosting&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;headline&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Title&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;image&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;absURL&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;datePublished&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PublishDate&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;dateModified&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Lastmod&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;author&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Person&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Site&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Author&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Site&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Author&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ただし、下記のように記事のfront matterに&lt;code&gt;title&lt;/code&gt;、&lt;code&gt;date&lt;/code&gt;、&lt;code&gt;image&lt;/code&gt;が定義されているものとする&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;記事のfront matterの例&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-md" data-lang="md"&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;title: Example
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;date: 2022-12-28T09:58:07+09:00
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;image: test/sample.webp
&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;&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;また、config.yamlに、次のように&lt;code&gt;author&lt;/code&gt;が定義されているものとする&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;config.yamlの例&lt;/div&gt;
&lt;div class="code-block-content"&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="nt"&gt;author&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;NakuRei&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;https://twitter.com/nakurei7901&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ここでさらに、記事のページに&lt;a class="link" href="https://developers.google.com/search/docs/appearance/structured-data/breadcrumb" target="_blank" rel="noopener"
&gt;パンくずリスト（BreadcrumbList）&lt;/a&gt;の構造化データを加える。
&lt;a class="link" href="https://developers.google.com/search/docs/appearance/structured-data/breadcrumb" target="_blank" rel="noopener"
&gt;Google検索セントラル&lt;/a&gt;によると、
パンくずリストで推奨されている構造化データは次のとおりである。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;application/ld+json&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@context&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://schema.org&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;BreadcrumbList&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;itemListElement&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ListItem&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Books&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;item&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://example.com/books&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ListItem&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Science Fiction&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;item&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://example.com/books/sciencefiction&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ListItem&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Award Winners&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これを&lt;a class="link" href="https://gohugo.io/variables/" target="_blank" rel="noopener"
&gt;Hugoの変数&lt;/a&gt;を用いて
各記事に適応できるように変更すると、次のようになる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;application/ld+json&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;categories&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@context&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://schema.org&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;BreadcrumbList&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;itemListElement&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ListItem&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;categories&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;item&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Join&lt;/span&gt; &lt;span class="p"&gt;(.&lt;/span&gt;&lt;span class="nx"&gt;Site&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;BaseURL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/categories/&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;relLangURL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;categories&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;urlize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;{{ if .Page.Params.categories }}&lt;/code&gt;で囲むことで、このパンくずリストの記述は、記事のfront matterに&lt;code&gt;categories&lt;/code&gt;が定義されているときだけ反映される。
また、下記のように複数カテゴリが記述されている場合、最初の1つだけが利用されるようにしている。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;記事のfront matterの例&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-md" data-lang="md"&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;categories: [Example1, Example2]
&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;/div&gt;
&lt;/div&gt;
&lt;p&gt;これら2つの構造化データ記述をまとめると下記のようになる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;application/ld+json&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@context&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://schema.org&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;BlogPosting&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;headline&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Title&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;image&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;absURL&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;datePublished&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PublishDate&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;dateModified&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Lastmod&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;author&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Person&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Site&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Author&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Site&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Author&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;categories&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@context&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://schema.org&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;BreadcrumbList&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;itemListElement&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ListItem&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;categories&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;item&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Join&lt;/span&gt; &lt;span class="p"&gt;(.&lt;/span&gt;&lt;span class="nx"&gt;Site&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;BaseURL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/categories/&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;relLangURL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;categories&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;urlize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ところで、上記&lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;タグのままだと、記事以外のページもBlogPosting扱いになってしまう。
そのため、記事にだけBlogPostingの構造化データが適用されるように、Hugoの変数&lt;code&gt;IsPage&lt;/code&gt;を利用する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;script type=&amp;#34;application/ld+json&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;&lt;span class="gi"&gt;+ {{ if .IsPage }}
&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;#34;@context&amp;#34;: &amp;#34;https://schema.org&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;@type&amp;#34;: &amp;#34;BlogPosting&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;headline&amp;#34;: {{ .Title }},
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;image&amp;#34;: {{ .Page.Params.image | absURL }},
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;datePublished&amp;#34;: {{ .PublishDate }},
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;dateModified&amp;#34;: {{ .Lastmod }},
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;author&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;@type&amp;#34;: &amp;#34;Person&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;name&amp;#34;: {{ .Site.Author.name }},
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;url&amp;#34;: {{ .Site.Author.url }}
&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; {{ if .Page.Params.categories }}
&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;#34;@context&amp;#34;: &amp;#34;https://schema.org&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;@type&amp;#34;: &amp;#34;BreadcrumbList&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;itemListElement&amp;#34;: [{
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;@type&amp;#34;: &amp;#34;ListItem&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;position&amp;#34;: 1,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;name&amp;#34;: {{ index .Page.Params.categories 0 }},
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;item&amp;#34;: {{ path.Join (.Site.BaseURL) (&amp;#34;/categories/&amp;#34; | relLangURL) (index .Page.Params.categories 0 | urlize) }}
&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; {{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ {{ end }}
&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;/script&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;記事以外のページには、&lt;a class="link" href="https://developers.google.com/search/docs/appearance/site-names#how-to-add-structured-data" target="_blank" rel="noopener"
&gt;WebSite&lt;/a&gt;の構造化データを適用する。
&lt;a class="link" href="https://developers.google.com/search/docs/appearance/site-names#how-to-add-structured-data" target="_blank" rel="noopener"
&gt;Google検索セントラル&lt;/a&gt;によると、
WebSiteで推奨されている構造化データは下記のとおりである。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;application/ld+json&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@context&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://schema.org&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;WebSite&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Example&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;url&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://example.com/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これを&lt;a class="link" href="https://gohugo.io/variables/" target="_blank" rel="noopener"
&gt;Hugoの変数&lt;/a&gt;を用いて
各記事に適応できるように変更すると、次のようになる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;application/ld+json&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@context&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://schema.org&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;WebSite&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Site&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Title&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Site&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;BaseURL&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ただし、config.yamlに、次のように&lt;code&gt;title&lt;/code&gt;と&lt;code&gt;baseurl&lt;/code&gt;が定義されているものとする&lt;sup id="fnref:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;config.yamlの例&lt;/div&gt;
&lt;div class="code-block-content"&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="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="l"&gt;Examole Site Title&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;baseurl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;https://example.com&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;以上すべての構造化データをまとめると、&lt;code&gt;layouts/partials/schema.html&lt;/code&gt;には下記を記述することになる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;layouts/partials/schema.html&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;application/ld+json&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;IsPage&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@context&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://schema.org&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;BlogPosting&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;headline&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Title&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;image&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;absURL&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;datePublished&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PublishDate&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;dateModified&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Lastmod&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;author&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Person&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Site&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Author&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Site&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Author&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;categories&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@context&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://schema.org&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;BreadcrumbList&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;itemListElement&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ListItem&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;categories&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;item&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Join&lt;/span&gt; &lt;span class="p"&gt;(.&lt;/span&gt;&lt;span class="nx"&gt;Site&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;BaseURL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/categories/&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;relLangURL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;categories&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;urlize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@context&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://schema.org&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;WebSite&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Site&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Title&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Site&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;BaseURL&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="schemahtmlをサイトに埋め込む"&gt;
schema.htmlをサイトに埋め込む&lt;a href="#schemahtml%e3%82%92%e3%82%b5%e3%82%a4%e3%83%88%e3%81%ab%e5%9f%8b%e3%82%81%e8%be%bc%e3%82%80"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;つくったschema.htmlをサイトに埋め込む。
&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;タグ内か、&lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;タグの下部に埋め込めばよい。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- json-ld --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {{- partial &amp;#34;schema.html&amp;#34; . -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- json-ld --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;筆者の使っているHugoのテーマ&lt;a class="link" href="https://themes.gohugo.io/themes/hugo-theme-stack/" target="_blank" rel="noopener"
&gt;Stack&lt;/a&gt;では、&lt;code&gt;layouts/partials/head/custom.html&lt;/code&gt;に追加したい内容を記述すれば、
&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;タグ内に自動で追記してくれる。
よって、&lt;code&gt;layouts/partials/head/custom.html&lt;/code&gt;にschema.htmlを読み込む記述を書く。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;layouts/partials/head/custom.html&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{- partial &amp;#34;schema.html&amp;#34; . -}}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="構造化データが正常に作成されているか確認する"&gt;
構造化データが正常に作成されているか確認する&lt;a href="#%e6%a7%8b%e9%80%a0%e5%8c%96%e3%83%87%e3%83%bc%e3%82%bf%e3%81%8c%e6%ad%a3%e5%b8%b8%e3%81%ab%e4%bd%9c%e6%88%90%e3%81%95%e3%82%8c%e3%81%a6%e3%81%84%e3%82%8b%e3%81%8b%e7%a2%ba%e8%aa%8d%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;構造化データが作成されているかは、
&lt;a class="link" href="https://developers.google.com/search/docs/appearance/structured-data" target="_blank" rel="noopener"
&gt;Google 検索セントラルの構造化データ マークアップテストサイト&lt;/a&gt;
で確認できる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://search.google.com/test/rich-results" target="_blank" rel="noopener"
&gt;リッチリザルト テスト&lt;/a&gt;: Googleのリッチリザルトに対応している構造化データを確認できる&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://validator.schema.org/" target="_blank" rel="noopener"
&gt;スキーマ マークアップ検証ツール&lt;/a&gt;: すべての構造化データを確認できる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data" target="_blank" rel="noopener"
&gt;構造化データのマークアップの仕組み概要 | Google 検索セントラル | ドキュメント | Google Developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://aloha-ru.com/hugo/hugo-schema/" target="_blank" rel="noopener"
&gt;HUGOのサイトを構造化マークアップに対応する方法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://turuyakame.com/p/etjzggy/" target="_blank" rel="noopener"
&gt;🎉 Hugoサイトを構造化データ(JSON-LD)対応にした - 鶴屋蛙芽ブログ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://enjoyall.comichi.com/json-ld_implemetation/" target="_blank" rel="noopener"
&gt;Hugoで構造化データ(JSON-LD)に対応する【Google推奨SEO】 ｜ enjoyall&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;&lt;code&gt;.Title&lt;/code&gt;、&lt;code&gt;.PublishDate&lt;/code&gt;、&lt;code&gt;.Lastmod&lt;/code&gt;、&lt;code&gt;.Page.Params.image&lt;/code&gt;のため。&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;&lt;code&gt;.Site.Author.name&lt;/code&gt;と&lt;code&gt;.Site.Author.url&lt;/code&gt;のため。&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;&lt;code&gt;.Site.Title&lt;/code&gt;と&lt;code&gt;.Site.BaseURL&lt;/code&gt;のため。&amp;#160;&lt;a href="#fnref:3" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>WindowsでHDDなどのデバイスやストレージをXFSにフォーマットする</title><link>https://notes.nakurei.com/post/formatting-hdd-to-xfs-in-windows/</link><pubDate>Wed, 28 Dec 2022 02:49:38 +0900</pubDate><guid>https://notes.nakurei.com/post/formatting-hdd-to-xfs-in-windows/</guid><description>&lt;img src="https://notes.nakurei.com/post/formatting-hdd-to-xfs-in-windows/20221228014229_trim.webp" alt="Featured image of post WindowsでHDDなどのデバイスやストレージをXFSにフォーマットする" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;WindowsのマシンでHDDなどのデバイス/ストレージをXFS形式でフォーマットする手順を示すもの。
WindowsのマシンでUbuntuを起動し、Ubuntuでフォーマットする。&lt;/p&gt;
&lt;h2 id="はじめに"&gt;
はじめに&lt;a href="#%e3%81%af%e3%81%98%e3%82%81%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;UbuntuなどLinuxマシンがあるなら、ここで説明する回りくどい方法は必要ない。&lt;/p&gt;
&lt;h2 id="必要なもの"&gt;
必要なもの&lt;a href="#%e5%bf%85%e8%a6%81%e3%81%aa%e3%82%82%e3%81%ae"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Windows 11（またはWindows 10）が起動するPC&lt;/li&gt;
&lt;li&gt;3GB以上の空のUSBメモリ&lt;/li&gt;
&lt;li&gt;フォーマットしたいデバイス&lt;/li&gt;
&lt;li&gt;Windowsマシンの管理者権限&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Windows 11 22H2&lt;/li&gt;
&lt;li&gt;Rufus 3.21&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="流れ"&gt;
流れ&lt;a href="#%e6%b5%81%e3%82%8c"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;フォーマットしたいデバイス内のデータをバックアップする&lt;/li&gt;
&lt;li&gt;WindowsのマシンでUbuntuのUSBブートメディアを作る&lt;/li&gt;
&lt;li&gt;WindowsのマシンでUbuntuをUSBメモリから起動する&lt;/li&gt;
&lt;li&gt;UbuntuでデバイスをXFSにフォーマットする&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="フォーマットしたいデバイス内のデータをバックアップする"&gt;
フォーマットしたいデバイス内のデータをバックアップする&lt;a href="#%e3%83%95%e3%82%a9%e3%83%bc%e3%83%9e%e3%83%83%e3%83%88%e3%81%97%e3%81%9f%e3%81%84%e3%83%87%e3%83%90%e3%82%a4%e3%82%b9%e5%86%85%e3%81%ae%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92%e3%83%90%e3%83%83%e3%82%af%e3%82%a2%e3%83%83%e3%83%97%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;フォーマットすると、&lt;strong&gt;フォーマットされたデバイス内のデータはすべて消去されてしまう&lt;/strong&gt;。
そのため、必ず内部データはすべてバックアップしておく。&lt;/p&gt;
&lt;h3 id="windowsのマシンでubuntuのusbブートメディアを作る"&gt;
WindowsのマシンでUbuntuのUSBブートメディアを作る&lt;a href="#windows%e3%81%ae%e3%83%9e%e3%82%b7%e3%83%b3%e3%81%a7ubuntu%e3%81%aeusb%e3%83%96%e3%83%bc%e3%83%88%e3%83%a1%e3%83%87%e3%82%a3%e3%82%a2%e3%82%92%e4%bd%9c%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;UbuntuのUSB起動ドライブを作り、UbuntuをUSBメモリから起動できるようにする。&lt;/p&gt;
&lt;p&gt;まず、&lt;a class="link" href="https://www.ubuntulinux.jp/download" target="_blank" rel="noopener"
&gt;Ubuntu Japanese Teamの公式サイト&lt;/a&gt;
から、入れたいOSのISOイメージファイルをWindowsマシンにダウンロードする。
言語を日本語にしたいなら&lt;a class="link" href="https://www.ubuntulinux.jp/download/ja-remix" target="_blank" rel="noopener"
&gt;日本語Remixイメージ&lt;/a&gt;のほうがよい。
なぜなら、日本語Remixイメージは、はじめから日本語をサポートするように構成されているためである。
今回は日本語RemixイメージのUbuntu 20.04.1 LTSをダウンロードした。&lt;/p&gt;
&lt;p&gt;次に、ダウンロードしたISOイメージファイルをUSBメモリに書き込むためのソフトウェアをダウンロード/インストールする。
今回は&lt;a class="link" href="https://rufus.ie/" target="_blank" rel="noopener"
&gt;Rufus&lt;/a&gt;を利用する&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;。
インストール版とポータブル版があるが、今回はインストールが不要なポータブル版を利用した。&lt;/p&gt;
&lt;p&gt;ここで、用意したUSBメモリをWindows PCに差し込む。
このUSBメモリにUbuntuを入れる。&lt;/p&gt;
&lt;p&gt;ダウンロードしたRufusのEXEファイル（e.g. rufus-3.21p.exe）を実行する。
管理者権限が必要。
Rufusの更新ポリシーの確認ダイアログが出るが、これはどちらでもかまわない&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;
&lt;p&gt;Rufusが起動したら、下記をすべて設定する。そのほかはデフォルトで問題ない。
保存領域のサイズについては、4096kB程度にしてもよい。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;設定名&lt;/th&gt;
&lt;th style="text-align: left"&gt;設定するもの&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;デバイス&lt;/td&gt;
&lt;td style="text-align: left"&gt;Ubuntuを入れるUSBメモリを選択&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;ブートの種類&lt;/td&gt;
&lt;td style="text-align: left"&gt;「選択」ボタンから、ダウンロードしたISOイメージファイルを選択&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/formatting-hdd-to-xfs-in-windows/20221228014229.png"
width="850"
height="1114"
srcset="https://notes.nakurei.com/post/formatting-hdd-to-xfs-in-windows/20221228014229_hu_688bb63c8d4698d1.png 480w, https://notes.nakurei.com/post/formatting-hdd-to-xfs-in-windows/20221228014229_hu_21680f8d99077027.png 1024w"
loading="lazy"
alt="Rufusの設定"
class="gallery-image"
data-flex-grow="76"
data-flex-basis="183px"
&gt;&lt;/p&gt;
&lt;p&gt;ここまで設定したら「スタート」をクリックする。&lt;/p&gt;
&lt;p&gt;「ISOHybridイメージの検出」ダイアログが出たら、ISOイメージモードを選択する。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/formatting-hdd-to-xfs-in-windows/20221228015003.png"
width="1017"
height="534"
srcset="https://notes.nakurei.com/post/formatting-hdd-to-xfs-in-windows/20221228015003_hu_270b6053f7931907.png 480w, https://notes.nakurei.com/post/formatting-hdd-to-xfs-in-windows/20221228015003_hu_7a7b63b48d23f74e.png 1024w"
loading="lazy"
alt="「ISOHybridイメージの検出」ダイアログ"
class="gallery-image"
data-flex-grow="190"
data-flex-basis="457px"
&gt;&lt;/p&gt;
&lt;p&gt;「ダウンロードが必要です」のダイアログが出たら、「はい」をクリックしてダウンロードする。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/formatting-hdd-to-xfs-in-windows/20221228014901.png"
width="899"
height="662"
srcset="https://notes.nakurei.com/post/formatting-hdd-to-xfs-in-windows/20221228014901_hu_af0a0ee671255645.png 480w, https://notes.nakurei.com/post/formatting-hdd-to-xfs-in-windows/20221228014901_hu_2487d070708e914c.png 1024w"
loading="lazy"
alt="「ダウンロードが必要です」のダイアログ"
class="gallery-image"
data-flex-grow="135"
data-flex-basis="325px"
&gt;&lt;/p&gt;
&lt;p&gt;最後に警告が表示される。&lt;strong&gt;デバイスがUSBデバイスになっていることを再度確認して&lt;/strong&gt;、OKを選択する。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/formatting-hdd-to-xfs-in-windows/20221228014932.png"
width="898"
height="383"
srcset="https://notes.nakurei.com/post/formatting-hdd-to-xfs-in-windows/20221228014932_hu_e4c0960cf21aa805.png 480w, https://notes.nakurei.com/post/formatting-hdd-to-xfs-in-windows/20221228014932_hu_8500db697c6ec3b2.png 1024w"
loading="lazy"
alt="警告ダイアログ"
class="gallery-image"
data-flex-grow="234"
data-flex-basis="562px"
&gt;&lt;/p&gt;
&lt;p&gt;すると、USBへの書き込みが開始する。
しばらく待って書き込みが完了したら、Rufusを閉じる。
以上で、UbuntuのUSBブートメディアが完成した。&lt;/p&gt;
&lt;h3 id="windowsのマシンでubuntuをusbメモリから起動する"&gt;
WindowsのマシンでUbuntuをUSBメモリから起動する&lt;a href="#windows%e3%81%ae%e3%83%9e%e3%82%b7%e3%83%b3%e3%81%a7ubuntu%e3%82%92usb%e3%83%a1%e3%83%a2%e3%83%aa%e3%81%8b%e3%82%89%e8%b5%b7%e5%8b%95%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;作ったUbuntuのUSBブートメディアでUbuntuを起動するため、USBメモリを差したまま、Windows PCを再起動する。&lt;/p&gt;
&lt;p&gt;起動時にF2やF12キーを押してBIOS／UEFIの設定画面を開く&lt;sup id="fnref:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt;。
BIOS画面ではブートメニューを開く。
ブートメニューの変更前の状態を写真などで保存したのち、起動デバイスの優先順位を、内臓SSD/HDDよりもUSBドライブが優先されるように変更する&lt;sup id="fnref:4"&gt;&lt;a href="#fn:4" class="footnote-ref" role="doc-noteref"&gt;4&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;
&lt;p&gt;BIOSの変更を保存して再起動すると、Ubuntuが起動する。
このとき「can not mount /dev/loop0 on /cow」というエラーが発生した場合は、USBブートメディアがきちんと作れていないため、再度USBブートメディアを作り直す。&lt;/p&gt;
&lt;p&gt;Installer boot menuが表示された場合は「Try Ubuntu without installing」あるいは「Ubuntuを試す」を選択する。
&lt;strong&gt;絶対に「Ubuntuをインストール」してはいけない&lt;/strong&gt;。
Windowsマシン内のデータが失われてしまう。&lt;/p&gt;
&lt;h3 id="ubuntuでデバイスをxfsにフォーマットする"&gt;
UbuntuでデバイスをXFSにフォーマットする&lt;a href="#ubuntu%e3%81%a7%e3%83%87%e3%83%90%e3%82%a4%e3%82%b9%e3%82%92xfs%e3%81%ab%e3%83%95%e3%82%a9%e3%83%bc%e3%83%9e%e3%83%83%e3%83%88%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Ubuntuが起動したら、ターミナルを開き、ストレージをXFSにフォーマットしていく。&lt;/p&gt;
&lt;p&gt;まず、ディスクのパーティションを確認する。
下記コマンドをターミナルで実行すると、接続されているストレージの情報が表示される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo parted -l&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;表示される情報の「Model」がデバイス/ストレージの名前、「Disk」がデバイスのパスと容量である。
これらの情報から、フォーマットしたいデバイス/ストレージのパスを確認する。
以下はこのパスが&lt;code&gt;/dev/sda&lt;/code&gt;であるものとする。
&lt;strong&gt;このパスを間違えると取り返しのつかないことになる&lt;/strong&gt;ため、間違いのないようにすること。&lt;/p&gt;
&lt;p&gt;次に、XFSへのフォーマットを実行する。
&lt;strong&gt;下記コマンドの&lt;code&gt;/dev/sda&lt;/code&gt;を、フォーマットしたいデバイス/ストレージのパスに変更して&lt;/strong&gt;実行する。
これで、デバイス/ストレージをXFSにフォーマットできる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mkfs.xfs -f /dev/sda&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;このとき「デバイスもしくはリソースがビジー状態です」というエラーが発生しうる。
発生する場合は、Ubuntuのなんらかのシステムがデバイスを利用しているか、Ubuntu側で自動的にデバイスをマウントしている可能性がある。&lt;/p&gt;
&lt;p&gt;Ubuntuのなんらかのシステムがデバイスを利用しているかどうかを確認するには、&lt;code&gt;lsof&lt;/code&gt;コマンドを利用する。
これにより、マウント先のディレクトリを利用しているサービスを調べられる。
そのサービスを停止すれば、ビジー状態が解除される。
下記コマンドで何も表示されない場合は無視してよい（&lt;code&gt;/dev/sda&lt;/code&gt;はフォーマットしたいデバイス/ストレージのパスに変更すること）。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lsof &lt;span class="p"&gt;|&lt;/span&gt; grep /dev/sda&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Ubuntu側で自動的にデバイスをマウントしているかを確認するには、&lt;code&gt;lsblk&lt;/code&gt;コマンドを利用する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lsblk&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;出てくる結果の「NAME」がフォーマットしたいデバイス（e.g. &lt;code&gt;sda&lt;/code&gt;）と一致する部分を確認する。
その部分およびそこから枝分かれしている部分の「MOUNTPOINT」に&lt;code&gt;/ubuntu/&lt;/code&gt;から始まるパスが指定されている場合は、Ubuntu側で自動的にデバイスをマウントしている。
その場合は、デバイスを&lt;code&gt;umount&lt;/code&gt;コマンドでアンマウントする。下記に&lt;code&gt;umount&lt;/code&gt;コマンドの例を示す。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;umount /dev/sda1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;以上の対応をしてからXFSへのフォーマットを実行すると、今度はうまくいくはずである。
&lt;strong&gt;くれぐれもデバイスのパスを間違えないように&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;XFSへのフォーマットが完了したら、&lt;code&gt;sudo parted -l&lt;/code&gt;できちんとフォーマットされたか確認するとよい。&lt;/p&gt;
&lt;p&gt;無事フォーマットできたら、Ubuntuはシャットダウンする。
PCを再起動し、BIOS画面を開き、起動デバイスの優先順位を元に戻す。
設定を保存して再起動すると、Windowsが起動する。&lt;/p&gt;
&lt;p&gt;以上で、WindowsマシンでストレージをXFSにマウントできた。&lt;/p&gt;
&lt;h2 id="おわりに"&gt;
おわりに&lt;a href="#%e3%81%8a%e3%82%8f%e3%82%8a%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;作成したUSBブートメディアは、再度NTFSなどにフォーマットして、ただのUSBデバイスとして利用してよい。
Ubuntuが起動できると便利なこともあるため、そのままPCへ差しっぱなしにしてもいいだろう。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://dailylife.pman-bros.com/ubuntu-usb-boot/" target="_blank" rel="noopener"
&gt;UbuntuをUSBから起動する【ブータブルUSBドライブ】を作成する | ピーマンブラザーズの日常&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://itlogs.net/ubuntu-bootable-usb/" target="_blank" rel="noopener"
&gt;Linux UbuntuのブータブルUSBドライブを作成する手順 | 俺の開発研究所&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://jp.easeus.com/todo-backup-resource/backup-files-to-external-hdd-automaticly.html" target="_blank" rel="noopener"
&gt;方法3選｜パソコンのデータを外付けHDDに自動的にバックアップする方法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.ubuntulinux.jp/download" target="_blank" rel="noopener"
&gt;Ubuntuの入手 | Ubuntu Japanese Team&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://rufus.ie/ja/" target="_blank" rel="noopener"
&gt;Rufus - 起動可能なUSBドライブを簡単に作成できます&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://malg7.com/there-are-filesystem-specific-o-flags-can-not-mount-dev-loop0-on-cow/" target="_blank" rel="noopener"
&gt;there are filesystem specific o flags can not mount /dev/loop0 on /cow というエラー | よろろぐ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://okinaka.hatenablog.com/entry/20100609/1276072346" target="_blank" rel="noopener"
&gt;Ubuntu で XFSファイルシステムを使う - エンジニアきまぐれTips&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://www2.yukawa.kyoto-u.ac.jp/~koudai.sugimoto/dokuwiki/doku.php?id=ubuntu:%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8%E3%81%AE%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88" target="_blank" rel="noopener"
&gt;ubuntu:ストレージのフォーマット \[雑多な記録\]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://help.arena.ne.jp/hc/ja/articles/4402359195799-%E8%BF%BD%E5%8A%A0%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88-Ubuntu20-04-Ubuntu22-04-" target="_blank" rel="noopener"
&gt;追加ディスクマウント（Ubuntu20,04、Ubuntu22.04） – お客さまサポート&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://wiki.inamuu.com/?%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%82%82%E3%81%97%E3%81%8F%E3%81%AF%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%8C%E3%83%93%E3%82%B8%E3%83%BC%E7%8A%B6%E6%85%8B%E3%81%A7%E3%81%99" target="_blank" rel="noopener"
&gt;デバイスもしくはリソースがビジー状態です - inamuu wiki site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://kimamani89.com/2020/01/15/%E3%80%90linux-debian%E3%80%91fdisk%E3%81%A7%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E5%87%BA%E3%81%9F%E6%99%82%E3%81%AE%E5%AF%BE%E7%AD%96/" target="_blank" rel="noopener"
&gt;【Linux : Debian】fdiskでエラーが出た時の対策 | ぶたキムチBLOG&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;ちなみに、Universal USB Installerも利用したことがあるが、筆者の環境ではUbuntuをうまくインストールできないことが多かった。&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;何度も利用するアプリではないため、筆者は「いいえ」にして、使い終わった後ソフトウェアを削除している。&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;BIOS画面の開き方はPCの構成/メーカーによって異なるため、わからない場合は各自調べてほしい。BIOS画面の開き方については、大抵起動時のロゴ表示時に、上下に文字で書かれている。&amp;#160;&lt;a href="#fnref:3" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:4"&gt;
&lt;p&gt;BIOS画面の操作方法はPCの構成/メーカーによって異なるため、わからない場合は各自調べてほしい。&amp;#160;&lt;a href="#fnref:4" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>VSTプラグインを適用した音声をDiscordの通話に乗せる</title><link>https://notes.nakurei.com/post/put-voice-de-noise-audio-on-discord/</link><pubDate>Mon, 26 Dec 2022 03:01:36 +0900</pubDate><guid>https://notes.nakurei.com/post/put-voice-de-noise-audio-on-discord/</guid><description>&lt;img src="https://notes.nakurei.com/post/put-voice-de-noise-audio-on-discord/20221226024904.webp" alt="Featured image of post VSTプラグインを適用した音声をDiscordの通話に乗せる" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Discordの通話音声にVSTプラグインをリアルタイムで適用するためにやったことのメモ。今回はVSTプラグインとして、iZotopeのRX 9に入っているVoice De-noiseを利用した。&lt;/p&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Windows 11&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://discord.com/" target="_blank" rel="noopener"
&gt;Discord&lt;/a&gt;のデスクトップアプリ&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="必要なもの"&gt;
必要なもの&lt;a href="#%e5%bf%85%e8%a6%81%e3%81%aa%e3%82%82%e3%81%ae"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;DAWソフト、あるいはVSTプラグインホストアプリ
&lt;ul&gt;
&lt;li&gt;今回は無料のDAWソフトである&lt;a class="link" href="https://www.bandlab.com/products/cakewalk" target="_blank" rel="noopener"
&gt;Cakewalk&lt;/a&gt;を使う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;仮想オーディオデバイス
&lt;ul&gt;
&lt;li&gt;今回は無料の&lt;a class="link" href="https://syncroom.yamaha.com/play/dl/" target="_blank" rel="noopener"
&gt;SYNCROOM&lt;/a&gt;を使う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;適用したいVSTプラグイン
&lt;ul&gt;
&lt;li&gt;今回はiZotope RX 9 Voice De-noiseを用いる。これは有料。&lt;/li&gt;
&lt;li&gt;VST2/VST3プラグインであればなんでもよい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="dawソフトあるいはvstプラグインホストアプリ"&gt;
DAWソフト、あるいはVSTプラグインホストアプリ&lt;a href="#daw%e3%82%bd%e3%83%95%e3%83%88%e3%81%82%e3%82%8b%e3%81%84%e3%81%afvst%e3%83%97%e3%83%a9%e3%82%b0%e3%82%a4%e3%83%b3%e3%83%9b%e3%82%b9%e3%83%88%e3%82%a2%e3%83%97%e3%83%aa"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;今回は無料のDAWソフトである&lt;a class="link" href="https://www.bandlab.com/products/cakewalk" target="_blank" rel="noopener"
&gt;Cakewalk&lt;/a&gt;を使う。&lt;/p&gt;
&lt;p&gt;CakewalkはあくまでVSTプラグインを音声にかけるためのソフトとして利用する。そのため、任意の入出力インターフェイスに対してVSTプラグインをかけられるソフトであれば、別のものでも問題ない。
大抵のDAWソフトなら対応している。また、&lt;a class="link" href="https://www.cantabilesoftware.com/download/" target="_blank" rel="noopener"
&gt;Cantabile Lite&lt;/a&gt;や&lt;a class="link" href="https://www.hermannseib.com/english/vsthost.htm" target="_blank" rel="noopener"
&gt;VSTHost&lt;/a&gt;のようなVSTプラグインホストアプリでも代用できる。&lt;/p&gt;
&lt;h3 id="syncroom"&gt;
SYNCROOM&lt;a href="#syncroom"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a class="link" href="https://syncroom.yamaha.com/play/dl/" target="_blank" rel="noopener"
&gt;SYNCROOM&lt;/a&gt;は、アプリ自体は使わず、インストール時についてくる仮想オーディオデバイス（YAMAHA SYNCROOM driver）を利用する。そのため、インストール時にドライバもインストールしなければならない。&lt;/p&gt;
&lt;p&gt;仮想インターフェイスを利用できれば良いため、&lt;a class="link" href="https://vb-audio.com/Cable/" target="_blank" rel="noopener"
&gt;VB-Audio CABLE&lt;/a&gt;などの仮想オーディオデバイスでも問題ない。VB-Audio CABLEのほうが軽いため、容量の問題を気にするならこちらのほうがよい。&lt;/p&gt;
&lt;h2 id="流れ"&gt;
流れ&lt;a href="#%e6%b5%81%e3%82%8c"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;DAWソフトあるいはVSTプラグインホストアプリ（Cakewalk）と、SYNCROOMをインストールする&lt;/li&gt;
&lt;li&gt;CakewalkでVSTプラグインをかけるためのプロジェクトを作成する&lt;/li&gt;
&lt;li&gt;Discordの入力デバイスを仮想デバイスにする&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="dawソフトとsyncroomをインストールする"&gt;
DAWソフトとSYNCROOMをインストールする&lt;a href="#daw%e3%82%bd%e3%83%95%e3%83%88%e3%81%a8syncroom%e3%82%92%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;DAWソフト（&lt;a class="link" href="https://www.bandlab.com/products/cakewalk" target="_blank" rel="noopener"
&gt;Cakewalk&lt;/a&gt;）と&lt;a class="link" href="https://syncroom.yamaha.com/play/dl/" target="_blank" rel="noopener"
&gt;SYNCROOM&lt;/a&gt;をそれぞれインストールする。
どちらも無料（執筆時点）。
SYNCROOMをインストールする際にドライバもインストールするか聞かれたら、ドライバもインストールするほうを選ぶ。&lt;/p&gt;
&lt;p&gt;ちなみに、SYNCROOMはインストールするだけで、今後起動することはない。&lt;/p&gt;
&lt;h3 id="cakewalkでvstプラグインをかけるためのプロジェクトを作成する"&gt;
CakewalkでVSTプラグインをかけるためのプロジェクトを作成する&lt;a href="#cakewalk%e3%81%a7vst%e3%83%97%e3%83%a9%e3%82%b0%e3%82%a4%e3%83%b3%e3%82%92%e3%81%8b%e3%81%91%e3%82%8b%e3%81%9f%e3%82%81%e3%81%ae%e3%83%97%e3%83%ad%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%82%92%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Cakewalkを起動し、新規プロジェクト-&amp;gt;Empty Project.cwtを選択して、空のプロジェクトを作成する。&lt;/p&gt;
&lt;p&gt;上のメニューバーの「編集」-&amp;gt;「環境設定」を開き、下記を設定する。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;オーディオ-&amp;gt;デバイスの選択
&lt;ul&gt;
&lt;li&gt;入力デバイスを使うマイクにする&lt;/li&gt;
&lt;li&gt;出力デバイスを「ライン (Yamaha STNCROOM Driver (WDM))」にする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;オーディオ-&amp;gt;オプション
&lt;ul&gt;
&lt;li&gt;ドライバモードを「WASAPI共有」にする&lt;/li&gt;
&lt;li&gt;「フォーカス中でなければオーディオエンジンを一時停止」のチェックを&lt;strong&gt;外す&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/put-voice-de-noise-audio-on-discord/20221226024606.png"
width="508"
height="149"
srcset="https://notes.nakurei.com/post/put-voice-de-noise-audio-on-discord/20221226024606_hu_561532b435186658.png 480w, https://notes.nakurei.com/post/put-voice-de-noise-audio-on-discord/20221226024606_hu_6c4c02edfa5634d3.png 1024w"
loading="lazy"
alt="オーディオ-&amp;gt;オプションの設定画面"
class="gallery-image"
data-flex-grow="340"
data-flex-basis="818px"
&gt;&lt;/p&gt;
&lt;p&gt;設定したら適用-&amp;gt;OKして、設定ダイアログを閉じる。&lt;/p&gt;
&lt;p&gt;次に、真ん中左上にあるプラスマークをクリックし、プロジェクトにトラックを追加する。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/put-voice-de-noise-audio-on-discord/20221226024307.png"
width="410"
height="98"
srcset="https://notes.nakurei.com/post/put-voice-de-noise-audio-on-discord/20221226024307_hu_c7ebad13c2fb86ed.png 480w, https://notes.nakurei.com/post/put-voice-de-noise-audio-on-discord/20221226024307_hu_34dcfaf76edc0b30.png 1024w"
loading="lazy"
alt="トラックの情報が表示されていない場合"
class="gallery-image"
data-flex-grow="418"
data-flex-basis="1004px"
&gt;&lt;/p&gt;
&lt;p&gt;上図のようにトラックの情報が表示されていない場合は、トラック右端にある下三角2個のマークをクリックする。
そうすると、下図のように情報が表示される。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/put-voice-de-noise-audio-on-discord/20221226023858.png"
width="442"
height="197"
srcset="https://notes.nakurei.com/post/put-voice-de-noise-audio-on-discord/20221226023858_hu_ae1dffc372490a5d.png 480w, https://notes.nakurei.com/post/put-voice-de-noise-audio-on-discord/20221226023858_hu_cf698e7e82f2472f.png 1024w"
loading="lazy"
alt="追加したトラックの設定"
class="gallery-image"
data-flex-grow="224"
data-flex-basis="538px"
&gt;&lt;/p&gt;
&lt;p&gt;追加したトラックの入力（3段目左のI）が使うマイクに、
出力（3段目右のO）が「ライン (Yamaha STNCROOM Driver (WDM))」になっていることを確認する。&lt;/p&gt;
&lt;p&gt;また、1段目の一番右にあるインプットモニターをONにする。&lt;/p&gt;
&lt;p&gt;最後に、トラック-&amp;gt;「FX」の右にあるプラスボタンをクリックし、
「オーディオFXの挿入」-&amp;gt;「Restoration」-&amp;gt;「RX 9 Voice De-noise」を選択する&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;。
すると、Voice De-noiseの画面が出てくる。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/put-voice-de-noise-audio-on-discord/20221226024904.png"
width="784"
height="460"
srcset="https://notes.nakurei.com/post/put-voice-de-noise-audio-on-discord/20221226024904_hu_5d566c8e22313d3c.png 480w, https://notes.nakurei.com/post/put-voice-de-noise-audio-on-discord/20221226024904_hu_aa661c72350028ac.png 1024w"
loading="lazy"
alt="RX 9 Voice De-noiseの画面"
class="gallery-image"
data-flex-grow="170"
data-flex-basis="409px"
&gt;&lt;/p&gt;
&lt;p&gt;Adaptive modeを利用するなら、Adaptive modeを有効にしたままでよい。
Learn modeを利用するなら、Adaptive modeを無効にしてLearnを有効にし、しばらくたってからLearnを無効にする。
その後、Voice De-noiseの画面を閉じる。
この辺りはDiscordで聞こえ方を確認しながら設定すればよいため、今は適当で構わない。&lt;/p&gt;
&lt;p&gt;ここで一度プロジェクトを保存しておく。&lt;/p&gt;
&lt;h3 id="discordの入力デバイスを仮想デバイスにする"&gt;
Discordの入力デバイスを仮想デバイスにする&lt;a href="#discord%e3%81%ae%e5%85%a5%e5%8a%9b%e3%83%87%e3%83%90%e3%82%a4%e3%82%b9%e3%82%92%e4%bb%ae%e6%83%b3%e3%83%87%e3%83%90%e3%82%a4%e3%82%b9%e3%81%ab%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cakewalkを起動したまま&lt;/strong&gt;、Discordを起動する。&lt;/p&gt;
&lt;p&gt;Discordの「ユーザー設定」-&amp;gt;「音声・ビデオ」を開く。
その後、一番上の「音声設定」にある入力デバイスを、「ライン (Yamaha STNCROOM Driver (WDM))」にする。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/put-voice-de-noise-audio-on-discord/20221226021720.png"
width="383"
height="145"
srcset="https://notes.nakurei.com/post/put-voice-de-noise-audio-on-discord/20221226021720_hu_adc2d41408130ab9.png 480w, https://notes.nakurei.com/post/put-voice-de-noise-audio-on-discord/20221226021720_hu_f7c854cd1220acb9.png 1024w"
loading="lazy"
alt="Discordの入力デバイスの設定"
class="gallery-image"
data-flex-grow="264"
data-flex-basis="633px"
&gt;&lt;/p&gt;
&lt;p&gt;ここまで設定すると、マイクの音声に対してVoice De-noiseのかけられた音声がDiscordに入る。
あとは、Discordのマイクテストを実行するなどして、CakewalkでかけているVoice De-noiseの設定を調整する。&lt;/p&gt;
&lt;p&gt;調整し終わったら、Cakewalkのプロジェクトを保存する。&lt;/p&gt;
&lt;h3 id="次回以降使うときは"&gt;
次回以降使うときは&lt;a href="#%e6%ac%a1%e5%9b%9e%e4%bb%a5%e9%99%8d%e4%bd%bf%e3%81%86%e3%81%a8%e3%81%8d%e3%81%af"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Cakewalkを起動し、作成したプロジェクトを開く
&lt;ul&gt;
&lt;li&gt;入力デバイスを使うマイクにする&lt;/li&gt;
&lt;li&gt;出力デバイスを「ライン (Yamaha STNCROOM Driver (WDM))」にする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Discordを起動する
&lt;ul&gt;
&lt;li&gt;入力デバイスを、「ライン (Yamaha STNCROOM Driver (WDM))」にする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;このシステムは作成したCakewalkのプロジェクトとDiscordが同時に起動していないと動作しない。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://gamehandsouls.blog.jp/archives/24251446.html" target="_blank" rel="noopener"
&gt;Hand’s Makers : Discordの通話音声にVSTでノイズ除去をかけた時のメモ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;PCにRX 9 ElementsなどVoice De-noiseが含まれたプラグインをインストールしていないと出てこない。また、かけたいVSTプラグインが別にあるなら、それを選択する。&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Vuetify 3+TypeScript+ESLintのWebアプリにPrettierとStyleLintを導入する</title><link>https://notes.nakurei.com/post/add-prettier-and-stylelint-to-vuetify-3-web-app/</link><pubDate>Thu, 22 Dec 2022 13:09:12 +0900</pubDate><guid>https://notes.nakurei.com/post/add-prettier-and-stylelint-to-vuetify-3-web-app/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Vuetify 3で作成したWebアプリにPrettier, StyleLintの3つを追加する方法を記したもの。
eslint-plugin-prettierが非推奨になったため、eslint-plugin-prettierと@vue/eslint-config-prettierは使わないようにした。&lt;/p&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Vuetifyでアプリを作成した際に、一緒にTypeScriptとESLintを入れた想定。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vuetify 3.0.6&lt;/li&gt;
&lt;li&gt;VS Code&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="prettierを導入する"&gt;
Prettierを導入する&lt;a href="#prettier%e3%82%92%e5%b0%8e%e5%85%a5%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;必要なパッケージをインストールする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yarn add -D prettier eslint-config-prettier eslint-config-prettier-vue&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;インストールしたパッケージの詳細は下記の通りである。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;パッケージ名&lt;/th&gt;
&lt;th style="text-align: left"&gt;説明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;prettier&lt;/td&gt;
&lt;td style="text-align: left"&gt;Prettierの本体&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;eslint-config-prettier&lt;/td&gt;
&lt;td style="text-align: left"&gt;Prettierと競合するESLintの設定を無効化するconfig&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;eslint-config-prettier-vue&lt;/td&gt;
&lt;td style="text-align: left"&gt;Prettierと競合するESLintの設定を無効化するVue用config&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;ESLintの設定ファイル.eslintrc.jsに、Prettier用の設定を追加する。
これを追加することで、ESLintとPrettierの住み分けができる。
必ず&lt;code&gt;extends&lt;/code&gt;の&lt;strong&gt;一番最後&lt;/strong&gt;にいれること。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.eslintrc.js&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;module.exports = {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; root: true,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; env: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; node: true,
&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; extends: [
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;plugin:vue/vue3-recommended&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;eslint:recommended&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;@vue/eslint-config-typescript&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ &amp;#34;prettier&amp;#34;,
&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; rules: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;vue/multi-word-component-names&amp;#34;: &amp;#34;off&amp;#34;,
&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Prettierの設定ファイルである.prettierrc.jsonを作成し、任意のオプションを設定する。
設定できるオプションの詳細は&lt;a class="link" href="https://prettier.io/docs/en/options.html" target="_blank" rel="noopener"
&gt;Prettier公式&lt;/a&gt;を参照してほしい。
下記に例を示す。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.prettierrc.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;printWidth&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&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;&amp;#34;tabWidth&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&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;&amp;#34;semi&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;singleQuote&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;vueIndentScriptAndStyle&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;package.jsonにformatコマンドを追加。
lintコマンドと同時に動かすfixコマンドも追加する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;package.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;scripts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;lint&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;eslint . --fix --ignore-path .gitignore&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;format&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;yarn prettier -w -u .&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;fix&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;yarn format &amp;amp;&amp;amp; yarn lint&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;とりあえず動くか試す。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yarn format
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yarn fix&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;VS Codeの場合は&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode" target="_blank" rel="noopener"
&gt;Prettierの拡張機能&lt;/a&gt;を追加し、 config.jsonに下記を追記する。
そうするとVS Code側で保存時に自動で実行してくれる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.vscode/config.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// formatter
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;editor.defaultFormatter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;esbenp.prettier-vscode&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;editor.formatOnSave&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;editor.formatOnPaste&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;editor.formatOnType&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;prettier.requireConfig&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;prettier.configPath&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./app/.prettierrc.json&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;prettier.prettierPath&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./app/node_modules/prettier&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;VS Codeの場合、Prettierを入れた直後はESLintとバッティングしてうまく動作しないことがある。
その場合は、一度VS Codeを再起動する。&lt;/p&gt;
&lt;h2 id="stylelintを導入する"&gt;
StyleLintを導入する&lt;a href="#stylelint%e3%82%92%e5%b0%8e%e5%85%a5%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;StyleLintを導入して、cssやvueファイル内の&lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt;タグもlintする。&lt;/p&gt;
&lt;p&gt;必要なパッケージをインストールする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yarn add -D stylelint postcss-html stylelint-config-recommended-vue stylelint-config-standard stylelint-config-prettier&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;インストールしたパッケージの詳細は下記の通りである。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;パッケージ名&lt;/th&gt;
&lt;th style="text-align: left"&gt;説明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;stylelint&lt;/td&gt;
&lt;td style="text-align: left"&gt;StyleLintの本体&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;postcss-html&lt;/td&gt;
&lt;td style="text-align: left"&gt;Vueをlintするのに必要&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;stylelint-config-recommended-vue&lt;/td&gt;
&lt;td style="text-align: left"&gt;Vueをlintするための設定preset&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;stylelint-config-standard&lt;/td&gt;
&lt;td style="text-align: left"&gt;StyleLint公式の設定preset&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;StyleLintの設定ファイルstylelint.config.jsをつくり、下記を記入する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;stylelint.config.js&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;extends&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;stylelint-config-standard&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;stylelint-config-recommended-vue&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;stylelint-config-prettier&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Lintの対象から除外したいファイルがある場合は、ルートディレクトリに.stylelintignoreを作成して、除外する条件を書く。
以下は例である。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.stylelintignore&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/dist/**/*.css&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;package.jsonにlint-cssコマンドを追加。
fixコマンドにも、lintコマンドと同時に動かすように追記する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;package.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;scripts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;lint-css&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;stylelint src/**/*.{css,vue}&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;fix&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;yarn lint-css --fix &amp;amp;&amp;amp; yarn format &amp;amp;&amp;amp; yarn lint --fix&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;とりあえず動くか試す。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yarn lint-css
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yarn fix&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;VS Codeの場合は&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=stylelint.vscode-stylelint" target="_blank" rel="noopener"
&gt;StyleLintの拡張機能&lt;/a&gt;を追加し、config.jsonに下記を追記する。
そうするとVS Code側でもlintエラーを表示してくれる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.vscode/config.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;editor.codeActionsOnSave&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;source.fixAll.eslint&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;source.fixAll.stylelint&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;stylelint.validate&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;vue&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;css&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Prettier関連
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/tristar/items/c2f86d4130c72aa250c6" target="_blank" rel="noopener"
&gt;Vue+TypeScriptをESLint+Prettierでなるべくコンパクトな設定でLint+整形する - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://zenn.dev/kazuwombat/articles/20e0c0cc83c3f2" target="_blank" rel="noopener"
&gt;PrettierとESLintのコンフリクトの原因を理解する、解決する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://zenn.dev/kohski/articles/eslint-prettier-integration" target="_blank" rel="noopener"
&gt;eslintとprettierの組み合わせ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://teratail.com/questions/296387" target="_blank" rel="noopener"
&gt;VSCodeで保存時に整形するprettierの設定を変更したい&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://zenn.dev/chida/articles/c0bd3ad56ed06b#prettier%E3%81%AE%E5%B0%8E%E5%85%A5" target="_blank" rel="noopener"
&gt;Vite + Vue3にESLintとPrettierを導入する&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;StyleLint関連
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/ota-meshi/items/b29cfcf23226e952ac02" target="_blank" rel="noopener"
&gt;&lt;code&gt;.vue&lt;/code&gt;ファイルの&amp;lt;template&amp;gt;&amp;lt;script&amp;gt;&amp;lt;style&amp;gt;全てLintかける - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://kimuson.dev/blog/vscode/eslint_stylelint_prettier_vscode_onsave/" target="_blank" rel="noopener"
&gt;ESLintとstylelintをpluginなしでprettierと共存させるvscode設定について | きむそん.dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/senku/items/894fd63d71ddac50dae5" target="_blank" rel="noopener"
&gt;Stylelint 14とVSCode拡張を動かすためにやったこと - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://knote.dev/post/2020-08-29/duprecated-eslint-plugin-prettier/" target="_blank" rel="noopener"
&gt;いつのまにかeslint-plugin-prettierが推奨されないものになってた | K note.dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=stylelint.vscode-stylelint" target="_blank" rel="noopener"
&gt;Stylelint - Visual Studio Marketplace&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Vuetify 3 + TypeScriptのWebアプリにESLint, Prettier, StyleLintを導入する</title><link>https://notes.nakurei.com/post/add-linters-to-vuetify-3-web-app/</link><pubDate>Thu, 22 Dec 2022 09:12:33 +0900</pubDate><guid>https://notes.nakurei.com/post/add-linters-to-vuetify-3-web-app/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Vuetify 3で作成したWebアプリにESLint, Prettier, StyleLintの3つを追加する方法を記したもの。
eslint-plugin-prettierが非推奨になったため、eslint-plugin-prettierと@vue/eslint-config-prettierを使わないようにした。&lt;/p&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Windows 10&lt;/li&gt;
&lt;li&gt;Docker Desktop&lt;/li&gt;
&lt;li&gt;VS Code&lt;/li&gt;
&lt;li&gt;Vue 3&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Vuetify 3.0.5&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="eslintを導入する"&gt;
ESLintを導入する&lt;a href="#eslint%e3%82%92%e5%b0%8e%e5%85%a5%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;必要なパッケージをインストールする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yarn add -D eslint eslint-plugin-vue @vue/eslint-config-typescript @rushstack/eslint-patch&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;インストールしたパッケージの詳細は下記の通りである。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;パッケージ名&lt;/th&gt;
&lt;th style="text-align: left"&gt;説明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;eslint&lt;/td&gt;
&lt;td style="text-align: left"&gt;ESLintの本体&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;eslint-plugin-vue&lt;/td&gt;
&lt;td style="text-align: left"&gt;Vue.jsの公式ESLintプラグイン&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;@vue/eslint-config-typescript&lt;/td&gt;
&lt;td style="text-align: left"&gt;Vue-TypeScriptプロジェクトの基本構成のルールセット&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;@rushstack/eslint-patch&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;code&gt;@vue/eslint-config-typescript&lt;/code&gt;に必要&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;ESLint設定ファイル&lt;code&gt;.eslintrc.cjs&lt;/code&gt;をつくり、下記を記入する。
拡張子がcjsなのは動的にルールを生成するためである。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;app/.eslintrc.cjs&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;@rushstack/eslint-patch/modern-module-resolution&amp;#39;&lt;/span&gt;&lt;span class="p"&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="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;root&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;es2021&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;extends&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;eslint:recommended&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;plugin:vue/vue3-recommended&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;@vue/eslint-config-typescript&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;parserOptions&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;ecmaVersion&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;latest&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;package.jsonに&lt;code&gt;lint&lt;/code&gt;コマンドを追加。
&lt;code&gt;--fix&lt;/code&gt;は好みで。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;app/package.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;scripts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;lint&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Linterを実行してみる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yarn lint&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;VS Codeの場合は&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint" target="_blank" rel="noopener"
&gt;ESLintの拡張機能&lt;/a&gt;を追加し、
config.jsonに下記を追記する。
そうするとVS Code側で自動的に実行してくれる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.vscode/config.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// linter
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;eslint.packageManager&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;yarn&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;eslint.workingDirectories&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;./app&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;editor.codeActionsOnSave&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;source.fixAll.eslint&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="prettierを導入する"&gt;
Prettierを導入する&lt;a href="#prettier%e3%82%92%e5%b0%8e%e5%85%a5%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;必要なパッケージをインストールする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yarn add -D prettier eslint-config-prettier eslint-config-prettier-vue&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;インストールしたパッケージの詳細は下記の通りである。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;パッケージ名&lt;/th&gt;
&lt;th style="text-align: left"&gt;説明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;prettier&lt;/td&gt;
&lt;td style="text-align: left"&gt;Prettierの本体&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;eslint-config-prettier&lt;/td&gt;
&lt;td style="text-align: left"&gt;Prettierと競合するESLintの設定を無効化するconfig&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;eslint-config-prettier-vue&lt;/td&gt;
&lt;td style="text-align: left"&gt;Prettierと競合するESLintの設定を無効化するVue用config&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;ESLint導入時で作成した.eslintrc.cjsにPrettier用の設定を追加する。
これを追加することで、ESLintとPrettierの住み分けができる。
必ず&lt;code&gt;extends&lt;/code&gt;の&lt;strong&gt;一番最後&lt;/strong&gt;にいれること。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;app/.eslintrc.cjs&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;require(&amp;#39;@rushstack/eslint-patch/modern-module-resolution&amp;#39;);
&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;module.exports = {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; root: true,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; env: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; browser: true,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; es2021: true,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; node: true,
&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; extends: [
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#39;eslint:recommended&amp;#39;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#39;plugin:vue/vue3-recommended&amp;#39;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#39;@vue/eslint-config-typescript&amp;#39;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ &amp;#39;prettier&amp;#39;,
&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; parserOptions: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ecmaVersion: &amp;#39;latest&amp;#39;,
&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Prettierの設定ファイルである.prettierrc.jsonを作成し、任意のオプションを設定する。
設定できるオプションの詳細は&lt;a class="link" href="https://prettier.io/docs/en/options.html" target="_blank" rel="noopener"
&gt;Prettier公式&lt;/a&gt;を参照してほしい。
下記に例を示す。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;app/.prettierrc.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;printWidth&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&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;&amp;#34;tabWidth&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&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;&amp;#34;semi&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;singleQuote&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;vueIndentScriptAndStyle&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;package.jsonにformatコマンドを追加。
lintコマンドと同時に動かすfixコマンドも追加する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;app/package.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;scripts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;lint&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --ignore-path .gitignore&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;format&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;yarn prettier -w -u .&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;fix&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;yarn format &amp;amp;&amp;amp; yarn lint --fix&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;とりあえず動くか試す。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yarn format
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yarn fix&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;VS Codeの場合は&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode" target="_blank" rel="noopener"
&gt;Prettierの拡張機能&lt;/a&gt;を追加し、 config.jsonに下記を追記する。
そうするとVS Code側で保存時に自動で実行してくれる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.vscode/config.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// formatter
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;editor.defaultFormatter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;esbenp.prettier-vscode&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;editor.formatOnSave&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;editor.formatOnPaste&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;editor.formatOnType&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;prettier.requireConfig&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;prettier.configPath&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./app/.prettierrc.json&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;prettier.prettierPath&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./app/node_modules/prettier&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;VS CodeだとPrettierを入れた直後はESLintとバッティングしてうまく動作しないことがある。
その場合は一度VS Codeを再起動する。&lt;/p&gt;
&lt;h2 id="stylelintを導入する"&gt;
StyleLintを導入する&lt;a href="#stylelint%e3%82%92%e5%b0%8e%e5%85%a5%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;StyleLintを導入して、cssやvueファイル内の&lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt;タグもlintする。&lt;/p&gt;
&lt;p&gt;必要なパッケージをインストールする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yarn add -D stylelint postcss-html stylelint-config-recommended-vue stylelint-config-standard stylelint-config-prettier&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;インストールしたパッケージの詳細は下記の通りである。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;パッケージ名&lt;/th&gt;
&lt;th style="text-align: left"&gt;説明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;stylelint&lt;/td&gt;
&lt;td style="text-align: left"&gt;StyleLintの本体&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;postcss-html&lt;/td&gt;
&lt;td style="text-align: left"&gt;Vueをlintするのに必要&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;stylelint-config-recommended-vue&lt;/td&gt;
&lt;td style="text-align: left"&gt;Vueをlintするための設定preset&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;stylelint-config-standard&lt;/td&gt;
&lt;td style="text-align: left"&gt;StyleLint公式の設定preset&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;StyleLint設定ファイル&lt;code&gt;stylelint.config.js&lt;/code&gt;をつくり、下記を記入する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;app/stylelint.config.js&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;extends&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;stylelint-config-standard&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;stylelint-config-recommended-vue&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;stylelint-config-prettier&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Lintの対象から除外したいファイルがある場合は、ルートディレクトリに.stylelintignoreを作成して、除外する条件を書く。
以下は例である。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;app/.stylelintignore&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;src/dist/**/*.css&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;package.jsonにlint-cssコマンドを追加。
fixコマンドにも、lintコマンドと同時に動かすように追記する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;app/package.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;scripts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;lint-css&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;stylelint src/**/*.{css,scss,vue}&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;fix&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;yarn lint-css --fix &amp;amp;&amp;amp; yarn format &amp;amp;&amp;amp; yarn lint --fix&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;とりあえず動くか試す。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yarn lint-css
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yarn fix&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;VS Codeの場合は&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=stylelint.vscode-stylelint" target="_blank" rel="noopener"
&gt;StyleLintの拡張機能&lt;/a&gt;を追加し、config.jsonに下記を追記する。
そうするとVS Code側でもlintエラーを表示してくれる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.vscode/config.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;editor.codeActionsOnSave&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;source.fixAll.eslint&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;&amp;#34;source.fixAll.stylelint&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;stylelint.validate&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;vue&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;css&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ESLint関連
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://eslint.vuejs.org/user-guide/" target="_blank" rel="noopener"
&gt;User Guide | eslint-plugin-vue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.npmjs.com/package/@vue/eslint-config-typescript?activeTab=readme" target="_blank" rel="noopener"
&gt;@vue/eslint-config-typescript - npm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/vuejs/eslint-config-typescript#vueeslint-config-typescriptrecommended" target="_blank" rel="noopener"
&gt;vuejs/eslint-config-typescript: eslint-config-typescript for vue-cli&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.techpit.jp/courses/210/curriculums/213/sections/1402/parts/5679" target="_blank" rel="noopener"
&gt;リンターを導入する|Vue3とTypeScriptでブラウザゲームを作りながら、状態管理とComposition APIを学ぼう|Techpit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://zenn.dev/tristar/scraps/dcf755a57d2c96" target="_blank" rel="noopener"
&gt;Vue3をTypeScriptで始める方法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Prettier関連
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/tristar/items/c2f86d4130c72aa250c6" target="_blank" rel="noopener"
&gt;Vue+TypeScriptをESLint+Prettierでなるべくコンパクトな設定でLint+整形する - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://zenn.dev/kazuwombat/articles/20e0c0cc83c3f2" target="_blank" rel="noopener"
&gt;PrettierとESLintのコンフリクトの原因を理解する、解決する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://zenn.dev/kohski/articles/eslint-prettier-integration" target="_blank" rel="noopener"
&gt;eslintとprettierの組み合わせ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://teratail.com/questions/296387" target="_blank" rel="noopener"
&gt;VSCodeで保存時に整形するprettierの設定を変更したい&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://zenn.dev/chida/articles/c0bd3ad56ed06b#prettier%E3%81%AE%E5%B0%8E%E5%85%A5" target="_blank" rel="noopener"
&gt;Vite + Vue3にESLintとPrettierを導入する&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;StyleLint関連
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/ota-meshi/items/b29cfcf23226e952ac02" target="_blank" rel="noopener"
&gt;&lt;code&gt;.vue&lt;/code&gt;ファイルの&amp;lt;template&amp;gt;&amp;lt;script&amp;gt;&amp;lt;style&amp;gt;全てLintかける - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://kimuson.dev/blog/vscode/eslint_stylelint_prettier_vscode_onsave/" target="_blank" rel="noopener"
&gt;ESLintとstylelintをpluginなしでprettierと共存させるvscode設定について | きむそん.dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/senku/items/894fd63d71ddac50dae5" target="_blank" rel="noopener"
&gt;Stylelint 14とVSCode拡張を動かすためにやったこと - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://knote.dev/post/2020-08-29/duprecated-eslint-plugin-prettier/" target="_blank" rel="noopener"
&gt;いつのまにかeslint-plugin-prettierが推奨されないものになってた | K note.dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=stylelint.vscode-stylelint" target="_blank" rel="noopener"
&gt;Stylelint - Visual Studio Marketplace&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>VS Code + Docker + Vuetify 3でVue 3のWebアプリを作る</title><link>https://notes.nakurei.com/post/create-vuetify-app-with-vs-code-and-docker/</link><pubDate>Wed, 21 Dec 2022 20:56:06 +0900</pubDate><guid>https://notes.nakurei.com/post/create-vuetify-app-with-vs-code-and-docker/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Vuetify 3でWebアプリを作成する流れをまとめたもの。
Dockerを利用して、環境構築も再現性があるようにした。&lt;/p&gt;
&lt;p&gt;あくまで自分が作るとき用の備忘録なので、個人最適化されたところが多々あることに留意してほしい。&lt;/p&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Windows 10&lt;/li&gt;
&lt;li&gt;Docker Desktop&lt;/li&gt;
&lt;li&gt;VS Code
&lt;ul&gt;
&lt;li&gt;拡張機能&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers" target="_blank" rel="noopener"
&gt;Dev Containers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Vue 3&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Vuetify 3.0.6&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="vs-codeの設定ファイルをつくる"&gt;
VS Codeの設定ファイルをつくる&lt;a href="#vs-code%e3%81%ae%e8%a8%ad%e5%ae%9a%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92%e3%81%a4%e3%81%8f%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;.vscode/config.jsonを作成し、下記を書き込む。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.vscode/config.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;files.eol&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;editor.tabSize&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&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;&amp;#34;path-intellisense.mappings&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;@/&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${workspaceFolder}/app/src/&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;デフォルトの改行コードをLFにする&lt;/li&gt;
&lt;li&gt;タブのサイズを2にする&lt;/li&gt;
&lt;li&gt;任意 : 拡張機能&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=christian-kohler.path-intellisense" target="_blank" rel="noopener"
&gt;path-intellisense&lt;/a&gt;でpath aliasを処理できるようにする&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="dockerfileをつくる"&gt;
Dockerfileをつくる&lt;a href="#dockerfile%e3%82%92%e3%81%a4%e3%81%8f%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;.devcontainerフォルダを作成。
Dockerfileを作る。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.devcontainer/Dockerfile&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Dockerfile" data-lang="Dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:19-bullseye-slim&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&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;RUN&lt;/span&gt; apt -y update &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt install -y git&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="vs-codeのdev-containersでコンテナにアタッチする"&gt;
VS CodeのDev Containersでコンテナにアタッチする&lt;a href="#vs-code%e3%81%aedev-containers%e3%81%a7%e3%82%b3%e3%83%b3%e3%83%86%e3%83%8a%e3%81%ab%e3%82%a2%e3%82%bf%e3%83%83%e3%83%81%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;VS Codeの拡張機能&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers" target="_blank" rel="noopener"
&gt;Dev Containers&lt;/a&gt;を利用して、Dockerfileをビルド、VS Codeをコンテナにアタッチする。&lt;/p&gt;
&lt;p&gt;そのために、.devcontainerフォルダ内にdevcontainer.jsonを作る。
Vue 3では&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=octref.vetur" target="_blank" rel="noopener"
&gt;Vetur&lt;/a&gt;は非推奨なので、代わりに&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=vue.volar" target="_blank" rel="noopener"
&gt;Volar&lt;/a&gt;を入れる。その他のextensionsは好みで入れる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.devcontainer/devcontainer.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;FF14-tools-vue3&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;dockerFile&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Dockerfile&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;forwardPorts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;4173&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;extensions&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 必須級
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Vue.volar&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Vue.vscode-typescript-vue-plugin&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 任意
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;ms-vscode.vscode-typescript-next&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;streetsidesoftware.code-spell-checker&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;naumovs.color-highlight&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;saikou9901.evilinspector&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;fabiospampinato.vscode-highlight&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;oderwat.indent-rainbow&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Gruntfuggly.todo-tree&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;eamodio.gitlens&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;mhutchie.git-graph&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;christian-kohler.path-intellisense&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;shardulm94.trailing-spaces&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 設定しないと動かない
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;dbaeumer.vscode-eslint&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;esbenp.prettier-vscode&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;stylelint.vscode-stylelint&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;VS CodeでCtrl + Shuft + Pのショートカットから、Dev ContainersのReopen in Containerを実行する。
すると、自動でDockerfileがビルドされ、VS Codeをコンテナにアタッチできる。&lt;/p&gt;
&lt;p&gt;無事にビルドが通ってアタッチできたら、全体をGit管理下に置く。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;touch .gitignore&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="volarのtake-over-modeを有効化する"&gt;
VolarのTake Over Modeを有効化する&lt;a href="#volar%e3%81%aetake-over-mode%e3%82%92%e6%9c%89%e5%8a%b9%e5%8c%96%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;VueでTypeScriptを使い、かつVS Codeで拡張機能&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=vue.volar" target="_blank" rel="noopener"
&gt;Volar&lt;/a&gt;を使う場合は、Take Over Modeを有効にすることが&lt;a class="link" href="https://vuejs.org/guide/typescript/overview.html#volar-takeover-mode" target="_blank" rel="noopener"
&gt;Vue公式&lt;/a&gt;で推奨されている。
これを有効にすると、Volarに実装されたVue固有のサポートを利用できるようになる。&lt;/p&gt;
&lt;p&gt;有効化のしかたは&lt;a class="link" href="https://vuejs.org/guide/typescript/overview.html#volar-takeover-mode" target="_blank" rel="noopener"
&gt;Vue公式&lt;/a&gt;にあるとおりだが、ここにも記載しておく。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;VS Codeの拡張機能のタブを開く&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@builtin typescript&lt;/code&gt;で検索する&lt;/li&gt;
&lt;li&gt;「TypeScript and JavaScript Language Features」が出てくるので、歯車マークから「Disable(Workspace)」を選択する&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="アプリを生成する"&gt;
アプリを生成する&lt;a href="#%e3%82%a2%e3%83%97%e3%83%aa%e3%82%92%e7%94%9f%e6%88%90%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Vuetify 3のアプリを作成する。
&lt;a class="link" href="https://next.vuetifyjs.com/en/getting-started/installation/" target="_blank" rel="noopener"
&gt;Vuetifyの公式チュートリアル&lt;/a&gt;によると、下記コマンドで作れる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yarn create vuetify&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;色々聞かれるので答える。
Project nameは任意の名前で良い。本稿では&lt;code&gt;app&lt;/code&gt;にしたていで記述する。
その他のパッケージは必要に応じて入れる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ yarn create vuetify
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yarn create v1.22.19
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;1/4&lt;span class="o"&gt;]&lt;/span&gt; Resolving packages...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;2/4&lt;span class="o"&gt;]&lt;/span&gt; Fetching packages...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;3/4&lt;span class="o"&gt;]&lt;/span&gt; Linking dependencies...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;4/4&lt;span class="o"&gt;]&lt;/span&gt; Building fresh packages...
&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;success Installed &lt;span class="s2"&gt;&amp;#34;create-vuetify@1.0.5&amp;#34;&lt;/span&gt; with binaries:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - create-vuetify
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="c1"&gt;############] 12/12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Vuetify.js - Material Component Framework &lt;span class="k"&gt;for&lt;/span&gt; Vue
&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;✔ Project name: … app
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✔ Which preset would you like to install? › Custom &lt;span class="o"&gt;(&lt;/span&gt;Choose your features&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✔ Use TypeScript? … Yes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✔ Use Vue Router? … Yes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✔ Use Pinia? … No
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✔ Use ESLint? … Yes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✔ Would you like to install dependencies with yarn, npm, or pnpm? › yarn&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;すると、Project nameの「app」という名前でディレクトリが作成され、中にいろいろファイルが生成される。&lt;/p&gt;
&lt;p&gt;その後、appディレクトリに移動して、アプリを立ち上げる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; app
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yarn dev&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;http://localhost:3000/ にアクセスすると、デフォルトアプリが開く。&lt;/p&gt;
&lt;p&gt;起動を確認したら、gitでcommitする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git add ../
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git commit -m &lt;span class="s2"&gt;&amp;#34;Create an initial Vuetify 3 app.&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="ホットリロードが効くようにする"&gt;
ホットリロードが効くようにする&lt;a href="#%e3%83%9b%e3%83%83%e3%83%88%e3%83%aa%e3%83%ad%e3%83%bc%e3%83%89%e3%81%8c%e5%8a%b9%e3%81%8f%e3%82%88%e3%81%86%e3%81%ab%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Viteでは、WSL上だとホットリロードされないことがある。
Docker DesktopはバックグラウンドでWSLを利用するため、この現象が発生する。&lt;/p&gt;
&lt;p&gt;これを回避するために、vite.config.tsに下記を追記する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;app/vite.config.ts&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; server: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; port: 3000,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ watch: {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ usePolling: true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これでホットリロードが効くようになる。確認したのち、gitでcommitする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git add vite.config.ts
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git commit -m &lt;span class="s2"&gt;&amp;#34;Change Vite settings for hot-reload.&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="tsconfigを変更する"&gt;
tsconfigを変更する&lt;a href="#tsconfig%e3%82%92%e5%a4%89%e6%9b%b4%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Vuetifyが生成してくれるtsconfig.jsonは個人的に不足があるため、compilerOptionsに下記を追記する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;app/tsconfig.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;compilerOptions&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&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;&amp;#34;importsNotUsedAsValues&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;error&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;forceConsistentCasingInFileNames&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;その後、gitでcommitする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git add tsconfig.json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git commit -m &lt;span class="s2"&gt;&amp;#34;Change tsconfig.&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="vs-codeでeslintを動作させる"&gt;
VS CodeでESLintを動作させる&lt;a href="#vs-code%e3%81%a7eslint%e3%82%92%e5%8b%95%e4%bd%9c%e3%81%95%e3%81%9b%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;VS Codeに&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint" target="_blank" rel="noopener"
&gt;ESLintの拡張機能&lt;/a&gt;を追加し、
設定ファイルconfig.jsonに下記を追記する。
そうするとVS CodeがESLintを自動で実行してくれる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.vscode/config.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;eslint.packageManager&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;yarn&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;eslint.workingDirectories&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;./app&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&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;&amp;#34;editor.codeActionsOnSave&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;source.fixAll.eslint&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;その後、gitでcommitする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git add ../.vscode/settings.json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git commit -m &lt;span class="s2"&gt;&amp;#34;Change VS Code settings so that ESLint works.&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://next.vuetifyjs.com/en/getting-started/installation/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/2249647607c4cc3253a4605ab967c5cbc8c98ab9_hu_639cfd6d6d82a685.webp"
alt="Get started with Vuetify 4 — Vuetify image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Get started with Vuetify 4 — Vuetify
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Details for v4 release - faq, changes, and upgrading.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-d30bd4f7fa72ccb9f03a21946e5f3919a4406034.png"
style="margin-right: 2px;"
alt="next.vuetifyjs.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
next.vuetifyjs.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://qiita.com/kaazzo/items/53388e83d9587f50f856"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/e0f55372dcb7377924a97e73b43cee11eb6c1d8d_hu_8dfac2a47f3f0ccf.webp"
alt="WSL2上のコンテナでの開発時にviteのホットリロードが効かない事象への対処法 - Qiita image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
WSL2上のコンテナでの開発時にviteのホットリロードが効かない事象への対処法 - Qiita
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;概要 vite で立ち上げた vue3 + Typescript のプロジェクトにおいて、.vue ファイルを更新した際にホットリロードが効かなかった。 環境情報 vite: 2.6.4 vue: 3.2.16 原因 WSL上での開発時にホットリロードが効かない現...&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-7dfa4a32e8b8dd3b8a6b654e1cd55932c6a19262.png"
style="margin-right: 2px;"
alt="qiita.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
qiita.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;/p&gt;</description></item><item><title>Vuetify 3のv-imgで@を使って画像を読み込めない問題の解決方法</title><link>https://notes.nakurei.com/post/v-img-in-vuetify-3-with-using-path-alias/</link><pubDate>Sat, 17 Dec 2022 11:56:00 +0900</pubDate><guid>https://notes.nakurei.com/post/v-img-in-vuetify-3-with-using-path-alias/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Vuetify 2で動いていた&lt;code&gt;v-img&lt;/code&gt;のコードがVuetify 3で動かなくなったので対処した。
そのときの対処法を記す。&lt;/p&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;node v19.3.0&lt;/li&gt;
&lt;li&gt;Vue 3.2.45&lt;/li&gt;
&lt;li&gt;Vite 3.2.5&lt;/li&gt;
&lt;li&gt;Vuetify 3.0.5&lt;/li&gt;
&lt;li&gt;typescript 4.9.4&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="背景"&gt;
背景&lt;a href="#%e8%83%8c%e6%99%af"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Vuetifyを2から3にアップグレードした。
そしたら、いままで読み込めていた画像が読み込めなくなった。
どうやらpath aliasで定義されていた&lt;code&gt;@&lt;/code&gt;がきちんと処理されていない模様。&lt;/p&gt;
&lt;p&gt;Vuetify 2だと、下記の記述で問題なく画像が読み込まれていた。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-img&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;@/assets/logo.png&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;この記述をVuetify 3で使うと、下記のエラーが出て、画像は読み込めない。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Failed to load resource: the server responded with a status of &lt;span class="m"&gt;404&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;Not Found&lt;span class="o"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ちなみに、Vuetifyの&lt;code&gt;v-img&lt;/code&gt;タグではなく、普通の&lt;code&gt;img&lt;/code&gt;タグだと問題なく読み込める。
すなわち、下記の書き方なら、きちんと画像が表示される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;@/assets/logo.png&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;普通の&lt;code&gt;img&lt;/code&gt;タグなら読み込めるため、path aliasは問題なく設定できていると思われる。つまり&lt;code&gt;v-img&lt;/code&gt;タグが&lt;code&gt;@&lt;/code&gt;をうまく処理できていないとみられる。&lt;/p&gt;
&lt;h2 id="何が原因だったのか"&gt;
何が原因だったのか？&lt;a href="#%e4%bd%95%e3%81%8c%e5%8e%9f%e5%9b%a0%e3%81%a0%e3%81%a3%e3%81%9f%e3%81%ae%e3%81%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Vuetify 3が動くVue 3では、ビルドツールがvue-cliからViteに移行した。
どうやらその関係で動かなくなったっぽい。&lt;/p&gt;
&lt;h2 id="対処法"&gt;
対処法&lt;a href="#%e5%af%be%e5%87%a6%e6%b3%95"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;動作が確認できている対処法は次の2つ。
どちらかの対応を取ればよい。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;画像ファイルをimportする&lt;/li&gt;
&lt;li&gt;画像ファイルをpublic配下に配置する&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="どちらの方法が良いのか"&gt;
どちらの方法が良いのか？&lt;a href="#%e3%81%a9%e3%81%a1%e3%82%89%e3%81%ae%e6%96%b9%e6%b3%95%e3%81%8c%e8%89%af%e3%81%84%e3%81%ae%e3%81%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;画像ファイルをimportする方法では、画像ファイルも含めてビルドされる。
一方で画像ファイルをpublic配下に配置する方法では、画像ファイルはビルドに含まれない。
よって、コンポーネントの一部として用いられる画像はimportし、それ以外の画像はpublic配下に置くのが良さそう。&lt;/p&gt;
&lt;h3 id="1-画像ファイルをimportする方法"&gt;
1. 画像ファイルをimportする方法&lt;a href="#1-%e7%94%bb%e5%83%8f%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92import%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;ブロック内で画像ファイルをimportし、それを利用する方法。&lt;/p&gt;
&lt;p&gt;まず、&lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;ブロックで、適当な変数名で画像ファイルをimportする。
このときはpath aliasである&lt;code&gt;@/&lt;/code&gt;が使える。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;logo_img&lt;/span&gt; &lt;span class="nx"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;@/assets/logo.svg&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;次に、&lt;code&gt;&amp;lt;template&amp;gt;&lt;/code&gt;ブロック内に画像を配置する。
&lt;code&gt;src&lt;/code&gt;属性は変数になるのでbindさせる必要がある。
ゆえに、&lt;code&gt;src&lt;/code&gt;ではなく&lt;code&gt;:src&lt;/code&gt;（あるいは&lt;code&gt;v-bind:src&lt;/code&gt;）にしなければならない。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;&amp;lt;!-- ... --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-img&lt;/span&gt; &lt;span class="na"&gt;contain&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;300&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;:src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;logo_img&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;&amp;lt;!-- ... --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これで表示自体はできるようになる。
&lt;code&gt;yarn dev&lt;/code&gt;でローカルサーバを立ち上げると、きちんと画像が表示される。
しかし、このままだとTypeScriptで下記のエラーを吐かれる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;モジュール &amp;#39;@/assets/logo.svg&amp;#39; またはそれに対応する型宣言が見つかりません。ts(2307)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ビルド時にも、下記のエラーが発生してビルドが通らない。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;error TS2307: Cannot find module &lt;span class="s1"&gt;&amp;#39;@/assets/logo.svg&amp;#39;&lt;/span&gt; or its corresponding &lt;span class="nb"&gt;type&lt;/span&gt; declarations.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これはTypeScriptの仕様である。TypeScriptでコード以外のアセットを利用するためには、そのインポートに対して型を繰り下げる必要がある。どうすればよいかというと、&lt;a class="link" href="https://webpack.js.org/guides/typescript/#importing-other-assets" target="_blank" rel="noopener"
&gt;公式&lt;/a&gt;にもあるように、.svgファイルのcustom definitionsを用意すればよい。&lt;/p&gt;
&lt;p&gt;まず、custom.d.tsファイルを作り、svgの拡張子の型を定義する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;custom.d.ts&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;declare&lt;/span&gt; &lt;span class="nx"&gt;module&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;*.svg&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt;: &lt;span class="kt"&gt;any&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;次に、定義した型をTypeScriptのコンパイラに伝えるため、tsconfig.jsonにcustom.d.tsファイルの存在を追記する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;tsconfig.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&amp;#34;include&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;src/**/*.ts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;custom.d.ts&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;こうすると、TypeScriptのエラーは解消され、&lt;code&gt;yarn build&lt;/code&gt;も通るようになる。&lt;/p&gt;
&lt;h3 id="2-画像ファイルをpublic配下に配置する方法"&gt;
2. 画像ファイルをpublic配下に配置する方法&lt;a href="#2-%e7%94%bb%e5%83%8f%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92public%e9%85%8d%e4%b8%8b%e3%81%ab%e9%85%8d%e7%bd%ae%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;これはもっと簡単にできる。&lt;/p&gt;
&lt;p&gt;まず、画像ファイルをpublicディレクトリ下に配置する。
たとえば、&lt;code&gt;public/assets&lt;/code&gt;ディレクトリ内にlogo.pngを置く。
そして、それを&lt;code&gt;v-img&lt;/code&gt;の&lt;code&gt;src&lt;/code&gt;で参照する。&lt;/p&gt;
&lt;p&gt;次に、&lt;code&gt;&amp;lt;template&amp;gt;&lt;/code&gt;ブロック内で画像ファイルを参照する際、&lt;code&gt;src&lt;/code&gt;属性に&lt;code&gt;/assets/logo.png&lt;/code&gt;を指定する。例を次に示す。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;&amp;lt;!-- ... --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;v-img&lt;/span&gt; &lt;span class="na"&gt;contain&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;300&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/assets/logo_test.svg&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;&amp;lt;!-- ... --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これで、画像ファイルが正常に表示される。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;
まとめ&lt;a href="#%e3%81%be%e3%81%a8%e3%82%81"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Vuetify 3で&lt;code&gt;v-img&lt;/code&gt;が動かなくなった場合、以下の2つの方法で対処できる。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;画像ファイルをimportして使用する&lt;/li&gt;
&lt;li&gt;画像ファイルをpublicディレクトリ下に配置して使用する&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;どちらの方法でも、画像の表示は問題なくできる。コンポーネントに密接に関連する画像などはimportし、それ以外の画像はpublicディレクトリ下に置くという使い分けが適切だろう。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://zenn.dev/nuichi/articles/7974bd1101fe9d#%E7%94%BB%E5%83%8F%E3%81%AE%E3%83%91%E3%82%B9" target="_blank" rel="noopener"
&gt;Vue 3 / Vuetify 3 に備えてまず Vite への移行をお勧めしたい&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/Kairi_Yasunnde/items/dd4eeb52d140cd309da5" target="_blank" rel="noopener"
&gt;TypeScriptでsvgファイルのインポート時の型エラーを解消する - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://webpack.js.org/guides/typescript/#importing-other-assets" target="_blank" rel="noopener"
&gt;TypeScript | webpack&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>matplotlibでmp4を出力しようとしたら"ValueError: unknown file extension: .mp4"と言われたときの解決方法</title><link>https://notes.nakurei.com/post/i-want-to-output-mp4-with-matplotlib/</link><pubDate>Tue, 13 Dec 2022 20:14:10 +0900</pubDate><guid>https://notes.nakurei.com/post/i-want-to-output-mp4-with-matplotlib/</guid><description>&lt;img src="https://notes.nakurei.com/img/header/python_img.webp" alt="Featured image of post matplotlibでmp4を出力しようとしたら"ValueError: unknown file extension: .mp4"と言われたときの解決方法" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;matplotlibの&lt;code&gt;animation&lt;/code&gt;を利用してmp4を出力しようとしたら、&lt;code&gt;ValueError: unknown file extension: .mp4&lt;/code&gt;と言われて出力できなかった。
このときに取った対応策を備忘録として残す。&lt;/p&gt;
&lt;h2 id="原因-ffmpegへのパスが通っていない"&gt;
原因: ffmpegへのパスが通っていない&lt;a href="#%e5%8e%9f%e5%9b%a0-ffmpeg%e3%81%b8%e3%81%ae%e3%83%91%e3%82%b9%e3%81%8c%e9%80%9a%e3%81%a3%e3%81%a6%e3%81%84%e3%81%aa%e3%81%84"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;この問題の原因は、ffmpegへのパスが通っていなかったことだった。
ffmpegをダウンロードして、matplotlibに場所を教えてあげれば解決できる。&lt;/p&gt;
&lt;h2 id="当時の環境"&gt;
当時の環境&lt;a href="#%e5%bd%93%e6%99%82%e3%81%ae%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Windows 10&lt;/li&gt;
&lt;li&gt;Python 3.9.5&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="問題を再現する最小限のコード"&gt;
問題を再現する最小限のコード&lt;a href="#%e5%95%8f%e9%a1%8c%e3%82%92%e5%86%8d%e7%8f%be%e3%81%99%e3%82%8b%e6%9c%80%e5%b0%8f%e9%99%90%e3%81%ae%e3%82%b3%e3%83%bc%e3%83%89"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;以下のコードは、問題を再現する最小限のサンプルである。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;np&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;matplotlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;animation&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;loop_num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&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="n"&gt;fig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;artists&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;loop_num&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;signal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;artist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;artists&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;artist&lt;/span&gt;&lt;span class="p"&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="n"&gt;anim&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;animation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ArtistAnimation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;artists&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;artists&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;anim&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;test.mp4&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="エラーの詳細"&gt;
エラーの詳細&lt;a href="#%e3%82%a8%e3%83%a9%e3%83%bc%e3%81%ae%e8%a9%b3%e7%b4%b0"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;matplotlib.animation.ArtistAnimation&lt;/code&gt;で生成したアニメーションを保存するときに拡張子をmp4にすると、下記のエラーが発生した。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MovieWriter ffmpeg unavailable&lt;span class="p"&gt;;&lt;/span&gt; using Pillow instead.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Traceback &lt;span class="o"&gt;(&lt;/span&gt;most recent call last&lt;span class="o"&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; File &lt;span class="s2"&gt;&amp;#34;python\path\PIL\Image.py&amp;#34;&lt;/span&gt;, line 2331, in save
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;format&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; EXTENSION&lt;span class="o"&gt;[&lt;/span&gt;ext&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;KeyError: &lt;span class="s1"&gt;&amp;#39;.mp4&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;The above exception was the direct cause of the following exception:
&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="c1"&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; File &lt;span class="s2"&gt;&amp;#34;python\path\PIL\Image.py&amp;#34;&lt;/span&gt;, line 2333, in save
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; raise ValueError&lt;span class="o"&gt;(&lt;/span&gt;f&lt;span class="s2"&gt;&amp;#34;unknown file extension: {ext}&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; from e
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ValueError: unknown file extension: .mp4&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="何が問題だったのか"&gt;
何が問題だったのか&lt;a href="#%e4%bd%95%e3%81%8c%e5%95%8f%e9%a1%8c%e3%81%a0%e3%81%a3%e3%81%9f%e3%81%ae%e3%81%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ffmpegへのパスが通ってなかった。&lt;/p&gt;
&lt;h2 id="解決策"&gt;
解決策&lt;a href="#%e8%a7%a3%e6%b1%ba%e7%ad%96"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ffmpegをダウンロードして、matplotlibに場所を教えてあげれば解決できる。&lt;/p&gt;
&lt;h3 id="ffmpegをダウンロードする"&gt;
ffmpegをダウンロードする&lt;a href="#ffmpeg%e3%82%92%e3%83%80%e3%82%a6%e3%83%b3%e3%83%ad%e3%83%bc%e3%83%89%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a class="link" href="https://www.ffmpeg.org/" target="_blank" rel="noopener"
&gt;ffmpegの公式サイト&lt;/a&gt;からffmpegをダウンロードする。
DownloadからWindowsを選び、出てくるサイトからWindows用のffmpegファイルをダウンロードすればよい。
詳細は&lt;a class="link" href="https://jp.videoproc.com/edit-convert/how-to-download-and-install-ffmpeg.htm" target="_blank" rel="noopener"
&gt;このあたりのサイト&lt;/a&gt;を参考にすれば問題ないだろう。&lt;/p&gt;
&lt;h3 id="matplotlibにffmpegの場所を教える"&gt;
matplotlibにffmpegの場所を教える&lt;a href="#matplotlib%e3%81%abffmpeg%e3%81%ae%e5%a0%b4%e6%89%80%e3%82%92%e6%95%99%e3%81%88%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ffmpegのzipファイルをダウンロードしたら、解凍して、
中に入っているbinファイルを&lt;code&gt;C:\ffmpeg\&lt;/code&gt;直下に置く。
ffmpegというディレクトリがなければ、&lt;code&gt;C:\&lt;/code&gt;直下に新たに作成する。&lt;/p&gt;
&lt;p&gt;その後、matplotlibにffmpegの場所を教える。
matplotlibにffmpegの場所を教えるやり方は2通りある。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;環境変数のPathに追加する方法。&lt;code&gt;C:\ffmpeg\bin&lt;/code&gt;を環境変数に追加する。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;plt.rcParams['animation.ffmpeg_path']&lt;/code&gt;に指定する方法。Pythonプログラムのmp4を保存する前の行に、下記コードを追加する。&lt;/li&gt;
&lt;/ol&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&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="cl"&gt;&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;animation.ffmpeg_path&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;C:&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;ffmpeg/bin/ffmpeg.exe&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="修正後の最小限のコード"&gt;
修正後の最小限のコード&lt;a href="#%e4%bf%ae%e6%ad%a3%e5%be%8c%e3%81%ae%e6%9c%80%e5%b0%8f%e9%99%90%e3%81%ae%e3%82%b3%e3%83%bc%e3%83%89"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;修正後のコードは以下のとおりである。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import numpy as np
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import matplotlib.pyplot as plt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;from matplotlib import animation
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ plt.rcParams[&amp;#34;animation.ffmpeg_path&amp;#34;] = &amp;#34;C:\\ffmpeg/bin/ffmpeg.exe&amp;#34;
&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;loop_num = 10
&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;fig = plt.figure()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;artists = []
&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;for i in range(loop_num):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; signal = np.random.rand(100)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; artist = plt.plot(signal)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; artists.append(artist)
&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;anim = animation.ArtistAnimation(fig=fig, artists=artists, interval=10)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;anim.save(&amp;#34;test.mp4&amp;#34;, fps=30)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これを実行すると、無事test.mp4が生成される。&lt;/p&gt;
&lt;div class="video-wrapper"&gt;
&lt;video
controls
src="https://notes.nakurei.com/post/i-want-to-output-mp4-with-matplotlib/test.mp4"
autoplay
loop
&gt;
&lt;p&gt;
Your browser doesn't support HTML5 video. Here is a
&lt;a href="https://notes.nakurei.com/post/i-want-to-output-mp4-with-matplotlib/test.mp4"&gt;link to the video&lt;/a&gt; instead.
&lt;/p&gt;
&lt;/video&gt;
&lt;/div&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://jp.videoproc.com/edit-convert/how-to-download-and-install-ffmpeg.htm" target="_blank" rel="noopener"
&gt;【初心者】FFmpegのダウンロードとインストール手順～Windows/Mac/Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://stackoverflow.com/questions/58469357/python-unknown-file-extension-mp4" target="_blank" rel="noopener"
&gt;matplotlib - Python unknown file extension .mp4 - Stack Overflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.ffmpeg.org/" target="_blank" rel="noopener"
&gt;FFmpeg&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>InkscapeでPSDファイルを出力する方法</title><link>https://notes.nakurei.com/post/output-psd-files-with-inkscape/</link><pubDate>Mon, 12 Dec 2022 01:52:16 +0900</pubDate><guid>https://notes.nakurei.com/post/output-psd-files-with-inkscape/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="link" href="https://inkscape.org/ja/" target="_blank" rel="noopener"
&gt;Inkscape&lt;/a&gt;でPSDファイルを出力するのに多少苦労したので、対応策を備忘録として残しておく。&lt;/p&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://inkscape.org/ja/" target="_blank" rel="noopener"
&gt;Inkscape&lt;/a&gt; 1.2.2&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.gimp.org/" target="_blank" rel="noopener"
&gt;GIMP&lt;/a&gt; 2.10.32&lt;/li&gt;
&lt;li&gt;Windows 10&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="結果だけ知りたい人のために"&gt;
結果だけ知りたい人のために&lt;a href="#%e7%b5%90%e6%9e%9c%e3%81%a0%e3%81%91%e7%9f%a5%e3%82%8a%e3%81%9f%e3%81%84%e4%ba%ba%e3%81%ae%e3%81%9f%e3%82%81%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;InkscapeでPSDファイルを出力するための設定手順を下記に記す。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a class="link" href="https://inkscape.org/ja/" target="_blank" rel="noopener"
&gt;Inkscape&lt;/a&gt;と&lt;a class="link" href="https://www.gimp.org/" target="_blank" rel="noopener"
&gt;GIMP&lt;/a&gt;をインストールする&lt;/li&gt;
&lt;li&gt;GIMPのパスを通す
&lt;ol&gt;
&lt;li&gt;スタートメニューの検索窓で「環境変数を編集」を検索し開く&lt;/li&gt;
&lt;li&gt;「ユーザー環境変数」にある「Path」を選択して「編集」をクリック&lt;/li&gt;
&lt;li&gt;「新規」をクリックしてGIMPをインストールしたパス（デフォルトなら&lt;code&gt;%PROGRAMFILES%\GIMP 2\bin&lt;/code&gt;）を追加する&lt;/li&gt;
&lt;li&gt;「OK」をクリックして保存する&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;管理者権限でコマンドプロンプトを起動する&lt;/li&gt;
&lt;li&gt;GIMPへのパスが通っているか確認する
&lt;ol&gt;
&lt;li&gt;コマンドプロンプトに&lt;code&gt;gimp-2.10&lt;/code&gt;と打って実行（Enter）し、GIMPが起動すればOK&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gimp&lt;/code&gt;コマンドで&lt;code&gt;gimp-2.10.exe&lt;/code&gt;が起動するようにする
&lt;ol&gt;
&lt;li&gt;管理者権限でコマンドプロンプトを開き、&lt;code&gt;fsutil hardlink create &amp;quot;%PROGRAMFILES%\GIMP 2\bin\gimp.exe&amp;quot; &amp;quot;%PROGRAMFILES%\GIMP 2\bin\gimp-2.10.exe&amp;quot;&lt;/code&gt;を実行する -&amp;gt; ハードリンクが生成される&lt;/li&gt;
&lt;li&gt;コマンドプロンプトに&lt;code&gt;gimp&lt;/code&gt;と打って実行（Enter）し、GIMPが起動すればOK&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Inkscapeにgimp_psdのextensionを追加する
&lt;ol&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/NakuRei/gimp_psd" target="_blank" rel="noopener"
&gt;ここ&lt;/a&gt;からファイルをダウンロードし、任意の場所に保存する&lt;/li&gt;
&lt;li&gt;Inkscapeをインストールしたディレクトリを開く（デフォルトなら&lt;code&gt;C:\Program Files\Inkscape&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;その中の&lt;code&gt;share\inkscape\extensions&lt;/code&gt;内に、ダウンロードしたファイルの&lt;code&gt;gimp_psd.inx&lt;/code&gt;と&lt;code&gt;gimp_psd.py&lt;/code&gt;を入れる&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;以上を設定すると、InkscapeでPSD形式のファイルを保存できるようになる。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="背景"&gt;
背景&lt;a href="#%e8%83%8c%e6%99%af"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;InkscapeはデフォルトでPSDファイル出力をサポートしていない。
しかし、GIMPを利用してInkscapeからPSDを出力するextension「&lt;a class="link" href="https://github.com/junichi11/gimp_psd" target="_blank" rel="noopener"
&gt;gimp_psd&lt;/a&gt;」が、&lt;a class="link" href="https://github.com/junichi11" target="_blank" rel="noopener"
&gt;junichi11&lt;/a&gt;さんによって開発されている。
これを適用すれば簡単にInkscapeでPSDファイルを出力できる。&lt;/p&gt;
&lt;p&gt;…と思っていたのだが、単に適用しただけではInkscapeにエラー（&lt;code&gt;FileNotFoundError&lt;/code&gt;）を吐かれてしまう。
下記にエラーの一例を示す。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Traceback &lt;span class="o"&gt;(&lt;/span&gt;most recent call last&lt;span class="o"&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; File &lt;span class="s2"&gt;&amp;#34;C:\Program Files\Inkscape\share\inkscape\extensions\gimp_psd.py&amp;#34;&lt;/span&gt;, line 179, in &amp;lt;module&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; GimpXcf&lt;span class="o"&gt;()&lt;/span&gt;.run&lt;span class="o"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; File &lt;span class="s2"&gt;&amp;#34;C:\Program Files\Inkscape\share\inkscape\extensions\inkex\base.py&amp;#34;&lt;/span&gt;, line 231, in run
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; self.save_raw&lt;span class="o"&gt;(&lt;/span&gt;self.effect&lt;span class="o"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; File &lt;span class="s2"&gt;&amp;#34;C:\Program Files\Inkscape\share\inkscape\extensions\inkex\base.py&amp;#34;&lt;/span&gt;, line 277, in save_raw
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; self.save&lt;span class="o"&gt;(&lt;/span&gt;self.options.output&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; File &lt;span class="s2"&gt;&amp;#34;C:\Program Files\Inkscape\share\inkscape\extensions\gimp_psd.py&amp;#34;&lt;/span&gt;, line 175, in save
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; with open&lt;span class="o"&gt;(&lt;/span&gt;xcf, &lt;span class="s1"&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; as fhl:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FileNotFoundError: &lt;span class="o"&gt;[&lt;/span&gt;Errno 2&lt;span class="o"&gt;]&lt;/span&gt; No such file or directory: &lt;span class="s1"&gt;&amp;#39;C:\\Users\\&amp;lt;User Name&amp;gt;\\AppData\\Local\\Temp\\gimp-out-xxxxxxxx\\hogehoge.psd.psd&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="何が問題だったのか"&gt;
何が問題だったのか&lt;a href="#%e4%bd%95%e3%81%8c%e5%95%8f%e9%a1%8c%e3%81%a0%e3%81%a3%e3%81%9f%e3%81%ae%e3%81%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;gimp_psdのプログラムにバグが生じていた。&lt;/p&gt;
&lt;p&gt;GIMPのコマンドにパスを含む引数を渡すときに、なぜかはわからないが、パス区切り文字の&lt;code&gt;\\&lt;/code&gt;が無視されていた。
そのため、Inkscapeが&lt;code&gt;Temp\\gimp-out-xxxxxxxx&lt;/code&gt;ディレクトリに吐いた.pngファイルへアクセスできず、GIMPのコマンドが何も吐かずに終了していた。
よって、GIMPによって生成されるはずの&lt;code&gt;hogehoge.psd.psd&lt;/code&gt;が生成されず、&lt;code&gt;FileNotFoundError&lt;/code&gt;が生じた。&lt;/p&gt;
&lt;p&gt;なお、パス区切り文字が&lt;code&gt;\\&lt;/code&gt;になるのはWindowsだけなので、MacやLinuxではこのバグは生じないと思われる。&lt;/p&gt;
&lt;h2 id="どう解決したのか"&gt;
どう解決したのか&lt;a href="#%e3%81%a9%e3%81%86%e8%a7%a3%e6%b1%ba%e3%81%97%e3%81%9f%e3%81%ae%e3%81%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;実行OSがWindowsのときだけ、パス区切り文字の&lt;code&gt;\\&lt;/code&gt;を&lt;code&gt;/&lt;/code&gt;に置換して、GIMPのコマンドでパス区切り文字が無視されないようにした。&lt;/p&gt;
&lt;p&gt;具体的には、&lt;a class="link" href="https://github.com/junichi11/gimp_psd" target="_blank" rel="noopener"
&gt;gimp_psd&lt;/a&gt; -&amp;gt; &lt;a class="link" href="https://github.com/junichi11/gimp_psd/blob/master/gimp_psd.py" target="_blank" rel="noopener"
&gt;gimp_psd.py&lt;/a&gt;の115行目以降に、下記のように手を加えた。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;gimp_psd.py&lt;/div&gt;
&lt;div class="code-block-content"&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="cl"&gt; &lt;span class="n"&gt;xcf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tempdir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt;.psd&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;docname&lt;/span&gt;&lt;span class="p"&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="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;nt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# NOTE: if Windows&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;xcf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;xcf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sep&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;pngs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pngs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sep&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/NakuRei/gimp_psd/commit/33c515ccb0fa4bd325d88685857c77abf9d184f8" target="_blank" rel="noopener"
&gt;変更の詳細はこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;こうすることで、パス区切り文字が無視されなくなり、正常にPSDファイルが出力されるようになった。&lt;/p&gt;
&lt;h2 id="ちなみに"&gt;
ちなみに&lt;a href="#%e3%81%a1%e3%81%aa%e3%81%bf%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;GIMPにパスを通すとInkscapeの出力ファイルに追加される&lt;code&gt;.xcf&lt;/code&gt;の出力も、同じエラーで動かないと思われる。&lt;/p&gt;
&lt;h2 id="適用しても動かないときに確認すること"&gt;
適用しても動かないときに確認すること&lt;a href="#%e9%81%a9%e7%94%a8%e3%81%97%e3%81%a6%e3%82%82%e5%8b%95%e3%81%8b%e3%81%aa%e3%81%84%e3%81%a8%e3%81%8d%e3%81%ab%e7%a2%ba%e8%aa%8d%e3%81%99%e3%82%8b%e3%81%93%e3%81%a8"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;まずはコマンドプロンプトで&lt;code&gt;gimp&lt;/code&gt;コマンドを実行し、GIMPが起動するか確かめること。
GIMPにパスを通さないと動かない。
GIMPが起動しない場合は、環境変数にGIMPのパスが登録されていることを確認する。
パスが登録されていても動かないなら、GIMPを再インストールする。&lt;/p&gt;
&lt;p&gt;それでも動かなければ、&lt;a class="link" href="https://github.com/NakuRei/gimp_psd" target="_blank" rel="noopener"
&gt;こちら&lt;/a&gt;にIssueを投げてほしい。&lt;/p&gt;
&lt;h2 id="おわりに"&gt;
おわりに&lt;a href="#%e3%81%8a%e3%82%8f%e3%82%8a%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/junichi11" target="_blank" rel="noopener"
&gt;junichi11&lt;/a&gt;さんに、あらためて感謝の意を申し上げる。
このコードがなかったら諦めていただろう。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/nanbuwks/items/f9f858736c9fd20fcc5e" target="_blank" rel="noopener"
&gt;Windows 版 Inkcscape で GIMP XCF形式で保存する - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://wikiwiki.jp/inkscape/TIPS#rd71fdb7" target="_blank" rel="noopener"
&gt;TIPS - Inkscape Wiki*&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://junichi11.com/inkscape/inkscape-gimp_psd%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3" target="_blank" rel="noopener"
&gt;Inkscape gimp_psdエクステンション | junichi11.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/junichi11/gimp_psd" target="_blank" rel="noopener"
&gt;junichi11/gimp_psd: inkscape extension. create a psd file.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://otzt.nobody.jp/html/inkscape_tips.htm#SVG_to_PSD" target="_blank" rel="noopener"
&gt;その他のTipsなど\(Inkscape\)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.atsumitakeshi.com/python/py_os_discrim.html" target="_blank" rel="noopener"
&gt;OS（プラットフォーム）の判別（Python）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>PCからiPhoneのシンセサイザー（AudioKit Synth One）をMIDI制御して鳴らす方法</title><link>https://notes.nakurei.com/post/play-iphone-synthesizer-with-pc-midi/</link><pubDate>Thu, 08 Dec 2022 13:43:19 +0900</pubDate><guid>https://notes.nakurei.com/post/play-iphone-synthesizer-with-pc-midi/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="link" href="https://audiokitpro.com/synth/" target="_blank" rel="noopener"
&gt;AudioKit Synth One Synthesizer&lt;/a&gt;をPCから鳴らしたときのメモ。
特殊な機器は使わず、PCとiPhoneとlightning-USBケーブルだけで接続した。
&lt;a class="link" href="http://www.tobias-erichsen.de/software/rtpmidi.html" target="_blank" rel="noopener"
&gt;rtpMIDI&lt;/a&gt;があれば無線/USB接続でMIDI接続できる。&lt;/p&gt;
&lt;h2 id="当時の環境"&gt;
当時の環境&lt;a href="#%e5%bd%93%e6%99%82%e3%81%ae%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Windows 10のPC&lt;/li&gt;
&lt;li&gt;iPhone 13 Pro&lt;/li&gt;
&lt;li&gt;Ankerのlightning - USB3ケーブル&lt;/li&gt;
&lt;li&gt;rtpMIDI v1.1.14&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://apps.apple.com/us/app/audiokit-synth-one-synthesizer/id1371050497?ls=1" target="_blank" rel="noopener"
&gt;AudioKit Synth One SynthesizerのiOSアプリ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;iTunes 12.12.6.1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;iPhoneにいれるシンセサイザーは、Inter-app Audio (IAA)に対応していれば今回の手法を適用できる（と思われる&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;）。
それと、おそらくiPhoneでなくてもiOS端末なら同様に接続できる。
PCとUSB接続できれば良いので、lightningケーブルである必要はない。&lt;/p&gt;
&lt;p&gt;なお、今回はPC側のMIDIを流すアプリとしてGuitar Pro 8.0.0を使った&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;。
これもMIDIの出力先を変更できるアプリであれば問題ないため、DTMソフトやMIDIプレーヤーでもよい。&lt;/p&gt;
&lt;h2 id="前提条件"&gt;
前提条件&lt;a href="#%e5%89%8d%e6%8f%90%e6%9d%a1%e4%bb%b6"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="pc側の前提条件"&gt;
PC側の前提条件&lt;a href="#pc%e5%81%b4%e3%81%ae%e5%89%8d%e6%8f%90%e6%9d%a1%e4%bb%b6"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;PCにiTunesをインストールしている&lt;sup id="fnref:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;PCにMIDIを出力できるアプリをインストールしている&lt;/li&gt;
&lt;li&gt;PCに&lt;a class="link" href="http://www.tobias-erichsen.de/software/rtpmidi.html" target="_blank" rel="noopener"
&gt;rtpMIDI&lt;/a&gt;をインストールしている&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a class="link" href="http://www.tobias-erichsen.de/software/rtpmidi.html" target="_blank" rel="noopener"
&gt;rtpMIDI&lt;/a&gt;はMIDIドライバの役割を果たす。
リンク先の「download rtpMIDI」からインストーラをダウンロードできる。
インストールはデフォルト設定で問題ない。&lt;/p&gt;
&lt;h3 id="iphone側の前提条件"&gt;
iPhone側の前提条件&lt;a href="#iphone%e5%81%b4%e3%81%ae%e5%89%8d%e6%8f%90%e6%9d%a1%e4%bb%b6"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;iPhoneにAudioKit Synth One Synthesizerなどのシンセサイザーをインストールしている&lt;/li&gt;
&lt;li&gt;PCとiPhoneをlightning - USB3ケーブルで接続できる&lt;/li&gt;
&lt;li&gt;インターネット共有が使える、あるいはPCとiPhoneで共通のWi-Fiに接続できる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AudioKit Synth One Synthesizerは特に設定をせずにネットワークMIDIで接続できる。&lt;/p&gt;
&lt;h2 id="接続方法"&gt;
接続方法&lt;a href="#%e6%8e%a5%e7%b6%9a%e6%96%b9%e6%b3%95"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="どういう風に接続するか"&gt;
どういう風に接続するか&lt;a href="#%e3%81%a9%e3%81%86%e3%81%84%e3%81%86%e9%a2%a8%e3%81%ab%e6%8e%a5%e7%b6%9a%e3%81%99%e3%82%8b%e3%81%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;PCのMIDI出力できるソフト（Guitar Pro 8）-&amp;gt; Wi-Fi / USB -&amp;gt; AudioKit Synth One Synthesizer -&amp;gt; iPhoneスピーカー、という接続になる。
iPhoneにBluetoothスピーカーなどをつないでいれば、そこから音が出力される。&lt;/p&gt;
&lt;h3 id="pcとiphoneをmidi接続する"&gt;
PCとiPhoneをMIDI接続する&lt;a href="#pc%e3%81%a8iphone%e3%82%92midi%e6%8e%a5%e7%b6%9a%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;まず、PCとiPhoneを下記いずれかの方法で接続する。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PCとiPhoneを同じWi-Fiに接続する&lt;/li&gt;
&lt;li&gt;iPhone側で「インターネット共有」をオンにした状態で、lightning - USBケーブルでPCと接続する。このときコンピュータを信頼するか聞かれた場合は、信頼するを選ぶ。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wi-Fi接続のほうが手軽だが、筆者の環境ではあまり許容できない遅延が発生したため、遅延が気になる場合は後者のやり方のほうが良い。&lt;/p&gt;
&lt;p&gt;次に、iPhoneでシンセサイザーを、PCでrtpMIDIを開き、iOSとPCをMIDI接続する。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;rtpMIDIの「My Sessions」にあるプラスボタンをクリックする&lt;/li&gt;
&lt;li&gt;「Session」の「Local name」をわかりやすい名前にする&lt;/li&gt;
&lt;li&gt;「Session」の「Enabled」にチェックを入れる -&amp;gt; MIDIデバイスとして接続できるようになる&lt;/li&gt;
&lt;li&gt;PC側のMIDIを流すアプリで、MIDIの出力先を「Session」の「Local name」と同じにする
&lt;ul&gt;
&lt;li&gt;接続先に出てこない場合は一度アプリを再起動する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;iPhone側のアプリがネットワークMIDIに対応していて動作していれば「Directory」エリアにiOS端末が表示される。それを選択し「Connect」をクリックすると、「Session」の「Participants」に接続状況が表示される。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ここまでできたら、あとはPCのアプリでMIDIを再生すると、iPhoneのシンセサイザーで音が再生される。
接続が切断されると「Directory」エリアに再度iPhoneが表示されるので、再接続する。
切断したい場合は「Participants」にある「Disconnect」をクリックすればよい。&lt;/p&gt;
&lt;p&gt;AudioKit Synth One Synthesizerは再生音を録音する機能があるため、PCのMIDIをAudioKit Synth One Synthesizerの音で再生して録音できる。&lt;/p&gt;
&lt;h2 id="注意点トラブルシューティング"&gt;
注意点・トラブルシューティング&lt;a href="#%e6%b3%a8%e6%84%8f%e7%82%b9%e3%83%88%e3%83%a9%e3%83%96%e3%83%ab%e3%82%b7%e3%83%a5%e3%83%bc%e3%83%86%e3%82%a3%e3%83%b3%e3%82%b0"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;音がうまく再生されない場合は、iPhoneのボリュームを確認する。また、シンセサイザーアプリの設定でMIDIチャンネルが適切に設定されているか確認する。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://majipon.jp/blog/?p=1738" target="_blank" rel="noopener"
&gt;WindowsからiOSにWifi/USBでMIDI接続する（ネットワークMIDI） | majipon.jp　まじポン！&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://www.tobias-erichsen.de/software/rtpmidi.html" target="_blank" rel="noopener"
&gt;rtpMIDI | Tobias Erichsen&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;検証はしていない。&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;こういう用途のアプリではないが、個人的には曲作りに重宝している。&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;bonjourを使うため。&amp;#160;&lt;a href="#fnref:3" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Gitで日本語が文字化けするときの対処法</title><link>https://notes.nakurei.com/post/how-to-deal-with-garbled-japanese-in-git/</link><pubDate>Sun, 04 Dec 2022 02:24:13 +0900</pubDate><guid>https://notes.nakurei.com/post/how-to-deal-with-garbled-japanese-in-git/</guid><description>&lt;img src="https://notes.nakurei.com/icons/brand-git.svg" alt="Featured image of post Gitで日本語が文字化けするときの対処法" /&gt;&lt;p&gt;Git bashなどで&lt;code&gt;git status&lt;/code&gt;した際に日本語が文字化けしてしまうときは、
&lt;code&gt;git&lt;/code&gt;コマンドが使えるシェルで次のコマンドを実行すればよい。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --local core.quotepath false&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;--local&lt;/code&gt;だと、これを実行したgitリポジトリのみに適用される。
&lt;code&gt;--local&lt;/code&gt;を&lt;code&gt;--global&lt;/code&gt;にすると、PC全体に適用される。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://dev.classmethod.jp/articles/git-avoid-illegal-charactor-tips/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/7cf9d525c4978743a2373894a86ff0dd7e85e289_hu_8da32028148eb810.webp"
alt="[小ネタ][git] 日本語ファイルの文字化けを回避する | DevelopersIO image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
[小ネタ][git] 日本語ファイルの文字化けを回避する | DevelopersIO
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-f2a163d7176b1c47dd490b41df63c5aae42966cb.png"
style="margin-right: 2px;"
alt="dev.classmethod.jp favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
dev.classmethod.jp
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>シェルスクリプトでエラー文をわかりやすく表示する</title><link>https://notes.nakurei.com/post/easy-to-understand-error-in-shell-script/</link><pubDate>Sat, 03 Dec 2022 21:27:55 +0900</pubDate><guid>https://notes.nakurei.com/post/easy-to-understand-error-in-shell-script/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ちょっとしたスクリプトを書くときに、エラーメッセージをコンソールにわかりやすく表示するためのちょっとした関数を書いた。エラーメッセージに色を付けることで視認性が向上し、ビープ音を鳴らすことでエラー発生時にすぐに気づけるようになる。個人的には割とよく使うのでシェアする。&lt;/p&gt;
&lt;h2 id="usage"&gt;
Usage&lt;a href="#usage"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;以下に、関数の使用方法とコードの詳細説明を示す。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/sh
&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;error&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;\007&amp;#39;&lt;/span&gt; &lt;span class="c1"&gt;# ビープ音を鳴らす&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;\033[31;1m%s\033[m\n&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;!!!ERROR!!! &lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;# 赤色でエラーメッセージを表示&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="c1"&gt;# スクリプトを終了させる&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&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="c1"&gt;# 使い方&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;test&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;error &lt;span class="s2"&gt;&amp;#34;Error message.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;test&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/easy-to-understand-error-in-shell-script/20221204011851.png"
width="1290"
height="92"
srcset="https://notes.nakurei.com/post/easy-to-understand-error-in-shell-script/20221204011851_hu_d90cd23007beee6b.png 480w, https://notes.nakurei.com/post/easy-to-understand-error-in-shell-script/20221204011851_hu_745be8d8fad007af.png 1024w"
loading="lazy"
alt="出力例"
class="gallery-image"
data-flex-grow="1402"
data-flex-basis="3365px"
&gt;&lt;/p&gt;
&lt;p&gt;このコードでは&lt;code&gt;error&lt;/code&gt;関数が定義されており、エラーメッセージを赤色で表示し、ビープ音を鳴らすことで、エラーが発生したことを明確に伝える。スクリプトの途中で&lt;code&gt;error&lt;/code&gt;関数を呼び出すことで、エラーメッセージをコンソールに表示する。&lt;/p&gt;
&lt;h2 id="他のエラー表示方法"&gt;
他のエラー表示方法&lt;a href="#%e4%bb%96%e3%81%ae%e3%82%a8%e3%83%a9%e3%83%bc%e8%a1%a8%e7%a4%ba%e6%96%b9%e6%b3%95"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;他にも、&lt;code&gt;set -e&lt;/code&gt;や&lt;code&gt;set -o pipefail&lt;/code&gt;などのオプションを使って、シェルスクリプトのエラー検出を強化する方法がある。状況に応じて、適切なエラー表示方法を選択することが重要である。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/ko1nksm/items/095bdb8f0eca6d327233#%E3%81%8A%E3%81%BE%E3%81%911-%E8%89%B2%E6%8C%87%E5%AE%9A%E6%96%B9%E6%B3%95-%E4%B8%80%E8%A6%A7" target="_blank" rel="noopener"
&gt;シェルスクリプトのechoで”問題なく”色をつける\(bash他対応\) - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/dojineko/items/49aa30018bb721b0b4a9" target="_blank" rel="noopener"
&gt;シェルスクリプトの出力に色をつけたい！ - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>静的サイトジェネレータHugoで作成したサイトにrobots.txtを追加する方法</title><link>https://notes.nakurei.com/post/add-robots-txt-to-the-site-created-by-hugo/</link><pubDate>Fri, 02 Dec 2022 02:04:19 +0900</pubDate><guid>https://notes.nakurei.com/post/add-robots-txt-to-the-site-created-by-hugo/</guid><description>&lt;img src="https://notes.nakurei.com/img/header/website_img.webp" alt="Featured image of post 静的サイトジェネレータHugoで作成したサイトにrobots.txtを追加する方法" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;この記事では、静的サイトジェネレータHugoで作成されたサイトに、robots.txtファイルを追加する方法を紹介する。robots.txtは、ウェブサイトのクローリングを制御する重要なファイルである。&lt;/p&gt;
&lt;h2 id="hugoでデフォルトのrobotstxtを生成する方法"&gt;
Hugoでデフォルトのrobots.txtを生成する方法&lt;a href="#hugo%e3%81%a7%e3%83%87%e3%83%95%e3%82%a9%e3%83%ab%e3%83%88%e3%81%aerobotstxt%e3%82%92%e7%94%9f%e6%88%90%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Hugoでは、configファイルで&lt;code&gt;enableRobotsTXT&lt;/code&gt;を&lt;code&gt;true&lt;/code&gt;にすると、自動でrobots.txtをpublic直下に生成してくれる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;config.yaml&lt;/div&gt;
&lt;div class="code-block-content"&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="nt"&gt;enableRobotsTXT&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;利用しているテーマにrobots.txtのテンプレート&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;が含まれていない場合は、下記に示すシンプルなファイルが生成される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;/public/robots.txt&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;User-agent: *&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="robotstxtをカスタマイズする方法"&gt;
robots.txtをカスタマイズする方法&lt;a href="#robotstxt%e3%82%92%e3%82%ab%e3%82%b9%e3%82%bf%e3%83%9e%e3%82%a4%e3%82%ba%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Hugoが生成するrobots.txtをカスタマイズするには、&lt;code&gt;/layouts/robots.txt&lt;/code&gt;を作成し、そこにカスタム内容を書き込む。
たとえば、下記の内容を持つrobots.txtをlayouts下に生成する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;/layouts/robots.txt&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;User-agent: *
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Disallow:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Sitemap: {{ &amp;#34;sitemap.xml&amp;#34; | absURL }}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;その後&lt;code&gt;hugo&lt;/code&gt;コマンドを実行すると、public直下にカスタマイズされたrobots.txtが生成される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;/public/robots.txt&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;User-agent: *
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Disallow:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Sitemap: https://notes.nakurei.com/sitemap.xml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="特定のクローラーに対するrobotstxtの設定例"&gt;
特定のクローラーに対するrobots.txtの設定例&lt;a href="#%e7%89%b9%e5%ae%9a%e3%81%ae%e3%82%af%e3%83%ad%e3%83%bc%e3%83%a9%e3%83%bc%e3%81%ab%e5%af%be%e3%81%99%e3%82%8brobotstxt%e3%81%ae%e8%a8%ad%e5%ae%9a%e4%be%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="googlebotに対する設定例"&gt;
Googlebotに対する設定例&lt;a href="#googlebot%e3%81%ab%e5%af%be%e3%81%99%e3%82%8b%e8%a8%ad%e5%ae%9a%e4%be%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;User-agent: Googlebot
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Disallow: /private/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="他のウェブクローラに対する設定例"&gt;
他のウェブクローラに対する設定例&lt;a href="#%e4%bb%96%e3%81%ae%e3%82%a6%e3%82%a7%e3%83%96%e3%82%af%e3%83%ad%e3%83%bc%e3%83%a9%e3%81%ab%e5%af%be%e3%81%99%e3%82%8b%e8%a8%ad%e5%ae%9a%e4%be%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;User-agent: Bingbot
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Disallow: /private/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="robotstxtの設定ミスによる検索エンジンへの悪影響"&gt;
robots.txtの設定ミスによる検索エンジンへの悪影響&lt;a href="#robotstxt%e3%81%ae%e8%a8%ad%e5%ae%9a%e3%83%9f%e3%82%b9%e3%81%ab%e3%82%88%e3%82%8b%e6%a4%9c%e7%b4%a2%e3%82%a8%e3%83%b3%e3%82%b8%e3%83%b3%e3%81%b8%e3%81%ae%e6%82%aa%e5%bd%b1%e9%9f%bf"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;robots.txtの設定ミスは、サイトが検索エンジンで正しくインデックスされない原因となる。そのため、設定を変更する際は、特にDisallowやAllowの指定を正確に行うことが重要である。設定ミスを防ぐために、robots.txtを変更した後は、robots.txtの設定が正しく反映されているか確認しよう。確認には、&lt;a class="link" href="https://support.google.com/webmasters/answer/6062598" target="_blank" rel="noopener"
&gt;Google Search Consoleで用意されているrobots.txtテスター&lt;/a&gt;や、&lt;a class="link" href="https://www.bing.com/webmasters/help/robotstxt-tester-623520ca" target="_blank" rel="noopener"
&gt;Bing Webmaster Toolsに用意されているrobots.txtテスター&lt;/a&gt;を利用できる。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://gohugo.io/templates/robots/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/ca6a886b748530c50e91aa42540b4778cc271ce5_hu_7714facf1be40e18.webp"
alt="robots.txt template image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
robots.txt template
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-043342b2949ff8322cd47be6839f226ca9e66976.png"
style="margin-right: 2px;"
alt="gohugo.io favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
gohugo.io
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
style="
display: flex;
align-items: center;
justify-content: center;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
cursor: not-allowed;
"&gt;
&lt;div&gt;balloon-jp.vercel.app にアクセスできません&lt;/div&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://open-groove.net/other-tools/hugo-robots-move-contents/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/b96e5f2ce0403e028babb955826938a71050080b_hu_48b1885e2a6dc28a.webp"
alt="Klikbet77 - Situs Autentik Togel Asian &amp; Prediksi Akurat Lewat Odms Club image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
Klikbet77 - Situs Autentik Togel Asian &amp; Prediksi Akurat Lewat Odms Club
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;Klikbet77 adalah situs autentik togel Asian dengan prediksi akurat lewat ODMS Club. Menyajikan data real-time, analisis statistik mendalam, update pasaran lengkap, sistem aman, akses cepat, dan layanan profesional untuk pengalaman terpercaya.&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-ecdbd4105271c880a48b14680948a6a2afa6b129.png"
style="margin-right: 2px;"
alt="open-groove.net favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
open-groove.net
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;&lt;code&gt;/themes/&amp;lt;THEME&amp;gt;/layouts/robots.txt&lt;/code&gt;&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>VS CodeのスニペットでC++のインクルードガードを自動生成する</title><link>https://notes.nakurei.com/post/write-cpp-include-guard-in-vs-code-snippet/</link><pubDate>Thu, 01 Dec 2022 06:12:47 +0900</pubDate><guid>https://notes.nakurei.com/post/write-cpp-include-guard-in-vs-code-snippet/</guid><description>&lt;img src="https://notes.nakurei.com/img/header/cpp_img.webp" alt="Featured image of post VS CodeのスニペットでC++のインクルードガードを自動生成する" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;C++のヘッダファイル&lt;code&gt;.hpp&lt;/code&gt;を作成する際に、毎回手動でインクルードガードを書くのが面倒になった。そこで。Visual Studio Code (VS Code)のスニペット機能を使って、C++のインクルードガードを自動生成するようにした。そのスニペットを紹介する。&lt;/p&gt;
&lt;h2 id="スニペットの登録"&gt;
スニペットの登録&lt;a href="#%e3%82%b9%e3%83%8b%e3%83%9a%e3%83%83%e3%83%88%e3%81%ae%e7%99%bb%e9%8c%b2"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;VS Codeで、ファイル &amp;gt; 基本設定 &amp;gt; ユーザースニペットを選択し、C++のユーザースニペットの登録用JSONファイルを開く&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;。任意の箇所に以下のコードをコピー＆ペーストし、ファイルを保存する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;cpp.json&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// ほかのSnippets
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&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;&amp;#34;Include guard&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;&amp;#34;prefix&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;guard&amp;#34;&lt;/span&gt;&lt;span class="p"&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;&amp;#34;body&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#ifndef ${TM_FILENAME/([\\-\\\\\\.])|(\\w+)/${1:+_}${2:/upcase}/g}_&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#define ${TM_FILENAME/([\\-\\\\\\.])|(\\w+)/${1:+_}${2:/upcase}/g}_&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;$0&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;#endif // ${TM_FILENAME/([\\-\\\\\\.])|(\\w+)/${1:+_}${2:/upcase}/g}_&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;たとえば、&amp;ldquo;test_header_file.hpp&amp;quot;ファイルでこのスニペット&lt;code&gt;guard&lt;/code&gt;を実行すると、下記コードが自動で生成される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;test_header_file.hpp&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#ifndef TEST_HEADER_FILE_HPP_
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#define TEST_HEADER_FILE_HPP_
&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="c1"&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="cp"&gt;#endif &lt;/span&gt;&lt;span class="c1"&gt;// TEST_HEADER_FILE_HPP_
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;なお、命名規則は&lt;a class="link" href="https://google.github.io/styleguide/cppguide.html#The__define_Guard" target="_blank" rel="noopener"
&gt;Google C++ Style Guide&lt;/a&gt;に則っている。&lt;/p&gt;
&lt;h2 id="スニペットの解説"&gt;
スニペットの解説&lt;a href="#%e3%82%b9%e3%83%8b%e3%83%9a%e3%83%83%e3%83%88%e3%81%ae%e8%a7%a3%e8%aa%ac"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;つくったはいいものの暗号みたいなスニペットになってしまったため、何をしているかも書いておく。
下記の1文が理解できれば問題ないだろう。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;${TM_FILENAME/([\\-\\\\\\.])|(\\w+)/${1:+_}${2:/upcase}/g}_&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;この部分でしていることは、ファイル名のうち&lt;code&gt;-&lt;/code&gt;, &lt;code&gt;\&lt;/code&gt;, &lt;code&gt;.&lt;/code&gt;をアンダーバーに変換し、
かつ、それ以外のアルファベットを大文字（Upper Case）に変換している。&lt;/p&gt;
&lt;p&gt;形式としては、&lt;code&gt;${変換対象/正規表現/変換指定}&lt;/code&gt;という形をとっている。&lt;/p&gt;
&lt;p&gt;変換対象である&lt;code&gt;TM_FILENAME&lt;/code&gt;は、VS Codeのスニペットで使える変数であり、ファイル名を表す。
詳細は&lt;a class="link" href="https://code.visualstudio.com/docs/editor/userdefinedsnippets#_variables" target="_blank" rel="noopener"
&gt;公式サイト&lt;/a&gt;を参照してほしい。
たとえば、&lt;code&gt;TM_FILENAME&lt;/code&gt;を&lt;code&gt;RELATIVE_FILEPATH&lt;/code&gt;にすると、相対パスも含めたファイル名になる。&lt;/p&gt;
&lt;p&gt;正規表現の部分では、&lt;code&gt;-&lt;/code&gt;, &lt;code&gt;\&lt;/code&gt;, &lt;code&gt;.&lt;/code&gt;に一致する記号を&lt;code&gt;$1&lt;/code&gt;に、それ以外の半角英数字を&lt;code&gt;$2&lt;/code&gt;に抽出している。
VS Codeのスニペットでは、or (&lt;code&gt;|&lt;/code&gt;)で区切られた正規表現は、それぞれ別の変数に入力されるらしい。&lt;/p&gt;
&lt;p&gt;最後に、変換指定の部分で、&lt;code&gt;$1&lt;/code&gt;に抽出された記号をすべて&lt;code&gt;_&lt;/code&gt;に変換し、&lt;code&gt;$2&lt;/code&gt;に抽出された半角英数字をすべて大文字に変換している。&lt;/p&gt;
&lt;h2 id="ちなみに"&gt;
ちなみに&lt;a href="#%e3%81%a1%e3%81%aa%e3%81%bf%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;正直&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=amiralizadeh9480.cpp-helper" target="_blank" rel="noopener"
&gt;C++ Helper&lt;/a&gt;などの拡張機能を入れればすむ話ではある。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://code.visualstudio.com/docs/editor/userdefinedsnippets#_variables" target="_blank" rel="noopener"
&gt;Snippets in Visual Studio Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://google.github.io/styleguide/cppguide.html#The__define_Guard" target="_blank" rel="noopener"
&gt;Google C++ Style Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/yuki12/items/a67af0142f77ff496ef3" target="_blank" rel="noopener"
&gt;Visual Studio Code のスニペットでインクルードガードを作ってみる - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/chukeblo/items/ed3408adcfbeb290cd19" target="_blank" rel="noopener"
&gt;【VSCode】C++ でインクルードガードを書くのが煩わしいあなたへ - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://stackoverflow.com/questions/70935603/vscode-snippet-tranform-filename-to-capitalize-sentence-with-a-regex" target="_blank" rel="noopener"
&gt;visual studio code - Vscode snippet: tranform filename to Capitalize sentence with a regex - Stack Overflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.megasoft.co.jp/mifes/seiki/meta.html" target="_blank" rel="noopener"
&gt;正規表現サンプル集&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;VS Codeにおけるスニペットの登録の仕方は&lt;a class="link" href="https://code.visualstudio.com/docs/editor/userdefinedsnippets#_create-your-own-snippets" target="_blank" rel="noopener"
&gt;公式サイト&lt;/a&gt;を参照のこと。&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Visual Studio Codeで連携したGitHubアカウントを変更する方法</title><link>https://notes.nakurei.com/post/change-the-github-account-linked-to-vs-code/</link><pubDate>Sun, 27 Nov 2022 01:45:41 +0900</pubDate><guid>https://notes.nakurei.com/post/change-the-github-account-linked-to-vs-code/</guid><description>&lt;img src="https://notes.nakurei.com/img/header/vscode.webp" alt="Featured image of post Visual Studio Codeで連携したGitHubアカウントを変更する方法" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Visual Studio Code（VS Code）はGitHubアカウントと連携できる。
連携すると、VS CodeからGitHubのリモートリポジトリを参照したり作成したりできる。&lt;/p&gt;
&lt;p&gt;この記事では、この連携を一度行った後に、連携するGitHubアカウントを別のアカウントに変更する方法を記す。&lt;/p&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;VS Code x64 1.73.1&lt;/li&gt;
&lt;li&gt;Windows 10 Pro 22H2 19045.2251&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="連携しているgithubアカウントの変更手順"&gt;
連携しているGitHubアカウントの変更手順&lt;a href="#%e9%80%a3%e6%90%ba%e3%81%97%e3%81%a6%e3%81%84%e3%82%8bgithub%e3%82%a2%e3%82%ab%e3%82%a6%e3%83%b3%e3%83%88%e3%81%ae%e5%a4%89%e6%9b%b4%e6%89%8b%e9%a0%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;まず、すでに連携しているGitHubアカウント情報を削除する。
一度連携したアカウント情報は、VS CodeではなくWindows側に保存されているため、これを削除する。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;コントロールパネル -&amp;gt; ユーザーアカウント -&amp;gt; 資格情報マネージャー -&amp;gt; Windows資格情報の管理を開く&lt;/li&gt;
&lt;li&gt;汎用資格情報にある&amp;quot;vscodevscode.github-authentication/github.auth&amp;quot;を削除する&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;削除したら、VS Codeを再起動して、再度GitHubと連携する。&lt;/p&gt;
&lt;p&gt;これで連携しているGitHubアカウントが変更される。変更後のアカウント情報が設定されていることを確認する。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://wood-roots.com/web/tool-editor/2553"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/1b5da5edde6849a1aaf462b66a8d7088f0370ed1_hu_fb916507636abb3c.webp"
alt="【ツール/エディタ】Windows10のVSCodeでGithubのユーザーを切り替えてpush/commitする方法 | Wood-Roots:blog image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
【ツール/エディタ】Windows10のVSCodeでGithubのユーザーを切り替えてpush/commitする方法 | Wood-Roots:blog
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;VSCodeを使いはじめた結果、ようやくGithubを抵抗なく使えるようになってきました。Githubのことを知ってからX年…長い道のりだった…。順調に使っていたのですが、VSCodeでGithubアカウントを切り替えて使おうとした際に正常にpushができないことがありまし...&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-9a8922c69cdcf6b994a0e4fcd09447dc0119b2b4.png"
style="margin-right: 2px;"
alt="wood-roots.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
wood-roots.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;</description></item><item><title>Hugo+Netlifyで作成したサイトをGoogle Search Consoleに登録する方法</title><link>https://notes.nakurei.com/post/register-a-netlify-site-with-google-search-console/</link><pubDate>Sat, 26 Nov 2022 23:13:08 +0900</pubDate><guid>https://notes.nakurei.com/post/register-a-netlify-site-with-google-search-console/</guid><description>&lt;img src="https://notes.nakurei.com/post/register-a-netlify-site-with-google-search-console/20221127004217.webp" alt="Featured image of post Hugo+Netlifyで作成したサイトをGoogle Search Consoleに登録する方法" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;HugoとNetlifyを使用して作成したサイトにGoogle Search Consoleを設定する方法を解説する。&lt;/p&gt;
&lt;h2 id="前提条件"&gt;
前提条件&lt;a href="#%e5%89%8d%e6%8f%90%e6%9d%a1%e4%bb%b6"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Netlifyでサイトをホスティングしている&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;独自ドメインを設定していない&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;すなわち、サイトのリンクが&lt;code&gt;https://hogehoge.netlify.app&lt;/code&gt;（&lt;code&gt;hogehoge&lt;/code&gt;は任意）である&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="google-search-consoleの役割とメリット"&gt;
Google Search Consoleの役割とメリット&lt;a href="#google-search-console%e3%81%ae%e5%bd%b9%e5%89%b2%e3%81%a8%e3%83%a1%e3%83%aa%e3%83%83%e3%83%88"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Google Search Consoleとは、Googleの検索結果において、サイトの掲載順位を監視、管理、改善するためのツールである。また、サイトマップ（sitemap.xml）を登録すれば、サイトをGoogle検索結果に載せられる。&lt;/p&gt;
&lt;p&gt;Google Search Consoleにサイトを登録することで、Googleがサイトをどのように認識しているのかがわかる。たとえば、Google検索で表示される頻度や、そのときの検索クエリを表示してくれる。また、サイトの読み込みエラーやハッキング、マルウェアなどのセキュリティの問題を簡単に監視してくれる。&lt;/p&gt;
&lt;p&gt;詳細は&lt;a class="link" href="https://support.google.com/webmasters/answer/9128668?hl=ja" target="_blank" rel="noopener"
&gt;公式のヘルプ&lt;/a&gt;を参照してほしい。&lt;/p&gt;
&lt;h2 id="hugonetlifyサイトのgoogle-search-console設定方法"&gt;
Hugo+NetlifyサイトのGoogle Search Console設定方法&lt;a href="#hugonetlify%e3%82%b5%e3%82%a4%e3%83%88%e3%81%aegoogle-search-console%e8%a8%ad%e5%ae%9a%e6%96%b9%e6%b3%95"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="必要なもの"&gt;
必要なもの&lt;a href="#%e5%bf%85%e8%a6%81%e3%81%aa%e3%82%82%e3%81%ae"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;以下のものが必須である。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Googleアカウント&lt;/li&gt;
&lt;li&gt;Google Search Consoleに登録するサイトのURL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;加えて、下記のいずれかひとつが必要である。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Google Analysisアカウント&lt;/li&gt;
&lt;li&gt;Netlifyアカウントでサイトの設定を変更する権限&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="設定の流れ"&gt;
設定の流れ&lt;a href="#%e8%a8%ad%e5%ae%9a%e3%81%ae%e6%b5%81%e3%82%8c"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Googleアカウントでログインする&lt;/li&gt;
&lt;li&gt;Google Search ConsoleにURLプレフィクスを登録する&lt;/li&gt;
&lt;li&gt;サイトマップを登録する&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;今回はGoogleアカウントでChromeにログイン済みであることを前提として解説する。&lt;/p&gt;
&lt;h3 id="google-search-consoleにurlプレフィクスを登録する"&gt;
Google Search ConsoleにURLプレフィクスを登録する&lt;a href="#google-search-console%e3%81%aburl%e3%83%97%e3%83%ac%e3%83%95%e3%82%a3%e3%82%af%e3%82%b9%e3%82%92%e7%99%bb%e9%8c%b2%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a class="link" href="https://search.google.com/search-console/welcome" target="_blank" rel="noopener"
&gt;Google Search Console&lt;/a&gt;
にアクセスする。すると、プロパティタイプの選択画面が表示される。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/register-a-netlify-site-with-google-search-console/20221127004217.png"
width="1039"
height="780"
srcset="https://notes.nakurei.com/post/register-a-netlify-site-with-google-search-console/20221127004217_hu_6735f494c104edd8.png 480w, https://notes.nakurei.com/post/register-a-netlify-site-with-google-search-console/20221127004217_hu_c7df4003c4f37c36.png 1024w"
loading="lazy"
alt="プロパティタイプの選択画面"
class="gallery-image"
data-flex-grow="133"
data-flex-basis="319px"
&gt;&lt;/p&gt;
&lt;p&gt;独自ドメインの場合はどちらを選んでも問題ない。しかし、ドメインを「hogehoge.netlify.app」から変更していない場合は、URLプレフィクスしか選択できない。なぜなら、Netlifyが提供してくれるドメインだと、DNSの確認がとれないためである。&lt;/p&gt;
&lt;p&gt;URLプレフィクスの欄に&lt;code&gt;https://hogehoge.netlify.app&lt;/code&gt;と入力し続行すると、所有権の確認を求められる。これは、登録者と無関係なサイトをGoogle Search Consoleに勝手に登録できないようにするための制限である。&lt;/p&gt;
&lt;p&gt;下記2つの条件を満たす場合は、とくに何もせず所有権の確認が終了する。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;登録したいサイトにGoogle Analysisを設定している&lt;/li&gt;
&lt;li&gt;Google Search ConsoleとGoogle Analysisを同一のGoogleアカウントで登録している&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;そうでない場合は、NetlifyのSnippet injectionを利用した、HTMLタグによる確認が簡単である。
その場合の手順は下記のとおりである。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Google Search Consoleを設定したいサイトのNetlifyプロジェクトを開く&lt;/li&gt;
&lt;li&gt;Site Settingsを開く&lt;/li&gt;
&lt;li&gt;左メニューからBuild &amp;amp; deploy -&amp;gt; Post processingに移動する&lt;/li&gt;
&lt;li&gt;Snippet injectionの項目でAdd snippetし、スクリプトの編集画面に移る&lt;/li&gt;
&lt;li&gt;挿入個所を「Insert before &lt;code&gt;&amp;lt;/head&amp;gt;&lt;/code&gt;」にする&lt;/li&gt;
&lt;li&gt;HTMLの欄にGoogle Search Consoleでコピーしたメタタグを貼り付ける&lt;/li&gt;
&lt;li&gt;適当なScript nameをつけて保存する&lt;/li&gt;
&lt;li&gt;Google Search Consoleに戻り、「確認」をクリックする&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;確認が取れると、無事にGoogle Search Consoleへの登録が完了する。&lt;/p&gt;
&lt;h3 id="サイトマップを登録する"&gt;
サイトマップを登録する&lt;a href="#%e3%82%b5%e3%82%a4%e3%83%88%e3%83%9e%e3%83%83%e3%83%97%e3%82%92%e7%99%bb%e9%8c%b2%e3%81%99%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Google検索でサイトが表示されるようにするため、サイトマップをGoogle Search Consoleに登録する。&lt;/p&gt;
&lt;p&gt;Google Search Consoleの左メニューからサイトマップを選ぶと、サイトマップを追加する画面に移動する。Hugoでは、&lt;code&gt;hugo&lt;/code&gt;コマンドを実行すると、publicディレクトリ直下にindex.xmlとsitemap.xmlが生成される&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;。そのため、サイトマップのURL入力欄に「index.xml」と「sitemap.xml」をそれぞれ入力し送信すれば登録できる。&lt;/p&gt;
&lt;p&gt;サイトマップを登録してから反映されるまでには1日以上かかるため、気長に待つ。
利用できるようになると、Googleアカウントにメールが届く。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;
まとめ&lt;a href="#%e3%81%be%e3%81%a8%e3%82%81"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;この記事では、HugoとNetlifyを使用したサイトのGoogle Search Console設定方法を解説した。以下の手順で設定した。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Googleアカウントでログインする&lt;/li&gt;
&lt;li&gt;Google Search ConsoleにURLプレフィクスを登録する&lt;/li&gt;
&lt;li&gt;サイトマップを登録する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Google Search ConsoleはSEO対策に有益なツールであり、サイトの運営において重要な情報を提供してくれる。この記事が、Google Search Consoleを設定し、サイトの検索結果改善に役立てば幸いである。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://support.google.com/webmasters/answer/9128668?hl=ja" target="_blank" rel="noopener"
&gt;Search Console の概要 - Search Console ヘルプ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://su2umarathon.netlify.app/google-search-console/" target="_blank" rel="noopener"
&gt;ブログに Google Search Console を設定しました |&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;これらのファイルの存在は簡単に確認できる。&lt;code&gt;https://hogehoge.netlify.app/index.xml&lt;/code&gt;あるいは&lt;code&gt;https://hogehoge.netlify.app/sitemap.xml&lt;/code&gt;にアクセスするだけである。&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Hugo Stackテーマのカスタマイズ</title><link>https://notes.nakurei.com/post/customize-stack-theme/</link><pubDate>Sun, 20 Nov 2022 20:48:38 +0900</pubDate><guid>https://notes.nakurei.com/post/customize-stack-theme/</guid><description>&lt;img src="https://notes.nakurei.com/img/header/website_img.webp" alt="Featured image of post Hugo Stackテーマのカスタマイズ" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Hugoの&lt;a class="link" href="https://themes.gohugo.io/themes/hugo-theme-stack/" target="_blank" rel="noopener"
&gt;Stack&lt;/a&gt;テーマを利用するにあたり、&amp;ldquo;config.yaml&amp;quot;などテーマに関連する設定を変更した。もう一度サイトを構築する際絶対に忘れているため、記録を残しておく。&lt;/p&gt;
&lt;p&gt;本文で示す変更箇所は下記のとおりである。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;サイト情報&lt;/li&gt;
&lt;li&gt;画像&lt;/li&gt;
&lt;li&gt;サイトのリンク&lt;/li&gt;
&lt;li&gt;外部リンク&lt;/li&gt;
&lt;li&gt;Widgets&lt;/li&gt;
&lt;li&gt;Google Analytics&lt;/li&gt;
&lt;li&gt;言語&lt;/li&gt;
&lt;li&gt;多言語対応に関する設定&lt;/li&gt;
&lt;li&gt;コメント機能の無効化&lt;/li&gt;
&lt;li&gt;OpenGraphの設定&lt;/li&gt;
&lt;li&gt;フォント&lt;/li&gt;
&lt;li&gt;フッター&lt;/li&gt;
&lt;li&gt;コードブロックの設定&lt;/li&gt;
&lt;li&gt;コードブロックのカスタマイズ&lt;/li&gt;
&lt;li&gt;default.mdのアレンジ&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="サイト情報の変更"&gt;
サイト情報の変更&lt;a href="#%e3%82%b5%e3%82%a4%e3%83%88%e6%83%85%e5%a0%b1%e3%81%ae%e5%a4%89%e6%9b%b4"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;baseurl&lt;/code&gt;をサイトのHomeのURLに変更する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;title&lt;/code&gt;と&lt;code&gt;description&lt;/code&gt;をオリジナルのものに変更する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;footer&lt;/code&gt;に表示されるサイトの設立年を変更する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sidebar&lt;/code&gt;の絵文字やサブタイトルを変更する&lt;/li&gt;
&lt;/ul&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;config.yaml&lt;/div&gt;
&lt;div class="code-block-content"&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 hl"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;baseurl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;https://nakureis-notes.netlify.app&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="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&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="l"&gt;NakuRei&amp;#39;s Notes&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;meta descriptionだよ&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="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;params&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="c"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;footer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;since&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2022&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="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;sidebar&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;compact&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 hl"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;emoji&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;subtitle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&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="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# ...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="画像の変更"&gt;
画像の変更&lt;a href="#%e7%94%bb%e5%83%8f%e3%81%ae%e5%a4%89%e6%9b%b4"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;avatar画像とfaviconを作成&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;し、パスを指定する。&lt;/p&gt;
&lt;p&gt;Stackテーマでは、&lt;code&gt;avatar&lt;/code&gt;で&lt;code&gt;local&lt;/code&gt;を&lt;code&gt;true&lt;/code&gt;にし、&lt;code&gt;assets\&lt;/code&gt;以下に画像を配置すると、サイズを自動で変更してくれる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;assets/img/avatar.png&lt;/code&gt;にオリジナルの画像（150×150px）をオリジナルのものに変更する
&lt;ul&gt;
&lt;li&gt;あるいは&lt;code&gt;avatar.enabled&lt;/code&gt;を&lt;code&gt;false&lt;/code&gt;にする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;static/img/favicon.png&lt;/code&gt;を作成し、&amp;ldquo;config.yaml&amp;quot;にリンクを設定する&lt;/li&gt;
&lt;/ul&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;config.yaml&lt;/div&gt;
&lt;div class="code-block-content"&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="nt"&gt;params&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="c"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;sidebar&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="c"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;avatar&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;enabled&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&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;local&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&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;src&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;img/avatar.png&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="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;favicon: /img/favicon.png # e.g.&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;favicon placed in `static/favicon.ico` of your site folder, then set this field to `/favicon.ico` (`/` is necessary)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="サイトのリンクの変更"&gt;
サイトのリンクの変更&lt;a href="#%e3%82%b5%e3%82%a4%e3%83%88%e3%81%ae%e3%83%aa%e3%83%b3%e3%82%af%e3%81%ae%e5%a4%89%e6%9b%b4"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;permalinks&lt;/code&gt;を変更すると、&lt;code&gt;baseurl&lt;/code&gt;以降の各記事のリンクを変更できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;config.yaml&lt;/div&gt;
&lt;div class="code-block-content"&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="nt"&gt;permalinks&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;post&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/post/:slug/&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;page&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/:slug/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="外部リンクの変更"&gt;
外部リンクの変更&lt;a href="#%e5%a4%96%e9%83%a8%e3%83%aa%e3%83%b3%e3%82%af%e3%81%ae%e5%a4%89%e6%9b%b4"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;左サイドバーにあるGitHubやTwitterなどのリンクを変更する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;config.yaml&lt;/div&gt;
&lt;div class="code-block-content"&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="nt"&gt;menu&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="c"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;social&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;github&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;GitHub&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;https://github.com/NakuRei&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;params&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;brand-github&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="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;twitter&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Twitter&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line hl"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;https://twitter.com/nakurei7901&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;params&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;brand-twitter&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="widgetsの変更"&gt;
Widgetsの変更&lt;a href="#widgets%e3%81%ae%e5%a4%89%e6%9b%b4"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;サイトの右サイドバーに表示される情報を変更する。widgetは記述順に描画される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;config.yaml&lt;/div&gt;
&lt;div class="code-block-content"&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="nt"&gt;params&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="c"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;widgets&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;homepage&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;search&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="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;categories&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;params&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&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="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;tag-cloud&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;params&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&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="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;archives&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;params&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;page&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;toc&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="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;categories&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;params&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&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="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;tag-cloud&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;params&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="google-analyticsの設定"&gt;
Google Analyticsの設定&lt;a href="#google-analytics%e3%81%ae%e8%a8%ad%e5%ae%9a"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="link" href="https://analytics.google.com/analytics/web/provision/#/provision" target="_blank" rel="noopener"
&gt;Google Analytics&lt;/a&gt;でアカウントを作成し、Webストリームを作成する。その後、作成したストリームの測定IDを&lt;code&gt;googleAnalytics&lt;/code&gt;に書き込む。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;config.yaml&lt;/div&gt;
&lt;div class="code-block-content"&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="nt"&gt;googleAnalytics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;G-XXXXXXXXXX&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="言語の変更"&gt;
言語の変更&lt;a href="#%e8%a8%80%e8%aa%9e%e3%81%ae%e5%a4%89%e6%9b%b4"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;RSS出力に付与する文字コード&lt;code&gt;languageCode&lt;/code&gt;を日本語にする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;config.yaml&lt;/div&gt;
&lt;div class="code-block-content"&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="nt"&gt;languageCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ja&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;DefaultContentLanguage&lt;/code&gt;も日本語にする。これにより言語指定のないindex.mdがすべて日本語の記事として取り扱われる&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;。また、これに伴い&lt;code&gt;hasCJKLanguage&lt;/code&gt;を&lt;code&gt;true&lt;/code&gt;にする。これによりHugo内部の変数.Summaryと.WordCountが正しく動作するようになる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;config.yaml&lt;/div&gt;
&lt;div class="code-block-content"&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="nt"&gt;DefaultContentLanguage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;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;hasCJKLanguage&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="多言語対応に関する設定の変更"&gt;
多言語対応に関する設定の変更&lt;a href="#%e5%a4%9a%e8%a8%80%e8%aa%9e%e5%af%be%e5%bf%9c%e3%81%ab%e9%96%a2%e3%81%99%e3%82%8b%e8%a8%ad%e5%ae%9a%e3%81%ae%e5%a4%89%e6%9b%b4"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;languages&lt;/code&gt;を設定すると、サイトを多言語対応させ、言語ごとに各設定を変更できる。下記の例では、言語ごとにサイトタイトル、サブタイトル、meta descriptionを変更している&lt;sup id="fnref:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;config.yaml&lt;/div&gt;
&lt;div class="code-block-content"&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="nt"&gt;languages&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ja&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;languageName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&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="w"&gt; &lt;/span&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="l"&gt;NakuRei&amp;#39;s Notes&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;meta descriptionだよ&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;params&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;sidebar&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;compact&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;emoji&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;subtitle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;avatar&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;enabled&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;local&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;src&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;img/avatar.png&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;en&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;languageName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;English&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="w"&gt; &lt;/span&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="l"&gt;NakuRei&amp;#39;s Notes&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Example description&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;params&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;sidebar&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;compact&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;emoji&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;subtitle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Sub title&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;avatar&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;enabled&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;local&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;src&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;img/avatar.png&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="コメント機能の無効化"&gt;
コメント機能の無効化&lt;a href="#%e3%82%b3%e3%83%a1%e3%83%b3%e3%83%88%e6%a9%9f%e8%83%bd%e3%81%ae%e7%84%a1%e5%8a%b9%e5%8c%96"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;個人的にコメント機能は必要性を感じないので無効化する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;config.yaml&lt;/div&gt;
&lt;div class="code-block-content"&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="nt"&gt;params&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="c"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;comments&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;enabled&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="opengraphの設定"&gt;
OpenGraphの設定&lt;a href="#opengraph%e3%81%ae%e8%a8%ad%e5%ae%9a"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;opengraph&lt;/code&gt;の&lt;code&gt;twitter.site&lt;/code&gt;に自分のTwitterアカウントのアカウント名（&lt;code&gt;@&lt;/code&gt;は除いたもの）を書く。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;twitter.card&lt;/code&gt;では、Twitterで記事がシェアされるときの、カードのスタイルを変更できる。&lt;a class="link" href="https://stack.jimmycai.com/config/open-graph" target="_blank" rel="noopener"
&gt;StackのOpenGraphの設定&lt;/a&gt;では&lt;code&gt;summary&lt;/code&gt;と&lt;code&gt;summary_large_image&lt;/code&gt;が選べる。好みなほうに変更する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;config.yaml&lt;/div&gt;
&lt;div class="code-block-content"&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="nt"&gt;params&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="c"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;opengraph&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;twitter&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Your Twitter username&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;site&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nakurei7901&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="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Available values: summary, summary_large_image&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;card&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;summary_large_image&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="フォントの変更"&gt;
フォントの変更&lt;a href="#%e3%83%95%e3%82%a9%e3%83%b3%e3%83%88%e3%81%ae%e5%a4%89%e6%9b%b4"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Stackの標準では中国語のフォントが使われるため、これを日本語フォントに変更する。今回は&lt;a class="link" href="https://fonts.google.com/specimen/Zen&amp;#43;Maru&amp;#43;Gothic" target="_blank" rel="noopener"
&gt;Zen Maru Gothic&lt;/a&gt;を適用する。ついでにコードブロックのフォントに&lt;a class="link" href="https://github.com/edihbrandon/RictyDiminished" target="_blank" rel="noopener"
&gt;Ricty Diminished&lt;/a&gt;を追加する。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;layouts/partials/head/&lt;/code&gt;に&lt;code&gt;custom.html&lt;/code&gt;を作成し、下記を記入する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;layouts/partials/head/custom.html&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;style&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;--ja-g-font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Zen Maru Gothic&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;游ゴシック&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;游ゴシック Medium&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;Yu Gothic Medium&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;游ゴシック体&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Yu Gothic&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;YuGothic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;ヒラギノ角ゴ Pro&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Hiragino Kaku Gothic Pro&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;メイリオ&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Meiryo&amp;#39;&lt;/span&gt;&lt;span class="p"&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="nv"&gt;--article-font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;ja&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;family&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;family&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;--base-font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;ja&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;family&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Lato&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;family&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;zh&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;family&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="kc"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;--code-font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Ricty Diminished&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Menlo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Monaco&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Consolas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;Courier New&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;monospace&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;style&lt;/span&gt;&lt;span class="p"&gt;&amp;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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;customFont&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;link&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;customFont&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;https://fonts.googleapis.com/css2?family=Zen+Maru+Gothic&amp;amp;display=swap&amp;#39;&lt;/span&gt;&lt;span class="p"&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="nx"&gt;customFont&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;text/css&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;customFont&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;stylesheet&amp;#39;&lt;/span&gt;&lt;span class="p"&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="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;customFont&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;})();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Stackでは、フォントが&lt;code&gt;themes/hugo-theme-stack/assets/scss/variables.scss&lt;/code&gt;にCSS変数で定義されている。
たとえば、記事本文のフォントは&lt;code&gt;--article-font-family&lt;/code&gt;で定義されている。記事のタイトルや記事カード、サイドメニューなどのフォントは&lt;code&gt;--base-font-family&lt;/code&gt;に定義されている。よって、これらに日本語フォントを加えれば、記事が日本語フォントで表示されるようになる。
また、コードブロックのフォントは&lt;code&gt;--code-font-family&lt;/code&gt;で指定されている。そのため、これに&amp;quot;Ricty Diminished&amp;quot;を加えている。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;script&lt;/code&gt;には、&lt;a class="link" href="https://fonts.google.com/" target="_blank" rel="noopener"
&gt;Google Fonts&lt;/a&gt;から&amp;quot;Zen Maru Gothic&amp;quot;フォントを持ってくるためのコードを書いている。&lt;/p&gt;
&lt;h2 id="フッターの変更"&gt;
フッターの変更&lt;a href="#%e3%83%95%e3%83%83%e3%82%bf%e3%83%bc%e3%81%ae%e5%a4%89%e6%9b%b4"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Stackのデフォルトでは、フッターの著作権表示がサイトのタイトルになっている。個人的にはここを著者名にしたかったため、フッターをカスタマイズする。&lt;/p&gt;
&lt;p&gt;フッターをカスタマイズするには、&lt;code&gt;/layouts/partials/footer/&lt;/code&gt;直下に&lt;code&gt;footer.html&lt;/code&gt;を作成し、そこにカスタマイズ内容を書き込む。
Hugoではテーマよりも自作ファイルのほうが優先されるため、カスタマイズしたフッターがテーマよりも優先して利用される。&lt;/p&gt;
&lt;p&gt;まず、&amp;ldquo;config.yaml&amp;quot;に&lt;code&gt;author&lt;/code&gt;の情報を追記する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;config.yaml&lt;/div&gt;
&lt;div class="code-block-content"&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="nt"&gt;author&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Rei Naku&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;次に、もともとテーマに組み込まれているフッターをサイトにコピーする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp ./themes/hugo-theme-stack/layouts/partials/footer/footer.html ./layouts/partials/footer/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;その後、コピーした&amp;quot;footer.html&amp;quot;を開き、&lt;code&gt;{{ .Site.Title }}&lt;/code&gt;を&lt;code&gt;{{ with $.Site.Author.name }} {{.}} {{end}}&lt;/code&gt;に変更する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;layouts/partials/footer/footer.html&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;- {{ now.Format &amp;#34;2006&amp;#34; }} {{ .Site.Title }}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ {{ now.Format &amp;#34;2006&amp;#34; }} {{ with $.Site.Author.name }} {{.}} {{end}}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これで、著作権表示をサイトのタイトルから著者名に変更できる。&lt;/p&gt;
&lt;p&gt;ちなみに、Stackテーマの著作権表示は削除しないようにする。
公式ページにも下記の文言がある。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Please do not remove the &amp;ldquo;Theme Stack designed by Jimmy&amp;rdquo; text and link.&amp;rdquo;&lt;sup id="fnref:4"&gt;&lt;a href="#fn:4" class="footnote-ref" role="doc-noteref"&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="コードブロックの設定"&gt;
コードブロックの設定&lt;a href="#%e3%82%b3%e3%83%bc%e3%83%89%e3%83%96%e3%83%ad%e3%83%83%e3%82%af%e3%81%ae%e8%a8%ad%e5%ae%9a"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;デフォルトで行番号が表示されないように、&amp;ldquo;config.yaml&amp;quot;で&lt;code&gt;lineNos&lt;/code&gt;を&lt;code&gt;false&lt;/code&gt;にする。この設定のとき、行番号を表示したい場合は&lt;code&gt;{linenos=true}&lt;/code&gt;をコードブロックに追加すると表示できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;config.yaml&lt;/div&gt;
&lt;div class="code-block-content"&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="nt"&gt;markup&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="c"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;highlight&lt;/span&gt;&lt;span class="p"&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="w"&gt; &lt;/span&gt;&lt;span class="c"&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;lineNos&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="コードブロックのカスタマイズ"&gt;
コードブロックのカスタマイズ&lt;a href="#%e3%82%b3%e3%83%bc%e3%83%89%e3%83%96%e3%83%ad%e3%83%83%e3%82%af%e3%81%ae%e3%82%ab%e3%82%b9%e3%82%bf%e3%83%9e%e3%82%a4%e3%82%ba"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;コードブロックでファイル名が表示されるように変更する。&lt;/p&gt;
&lt;p&gt;ここでは、Hugo v0.93.0から使える&lt;a class="link" href="https://gohugo.io/templates/render-hooks/#render-hooks-for-code-blocks" target="_blank" rel="noopener"
&gt;Render Hooks for Code Blocks&lt;/a&gt;を利用する。これを利用すると、Markdown Syntaxを利用したまま、コードブロックのスタイルをカスタマイズできる。&lt;/p&gt;
&lt;p&gt;カスタマイズは、&lt;code&gt;layouts/_default/_markup/&lt;/code&gt;に&amp;quot;render-codeblock.html&amp;quot;を作成して、そこにカスタマイズ内容を書き込めば良い。言語によってスタイルを変えたい場合は、&amp;ldquo;render-codeblock-bash.html&amp;quot;のように、ファイル名の後ろに言語名を付ける。&lt;/p&gt;
&lt;p&gt;たとえば、ファイル名を&lt;code&gt;name&lt;/code&gt;で渡す場合、下記のようにカスタマイズする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;layouts/_default/_markup/render-codeblock.html&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {{- $name := .Attributes.name -}} {{ with $name }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;code-block-filename&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;{{ . }}&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;code-block-content&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {{- highlight (.Inner | safeHTML) .Type .Options }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;{ }&lt;/code&gt;で渡した変数は、&lt;code&gt;.Attributes.変数名&lt;/code&gt;で受け取れる。&lt;code&gt;{{ with $name }} ... {{ end }}&lt;/code&gt;で囲うことで、&lt;code&gt;$name&lt;/code&gt;がある場合のみファイル名を表示するようにしている。&lt;/p&gt;
&lt;p&gt;コードブロックの内容は&lt;code&gt;.Inner&lt;/code&gt;で受け取れる。これを&lt;code&gt;highlight&lt;/code&gt;関数に渡すことで、コードをハイライト表示にできる。また、Hugoの機能でコードブロックに指定できる変数（e.g. hl_lines, linenostart）&lt;sup id="fnref:5"&gt;&lt;a href="#fn:5" class="footnote-ref" role="doc-noteref"&gt;5&lt;/a&gt;&lt;/sup&gt;は&lt;code&gt;.Options&lt;/code&gt;に格納される。これを&lt;code&gt;highlight&lt;/code&gt;関数の第3引数に渡すと、デフォルトのコードブロックと同様にオプションを指定できる。&lt;/p&gt;
&lt;p&gt;表示部分にクラスを指定し、CSSを書けば表示スタイルも変更できる。たとえば下記のようなスタイルを指定すると、下図のようなスタイルでファイル名を表示できる。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/customize-stack-theme/20221117130458.png"
width="1103"
height="185"
srcset="https://notes.nakurei.com/post/customize-stack-theme/20221117130458_hu_886254ccf05e9cd5.png 480w, https://notes.nakurei.com/post/customize-stack-theme/20221117130458_hu_5e6c8d4909a1c033.png 1024w"
loading="lazy"
alt="スタイルの例"
class="gallery-image"
data-flex-grow="596"
data-flex-basis="1430px"
&gt;&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;render-codeblock.html&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;style&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;code-block-filename&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;--code-filename-fontsize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.96&lt;/span&gt;&lt;span class="kt"&gt;em&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.9&lt;/span&gt;&lt;span class="p"&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="k"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;table&lt;/span&gt;&lt;span class="p"&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;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="kt"&gt;%&lt;/span&gt;&lt;span class="p"&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;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;accent&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="kc"&gt;color&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;darker&lt;/span&gt;&lt;span class="p"&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;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;accent&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="kc"&gt;color&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="kc"&gt;text&lt;/span&gt;&lt;span class="p"&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;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="p"&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;line-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&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;padding-top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&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;padding-left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&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;padding-right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&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;padding-bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&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;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;code-block-content&lt;/span&gt; &lt;span class="p"&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;padding-top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;style&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="defaultmdのアレンジ"&gt;
default.mdのアレンジ&lt;a href="#defaultmd%e3%81%ae%e3%82%a2%e3%83%ac%e3%83%b3%e3%82%b8"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;新しい記事は&amp;quot;archetypes/default.md&amp;quot;に基づいて作成されるため、&amp;ldquo;archetypes/default.md&amp;quot;をアレンジすると記事を作りやすくなる。&lt;/p&gt;
&lt;p&gt;個人的に使っている設定は下記の通り。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;archetypes/default.md&lt;/div&gt;
&lt;div class="code-block-content"&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;title: {{ replace .Name &amp;#34;-&amp;#34; &amp;#34; &amp;#34; | title }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;description:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;slug: {{ replace .Name &amp;#34;-&amp;#34; &amp;#34; &amp;#34; | title }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;date: {{ .Date }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;categories:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tags:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;image:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;math: false
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;license:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hidden: false
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;comments: false
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;draft: true
&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;&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;## 参考文献・URL&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://stack.jimmycai.com/config/header-footer" target="_blank" rel="noopener"
&gt;Custom Header / Footer | Stack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.chick-p.work/blog/hugo-render-hooks-code" target="_blank" rel="noopener"
&gt;HUGO の Code Block Render Hooks を使って、コードブロックにファイル名を表示する | ひよこまめ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://gohugo.io/templates/render-hooks/" target="_blank" rel="noopener"
&gt;Markdown Render Hooks | Hugo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://gohugo.io/content-management/syntax-highlighting/#highlight-shortcode" target="_blank" rel="noopener"
&gt;Syntax Highlighting | Hugo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;本サイトのavatar画像とfavicon画像は、&lt;a class="link" href="https://www.canva.com/" target="_blank" rel="noopener"
&gt;Canva&lt;/a&gt;で作成した。&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;ファイル名をindex.en.mdとすれば、英語の記事として取り扱われる。&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;&lt;code&gt;sidebar&lt;/code&gt;の&lt;code&gt;subtitle&lt;/code&gt;を変更するのに&lt;code&gt;sidebar&lt;/code&gt;のパラメータをすべて記述しているが、こうしないと&lt;code&gt;sidebar&lt;/code&gt;のパラメータが正常に動作しない。&amp;#160;&lt;a href="#fnref:3" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:4"&gt;
&lt;p&gt;&lt;a class="link" href="https://stack.jimmycai.com/guide/#copyright" target="_blank" rel="noopener"
&gt;Stack | Card-style Hugo theme designed for bloggers&lt;/a&gt;（2022/11/19閲覧）より引用。&amp;#160;&lt;a href="#fnref:4" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:5"&gt;
&lt;p&gt;詳細は&lt;a class="link" href="https://gohugo.io/content-management/syntax-highlighting/#highlight-shortcode" target="_blank" rel="noopener"
&gt;Syntax Highlighting | Hugo&lt;/a&gt;を参照。&amp;#160;&lt;a href="#fnref:5" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Hugoで個人サイトを立ち上げた話</title><link>https://notes.nakurei.com/post/setting-up-a-personal-website-with-hugo/</link><pubDate>Sun, 20 Nov 2022 13:14:48 +0900</pubDate><guid>https://notes.nakurei.com/post/setting-up-a-personal-website-with-hugo/</guid><description>&lt;img src="https://notes.nakurei.com/post/setting-up-a-personal-website-with-hugo/20221106132142.webp" alt="Featured image of post Hugoで個人サイトを立ち上げた話" /&gt;&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;静的サイトジェネレータHugoを使って技術ブログを立ち上げた際の備忘録。
環境構築からテーマの選択、Netlifyでの公開まで、手順を詳しく説明する。&lt;/p&gt;
&lt;h2 id="環境"&gt;
環境&lt;a href="#%e7%92%b0%e5%a2%83"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;実証環境は次のとおりである。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows 10 Pro 21H1 (19043.2130)&lt;/li&gt;
&lt;li&gt;Hugo v0.105.0 extended&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://themes.gohugo.io/themes/hugo-theme-stack/" target="_blank" rel="noopener"
&gt;Hugo theme Stack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Netlify&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="サイト作成の流れ"&gt;
サイト作成の流れ&lt;a href="#%e3%82%b5%e3%82%a4%e3%83%88%e4%bd%9c%e6%88%90%e3%81%ae%e6%b5%81%e3%82%8c"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="hugoのインストール"&gt;
Hugoのインストール&lt;a href="#hugo%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;まず、Hugoをインストール&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;する。使用するThemeの関係上、Hugoの拡張バージョンを利用する。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/gohugoio/hugo/releases" target="_blank" rel="noopener"
&gt;Releases hugo - GitHub&lt;/a&gt;から、環境に合ったコンパイル済みのバイナリをダウンロードする。
&lt;ul&gt;
&lt;li&gt;今回は拡張バージョンをインストールするため、ファイル名に&amp;quot;extended&amp;quot;がついているものを利用する。Windowsの場合は&amp;quot;hugo_extended_X.XXX.X_windows-amd64.zip&amp;quot;である。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ダウンロードしたファイルを解凍し、中身を任意の場所に配置する。（e.g. &amp;ldquo;C:\HugoExtended\bin&amp;rdquo;）&lt;/li&gt;
&lt;li&gt;&amp;ldquo;hugo.exe&amp;quot;を配置したディレクトリまでのパスを、環境変数&amp;quot;Path&amp;quot;に追加する。&lt;/li&gt;
&lt;li&gt;コマンドプロンプトを立ち上げ、&lt;code&gt;hugo&lt;/code&gt;コマンドが通るか確認する。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hugo version&lt;/code&gt;を確認した際に、&amp;ldquo;extended&amp;quot;が記載されることを確認する。&lt;/li&gt;
&lt;/ol&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; hugo version
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo v0.105.0-0e3b42b4a9bdeb4d866210819fc6ddcf51582ffa+extended windows/amd64 &lt;span class="nv"&gt;BuildDate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2022-10-28T12:29:05Z &lt;span class="nv"&gt;VendorInfo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;gohugoio&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="サイトの作成"&gt;
サイトの作成&lt;a href="#%e3%82%b5%e3%82%a4%e3%83%88%e3%81%ae%e4%bd%9c%e6%88%90"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;次に、任意の場所にugoで新しいサイト（プロジェクト）を作成する。
以下のコマンドを実行する。&lt;code&gt;quickstart&lt;/code&gt;は任意の名前で良い。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo new site quickstart&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;下記のディレクトリ構成でサイトが作成される。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; tree /f
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└─quickstart
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ config.toml
&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; ├─archetypes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ default.md
&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; ├─content
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─data
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─layouts
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─public
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─static
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─themes&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;作成したサイトプロジェクトに移動する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; quickstart&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="サイトのバージョン管理"&gt;
サイトのバージョン管理&lt;a href="#%e3%82%b5%e3%82%a4%e3%83%88%e3%81%ae%e3%83%90%e3%83%bc%e3%82%b8%e3%83%a7%e3%83%b3%e7%ae%a1%e7%90%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;サイト全体をgit管理下に置くため、以下のコマンドを実行する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git init&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;.gitignore&lt;/code&gt;ファイルも作成する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;.gitignore&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/public/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/resources/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.hugo_build.lock&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="netlifyの設定ファイルの追加"&gt;
Netlifyの設定ファイルの追加&lt;a href="#netlify%e3%81%ae%e8%a8%ad%e5%ae%9a%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e8%bf%bd%e5%8a%a0"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Netlifyでサイトを公開する場合は、&lt;code&gt;netlify.toml&lt;/code&gt;ファイルを作成して、HUGOのバージョンを指定してあげる必要がある。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;netlify.toml&lt;/div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;production&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;HUGO_VERSION&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0.105.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;deploy-preview&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;HUGO_VERSION&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0.105.0&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="テーマの追加"&gt;
テーマの追加&lt;a href="#%e3%83%86%e3%83%bc%e3%83%9e%e3%81%ae%e8%bf%bd%e5%8a%a0"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a class="link" href="https://themes.gohugo.io/" target="_blank" rel="noopener"
&gt;Complete List | Hugo Themes&lt;/a&gt;から好きなテーマを選ぶ。たいていのテーマはインストール方法が記載されているので、それに従う。今回は&lt;a class="link" href="https://themes.gohugo.io/themes/hugo-theme-stack/" target="_blank" rel="noopener"
&gt;Stack&lt;/a&gt;を採用する。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://stack.jimmycai.com/guide/getting-started" target="_blank" rel="noopener"
&gt;Getting Started | Stack&lt;/a&gt;によると、Stackは&lt;code&gt;git clone&lt;/code&gt;と&lt;code&gt;git submodule add&lt;/code&gt;のどちらでも追加できる。今回はサイトのプロジェクト単位でGit管理するため、&lt;code&gt;git submodule&lt;/code&gt;で追加する&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git submodule add https://github.com/CaiJimmy/hugo-theme-stack/ themes/hugo-theme-stack&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;テーマのカスタマイズは、カスタマイズ方法がテーマごとに異なる。詳細はテーマのドキュメントを参照すること。&lt;/p&gt;
&lt;h3 id="サンプルページの作成"&gt;
サンプルページの作成&lt;a href="#%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab%e3%83%9a%e3%83%bc%e3%82%b8%e3%81%ae%e4%bd%9c%e6%88%90"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Stackにはサンプルページが用意されているため、これを利用する。まず、サンプルページの&amp;quot;content&amp;quot;ディレクトリと&amp;quot;config.yaml&amp;quot;をコピーする。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp -r ./themes/hugo-theme-stack/exampleSite/content/* ./content/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp -r ./themes/hugo-theme-stack/exampleSite/config.yaml ./&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;コピーした&amp;quot;config.yaml&amp;quot;と、もともとある&amp;quot;config.toml&amp;quot;は競合するため、&amp;ldquo;config.toml&amp;quot;のほうを削除する。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm ./config.toml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="起動の確認"&gt;
起動の確認&lt;a href="#%e8%b5%b7%e5%8b%95%e3%81%ae%e7%a2%ba%e8%aa%8d"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;これで環境が整ったので、簡易サーバーを実行してみる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo serve -D&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;上記コマンド実行後&amp;rdquo;&lt;a class="link" href="http://localhost:1313/" target="_blank" rel="noopener"
&gt;http://localhost:1313/&lt;/a&gt;&amp;ldquo;にアクセスすると、下図のようなサイトが立ち上がっているはずだ。Stackのサンプルページは多言語対応しているため、左下の言語設定を変更すると、中国語あるいはアラビア語の記事が表示される。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/setting-up-a-personal-website-with-hugo/20221106132142.png"
width="1898"
height="854"
srcset="https://notes.nakurei.com/post/setting-up-a-personal-website-with-hugo/20221106132142_hu_acf256675bdf091a.png 480w, https://notes.nakurei.com/post/setting-up-a-personal-website-with-hugo/20221106132142_hu_c47f1e599feb2662.png 1024w"
loading="lazy"
alt="サンプルページ"
class="gallery-image"
data-flex-grow="222"
data-flex-basis="533px"
&gt;&lt;/p&gt;
&lt;h2 id="記事の投稿"&gt;
記事の投稿&lt;a href="#%e8%a8%98%e4%ba%8b%e3%81%ae%e6%8a%95%e7%a8%bf"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;hugo new&lt;/code&gt;コマンドを利用すると、&amp;ldquo;archetypes/default.md&amp;quot;に基づいて新しい記事を生成できる。Stackでは、記事は&amp;quot;index.md&amp;quot;という名前のファイルで作成する必要がある。&amp;ldquo;index.md&amp;quot;の入っているディレクトリ名が記事のタイトルになる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo new post/my-first-post/index.md&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これで、&lt;code&gt;/content/posts/my-first-post/index.md&lt;/code&gt;ファイルが作成される。このファイルを開いて、記事の内容を編集する。記事はMarkdown形式で記述できる。&lt;/p&gt;
&lt;p&gt;たとえば、以下のように記述できる。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-content"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-md" data-lang="md"&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;title: &amp;#34;My First Post&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;date: 2023-04-06T00:00:00+09:00
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;draft: false
&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;こんにちは、これが私の最初の投稿です！
&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="k"&gt;-&lt;/span&gt; リスト1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; リスト2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; リスト3
&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;ここに本文が入ります。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;編集が完了したら、ローカルで表示されるか確認する。&lt;/p&gt;
&lt;h3 id="defaultmdのアレンジ"&gt;
default.mdのアレンジ&lt;a href="#defaultmd%e3%81%ae%e3%82%a2%e3%83%ac%e3%83%b3%e3%82%b8"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;新しい記事は&amp;quot;archetypes/default.md&amp;quot;に基づいて作成されるため、&amp;ldquo;archetypes/default.md&amp;quot;をアレンジすると記事を作りやすくなる。&lt;/p&gt;
&lt;p&gt;個人的に使っている設定は下記の通り。&lt;/p&gt;
&lt;style&gt;
.code-block-filename {
--code-filename-fontsize: calc(0.96em * 0.9);
display: table;
max-width: 100%;
background: var(--accent-color-darker);
color: var(--accent-color-text);
font-size: var(--code-filename-fontsize);
line-height: 1;
padding-top: calc(var(--code-filename-fontsize) * 0.5);
padding-left: calc(var(--code-filename-fontsize) * 0.7);
padding-right: calc(var(--code-filename-fontsize) * 0.7);
padding-bottom: calc(var(--code-filename-fontsize) * 0.7);
border-radius: calc(var(--code-filename-fontsize) * 0.5)
calc(var(--code-filename-fontsize) * 0.5) 0 0;
}
.code-block-content {
padding-top: 0px;
}
&lt;/style&gt;
&lt;div&gt;
&lt;div class="code-block-filename"&gt;archetypes/default.md&lt;/div&gt;
&lt;div class="code-block-content"&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;title: {{ replace .Name &amp;#34;-&amp;#34; &amp;#34; &amp;#34; | title }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;description:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;slug: {{ replace .Name &amp;#34;-&amp;#34; &amp;#34; &amp;#34; | title }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;date: {{ .Date }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;categories:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tags:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;image:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;math: false
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;license:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hidden: false
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;comments: false
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;draft: true
&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;&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;## 参考文献・URL&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="netlifyでの公開"&gt;
Netlifyでの公開&lt;a href="#netlify%e3%81%a7%e3%81%ae%e5%85%ac%e9%96%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;最後に、Netlifyでサイトを公開する。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;GitHub、GitLab、Bitbucketのいずれかに作成したサイトをアップロードする。&lt;/li&gt;
&lt;li&gt;Netlifyで新しいアカウントを作成し、ログインする。&lt;/li&gt;
&lt;li&gt;トップページに戻り、&amp;ldquo;New site from Git&amp;quot;をクリックする。&lt;/li&gt;
&lt;li&gt;GitHub、GitLab、Bitbucketのいずれかを選択し、リポジトリを選ぶ。&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Build settings&amp;quot;で、&amp;ldquo;Build command&amp;quot;にhugo、&amp;ldquo;Publish directory&amp;quot;にpublicを指定し、&amp;ldquo;Deploy site&amp;quot;をクリックする。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;これで、Netlifyでの公開が完了する。公開されたURLが表示されるので、アクセスして確認しよう。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;
まとめ&lt;a href="#%e3%81%be%e3%81%a8%e3%82%81"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;この記事では、Hugoを使って技術ブログを立ち上げる方法を解説した。環境構築からテーマの選択、Netlifyでの公開まで手順を詳しく説明した。自分だけの技術ブログを立ち上げる際の参考になればうれしい。&lt;/p&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://stack.jimmycai.com/guide/getting-started" target="_blank" rel="noopener"
&gt;Getting Started | Stack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://zenn.dev/ttr0108/articles/1_hugo_introduction" target="_blank" rel="noopener"
&gt;HUGO使ってみた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://uzimihsr.github.io/post/2020-12-23-hugo-theme/" target="_blank" rel="noopener"
&gt;Hugoを新しくしてThemeを変えた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://aakira.app/blog/2018/06/netlify/" target="_blank" rel="noopener"
&gt;静的サイトをNetlifyでホスティングする | AABrain&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Hugoにはインストーラが存在しないため、厳密にはインストールではない。&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;ちなみに&lt;code&gt;git clone&lt;/code&gt;で追加すると、サイトのgitリポジトリとthemesのgitリポジトリの間で整合性が取れず、Netlifyで公開する際にエラーを吐かれてしまう。&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>About</title><link>https://notes.nakurei.com/about/</link><pubDate>Sun, 20 Nov 2022 00:00:00 +0000</pubDate><guid>https://notes.nakurei.com/about/</guid><description>&lt;h2 id="どんな人"&gt;
どんな人&lt;a href="#%e3%81%a9%e3%82%93%e3%81%aa%e4%ba%ba"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;とある会社で働く会社員。&lt;/p&gt;
&lt;h2 id="趣味"&gt;
趣味&lt;a href="#%e8%b6%a3%e5%91%b3"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;クラシックギター&lt;/li&gt;
&lt;li&gt;日本酒&lt;/li&gt;
&lt;li&gt;ゲーム（主にRPG）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="使っている開発言語"&gt;
使っている開発言語&lt;a href="#%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%84%e3%82%8b%e9%96%8b%e7%99%ba%e8%a8%80%e8%aa%9e"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="よく書く"&gt;
よく書く&lt;a href="#%e3%82%88%e3%81%8f%e6%9b%b8%e3%81%8f"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="たまに書く"&gt;
たまに書く&lt;a href="#%e3%81%9f%e3%81%be%e3%81%ab%e6%9b%b8%e3%81%8f"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Go&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="まれに書く"&gt;
まれに書く&lt;a href="#%e3%81%be%e3%82%8c%e3%81%ab%e6%9b%b8%e3%81%8f"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;C++&lt;/li&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="書いたことはある"&gt;
書いたことはある&lt;a href="#%e6%9b%b8%e3%81%84%e3%81%9f%e3%81%93%e3%81%a8%e3%81%af%e3%81%82%e3%82%8b"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Lua&lt;/li&gt;
&lt;li&gt;C#&lt;/li&gt;
&lt;li&gt;Dart&lt;/li&gt;
&lt;li&gt;MATLAB&lt;/li&gt;
&lt;li&gt;Verilog-HDL&lt;/li&gt;
&lt;li&gt;VHDL&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Archives</title><link>https://notes.nakurei.com/archives/</link><pubDate>Sun, 20 Nov 2022 00:00:00 +0000</pubDate><guid>https://notes.nakurei.com/archives/</guid><description/></item><item><title>Buffalo LinkStation LS720Dのメール通知をGmailで受信するための設定方法</title><link>https://notes.nakurei.com/post/how-to-set-up-linkstation-to-send-email-to-gmail/</link><pubDate>Sat, 27 Aug 2022 12:00:00 +0900</pubDate><guid>https://notes.nakurei.com/post/how-to-set-up-linkstation-to-send-email-to-gmail/</guid><description>&lt;h2 id="これはなに"&gt;
これはなに&lt;a href="#%e3%81%93%e3%82%8c%e3%81%af%e3%81%aa%e3%81%ab"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;BuffaloのLinkStation LS720Dのメール通知機能を利用して、Gmailで通知を受信するための設定方法を解説する。&lt;/p&gt;
&lt;h2 id="buffalo-linkstation-ls720dとは"&gt;
Buffalo LinkStation LS720Dとは&lt;a href="#buffalo-linkstation-ls720d%e3%81%a8%e3%81%af"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Buffaloによって発売されているNAS（Network Attached Storage）デバイス。&lt;/p&gt;
&lt;h2 id="gmailのメール通知設定の手順"&gt;
Gmailのメール通知設定の手順&lt;a href="#gmail%e3%81%ae%e3%83%a1%e3%83%bc%e3%83%ab%e9%80%9a%e7%9f%a5%e8%a8%ad%e5%ae%9a%e3%81%ae%e6%89%8b%e9%a0%86"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;NAS Navigator 2を起動する。&lt;/li&gt;
&lt;li&gt;NASアイコンを右クリックして、「Web設定画面を開く」を選ぶ。&lt;/li&gt;
&lt;li&gt;パスワードでログインする。&lt;/li&gt;
&lt;li&gt;右のメニューから「管理」を選ぶ。&lt;/li&gt;
&lt;li&gt;「メール通知」の歯車アイコンをクリックする。&lt;/li&gt;
&lt;li&gt;「編集」ボタンをクリックする。&lt;/li&gt;
&lt;li&gt;下記の表に従って設定する。&lt;/li&gt;
&lt;li&gt;テスト送信を行い、正しく設定されていることを確認する。&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;項目&lt;/th&gt;
&lt;th style="text-align: left"&gt;設定&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;SMTPサーバーアドレス&lt;/td&gt;
&lt;td style="text-align: left"&gt;smtp.gmail.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;SMTPポート番号&lt;/td&gt;
&lt;td style="text-align: left"&gt;465&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;ユーザー認証方式&lt;/td&gt;
&lt;td style="text-align: left"&gt;LOGUN(SMTP-AUTH)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;差出人アドレス&lt;/td&gt;
&lt;td style="text-align: left"&gt;任意のメールアドレスを入力&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;POP3サーバーアドレス&lt;/td&gt;
&lt;td style="text-align: left"&gt;（設定できない）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;POP3ポート番号&lt;/td&gt;
&lt;td style="text-align: left"&gt;（設定できない）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;SSL/TLS&lt;/td&gt;
&lt;td style="text-align: left"&gt;SSL/TLS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;ユーザー名&lt;/td&gt;
&lt;td style="text-align: left"&gt;Gmailアカウントの&amp;quot;@gmail.com&amp;quot;より前まで&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;パスワード&lt;/td&gt;
&lt;td style="text-align: left"&gt;Gmailのパスワード。2段階認証の場合はアプリパスワード。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;通知メール件名&lt;/td&gt;
&lt;td style="text-align: left"&gt;わかりやすい名前&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;送信先メールアドレス&lt;/td&gt;
&lt;td style="text-align: left"&gt;通知を受け取りたいGmailアドレス&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img src="https://notes.nakurei.com/post/how-to-set-up-linkstation-to-send-email-to-gmail/LinkStation_GmailSetting.png"
width="873"
height="720"
srcset="https://notes.nakurei.com/post/how-to-set-up-linkstation-to-send-email-to-gmail/LinkStation_GmailSetting_hu_cfbec3f66cfe145d.png 480w, https://notes.nakurei.com/post/how-to-set-up-linkstation-to-send-email-to-gmail/LinkStation_GmailSetting_hu_f59e8adebaa0718e.png 1024w"
loading="lazy"
alt="LinkStationのGmail設定画面"
class="gallery-image"
data-flex-grow="121"
data-flex-basis="291px"
&gt;&lt;/p&gt;
&lt;h2 id="注意事項やトラブルシューティング"&gt;
注意事項やトラブルシューティング&lt;a href="#%e6%b3%a8%e6%84%8f%e4%ba%8b%e9%a0%85%e3%82%84%e3%83%88%e3%83%a9%e3%83%96%e3%83%ab%e3%82%b7%e3%83%a5%e3%83%bc%e3%83%86%e3%82%a3%e3%83%b3%e3%82%b0"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Googleアカウントで2段階認証を設定している場合は、パスワードの欄にアプリパスワードを記入する必要がある。アプリパスワードの詳細は&lt;a class="link" href="https://support.google.com/accounts/answer/185833" target="_blank" rel="noopener"
&gt;Googleアカウントヘルプ&lt;/a&gt;を参照のこと。&lt;/li&gt;
&lt;li&gt;Gmailのセキュリティ設定によっては、うまく設定できないことがある。その場合は、&lt;a class="link" href="https://myaccount.google.com/security" target="_blank" rel="noopener"
&gt;Googleアカウントのセキュリティ設定&lt;/a&gt;を確認し、必要に応じて変更すること。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参考文献url"&gt;
参考文献・URL&lt;a href="#%e5%8f%82%e8%80%83%e6%96%87%e7%8c%aeurl"&gt;
&lt;img src="https://notes.nakurei.com/icons/link.svg" style="width: 0.9em; margin-left: 0.25em; margin-bottom: -0.12em;" alt="Link to this heading" /&gt;
&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://datarescue.yamafd.com/linkterastation_mailnotification/"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/remote/3b1df775aeab4a2b68fb559f3b0c596916ee0ad0_hu_6a48e06328497d8d.webp"
alt="バッファロー LinkStation/TeraStationのメール通知設定 | データ復旧のパソコンサポートやまもと image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
バッファロー LinkStation/TeraStationのメール通知設定 | データ復旧のパソコンサポートやまもと
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;バッファロー社のLinkStation/TeraStationで、メール通知を設定する方法を説明します。メール通知をするために、Gmail・Yahoo!メールを使った方法を、画面のサンプルを使って具体的に説明します。&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-5fdc0d9039d4704f02fd0d9352a5a644d21fc239.png"
style="margin-right: 2px;"
alt="datarescue.yamafd.com favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
datarescue.yamafd.com
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;div
class="url-card"
style="
display: flex;
height: 100%;
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
padding: 10px;
border: solid 1px var(--table-border-color);
border-radius: 0.5rem;
overflow: hidden;
"
&gt;
&lt;a
href="https://www.buffalo.jp/s3/guide/ls700/jp/99/ja/pc_index.html"
target="_blank"
rel="noopener noreferrer"
style="
display: flex;
width: 100%;
height: 100%;
text-decoration: none;
"
class="linkcard"
&gt;
&lt;img
src="https://notes.nakurei.com/icons/photo-off.svg"
alt="www.buffalo.jp image"
width="120"
height="120"
loading="lazy"
decoding="async"
style="
max-width: 200px;
max-height: 120px;
object-fit: cover;
margin: 0;
flex-shrink: 0;
"&gt;
&lt;div
style="
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
margin-left: 12px;
"
&gt;
&lt;p style="margin: 0; padding-left: 0; padding-bottom: 3px; border: none"&gt;
www.buffalo.jp
&lt;/p&gt;
&lt;p
style="
margin: 0;
font-size: 12px;
word-break: break-word;
display: -webkit-box;
display: box;
-webkit-box-orient: vertical;
box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
"
&gt;&lt;/p&gt;
&lt;div
style="
display: flex;
flex-direction: row;
align-items: center;
gap: 2px;
"
&gt;&lt;img
src="https://notes.nakurei.com/remote/favicon-b29d093ea040a650b73d44e6ab0a71ef7db6876c.png"
style="margin-right: 2px;"
alt="www.buffalo.jp favicon image"
/&gt;&lt;span style="font-size: small; color: var(--card-text-color-tertiary);"&gt;
www.buffalo.jp
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;style&gt;
.url-card:hover {
box-shadow: 0 0 0 1px var(--card-text-color-tertiary);
}
&lt;/style&gt;
&lt;/p&gt;</description></item><item><title>Search</title><link>https://notes.nakurei.com/search/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://notes.nakurei.com/search/</guid><description/></item></channel></rss>