<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
<atom:link href="https://blog.publictheta.com/rss.xml" rel="self" type="application/rss+xml" />
<title><![CDATA[Public Theta Blog]]></title>
<link>https://blog.publictheta.com</link>
<description><![CDATA[Public Thetaの個人技術ブログです。]]></description>
<language>ja</language>
<pubDate>Sat, 19 Oct 2024 06:19:35 GMT</pubDate>
<lastBuildDate>Sat, 11 Apr 2026 11:48:59 GMT</lastBuildDate>
<generator>Public Theta Blog</generator>
<item>
<title><![CDATA[QEMU]]></title>
<link>https://blog.publictheta.com/tags/qemu</link>
<guid isPermaLink="true">https://blog.publictheta.com/tags/qemu</guid>
<description><![CDATA[]]></description>
<pubDate>Sat, 19 Oct 2024 06:19:35 GMT</pubDate>

<content:encoded><![CDATA[]]></content:encoded>
</item>
<item>
<title><![CDATA[x86_64のUbuntuでqemu-aarch64-staticする]]></title>
<link>https://blog.publictheta.com/memos/2024-10-19-qemu-aarch64-static</link>
<guid isPermaLink="true">https://blog.publictheta.com/memos/2024-10-19-qemu-aarch64-static</guid>
<description><![CDATA[]]></description>
<pubDate>Sat, 19 Oct 2024 06:19:13 GMT</pubDate>
<category>QEMU</category>
<content:encoded><![CDATA[<p>x86_64のUbuntu（環境はGitHub Actionsの<a href="https://github.com/actions/runner-images/blob/3fbcce7888450069b9843941654e55ab7b691eb6/images/ubuntu/Ubuntu2204-Readme.md" target="_blank" rel="noopener noreferrer">Ubuntu 22.04</a>のランナー）で、<code>qemu-aarch64-static</code>を使って<code>aarch64</code>のバイナリを実行する際に、少しハマったのでメモ。</p>
<p>単純に、<code>qemu-user-static</code>をインストールして実行しようとすると、次のようなエラーが出る。</p>
<figure data-code-block="" data-language="sh"><figcaption><span class="code-block-language">sh</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,c3VkbyBhcHQtZ2V0IHVwZGF0ZQpzdWRvIGFwdC1nZXQgaW5zdGFsbCBxZW11LXVzZXItc3RhdGlj" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-sh"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> apt-get</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> update</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> apt-get</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> qemu-user-static</span></span></code></pre></figure>
<figure data-code-block="" data-language="sh"><figcaption><span class="code-block-language">sh</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,cWVtdS1hYXJjaDY0LXN0YXRpYyBiaW4=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-sh"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">qemu-aarch64-static</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> bin</span></span></code></pre></figure>
<figure data-code-block="" data-language=""><figcaption><div class="code-block-actions"><a download="code.txt" href="data:text/plain;charset=utf-8;base64,L2xpYi9sZC1saW51eC1hYXJjaDY0LnNvLjE6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkK" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre><code>/lib/ld-linux-aarch64.so.1: No such file or directory
</code></pre></figure>
<p>これはaarch64向けの<code>libc</code>ないために起こるためで、<a href="https://unix.stackexchange.com/questions/751329/qemu-aarch64-could-not-open-lib-ld-linux-aarch64-so-1-no-such-file-or-direc" target="_blank" rel="noopener noreferrer">このunix.stackexchange.com</a>にある通り<code>arm64</code>のアークテクチャを追加して、<code>libc6:arm6</code>をインストールすればよい。</p>
<p>ただし、ただ追加して<code>apt-get update</code>しても404エラーが出る。</p>
<figure data-code-block="" data-language="sh"><figcaption><span class="code-block-language">sh</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,c3VkbyBkcGtnIC0tYWRkLWFyY2hpdGVjdHVyZSBhcm02NA==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-sh"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> dpkg</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --add-architecture</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> arm64</span></span></code></pre></figure>
<figure data-code-block="" data-language="sh"><figcaption><span class="code-block-language">sh</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,c3VkbyBhcHQtZ2V0IHVwZGF0ZQ==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-sh"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> apt-get</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> update</span></span></code></pre></figure>
<figure data-code-block="" data-language=""><figcaption><div class="code-block-actions"><a download="code.txt" href="data:text/plain;charset=utf-8;base64,RTogRmFpbGVkIHRvIGZldGNoIGh0dHA6Ly9hcmNoaXZlLnVidW50dS5jb20vdWJ1bnR1L2Rpc3RzL2ZvY2FsL211bHRpdmVyc2UvYmluYXJ5LWFybTY0L1BhY2thZ2VzICA0MDQgIE5vdCBGb3VuZCBbSVA6IDkxLjE4OS45MS44MSA4MF0KRTogRmFpbGVkIHRvIGZldGNoIGh0dHA6Ly9hcmNoaXZlLnVidW50dS5jb20vdWJ1bnR1L2Rpc3RzL2ZvY2FsLXVwZGF0ZXMvbXVsdGl2ZXJzZS9iaW5hcnktYXJtNjQvUGFja2FnZXMgIDQwNCAgTm90IEZvdW5kIFtJUDogOTEuMTg5LjkxLjgxIDgwXQpFOiBGYWlsZWQgdG8gZmV0Y2ggaHR0cDovL3NlY3VyaXR5LnVidW50dS5jb20vdWJ1bnR1L2Rpc3RzL2ZvY2FsLXNlY3VyaXR5L21haW4vYmluYXJ5LWFybTY0L1BhY2thZ2VzICA0MDQgIE5vdCBGb3VuZCBbSVA6IDkxLjE4OS45MS44MyA4MF0KRTogRmFpbGVkIHRvIGZldGNoIGh0dHA6Ly9hcmNoaXZlLnVidW50dS5jb20vdWJ1bnR1L2Rpc3RzL2ZvY2FsLWJhY2twb3J0cy9tYWluL2JpbmFyeS1hcm02NC9QYWNrYWdlcyAgNDA0ICBOb3QgRm91bmQgW0lQOiA5MS4xODkuOTEuODEgODBdCkU6IFNvbWUgaW5kZXggZmlsZXMgZmFpbGVkIHRvIGRvd25sb2FkLiBUaGV5IGhhdmUgYmVlbiBpZ25vcmVkLCBvciBvbGQgb25lcyB1c2VkIGluc3RlYWQuCg==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre><code>E: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/focal/multiverse/binary-arm64/Packages  404  Not Found [IP: 91.189.91.81 80]
E: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/focal-updates/multiverse/binary-arm64/Packages  404  Not Found [IP: 91.189.91.81 80]
E: Failed to fetch http://security.ubuntu.com/ubuntu/dists/focal-security/main/binary-arm64/Packages  404  Not Found [IP: 91.189.91.83 80]
E: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/focal-backports/main/binary-arm64/Packages  404  Not Found [IP: 91.189.91.81 80]
E: Some index files failed to download. They have been ignored, or old ones used instead.
</code></pre></figure>
<p>これはそのまま<code>libc6:arm6</code>がリポジトリに見つからないことを指すエラーなので、<a href="https://askubuntu.com/questions/430705/how-to-use-apt-get-to-download-multi-arch-library" target="_blank" rel="noopener noreferrer">このaskubuntu.com</a>にある通り、ソースを追加すると解決できる。</p>
<p>つまり例えば、<code>/etc/apt/sources.list.d/arm64.list</code>を作成して、次のように記述する。</p>
<figure data-code-block="" data-language="sh"><figcaption><span class="code-block-language">sh</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,ZGViIFthcmNoPWFybTY0XSBodHRwOi8vcG9ydHMudWJ1bnR1LmNvbS8gZm9jYWwgbWFpbiByZXN0cmljdGVkCmRlYiBbYXJjaD1hcm02NF0gaHR0cDovL3BvcnRzLnVidW50dS5jb20vIGZvY2FsLXVwZGF0ZXMgbWFpbiByZXN0cmljdGVkCmRlYiBbYXJjaD1hcm02NF0gaHR0cDovL3BvcnRzLnVidW50dS5jb20vIGZvY2FsIHVuaXZlcnNlCmRlYiBbYXJjaD1hcm02NF0gaHR0cDovL3BvcnRzLnVidW50dS5jb20vIGZvY2FsLXVwZGF0ZXMgdW5pdmVyc2UKZGViIFthcmNoPWFybTY0XSBodHRwOi8vcG9ydHMudWJ1bnR1LmNvbS8gZm9jYWwgbXVsdGl2ZXJzZQpkZWIgW2FyY2g9YXJtNjRdIGh0dHA6Ly9wb3J0cy51YnVudHUuY29tLyBmb2NhbC11cGRhdGVzIG11bHRpdmVyc2UKZGViIFthcmNoPWFybTY0XSBodHRwOi8vcG9ydHMudWJ1bnR1LmNvbS8gZm9jYWwtYmFja3BvcnRzIG1haW4gcmVzdHJpY3RlZCB1bml2ZXJzZSBtdWx0aXZlcnNl" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-sh"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deb</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [arch=arm64] http://ports.ubuntu.com/ focal main restricted</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deb</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deb</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [arch=arm64] http://ports.ubuntu.com/ focal universe</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deb</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [arch=arm64] http://ports.ubuntu.com/ focal-updates universe</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deb</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [arch=arm64] http://ports.ubuntu.com/ focal multiverse</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deb</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deb</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse</span></span></code></pre></figure>
<p>これをコマンドで行う場合は例えばこう。</p>
<figure data-code-block="" data-language="sh"><figcaption><span class="code-block-language">sh</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,VUJVTlRVPSQobHNiX3JlbGVhc2UgLWNzKQoKc3VkbyB0ZWUgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvYXJtNjQubGlzdCA8PEVPRgpkZWIgW2FyY2g9YXJtNjRdIGh0dHA6Ly9wb3J0cy51YnVudHUuY29tLyAkVUJVTlRVIG1haW4gcmVzdHJpY3RlZApkZWIgW2FyY2g9YXJtNjRdIGh0dHA6Ly9wb3J0cy51YnVudHUuY29tLyAkVUJVTlRVLXVwZGF0ZXMgbWFpbiByZXN0cmljdGVkCmRlYiBbYXJjaD1hcm02NF0gaHR0cDovL3BvcnRzLnVidW50dS5jb20vICRVQlVOVFUgdW5pdmVyc2UKZGViIFthcmNoPWFybTY0XSBodHRwOi8vcG9ydHMudWJ1bnR1LmNvbS8gJFVCVU5UVS11cGRhdGVzIHVuaXZlcnNlCmRlYiBbYXJjaD1hcm02NF0gaHR0cDovL3BvcnRzLnVidW50dS5jb20vICRVQlVOVFUgbXVsdGl2ZXJzZQpkZWIgW2FyY2g9YXJtNjRdIGh0dHA6Ly9wb3J0cy51YnVudHUuY29tLyAkVUJVTlRVLXVwZGF0ZXMgbXVsdGl2ZXJzZQpkZWIgW2FyY2g9YXJtNjRdIGh0dHA6Ly9wb3J0cy51YnVudHUuY29tLyAkVUJVTlRVLWJhY2twb3J0cyBtYWluIHJlc3RyaWN0ZWQgdW5pdmVyc2UgbXVsdGl2ZXJzZQpFT0Y=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-sh"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">UBUNTU</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">lsb_release</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -cs</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> tee</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /etc/apt/sources.list.d/arm64.list</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &#x3C;&#x3C;</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">EOF</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">deb [arch=arm64] http://ports.ubuntu.com/ </span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$UBUNTU</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> main restricted</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">deb [arch=arm64] http://ports.ubuntu.com/ </span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$UBUNTU</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">-updates main restricted</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">deb [arch=arm64] http://ports.ubuntu.com/ </span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$UBUNTU</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> universe</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">deb [arch=arm64] http://ports.ubuntu.com/ </span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$UBUNTU</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">-updates universe</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">deb [arch=arm64] http://ports.ubuntu.com/ </span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$UBUNTU</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> multiverse</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">deb [arch=arm64] http://ports.ubuntu.com/ </span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$UBUNTU</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">-updates multiverse</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">deb [arch=arm64] http://ports.ubuntu.com/ </span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$UBUNTU</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">-backports main restricted universe multiverse</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">EOF</span></span></code></pre></figure>
<p>加えて、デフォルトの<code>/etc/apt/sources.list</code>を現在のアーキテクチャ専用に書き換えておく必要がある。</p>
<figure data-code-block="" data-language="sh"><figcaption><span class="code-block-language">sh</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,IyDlv7Xjga7ngrrjg5Djg4Pjgq/jgqLjg4Pjg5cKc3VkbyBjcCAvZXRjL2FwdC9zb3VyY2VzLmxpc3QgL2V0Yy9hcHQvc291cmNlcy5saXN0LmJhawoKIyDkvovjgYjjgbBhbWQ2NApBUkNIPSQoZHBrZyAtLXByaW50LWFyY2hpdGVjdHVyZSkKCiMg572u5o+bCnN1ZG8gc2VkIC1pICJzL2RlYiAvZGViIFthcmNoPSRBUkNIXSAvZyIgL2V0Yy9hcHQvc291cmNlcy5saXN0" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-sh"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 念の為バックアップ</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> cp</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /etc/apt/sources.list</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /etc/apt/sources.list.bak</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 例えばamd64</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ARCH</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">dpkg</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --print-architecture</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 置換</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> sed</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -i</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "s/deb /deb [arch=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$ARCH</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">] /g"</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /etc/apt/sources.list</span></span></code></pre></figure>
<p>これで、<code>libc6:arm6</code>をインストールでき、<code>qemu-aarch64-static</code>による<code>aarch64</code>バイナリの実行が可能になるはず。</p>
<figure data-code-block="" data-language="sh"><figcaption><span class="code-block-language">sh</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,c3VkbyBhcHQtZ2V0IGluc3RhbGwgbGliYzY6YXJtNg==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-sh"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> apt-get</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> libc6:arm6</span></span></code></pre></figure>
<figure data-code-block="" data-language="sh"><figcaption><span class="code-block-language">sh</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,cWVtdS1hYXJjaDY0LXN0YXRpYyBiaW4=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-sh"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">qemu-aarch64-static</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> bin</span></span></code></pre></figure>]]></content:encoded>
</item>
<item>
<title><![CDATA[Windows]]></title>
<link>https://blog.publictheta.com/tags/windows</link>
<guid isPermaLink="true">https://blog.publictheta.com/tags/windows</guid>
<description><![CDATA[]]></description>
<pubDate>Sat, 19 Oct 2024 05:44:07 GMT</pubDate>

<content:encoded><![CDATA[]]></content:encoded>
</item>
<item>
<title><![CDATA[Windows上でのi686-pc-windows-gnu向けRustビルドで"linker `i686-w64-mingw32-gcc` not found"が出る]]></title>
<link>https://blog.publictheta.com/memos/2024-10-19-rust-i686-w64-mingw32-gcc</link>
<guid isPermaLink="true">https://blog.publictheta.com/memos/2024-10-19-rust-i686-w64-mingw32-gcc</guid>
<description><![CDATA[]]></description>
<pubDate>Sat, 19 Oct 2024 05:38:40 GMT</pubDate>
<category>Rust</category><category>Windows</category>
<content:encoded><![CDATA[<p>GitHub ActionsのWindowsのランナーでターゲットを<code>i686-pc-windows-gnu</code>にしてRustのバイナリーをビルドしようとしたら、以下のエラーが出た。</p>
<figure data-code-block="" data-language="text"><figcaption><span class="code-block-language">text</span><div class="code-block-actions"><a download="code.text" href="data:text/plain;charset=utf-8;base64,ZXJyb3I6IGxpbmtlciBgaTY4Ni13NjQtbWluZ3czMi1nY2NgIG5vdCBmb3VuZAogIHwKICA9IG5vdGU6IHByb2dyYW0gbm90IGZvdW5k" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-text"><span class="line"><span>error: linker `i686-w64-mingw32-gcc` not found</span></span>
<span class="line"><span>  |</span></span>
<span class="line"><span>  = note: program not found</span></span></code></pre></figure>
<p>原因は、ターゲットを追加してもコンパイルに必要な<code>rust-mingw</code>というコンポーネントがインストールされないこと（<a href="https://github.com/rust-lang/rustup/issues/607" target="_blank" rel="noopener noreferrer">rust-lang/rustup#607</a>）だったので、インストールのコマンドを次のようにすることで解決した。</p>
<figure data-code-block="" data-language="bash"><figcaption><span class="code-block-language">bash</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,cnVzdHVwIHRvb2xjaGFpbiBpbnN0YWxsIHN0YWJsZS1pNjg2LXBjLXdpbmRvd3MtZ251CnJ1c3R1cCBkZWZhdWx0IHN0YWJsZS1pNjg2LXBjLXdpbmRvd3MtZ251" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">rustup</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> toolchain</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> stable-i686-pc-windows-gnu</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">rustup</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> default</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> stable-i686-pc-windows-gnu</span></span></code></pre></figure>]]></content:encoded>
</item>
<item>
<title><![CDATA[Rustのtargetディレクトリをあるディレクトリ以下で共有する]]></title>
<link>https://blog.publictheta.com/memos/2024-06-14-cargo-target</link>
<guid isPermaLink="true">https://blog.publictheta.com/memos/2024-06-14-cargo-target</guid>
<description><![CDATA[]]></description>
<pubDate>Fri, 14 Jun 2024 04:08:21 GMT</pubDate>
<category>Rust</category><category>Cargo</category>
<content:encoded><![CDATA[<p>Rustのビルドによるアーティファクトはビルドのキャッシュを含め、すべて<code>target</code>ディレクトリに出力される。</p>
<ul>
<li><a href="https://doc.rust-lang.org/cargo/guide/build-cache.html" target="_blank" rel="noopener noreferrer">https://doc.rust-lang.org/cargo/guide/build-cache.html</a></li>
</ul>
<p>デフォルトでは、<code>target</code>ディレクトリはプロジェクトのルートディレクトリ、すなわち（ワークスペースであればワークスペースの）<code>Cargo.toml</code>があるディレクトリに作成されるが、複数のプロジェクトで多くの同じパッケージを依存関係として持つ場合、同じものをプロジェクトごとにビルドすることになるため、ビルド時間的にもディスク容量的にもかなりの重複が生じることになる。</p>
<figure data-code-block="" data-language="plaintext"><figcaption><span class="code-block-language">plaintext</span><div class="code-block-actions"><a download="code.plaintext" href="data:text/plain;charset=utf-8;base64,cHJvamVjdC1hL3RhcmdldC8uLi4KcHJvamVjdC1iL3RhcmdldC8uLi4KcHJvamVjdC1jL3RhcmdldC8uLi4=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-plaintext"><span class="line"><span>project-a/target/...</span></span>
<span class="line"><span>project-b/target/...</span></span>
<span class="line"><span>project-c/target/...</span></span></code></pre></figure>
<p>より高度な方法として、<a href="https://github.com/mozilla/sccache" target="_blank" rel="noopener noreferrer">sccache</a>のようなツールを使うこともできるが、単純な方法として、Cargoの設定で<code>target</code>ディレクトリに同じディレクトリを使うように指定することができる。</p>
<ul>
<li><a href="https://doc.rust-lang.org/cargo/reference/config.html#buildtarget-dir" target="_blank" rel="noopener noreferrer">https://doc.rust-lang.org/cargo/reference/config.html#buildtarget-dir</a></li>
</ul>
<p>環境変数<code>CARGO_TARGET_DIR</code>を設定したり、</p>
<figure data-code-block="" data-language="bash"><figcaption><span class="code-block-language">bash</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,ZXhwb3J0IENBUkdPX1RBUkdFVF9ESVI9Ii9wYXRoL3RvL3NoYXJlZC90YXJnZXQi" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-bash"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> CARGO_TARGET_DIR</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"/path/to/shared/target"</span></span></code></pre></figure>
<p><code>$CARGO_HOME/config.toml</code>に<code>build.target-dir</code>を設定したり、</p>
<figure data-code-block="" data-language="toml"><figcaption><span class="code-block-language">toml</span><div class="code-block-actions"><a download="code.toml" href="data:text/plain;charset=utf-8;base64,W2J1aWxkXQp0YXJnZXQtZGlyID0gIi9wYXRoL3RvL3NoYXJlZC90YXJnZXQi" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-toml"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">build</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">target-dir = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"/path/to/shared/target"</span></span></code></pre></figure>
<p>といった方法があるが、実はこれらより先に、現在のディレクトリ以上にある<code>.cargo/config.toml</code>を下から上へと再帰的に読んでくれるという仕組みがあるので、これを使うと、プロジェクトごとだったり、親ディレクトリごとだったりに、<code>target</code>ディレクトリを指定することもできる。</p>
<ul>
<li><a href="https://doc.rust-lang.org/cargo/reference/config.html#hierarchical-structure" target="_blank" rel="noopener noreferrer">https://doc.rust-lang.org/cargo/reference/config.html#hierarchical-structure</a></li>
</ul>
<p><code>.cargo/config.toml</code>の相対パスは、<code>.cargo</code>のあるディレクトリを基準として解釈される。</p>
<ul>
<li><a href="https://doc.rust-lang.org/cargo/reference/config.html#config-relative-paths" target="_blank" rel="noopener noreferrer">https://doc.rust-lang.org/cargo/reference/config.html#config-relative-paths</a></li>
</ul>
<p>なので、例えば次のような<code>.cargo/config.toml</code>を作成することで、そのディレクトリ以下のすべてのプロジェクトで同じ<code>target</code>ディレクトリ（<code>.cargo/target</code>）を使うようにできる。</p>
<figure data-code-block="" data-language="toml"><figcaption><span class="code-block-language">toml</span><div class="code-block-actions"><a download="code.toml" href="data:text/plain;charset=utf-8;base64,W2J1aWxkXQp0YXJnZXQtZGlyID0gIi5jYXJnby90YXJnZXQi" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-toml"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">build</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">target-dir = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">".cargo/target"</span></span></code></pre></figure>
<figure data-code-block="" data-language="plaintext"><figcaption><span class="code-block-language">plaintext</span><div class="code-block-actions"><a download="code.plaintext" href="data:text/plain;charset=utf-8;base64,LmNhcmdvL2NvbmZpZy50b21sCi5jYXJnby90YXJnZXQvLi4uCnByb2plY3QtYS8KcHJvamVjdC1iLwpwcm9qZWN0LWMv" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-plaintext"><span class="line"><span>.cargo/config.toml</span></span>
<span class="line"><span>.cargo/target/...</span></span>
<span class="line"><span>project-a/</span></span>
<span class="line"><span>project-b/</span></span>
<span class="line"><span>project-c/</span></span></code></pre></figure>
<p>その際、あるプロジェクトだけ例外として扱いたい場合は、現在のディレクトリを含めてより近いディレクトリにある<code>.cargo/config.toml</code>が優先されるので、そのプロジェクトのディレクトリに次のような<code>.cargo/config.toml</code>を作成して、<code>target</code>ディレクトリを指定すれば良い。</p>
<figure data-code-block="" data-language="toml"><figcaption><span class="code-block-language">toml</span><div class="code-block-actions"><a download="code.toml" href="data:text/plain;charset=utf-8;base64,W2J1aWxkXQp0YXJnZXQtZGlyID0gInRhcmdldCI=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-toml"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">build</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">target-dir = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"target"</span></span></code></pre></figure>
<p>例えば、<code>project-c</code>にこのファイルを追加した場合、<code>project-c</code>のビルド結果は<code>project-c/target</code>に出力されるようになる。</p>
<figure data-code-block="" data-language="plaintext"><figcaption><span class="code-block-language">plaintext</span><div class="code-block-actions"><a download="code.plaintext" href="data:text/plain;charset=utf-8;base64,LmNhcmdvL2NvbmZpZy50b21sCi5jYXJnby90YXJnZXQvLi4uCnByb2plY3QtYS8KcHJvamVjdC1iLwpwcm9qZWN0LWMvLmNhcmdvL2NvbmZpZy50b21sCnByb2plY3QtYy90YXJnZXQvLi4u" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-plaintext"><span class="line"><span>.cargo/config.toml</span></span>
<span class="line"><span>.cargo/target/...</span></span>
<span class="line"><span>project-a/</span></span>
<span class="line"><span>project-b/</span></span>
<span class="line"><span>project-c/.cargo/config.toml</span></span>
<span class="line"><span>project-c/target/...</span></span></code></pre></figure>
<p>このような使い方をする場合、<code>.gitignore_global</code>などに<code>.cargo/config.toml</code>を追加しておくと良いかもしれない。</p>
<figure data-code-block="" data-language="gitignore"><figcaption><span class="code-block-language">gitignore</span><div class="code-block-actions"><a download="code.gitignore" href="data:text/plain;charset=utf-8;base64,LmNhcmdvL2NvbmZpZy50b21sCg==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre><code class="language-gitignore">.cargo/config.toml
</code></pre></figure>
<p>ただし、その場合は逆に<code>target</code>ディレクトリを<code>.gitignore</code>に追加することを忘れないようにしなければならないだろう。</p>
<figure data-code-block="" data-language="gitignore"><figcaption><span class="code-block-language">gitignore</span><div class="code-block-actions"><a download="code.gitignore" href="data:text/plain;charset=utf-8;base64,L3RhcmdldAo=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre><code class="language-gitignore">/target
</code></pre></figure>]]></content:encoded>
</item>
<item>
<title><![CDATA[webpackでswcを使う]]></title>
<link>https://blog.publictheta.com/memos/2024-05-20-webpack-swc</link>
<guid isPermaLink="true">https://blog.publictheta.com/memos/2024-05-20-webpack-swc</guid>
<description><![CDATA[]]></description>
<pubDate>Mon, 20 May 2024 11:19:20 GMT</pubDate>
<category>webpack</category>
<content:encoded><![CDATA[<p><code>webpack</code>でTypeScriptをトランスパイルする際に、<code>ts-loader</code>の代わりに<code>esbuild</code>（<code>esbuild-loader</code>）を使うこともできるが、<a href="https://swc.rs/" target="_blank" rel="noopener noreferrer"><code>swc</code></a>（<a href="https://swc.rs/docs/usage/swc-loader" target="_blank" rel="noopener noreferrer"><code>swc-loader</code></a>）を使うこともできる。</p>
<p>依存関係には、<code>@swc/core</code>と<code>swc-loader</code>を追加する。</p>
<figure data-code-block="" data-language="bash"><figcaption><span class="code-block-language">bash</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,IyBucG0KbnBtIGluc3RhbGwgLUQgQHN3Yy9jb3JlIHN3Yy1sb2FkZXIKIyB5YXJuCnlhcm4gYWRkIC1EIEBzd2MvY29yZSBzd2MtbG9hZGVyCiMgcG5wbQpwbnBtIGFkZCAtRCBAc3djL2NvcmUgc3djLWxvYWRlcg==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-bash"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># npm</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -D</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> @swc/core</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> swc-loader</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># yarn</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">yarn</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> add</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -D</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> @swc/core</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> swc-loader</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># pnpm</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> add</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -D</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> @swc/core</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> swc-loader</span></span></code></pre></figure>
<p>あとは、<code>ts-loader</code>の代わりに<code>swc-loader</code>を使うように設定する。</p>
<p><code>webpack.config.js</code>:</p>
<figure data-code-block="" data-language="js"><figcaption><span class="code-block-language">js</span><div class="code-block-actions"><a download="code.js" href="data:text/plain;charset=utf-8;base64,bW9kdWxlLmV4cG9ydHMgPSB7CiAgICBtb2R1bGU6IHsKICAgICAgICBydWxlczogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0ZXN0OiAvXC4oW2p0XXN4Pyk/JC8sCiAgICAgICAgICAgICAgICBleGNsdWRlOiAvbm9kZV9tb2R1bGVzLywKICAgICAgICAgICAgICAgIHVzZTogewogICAgICAgICAgICAgICAgICAgIGxvYWRlcjogInN3Yy1sb2FkZXIiLAogICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vc3djLnJzL2RvY3MvY29uZmlndXJhdGlvbi9jb21waWxhdGlvbgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgICAgICAgICAgICAganNjOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXg6ICJ0eXBlc2NyaXB0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c3g6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICB9LAp9Ow==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-js"><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">exports</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    module: {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        rules: [</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                test:</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /</span><span style="--shiki-light:#22863A;--shiki-light-font-weight:bold;--shiki-dark:#85E89D;--shiki-dark-font-weight:bold">\.</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">[jt]</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">sx</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">?</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">)</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">?$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                exclude:</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">node_modules</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                use: {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                    loader: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"swc-loader"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">                    // https://swc.rs/docs/configuration/compilation</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                    options: {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                        jsc: {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                            parser: {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                                syntax: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"typescript"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                                tsx: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                            },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                        },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                    },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        ],</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">};</span></span></code></pre></figure>
<p>設定には<code>options</code>を使ってもいいが、<a href="https://swc.rs/docs/configuration/swcrc" target="_blank" rel="noopener noreferrer"><code>.swcrc</code></a>を使っても良い。</p>
<p><code>webpack.config.js</code>:</p>
<figure data-code-block="" data-language="js"><figcaption><span class="code-block-language">js</span><div class="code-block-actions"><a download="code.js" href="data:text/plain;charset=utf-8;base64,bW9kdWxlLmV4cG9ydHMgPSB7CiAgICBtb2R1bGU6IHsKICAgICAgICBydWxlczogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0ZXN0OiAvXC4oW2p0XXN4Pyk/JC8sCiAgICAgICAgICAgICAgICBleGNsdWRlOiAvbm9kZV9tb2R1bGVzLywKICAgICAgICAgICAgICAgIHVzZTogInN3Yy1sb2FkZXIiLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICB9LAp9Ow==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-js"><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">exports</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    module: {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        rules: [</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                test:</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /</span><span style="--shiki-light:#22863A;--shiki-light-font-weight:bold;--shiki-dark:#85E89D;--shiki-dark-font-weight:bold">\.</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">[jt]</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">sx</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">?</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">)</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">?$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                exclude:</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">node_modules</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                use: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"swc-loader"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        ],</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">};</span></span></code></pre></figure>
<p><code>.swcrc</code>:</p>
<figure data-code-block="" data-language="json"><figcaption><span class="code-block-language">json</span><div class="code-block-actions"><a download="code.json" href="data:text/plain;charset=utf-8;base64,ewogICAgImpzYyI6IHsKICAgICAgICAicGFyc2VyIjogewogICAgICAgICAgICAic3ludGF4IjogInR5cGVzY3JpcHQiLAogICAgICAgICAgICAidHN4IjogdHJ1ZQogICAgICAgIH0KICAgIH0KfQ==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-json"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "jsc"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        "parser"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">            "syntax"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"typescript"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">            "tsx"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>]]></content:encoded>
</item>
<item>
<title><![CDATA[npmのserveパッケージを使ってローカルサーバーを立てる]]></title>
<link>https://blog.publictheta.com/memos/2024-05-20-npm-serve</link>
<guid isPermaLink="true">https://blog.publictheta.com/memos/2024-05-20-npm-serve</guid>
<description><![CDATA[]]></description>
<pubDate>Mon, 20 May 2024 10:35:31 GMT</pubDate>
<category>JavaScript</category>
<content:encoded><![CDATA[<p><a href="https://www.npmjs.com/package/serve" target="_blank" rel="noopener noreferrer"><code>serve</code></a>（<a href="https://github.com/vercel/serve" target="_blank" rel="noopener noreferrer"><code>vercel/serve</code></a>）を使うと、ローカルサーバーを簡単に立てることができる。</p>
<p>特に、Node.jsが既にインストールされている環境であれば、<code>npx</code>や<code>dlx</code>を使って環境を汚さずその場でサーバーを立てることができる。</p>
<figure data-code-block="" data-language="bash"><figcaption><span class="code-block-language">bash</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,IyBucG0KbnB4IHNlcnZlCiMgeWFybgp5YXJuIGRseCBzZXJ2ZQojIHBucG0KcG5wbSBkbHggc2VydmU=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-bash"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># npm</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npx</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> serve</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># yarn</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">yarn</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> dlx</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> serve</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># pnpm</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> dlx</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> serve</span></span></code></pre></figure>
<p>もちろん依存関係に追加して、<code>package.json</code>の<code>scripts</code>に追加するなどしても良い。</p>
<figure data-code-block="" data-language="bash"><figcaption><span class="code-block-language">bash</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,IyBucG0KbnBtIGluc3RhbGwgLUQgc2VydmUKIyB5YXJuCnlhcm4gYWRkIC1EIHNlcnZlCiMgcG5wbQpwbnBtIGFkZCAtRCBzZXJ2ZQ==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-bash"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># npm</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -D</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> serve</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># yarn</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">yarn</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> add</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -D</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> serve</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># pnpm</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> add</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -D</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> serve</span></span></code></pre></figure>
<figure data-code-block="" data-language="json"><figcaption><span class="code-block-language">json</span><div class="code-block-actions"><a download="code.json" href="data:text/plain;charset=utf-8;base64,ewogICAgInNjcmlwdHMiOiB7CiAgICAgICAgInNlcnZlIjogInNlcnZlIgogICAgfQp9" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-json"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "scripts"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        "serve"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"serve"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<p>グローバルインストールするならこう。</p>
<figure data-code-block="" data-language="bash"><figcaption><span class="code-block-language">bash</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,IyBucG0KbnBtIGluc3RhbGwgLWcgc2VydmUKIyB5YXJuCnlhcm4gZ2xvYmFsIGFkZCBzZXJ2ZQojIHBucG0KcG5wbSBhZGQgLWcgc2VydmU=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-bash"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># npm</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -g</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> serve</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># yarn</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">yarn</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> global</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> add</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> serve</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># pnpm</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> add</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -g</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> serve</span></span></code></pre></figure>
<p>コマンドラインオプションは、<code>-h</code>（<code>--help</code>）で確認できる。</p>
<figure data-code-block="" data-language="bash"><figcaption><span class="code-block-language">bash</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,c2VydmUgLWgKc2VydmUgLS1oZWxw" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">serve</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -h</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">serve</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --help</span></span></code></pre></figure>
<p>ディレクトリを指定する場合は、引数に指定する。デフォルトはカレントディレクトリ。</p>
<figure data-code-block="" data-language="bash"><figcaption><span class="code-block-language">bash</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,c2VydmUgcHVibGlj" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">serve</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> public</span></span></code></pre></figure>
<p>ポートを指定する場合は、<code>-p</code>または<code>-l</code>（<code>--listen</code>、より複雑な指定が可能）を使う。デフォルトは<code>3000</code>。</p>
<figure data-code-block="" data-language="bash"><figcaption><span class="code-block-language">bash</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,c2VydmUgLXAgODA4MApzZXJ2ZSAtbCA4MDgw" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">serve</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -p</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 8080</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">serve</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -l</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 8080</span></span></code></pre></figure>
<p><code>serve.json</code>を使って設定を行うこともできる。プロパティの詳細は、<a href="https://github.com/vercel/serve-handler#options" target="_blank" rel="noopener noreferrer">https://github.com/vercel/serve-handler#options</a> を参照。</p>
<p>公開ディレクトリを指定する場合は、<code>public</code>プロパティを使う。</p>
<figure data-code-block="" data-language="json"><figcaption><span class="code-block-language">json</span><div class="code-block-actions"><a download="code.json" href="data:text/plain;charset=utf-8;base64,ewogICAgInB1YmxpYyI6ICJwdWJsaWMiCn0=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-json"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "public"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"public"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>]]></content:encoded>
</item>
<item>
<title><![CDATA[Jest + TypeScriptで`SyntaxError: Unexpected token 'export'`が出る]]></title>
<link>https://blog.publictheta.com/memos/2022-06-24-jest-typescript-unexpected-token</link>
<guid isPermaLink="true">https://blog.publictheta.com/memos/2022-06-24-jest-typescript-unexpected-token</guid>
<description><![CDATA[]]></description>
<pubDate>Fri, 24 Jun 2022 13:14:13 GMT</pubDate>
<category>Jest</category><category>TypeScript</category>
<content:encoded><![CDATA[<p>TypeScriptのプロジェクトに<a href="https://github.com/kulshekhar/ts-jest" target="_blank" rel="noopener noreferrer"><code>ts-jest</code></a>を使って<a href="https://jestjs.io" target="_blank" rel="noopener noreferrer">Jest</a>を導入しようとしたところ、次のようなエラーが出た。</p>
<figure data-code-block="" data-language="text"><figcaption><span class="code-block-language">text</span><div class="code-block-actions"><a download="code.text" href="data:text/plain;charset=utf-8;base64,ZXhwb3J0IHt9OwogICAgXl5eXl5eCgogICAgU3ludGF4RXJyb3I6IFVuZXhwZWN0ZWQgdG9rZW4gJ2V4cG9ydCc=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-text"><span class="line"><span>export {};</span></span>
<span class="line"><span>    ^^^^^^</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    SyntaxError: Unexpected token 'export'</span></span></code></pre></figure>
<p>よく見ると、ビルド後のJavaScriptファイル（ここでは<code>dist</code>内にあるとする）がテストファイルとして認識されていたことが原因だったので、<a href="https://jestjs.io/docs/configuration" target="_blank" rel="noopener noreferrer"><code>jest.config.js</code></a>に次のような設定を追加した。</p>
<figure data-code-block="" data-language="js"><figcaption><span class="code-block-language">js</span><div class="code-block-actions"><a download="code.js" href="data:text/plain;charset=utf-8;base64,bW9kdWxlLmV4cG9ydHMgPSB7CiAgICAvLyDov73liqA6CiAgICB0ZXN0UGF0aElnbm9yZVBhdHRlcm5zOiBbIjxyb290RGlyPi9ub2RlX21vZHVsZXMvIiwgIjxyb290RGlyPi9kaXN0LyJdLAogICAgLy8g44OH44OV44Kp44Or44OIOgogICAgLy8gdGVzdFBhdGhJZ25vcmVQYXR0ZXJuczogWyIvbm9kZV9tb2R1bGVzLyJdLAp9" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-js"><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">exports</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    // 追加:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    testPathIgnorePatterns: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"&#x3C;rootDir>/node_modules/"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"&#x3C;rootDir>/dist/"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">],</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    // デフォルト:</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    // testPathIgnorePatterns: ["/node_modules/"],</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<p><a href="https://jestjs.io/docs/configuration#testpathignorepatterns-arraystring" target="_blank" rel="noopener noreferrer"><code>testPathIgnorePatterns</code></a>には、ファイルのフルパスに対してマッチされる正規表現を文字列で指定するようになっている。<code>&#x3C;rootDir></code>はプロジェクトのルートディレクトリに置き換えられる。</p>
<p>特定のディレクトリのみからテストファイルを探させたい場合は<a href="https://jestjs.io/docs/configuration#roots-arraystring" target="_blank" rel="noopener noreferrer"><code>roots</code></a>を使うこともできる。ただし、そのディレクトリが存在しない場合はエラーが出るようなので注意が必要。</p>
<figure data-code-block="" data-language="js"><figcaption><span class="code-block-language">js</span><div class="code-block-actions"><a download="code.js" href="data:text/plain;charset=utf-8;base64,bW9kdWxlLmV4cG9ydHMgPSB7CiAgICAvLyDov73liqA6CiAgICByb290czogWyI8cm9vdERpcj4vc3JjLyIsICI8cm9vdERpcj4vdGVzdHMvIl0sCiAgICAvLyDjg4fjg5Xjgqnjg6vjg4g6CiAgICAvLyByb290czogWyI8cm9vdERpcj4iXSwKfQ==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-js"><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">exports</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    // 追加:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    roots: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"&#x3C;rootDir>/src/"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"&#x3C;rootDir>/tests/"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">],</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    // デフォルト:</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    // roots: ["&#x3C;rootDir>"],</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>]]></content:encoded>
</item>
<item>
<title><![CDATA[Jest]]></title>
<link>https://blog.publictheta.com/tags/jest</link>
<guid isPermaLink="true">https://blog.publictheta.com/tags/jest</guid>
<description><![CDATA[]]></description>
<pubDate>Fri, 24 Jun 2022 13:14:13 GMT</pubDate>

<content:encoded><![CDATA[<h2 id="リンク"><a aria-hidden="true" tabindex="-1" href="#リンク"><span class="icon icon-link"></span></a>リンク</h2>
<ul>
<li>公式サイト: <a href="https://jestjs.io" target="_blank" rel="noopener noreferrer">https://jestjs.io</a></li>
<li>リポジトリ: <a href="https://github.com/facebook/jest" target="_blank" rel="noopener noreferrer">https://github.com/facebook/jest</a></li>
<li>ドキュメンテーション: <a href="https://jestjs.io/docs/getting-started" target="_blank" rel="noopener noreferrer">https://jestjs.io/docs/getting-started</a>
<ul>
<li>API（グローバル）: <a href="https://jestjs.io/docs/api" target="_blank" rel="noopener noreferrer">https://jestjs.io/docs/api</a></li>
<li>API（<code>expect</code>）: <a href="https://jestjs.io/docs/expect" target="_blank" rel="noopener noreferrer">https://jestjs.io/docs/expect</a></li>
<li>設定: <a href="https://jestjs.io/docs/configuration" target="_blank" rel="noopener noreferrer">https://jestjs.io/docs/configuration</a></li>
<li>CLI: <a href="https://jestjs.io/docs/cli" target="_blank" rel="noopener noreferrer">https://jestjs.io/docs/cli</a></li>
</ul>
</li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[Cloudflare Pagesのダイレクトアップロードでビルド済みの静的サイトをそのままデプロイする]]></title>
<link>https://blog.publictheta.com/memos/2022-06-11-cloudflare-direct-upload</link>
<guid isPermaLink="true">https://blog.publictheta.com/memos/2022-06-11-cloudflare-direct-upload</guid>
<description><![CDATA[]]></description>
<pubDate>Sat, 11 Jun 2022 20:34:02 GMT</pubDate>
<category>Cloudflare Pages</category>
<content:encoded><![CDATA[<p>Cloudflare PagesでCIやローカルからビルド済みのコンテンツをそのままアップロードするには「<a href="https://developers.cloudflare.com/pages/platform/direct-upload/" target="_blank" rel="noopener noreferrer">ダイレクトアップロード</a>」を使う。</p>
<p>ドラッグ&#x26;ドロップによるアップロードもできるが、</p>
<ul>
<li><a href="https://developers.cloudflare.com/pages/platform/direct-upload/#drag-and-drop" target="_blank" rel="noopener noreferrer">https://developers.cloudflare.com/pages/platform/direct-upload/#drag-and-drop</a></li>
</ul>
<p>ここではWranglerを使った方法を紹介する。</p>
<ul>
<li><a href="https://developers.cloudflare.com/pages/platform/direct-upload/#wrangler-cli" target="_blank" rel="noopener noreferrer">https://developers.cloudflare.com/pages/platform/direct-upload/#wrangler-cli</a></li>
</ul>
<h2 id="wrangler"><a aria-hidden="true" tabindex="-1" href="#wrangler"><span class="icon icon-link"></span></a>Wrangler</h2>
<p>現在のバージョンは、</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,d3JhbmdsZXIgLS12ZXJzaW9u" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">wrangler</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --version</span></span></code></pre></figure>
<figure data-code-block="" data-language="text"><figcaption><span class="code-block-language">text</span><div class="code-block-actions"><a download="code.text" href="data:text/plain;charset=utf-8;base64,Mi4wLjk=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-text"><span class="line"><span>2.0.9</span></span></code></pre></figure>
<p>もしWrangler 1を使っている場合は、Wrangler 2に移行する必要がある。</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,IyBXcmFuZ2xlciAxCm5wbSB1bmluc3RhbGwgLWcgQGNsb3VkZmxhcmUvd3JhbmdsZXIKIyBXcmFuZ2xlciAyCm5wbSBpbnN0YWxsIC1nIHdyYW5nbGVy" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Wrangler 1</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> uninstall</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -g</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> @cloudflare/wrangler</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Wrangler 2</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -g</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> wrangler</span></span></code></pre></figure>
<ul>
<li><a href="https://developers.cloudflare.com/workers/wrangler/migration/migrating-from-wrangler-1/" target="_blank" rel="noopener noreferrer">https://developers.cloudflare.com/workers/wrangler/migration/migrating-from-wrangler-1/</a></li>
</ul>
<h2 id="アップロード"><a aria-hidden="true" tabindex="-1" href="#アップロード"><span class="icon icon-link"></span></a>アップロード</h2>
<p>アップロードは次のコマンドで行う。</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,d3JhbmdsZXIgcGFnZXMgcHVibGlzaCBbRElSRUNUT1JZXSBbT1BUSU9OU10=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">wrangler</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pages</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> publish</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [DIRECTORY] [OPTIONS]</span></span></code></pre></figure>
<p><code>dist</code>ディレクトリをアップロードしたい場合は、</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,d3JhbmdsZXIgcGFnZXMgcHVibGlzaCBkaXN0" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">wrangler</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pages</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> publish</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> dist</span></span></code></pre></figure>
<p>新しくデプロイする場合は、プロンプトでまずプロジェクトを作成することになる。</p>
<p>既存のプロジェクト名を指定したい場合は、</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,d3JhbmdsZXIgcGFnZXMgcHVibGlzaCBkaXN0IC0tcHJvamVjdC1uYW1lIG15LXByb2plY3Q=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">wrangler</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pages</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> publish</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> dist</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --project-name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> my-project</span></span></code></pre></figure>
<h2 id="プロジェクト"><a aria-hidden="true" tabindex="-1" href="#プロジェクト"><span class="icon icon-link"></span></a>プロジェクト</h2>
<p>既存のプロジェクトを確認するには、</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,d3JhbmdsZXIgcGFnZXMgcHJvamVjdCBsaXN0" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">wrangler</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pages</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> project</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> list</span></span></code></pre></figure>
<p>プロジェクトを作成するには、</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,d3JhbmdsZXIgcGFnZXMgcHJvamVjdCBjcmVhdGUgW1BST0pFQ1QtTkFNRV0gW09QVElPTlNd" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">wrangler</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pages</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> project</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> create</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [PROJECT-NAME] [OPTIONS]</span></span></code></pre></figure>
<p>例えば<code>my-project</code>という名前のプロジェクトを作成するには、</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,d3JhbmdsZXIgcGFnZXMgcHJvamVjdCBjcmVhdGUgbXktcHJvamVjdA==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">wrangler</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pages</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> project</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> create</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> my-project</span></span></code></pre></figure>
<p>さらにプロダクション用のブランチ名を指定するには、</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,d3JhbmdsZXIgcGFnZXMgcHJvamVjdCBjcmVhdGUgbXktcHJvamVjdCAtLXByb2R1Y3Rpb24tYnJhbmNoIG1haW4=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">wrangler</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pages</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> project</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> create</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> my-project</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --production-branch</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> main</span></span></code></pre></figure>
<h2 id="参考リンク"><a aria-hidden="true" tabindex="-1" href="#参考リンク"><span class="icon icon-link"></span></a>参考リンク</h2>
<ul>
<li><a href="https://developers.cloudflare.com/workers/wrangler/commands/#pages" target="_blank" rel="noopener noreferrer">https://developers.cloudflare.com/workers/wrangler/commands/#pages</a></li>
<li><a href="https://developers.cloudflare.com/pages/platform/direct-upload/" target="_blank" rel="noopener noreferrer">https://developers.cloudflare.com/pages/platform/direct-upload/</a></li>
<li><a href="https://blog.cloudflare.com/cloudflare-pages-direct-uploads/" target="_blank" rel="noopener noreferrer">https://blog.cloudflare.com/cloudflare-pages-direct-uploads/</a></li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[RustでCargoの仮想ワークスペース（virtual workspaces）使用時にのみ依存パッケージのコンパイルに失敗する]]></title>
<link>https://blog.publictheta.com/memos/2022-05-29-cargo-resolver-2</link>
<guid isPermaLink="true">https://blog.publictheta.com/memos/2022-05-29-cargo-resolver-2</guid>
<description><![CDATA[]]></description>
<pubDate>Sun, 29 May 2022 09:24:05 GMT</pubDate>
<category>Rust</category><category>Cargo</category><category>Bevy</category>
<content:encoded><![CDATA[<p>Rustでゲームエンジンの<a href="https://bevyengine.org/" target="_blank" rel="noopener noreferrer">Bevy</a>を使ってパッケージとして書いていたものをワークスペースに移行してビルドしてみると、なぜか突然依存パッケージのコンパイルに失敗するようになった。</p>
<p>調べてみると仮想ワークスペースではパッケージのようにエディションを指定しないので、依存関係の解決アルゴリズムに古いバージョンのものがデフォルトで使われてしまうことが原因のようで、<code>resolver = "2"</code>を指定すると解決した。</p>
<figure data-code-block="" data-language="toml"><figcaption><span class="code-block-language">toml</span><div class="code-block-actions"><a download="code.toml" href="data:text/plain;charset=utf-8;base64,W3dvcmtzcGFjZV0KbWVtYmVycyA9IFsiY3JhdGVzLyoiXQpyZXNvbHZlciA9ICIyIg==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-toml"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">workspace</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">members = [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"crates/*"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">resolver = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"2"</span></span></code></pre></figure>
<ul>
<li><a href="https://doc.rust-lang.org/cargo/reference/resolver.html#resolver-versions" target="_blank" rel="noopener noreferrer">https://doc.rust-lang.org/cargo/reference/resolver.html#resolver-versions</a></li>
</ul>
<p>なお解決したあとで検索してみるとBevyの非公式チートブックにもよくある落とし穴としてしっかり記載されていた。</p>
<ul>
<li><a href="https://bevy-cheatbook.github.io/pitfalls/build-errors.html#multi-crate-workspaces" target="_blank" rel="noopener noreferrer">https://bevy-cheatbook.github.io/pitfalls/build-errors.html#multi-crate-workspaces</a></li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[Storybook + React + MDX で TypeError `(0 , _mdx_js_react__WEBPACK_IMPORTED_MODULE_2__.mdx) is not a function` が出る]]></title>
<link>https://blog.publictheta.com/memos/2022-05-26-storybook-react-mdx-not-function</link>
<guid isPermaLink="true">https://blog.publictheta.com/memos/2022-05-26-storybook-react-mdx-not-function</guid>
<description><![CDATA[]]></description>
<pubDate>Thu, 26 May 2022 12:55:50 GMT</pubDate>
<category>Storybook</category>
<content:encoded><![CDATA[<p>Storybookの構築時にハマったのでメモ。ビルドは正常にされるが、Storybookを開いた時に次のようなTypeErrorが出た。</p>
<figure data-code-block="" data-language="text"><figcaption><span class="code-block-language">text</span><div class="code-block-actions"><a download="code.text" href="data:text/plain;charset=utf-8;base64,KDAgLCBfbWR4X2pzX3JlYWN0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18ubWR4KSBpcyBub3QgYSBmdW5jdGlvbg==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-text"><span class="line"><span>(0 , _mdx_js_react__WEBPACK_IMPORTED_MODULE_2__.mdx) is not a function</span></span></code></pre></figure>
<p>原因はどうやらMDX 2を使っていたことのようだったので、</p>
<ul>
<li><a href="https://storybook.js.org/docs/react/writing-docs/mdx#mdx-2" target="_blank" rel="noopener noreferrer">https://storybook.js.org/docs/react/writing-docs/mdx#mdx-2</a></li>
</ul>
<p>に書かれている通り、</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,bnBtIGluc3RhbGwgQHN0b3J5Ym9vay9tZHgyLWNzZiAtLXNhdmUtZGV2" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> @storybook/mdx2-csf</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --save-dev</span></span></code></pre></figure>
<p><code>.storybook/main.js</code>:</p>
<figure data-code-block="" data-language="js"><figcaption><span class="code-block-language">js</span><div class="code-block-actions"><a download="code.js" href="data:text/plain;charset=utf-8;base64,bW9kdWxlLmV4cG9ydHMgPSB7CiAgICAvLyAuLi4KICAgIGZlYXR1cmVzOiB7CiAgICAgICAgcHJldmlld01keDI6IHRydWUsCiAgICB9LAp9" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-js"><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">exports</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    // ...</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    features: {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        previewMdx2: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<p>を追加すると解決した。</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Storybook]]></title>
<link>https://blog.publictheta.com/tags/storybook</link>
<guid isPermaLink="true">https://blog.publictheta.com/tags/storybook</guid>
<description><![CDATA[]]></description>
<pubDate>Thu, 26 May 2022 12:55:50 GMT</pubDate>

<content:encoded><![CDATA[<h2 id="リンク"><a aria-hidden="true" tabindex="-1" href="#リンク"><span class="icon icon-link"></span></a>リンク</h2>
<ul>
<li>公式サイト: <a href="https://storybook.js.org" target="_blank" rel="noopener noreferrer">https://storybook.js.org</a></li>
<li>リポジトリ: <a href="https://github.com/storybookjs/storybook/" target="_blank" rel="noopener noreferrer">https://github.com/storybookjs/storybook/</a></li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[FFmpegで動画をGIF化する]]></title>
<link>https://blog.publictheta.com/memos/2022-05-14-ffmpeg-video-to-gif</link>
<guid isPermaLink="true">https://blog.publictheta.com/memos/2022-05-14-ffmpeg-video-to-gif</guid>
<description><![CDATA[]]></description>
<pubDate>Sat, 14 May 2022 23:01:59 GMT</pubDate>
<category>FFmpeg</category><category>GIF</category>
<content:encoded><![CDATA[<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,ZmZtcGVnIC1pIHZpZGVvLm1vdiB2aWRlby5naWY=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">ffmpeg</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -i</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> video.mov</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> video.gif</span></span></code></pre></figure>
<p>フレームレートは<code>-r</code>で、サイズは<code>-vf scale=</code>で指定できる。<code>-1</code>はアスペクト比を保つという意味。</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,ZmZtcGVnIC1pIHZpZGVvLm1vdiAtciAzMCAtdmYgc2NhbGU9MTI4MDotMSB2aWRlby5naWY=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">ffmpeg</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -i</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> video.mov</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -r</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 30</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -vf</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> scale=1280:-1</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> video.gif</span></span></code></pre></figure>]]></content:encoded>
</item>
<item>
<title><![CDATA[FFmpeg]]></title>
<link>https://blog.publictheta.com/tags/ffmpeg</link>
<guid isPermaLink="true">https://blog.publictheta.com/tags/ffmpeg</guid>
<description><![CDATA[]]></description>
<pubDate>Sat, 14 May 2022 23:01:59 GMT</pubDate>

<content:encoded><![CDATA[<h2 id="リンク"><a aria-hidden="true" tabindex="-1" href="#リンク"><span class="icon icon-link"></span></a>リンク</h2>
<ul>
<li>公式サイト: <a href="https://ffmpeg.org" target="_blank" rel="noopener noreferrer">https://ffmpeg.org</a></li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[GIF]]></title>
<link>https://blog.publictheta.com/tags/gif</link>
<guid isPermaLink="true">https://blog.publictheta.com/tags/gif</guid>
<description><![CDATA[]]></description>
<pubDate>Sat, 14 May 2022 23:01:59 GMT</pubDate>

<content:encoded><![CDATA[<p>Graphics Interchange Formatの略。設計者（Steve Wilhite）による読み方は「ジフ」。</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Netlifyでローカルビルドをそのまま静的ホストする]]></title>
<link>https://blog.publictheta.com/memos/2022-05-10-netlify-local-deploy</link>
<guid isPermaLink="true">https://blog.publictheta.com/memos/2022-05-10-netlify-local-deploy</guid>
<description><![CDATA[]]></description>
<pubDate>Tue, 10 May 2022 02:47:01 GMT</pubDate>
<category>Netlify</category>
<content:encoded><![CDATA[<p><a href="https://www.netlify.com" target="_blank" rel="noopener noreferrer">Netlify</a>の手動デプロイを使うと、ブラウザまたはCLIからフォルダをアップロードして静的ホストすることができる。</p>
<ul>
<li><a href="https://www.netlify.com" target="_blank" rel="noopener noreferrer">https://www.netlify.com</a></li>
</ul>
<p>ブラウザ（各種メニューの「手動デプロイ」、<a href="https://app.netlify.com/drop" target="_blank" rel="noopener noreferrer">Netlify Drop</a>）からデプロイすることもできるが、ここでは<a href="https://cli.netlify.com" target="_blank" rel="noopener noreferrer">Netlify CLI</a>を使う。</p>
<ul>
<li><a href="https://github.com/netlify/cli/" target="_blank" rel="noopener noreferrer">https://github.com/netlify/cli/</a></li>
</ul>
<h2 id="インストール"><a aria-hidden="true" tabindex="-1" href="#インストール"><span class="icon icon-link"></span></a>インストール</h2>
<p>今回はCI環境では使わないので、グローバルインストールする。</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,bnBtIGluc3RhbGwgbmV0bGlmeS1jbGkgLWc=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> netlify-cli</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -g</span></span></code></pre></figure>
<p>もしCI環境でもNetlify CLIを使うのであれば、開発依存パッケージとしてインストールする。（ビルドには別のCIサービスを使い、デプロイ先だけNetlifyにしたいような場合に便利。）</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,bnBtIGluc3RhbGwgLS1zYXZlLWRldiBuZXRsaWZ5LWNsaQ==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --save-dev</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> netlify-cli</span></span></code></pre></figure>
<p>コマンドが実行できるかを確認するには次を実行する。</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,bmV0bGlmeQ==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">netlify</span></span></code></pre></figure>
<h2 id="ログイン"><a aria-hidden="true" tabindex="-1" href="#ログイン"><span class="icon icon-link"></span></a>ログイン</h2>
<p>現在の環境でログインするには次を実行する。実行するとブラウザが開く。</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,bmV0bGlmeSBsb2dpbg==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">netlify</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> login</span></span></code></pre></figure>
<p>ログイン情報はユーザーディレクトリ以下の次の場所にある<a href="https://docs.netlify.com/cli/get-started/#config-json-location" target="_blank" rel="noopener noreferrer"><code>config.json</code></a>に保存される。</p>
<ul>
<li>macOS: <code>Library/Preferences/netlify/config.json</code></li>
<li>Linux: <code>.config/netlify/config.json</code></li>
<li>Windows: <code>AppData\Roaming\netlify\Config\config.json</code></li>
</ul>
<p>なおアカウントを切り替えるには次を実行する。</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,bmV0bGlmeSBzd2l0Y2g=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">netlify</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> switch</span></span></code></pre></figure>
<h2 id="デプロイ"><a aria-hidden="true" tabindex="-1" href="#デプロイ"><span class="icon icon-link"></span></a>デプロイ</h2>
<p>デプロイには<code>netlify deploy</code>コマンドを使う。</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,bmV0bGlmeSBkZXBsb3k=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">netlify</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> deploy</span></span></code></pre></figure>
<p>何もなしで実行するとカレントディレクトリの中身全てをそのままプレビュー環境にデプロイすることになる。ちなみに初回実行時はディレクトリとサイトが結び付けられていないので、コマンドライン上のプロンプトでサイトを作成または選択することになる。</p>
<p>多くの場合プロジェクトのルートディレクトリにカレントディレクトリがあり、その下にあるビルドディレクトリをアップロードすることになると思う。そのような場合、<code>--dir</code>オプションと使うとアップロードするディレクトリを指定できる。例えばビルドディレクトリがカレントディレクトリの<code>./dist</code>にあるとすると次のようになる。</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,bmV0bGlmeSBkZXBsb3kgLS1kaXI9ZGlzdA==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">netlify</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> deploy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --dir=dist</span></span></code></pre></figure>
<p>上記を実行してもデプロイ先はプレビュー環境になる。本番環境にデプロイし公開したい場合は<code>--prod</code>オプションをつける。</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,bmV0bGlmeSBkZXBsb3kgLS1kaXI9ZGlzdCAtLXByb2Q=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">netlify</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> deploy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --dir=dist</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --prod</span></span></code></pre></figure>
<p>もちろんカレントディレクトリの中身全てを公開したい場合は、<code>--dir</code>を省けばよい。</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,bmV0bGlmeSBkZXBsb3kgLS1wcm9k" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">netlify</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> deploy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --prod</span></span></code></pre></figure>
<p>既存のサイトに対して手動デプロイを行う場合は、<code>--site</code>オプションでサイト名またはサイトIDを指定してアップロードすることもできる。</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,bmV0bGlmeSBkZXBsb3kgLS1kaXI9ZGlzdCAtLXNpdGU9bXktc2l0ZSAtLXByb2Q=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">netlify</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> deploy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --dir=dist</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --site=my-site</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --prod</span></span></code></pre></figure>
<p>既存のサイトの一覧は次のコマンドで確認できる。</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,bmV0bGlmeSBzaXRlczpsaXN0" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">netlify</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> sites:list</span></span></code></pre></figure>
<h2 id="既存サイトとのリンク"><a aria-hidden="true" tabindex="-1" href="#既存サイトとのリンク"><span class="icon icon-link"></span></a>既存サイトとのリンク</h2>
<p>サイトの設定はディレクトリ内の<code>.netlify/state.json</code>に保持される。</p>
<p>サイトとディレクトリを結び付けるには次を実行する。</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,bmV0bGlmeSBsaW5r" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">netlify</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> link</span></span></code></pre></figure>
<p>上記のように何もオプションを指定しないと、プロンプトでサイトを選択することになる。</p>
<p>サイト名を使って結び付けたい場合は、次のように<code>--name</code>オプションを使用する。</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,bmV0bGlmeSBsaW5rIC0tbmFtZSBteS1zaXRl" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">netlify</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> link</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> my-site</span></span></code></pre></figure>
<p>なお先述の通り、既存サイトの一覧は次のコマンドで確認できる。</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,bmV0bGlmeSBzaXRlczpsaXN0" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">netlify</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> sites:list</span></span></code></pre></figure>
<p>逆にリンクを解除したい場合は、次を実行する。</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,bmV0bGlmeSB1bmxpbms=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">netlify</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> unlink</span></span></code></pre></figure>
<h2 id="新規サイトの作成"><a aria-hidden="true" tabindex="-1" href="#新規サイトの作成"><span class="icon icon-link"></span></a>新規サイトの作成</h2>
<p>新しくサイトを作成してディレクトリとリンクするには、次のコマンドを実行する。</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,bmV0bGlmeSBzaXRlczpjcmVhdGU=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">netlify</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> sites:create</span></span></code></pre></figure>
<p>サイト名を指定して作成するには、<code>--name</code>オプションを使用する。</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,bmV0bGlmeSBzaXRlczpjcmVhdGUgLS1uYW1lIG15LXNpdGU=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">netlify</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> sites:create</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> my-site</span></span></code></pre></figure>
<h2 id="参考リンク"><a aria-hidden="true" tabindex="-1" href="#参考リンク"><span class="icon icon-link"></span></a>参考リンク</h2>
<ul>
<li><a href="https://github.com/netlify/cli/" target="_blank" rel="noopener noreferrer">https://github.com/netlify/cli/</a></li>
<li><a href="https://docs.netlify.com/cli/get-started/" target="_blank" rel="noopener noreferrer">https://docs.netlify.com/cli/get-started/</a></li>
<li><a href="https://cli.netlify.com" target="_blank" rel="noopener noreferrer">https://cli.netlify.com</a></li>
</ul>
<h2 id="変更履歴"><a aria-hidden="true" tabindex="-1" href="#変更履歴"><span class="icon icon-link"></span></a>変更履歴</h2>
<h3 id="2022-06-12"><a aria-hidden="true" tabindex="-1" href="#2022-06-12"><span class="icon icon-link"></span></a>2022-06-12</h3>
<ul>
<li>Cloudflare Pagesでも「<a href="https://developers.cloudflare.com/pages/platform/direct-upload/" target="_blank" rel="noopener noreferrer">ダイレクトアップロード</a>」ができるように<a href="https://blog.cloudflare.com/cloudflare-pages-direct-uploads/" target="_blank" rel="noopener noreferrer">なっていた</a>ので、できないとしていた記述を改訂。</li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[Netlify]]></title>
<link>https://blog.publictheta.com/tags/netlify</link>
<guid isPermaLink="true">https://blog.publictheta.com/tags/netlify</guid>
<description><![CDATA[]]></description>
<pubDate>Tue, 10 May 2022 02:47:01 GMT</pubDate>

<content:encoded><![CDATA[<h2 id="リンク"><a aria-hidden="true" tabindex="-1" href="#リンク"><span class="icon icon-link"></span></a>リンク</h2>
<ul>
<li>公式サイト: <a href="https://www.netlify.com" target="_blank" rel="noopener noreferrer">https://www.netlify.com</a></li>
<li>Netlify CLI: <a href="https://cli.netlify.com" target="_blank" rel="noopener noreferrer">https://cli.netlify.com</a></li>
<li>Netlify Docs: <a href="https://docs.netlify.com" target="_blank" rel="noopener noreferrer">https://docs.netlify.com</a></li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[Bevyの座標系]]></title>
<link>https://blog.publictheta.com/memos/2022-04-30-bevy-coordinate-system</link>
<guid isPermaLink="true">https://blog.publictheta.com/memos/2022-04-30-bevy-coordinate-system</guid>
<description><![CDATA[]]></description>
<pubDate>Mon, 02 May 2022 21:25:43 GMT</pubDate>
<category>Rust</category><category>Bevy</category><category>3D</category>
<content:encoded><![CDATA[<p>Bevyでは座標系として、Y軸上向きの右手系が使われている。</p>
<p><img src="https://blog.publictheta.com/uploads/p9KAaQGQaaTTc1yAv5IGB/y-up-right-handed.svg" alt="Y軸上向き右手座標系"></p>
<p>これはMayaやGodot、Minecraftなどとは同じだが、UnityとはZ軸の正負が逆となっている。</p>
<table>
<thead>
<tr>
<th>軸</th>
<th>符号</th>
<th>向き</th>
</tr>
</thead>
<tbody>
<tr>
<td>X</td>
<td>+</td>
<td>右</td>
</tr>
<tr>
<td>X</td>
<td>-</td>
<td>左</td>
</tr>
<tr>
<td>Y</td>
<td>+</td>
<td>上</td>
</tr>
<tr>
<td>Y</td>
<td>-</td>
<td>下</td>
</tr>
<tr>
<td>Z</td>
<td>+</td>
<td>後</td>
</tr>
<tr>
<td>Z</td>
<td>-</td>
<td>前</td>
</tr>
</tbody>
</table>
<h2 id="参考リンク"><a aria-hidden="true" tabindex="-1" href="#参考リンク"><span class="icon icon-link"></span></a>参考リンク</h2>
<ul>
<li><a href="https://github.com/bevyengine/bevy/discussions/1979" target="_blank" rel="noopener noreferrer">https://github.com/bevyengine/bevy/discussions/1979</a></li>
<li><a href="https://github.com/bevyengine/bevy/blob/main/crates/bevy_transform/src/components/transform.rs" target="_blank" rel="noopener noreferrer">https://github.com/bevyengine/bevy/blob/main/crates/bevy_transform/src/components/transform.rs</a></li>
<li><a href="https://docs.rs/bevy/latest/bevy/transform/components/struct.Transform.html" target="_blank" rel="noopener noreferrer">https://docs.rs/bevy/latest/bevy/transform/components/struct.Transform.html</a></li>
<li><a href="https://bevy-cheatbook.github.io/features/coords.html" target="_blank" rel="noopener noreferrer">https://bevy-cheatbook.github.io/features/coords.html</a></li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[3D]]></title>
<link>https://blog.publictheta.com/tags/3d</link>
<guid isPermaLink="true">https://blog.publictheta.com/tags/3d</guid>
<description><![CDATA[]]></description>
<pubDate>Mon, 02 May 2022 21:25:43 GMT</pubDate>

<content:encoded><![CDATA[]]></content:encoded>
</item>
<item>
<title><![CDATA[Bevy]]></title>
<link>https://blog.publictheta.com/tags/bevy</link>
<guid isPermaLink="true">https://blog.publictheta.com/tags/bevy</guid>
<description><![CDATA[]]></description>
<pubDate>Mon, 02 May 2022 21:25:43 GMT</pubDate>

<content:encoded><![CDATA[<h2 id="リンク"><a aria-hidden="true" tabindex="-1" href="#リンク"><span class="icon icon-link"></span></a>リンク</h2>
<ul>
<li>公式サイト: <a href="https://bevyengine.org" target="_blank" rel="noopener noreferrer">https://bevyengine.org</a></li>
<li>公式ブック: <a href="https://bevyengine.org/learn/book/" target="_blank" rel="noopener noreferrer">https://bevyengine.org/learn/book/</a></li>
<li>リポジトリ: <a href="https://github.com/bevyengine/bevy" target="_blank" rel="noopener noreferrer">https://github.com/bevyengine/bevy</a></li>
<li><code>docs.rs</code>: <a href="https://docs.rs/bevy/latest/bevy/" target="_blank" rel="noopener noreferrer">https://docs.rs/bevy/latest/bevy/</a></li>
<li>チートブック: <a href="https://bevy-cheatbook.github.io/" target="_blank" rel="noopener noreferrer">https://bevy-cheatbook.github.io/</a></li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[`vscode.dev`に開発中の拡張機能をローカルから読み込む]]></title>
<link>https://blog.publictheta.com/memos/2022-04-11-vscode-side-load-extension</link>
<guid isPermaLink="true">https://blog.publictheta.com/memos/2022-04-11-vscode-side-load-extension</guid>
<description><![CDATA[]]></description>
<pubDate>Mon, 11 Apr 2022 17:39:44 GMT</pubDate>
<category>VS Code</category><category>VS Code拡張機能</category>
<content:encoded><![CDATA[<p><a href="https://vscode.dev/" target="_blank" rel="noopener noreferrer"><code>vscode.dev</code></a>では、ローカルで開発中の拡張機能をマーケットプレイスなどに公開することなく、実際にインストールして試すことができる。</p>
<p>仕組みとしては、ローカルサーバーでホストした拡張機能を<a href="https://github.com/localtunnel/localtunnel" target="_blank" rel="noopener noreferrer"><code>localtunnel</code></a>を使ってグローバルにアクセスできるようにし、それを<code>vscode.dev</code>の<code>Developer: Install Web Extension</code>コマンドによってサイドロードする、という流れになっている。</p>
<p>なお、<code>localtunnel</code>によるトンネリングに使うサーバーにはデフォルトで<code>https://localtunnel.me</code>が使われるようになっているが、自前でホストすることも<a href="https://github.com/localtunnel/server" target="_blank" rel="noopener noreferrer">可能</a>。もちろんトンネリングには別のツールを使ってもいいのだが、VS Codeの公式ドキュメントで紹介されていたので、ここではそのまま<code>localtunnel</code>を使うことにする。</p>
<h2 id="方法"><a aria-hidden="true" tabindex="-1" href="#方法"><span class="icon icon-link"></span></a>方法</h2>
<p>ローカルサーバーのポート番号としてここでは<code>8080</code>を使うことにする。</p>
<p>まずターミナルを一つ開いてローカルサーバーを立ち上げ拡張機能をホストする（ビルドが必要な場合あらかじめビルドしておく）:</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,bnB4IHNlcnZlIC0tY29ycyAtbCA4MDgw" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npx</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> serve</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --cors</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -l</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 8080</span></span></code></pre></figure>
<p>次に別のターミナルを開いてトンネリングを開始する:</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,bnB4IGxvY2FsdHVubmVsIC1wIDgwODA=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npx</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> localtunnel</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -p</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 8080</span></span></code></pre></figure>
<p>ここで発行される次のようなURLをコピーしてメモしておく:</p>
<figure data-code-block="" data-language="text"><figcaption><span class="code-block-language">text</span><div class="code-block-actions"><a download="code.text" href="data:text/plain;charset=utf-8;base64,eW91ciB1cmwgaXM6IGh0dHBzOi8vaHVuZ3J5LW1vbGUtNDgubG9jYS5sdC8=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-text"><span class="line"><span>your url is: https://hungry-mole-48.loca.lt/</span></span></code></pre></figure>
<p>まずURLブラウザでこのURLを開き、そこで表示される</p>
<figure data-code-block="" data-language="text"><figcaption><span class="code-block-language">text</span><div class="code-block-actions"><a download="code.text" href="data:text/plain;charset=utf-8;base64,Q2xpY2sgdG8gQ29udGludWU=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-text"><span class="line"><span>Click to Continue</span></span></code></pre></figure>
<p>という青いボタンを、注意を読んだ上で押す。</p>
<p>あとは<code>vscode.dev</code>のコマンドパレットから:</p>
<figure data-code-block="" data-language="text"><figcaption><span class="code-block-language">text</span><div class="code-block-actions"><a download="code.text" href="data:text/plain;charset=utf-8;base64,RGV2ZWxvcGVyOiBJbnN0YWxsIFdlYiBFeHRlbnNpb24uLi4=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-text"><span class="line"><span>Developer: Install Web Extension...</span></span></code></pre></figure>
<p>を実行し、発行されたURLを入力欄にペーストしてEnterすると、拡張機能の読み込みが実行される。</p>
<h2 id="参考リンク"><a aria-hidden="true" tabindex="-1" href="#参考リンク"><span class="icon icon-link"></span></a>参考リンク</h2>
<ul>
<li>公式ドキュメント: Web Extensions - Test your web extension in on vscode.dev
<ul>
<li><a href="https://code.visualstudio.com/api/extension-guides/web-extensions#test-your-web-extension-in-on-vscode.dev" target="_blank" rel="noopener noreferrer">https://code.visualstudio.com/api/extension-guides/web-extensions#test-your-web-extension-in-on-vscode.dev</a></li>
</ul>
</li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[VS Code]]></title>
<link>https://blog.publictheta.com/tags/vscode</link>
<guid isPermaLink="true">https://blog.publictheta.com/tags/vscode</guid>
<description><![CDATA[]]></description>
<pubDate>Mon, 11 Apr 2022 17:39:44 GMT</pubDate>

<content:encoded><![CDATA[<h2 id="リンク"><a aria-hidden="true" tabindex="-1" href="#リンク"><span class="icon icon-link"></span></a>リンク</h2>
<ul>
<li>公式サイト: <a href="https://code.visualstudio.com/" target="_blank" rel="noopener noreferrer">https://code.visualstudio.com/</a></li>
<li>リポジトリ: <a href="https://github.com/microsoft/vscode" target="_blank" rel="noopener noreferrer">https://github.com/microsoft/vscode</a></li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[VS Code拡張機能]]></title>
<link>https://blog.publictheta.com/tags/vscode-extension</link>
<guid isPermaLink="true">https://blog.publictheta.com/tags/vscode-extension</guid>
<description><![CDATA[]]></description>
<pubDate>Mon, 11 Apr 2022 17:39:44 GMT</pubDate>

<content:encoded><![CDATA[<h2 id="リンク"><a aria-hidden="true" tabindex="-1" href="#リンク"><span class="icon icon-link"></span></a>リンク</h2>
<ul>
<li>公式ドキュメンテーション: <a href="https://code.visualstudio.com/api" target="_blank" rel="noopener noreferrer">https://code.visualstudio.com/api</a></li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[TypeScriptのイテレーターとジェネレーター]]></title>
<link>https://blog.publictheta.com/articles/2022-04-03-typescript-iterator-generator</link>
<guid isPermaLink="true">https://blog.publictheta.com/articles/2022-04-03-typescript-iterator-generator</guid>
<description><![CDATA[]]></description>
<pubDate>Mon, 04 Apr 2022 02:08:06 GMT</pubDate>
<category>TypeScript</category>
<content:encoded><![CDATA[<h2 id="ecmascriptの反復処理インターフェース"><a aria-hidden="true" tabindex="-1" href="#ecmascriptの反復処理インターフェース"><span class="icon icon-link"></span></a>ECMAScriptの反復処理インターフェース</h2>
<p>ECMAScript（現行: 2023）では、反復処理（iteration）のためのインターフェースとして、</p>
<ul>
<li><a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-iterable-interface" target="_blank" rel="noopener noreferrer"><code>Iterable</code></a></li>
<li><a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-iterator-interface" target="_blank" rel="noopener noreferrer"><code>Iterator</code></a></li>
<li><a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-asynciterable-interface" target="_blank" rel="noopener noreferrer"><code>AsyncIterable</code></a></li>
<li><a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-asynciterator-interface" target="_blank" rel="noopener noreferrer"><code>AsyncIterator</code></a></li>
<li><a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-iteratorresult-interface" target="_blank" rel="noopener noreferrer"><code>IteratorResult</code></a></li>
</ul>
<p>の5つが定義されている。</p>
<h3 id="iterable"><a aria-hidden="true" tabindex="-1" href="#iterable"><span class="icon icon-link"></span></a>Iterable</h3>
<p><a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-iterable-interface" target="_blank" rel="noopener noreferrer"><code>Iterable</code></a>は、<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-iterator-interface" target="_blank" rel="noopener noreferrer"><code>Iterator</code></a>にしたがうオブジェクトを返す関数<code>@@iterator</code>（<a href="https://tc39.es/ecma262/multipage/fundamental-objects.html#sec-symbol.iterator" target="_blank" rel="noopener noreferrer"><code>Symbol.iterator</code></a>）をプロパティとして必ず持つことを示すインターフェースである。</p>
<p>TypeScriptではそのまま次のように定義されている。</p>
<p><a href="https://github.com/microsoft/TypeScript/blob/b1a25fd8b1adec4514809d54d96b64069887652c/src/lib/es2015.iterable.d.ts#L30-L32" target="_blank" rel="noopener noreferrer"><code>src/lib/es2015.iterable.d.ts#L30-L32</code></a></p>
<figure data-code-block="" data-language="ts"><figcaption><span class="code-block-language">ts</span><div class="code-block-actions"><a download="code.ts" href="data:text/plain;charset=utf-8;base64,aW50ZXJmYWNlIEl0ZXJhYmxlPFQ+IHsKICAgIFtTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhdG9yPFQ+Owp9" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-ts"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">interface</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Iterable</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    [Symbol.iterator]()</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Iterator</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<p>※引用するコードにもともとあったコメントは省略してある。以下同様。</p>
<p>この<code>@@iterator</code>は、<code>for...of</code>文、<code>yield*</code>式、<code>...</code>演算子などを使った際にも暗黙的に呼ばれる（抽象操作<a href="https://tc39.es/ecma262/multipage/abstract-operations.html#sec-getiterator" target="_blank" rel="noopener noreferrer"><code>GetIterator</code></a>を参照）。</p>
<figure data-code-block="" data-language="ts"><figcaption><span class="code-block-language">ts</span><div class="code-block-actions"><a download="code.ts" href="data:text/plain;charset=utf-8;base64,Zm9yIChjb25zdCBpdGVtIG9mIFsxLCAyLCAzLCA0XSkgewogICAgY29uc29sZS5sb2coaXRlbSkKfQ==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-ts"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> item</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> of</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(item)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<h3 id="asynciterable"><a aria-hidden="true" tabindex="-1" href="#asynciterable"><span class="icon icon-link"></span></a>AsyncIterable</h3>
<p><a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-asynciterable-interface" target="_blank" rel="noopener noreferrer"><code>AsyncIterable</code></a>は、<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-iterable-interface" target="_blank" rel="noopener noreferrer"><code>Iterable</code></a>の非同期版で、<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-asynciterator-interface" target="_blank" rel="noopener noreferrer"><code>AsyncIterator</code></a>にしたがうオブジェクトを返す関数<code>@@asyncIterator</code>（<a href="https://tc39.es/ecma262/multipage/fundamental-objects.html#sec-symbol.asynciterator" target="_blank" rel="noopener noreferrer"><code>Symbol.asyncIterator</code></a>）をプロパティとして必ず持つことを示すインターフェースである。</p>
<p>こちらもTypeScriptではそのまま次のように定義されている。</p>
<p><a href="https://github.com/microsoft/TypeScript/blob/b1a25fd8b1adec4514809d54d96b64069887652c/src/lib/es2018.asynciterable.d.ts#L19-L21" target="_blank" rel="noopener noreferrer"><code>src/lib/es2018.asynciterable.d.ts#L19-L21</code></a></p>
<figure data-code-block="" data-language="ts"><figcaption><span class="code-block-language">ts</span><div class="code-block-actions"><a download="code.ts" href="data:text/plain;charset=utf-8;base64,aW50ZXJmYWNlIEFzeW5jSXRlcmFibGU8VD4gewogICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOiBBc3luY0l0ZXJhdG9yPFQ+Owp9" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-ts"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">interface</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> AsyncIterable</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    [Symbol.asyncIterator]()</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> AsyncIterator</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<p>この<code>@@asyncIterator</code>も、<code>for await...of</code>文、<code>yield*</code>式、などを使った際に暗黙的に呼ばれうる（同じく抽象操作<a href="https://tc39.es/ecma262/multipage/abstract-operations.html#sec-getiterator" target="_blank" rel="noopener noreferrer"><code>GetIterator</code></a>を参照）。</p>
<h3 id="iterator"><a aria-hidden="true" tabindex="-1" href="#iterator"><span class="icon icon-link"></span></a>Iterator</h3>
<p><a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-iterator-interface" target="_blank" rel="noopener noreferrer"><code>Iterator</code></a>は、<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-iteratorresult-interface" target="_blank" rel="noopener noreferrer"><code>IteratorResult</code></a>を返す関数<code>next</code>をプロパティとして必ず持ち、オプションとして同じく<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-iteratorresult-interface" target="_blank" rel="noopener noreferrer"><code>IteratorResult</code></a>を返す関数<code>return</code>、<code>throw</code>を持つことを示すインターフェースとなっている。</p>
<p>TypeScriptでの定義は次のようになっている。</p>
<p><a href="https://github.com/microsoft/TypeScript/blob/b1a25fd8b1adec4514809d54d96b64069887652c/src/lib/es2015.iterable.d.ts#L23-L28" target="_blank" rel="noopener noreferrer"><code>src/lib/es2015.iterable.d.ts#L23-L28</code></a></p>
<figure data-code-block="" data-language="ts"><figcaption><span class="code-block-language">ts</span><div class="code-block-actions"><a download="code.ts" href="data:text/plain;charset=utf-8;base64,aW50ZXJmYWNlIEl0ZXJhdG9yPFQsIFRSZXR1cm4gPSBhbnksIFROZXh0ID0gdW5kZWZpbmVkPiB7CiAgICBuZXh0KC4uLmFyZ3M6IFtdIHwgW1ROZXh0XSk6IEl0ZXJhdG9yUmVzdWx0PFQsIFRSZXR1cm4+OwogICAgcmV0dXJuPyh2YWx1ZT86IFRSZXR1cm4pOiBJdGVyYXRvclJlc3VsdDxULCBUUmV0dXJuPjsKICAgIHRocm93PyhlPzogYW55KTogSXRlcmF0b3JSZXN1bHQ8VCwgVFJldHVybj47Cn0=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-ts"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">interface</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Iterator</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TReturn</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> any</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TNext</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> undefined</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    next</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">...</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">args</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TNext</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">])</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> IteratorResult</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TReturn</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    return</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">?</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">value</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">?:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> TReturn</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> IteratorResult</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TReturn</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    throw</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">?</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">e</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">?:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> any</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> IteratorResult</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TReturn</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<p>反復は<code>next</code>を呼ぶことによって進められる。<code>next</code>は引数を任意で1つとり、<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-iteratorresult-interface" target="_blank" rel="noopener noreferrer"><code>IteratorResult</code></a>を返す。ECMAScriptの仕様には、一度<code>done</code>が<code>true</code>の<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-iteratorresult-interface" target="_blank" rel="noopener noreferrer"><code>IteratorResult</code></a>が返されたら、それ以降返される<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-iteratorresult-interface" target="_blank" rel="noopener noreferrer"><code>IteratorResult</code></a>の<code>done</code>はすべて<code>true</code>であるべき旨が書かれているが、一方でこの要求は強制的なものではないとも書かれている。</p>
<p>またECMAScriptの仕様には、<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-iterator-interface" target="_blank" rel="noopener noreferrer"><code>Iterator</code></a>は<code>next</code>が引数なしで呼ばれることもあることを前提としなければならない旨の注釈も付け加えられてある。TypeScriptでの<code>next</code>の引数がタプルで表現されているのはそのチェックを厳密にするためであると思われる（省略したソースコード中のコメントにそのような旨が記載されている）。</p>
<p><code>return</code>と<code>throw</code>はそれぞれ<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-iterator-interface" target="_blank" rel="noopener noreferrer"><code>Iterator</code></a>に反復処理の終了やエラーによる中断を知らせるためのもので、ECMAScriptの仕様では、典型的な振る舞いは<code>value</code>で指定した値を<code>value</code>として持つ<code>IteratorResult</code>を返したり、<code>e</code>で指定した値を<code>throw</code>したりして、以降の<code>IteratorResult</code>の<code>done</code>を<code>true</code>にすることであるが、実際の振る舞いは<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-iterator-interface" target="_blank" rel="noopener noreferrer"><code>Iterator</code></a>がどのように実装されているかに依存するとされている。</p>
<h3 id="asynciterator"><a aria-hidden="true" tabindex="-1" href="#asynciterator"><span class="icon icon-link"></span></a>AsyncIterator</h3>
<p><a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-asynciterator-interface" target="_blank" rel="noopener noreferrer"><code>AsyncIterator</code></a>は、<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-iterator-interface" target="_blank" rel="noopener noreferrer"><code>Iterator</code></a>の非同期版で、プロパティとしてもつ関数がすべて、<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-iteratorresult-interface" target="_blank" rel="noopener noreferrer"><code>IteratorResult</code></a>の代わりに<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-iteratorresult-interface" target="_blank" rel="noopener noreferrer"><code>IteratorResult</code></a>の<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-promise-objects" target="_blank" rel="noopener noreferrer"><code>Promise</code></a>を返すインターフェスである。</p>
<p>TypeScriptでの定義は次のようになっている。</p>
<p><a href="https://github.com/microsoft/TypeScript/blob/b1a25fd8b1adec4514809d54d96b64069887652c/src/lib/es2018.asynciterable.d.ts#L12-L17" target="_blank" rel="noopener noreferrer"><code>src/lib/es2018.asynciterable.d.ts#L12-L17</code></a></p>
<figure data-code-block="" data-language="ts"><figcaption><span class="code-block-language">ts</span><div class="code-block-actions"><a download="code.ts" href="data:text/plain;charset=utf-8;base64,aW50ZXJmYWNlIEFzeW5jSXRlcmF0b3I8VCwgVFJldHVybiA9IGFueSwgVE5leHQgPSB1bmRlZmluZWQ+IHsKICAgIG5leHQoLi4uYXJnczogW10gfCBbVE5leHRdKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxULCBUUmV0dXJuPj47CiAgICByZXR1cm4/KHZhbHVlPzogVFJldHVybiB8IFByb21pc2VMaWtlPFRSZXR1cm4+KTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxULCBUUmV0dXJuPj47CiAgICB0aHJvdz8oZT86IGFueSk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VCwgVFJldHVybj4+Owp9" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-ts"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">interface</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> AsyncIterator</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TReturn</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> any</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TNext</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> undefined</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    next</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">...</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">args</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TNext</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">])</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Promise</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">IteratorResult</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TReturn</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>>;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    return</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">?</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">value</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">?:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> TReturn</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> |</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> PromiseLike</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TReturn</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>)</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Promise</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">IteratorResult</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TReturn</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>>;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    throw</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">?</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">e</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">?:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> any</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Promise</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">IteratorResult</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TReturn</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>>;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<h3 id="iteratorresult"><a aria-hidden="true" tabindex="-1" href="#iteratorresult"><span class="icon icon-link"></span></a>IteratorResult</h3>
<p>イテレーターから返される<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-iteratorresult-interface" target="_blank" rel="noopener noreferrer"><code>IteratorResult</code></a>は、<code>done</code>と<code>value</code>の二つの値をプロパティーとして持ちうるインターフェースである。<code>done</code>は<code>true</code>または<code>false</code>、<code>value</code>は任意のECMAScriptの値をとるが、存在しない可能性もある。</p>
<p><code>done</code>が<code>false</code>または存在しない場合、<code>value</code>の値は反復の一要素として解釈される。一方、<code>done</code>が<code>true</code>である場合、それは反復の終了を意味し、そのときの<code>value</code>はイテレーター自体の返却値として解釈される。</p>
<p>これをTypeScriptでは次のように表現している。</p>
<p><a href="https://github.com/microsoft/TypeScript/blob/b1a25fd8b1adec4514809d54d96b64069887652c/src/lib/es2015.iterable.d.ts#L11-L21" target="_blank" rel="noopener noreferrer"><code>src/lib/es2015.iterable.d.ts#L11-L21</code></a></p>
<figure data-code-block="" data-language="ts"><figcaption><span class="code-block-language">ts</span><div class="code-block-actions"><a download="code.ts" href="data:text/plain;charset=utf-8;base64,aW50ZXJmYWNlIEl0ZXJhdG9yWWllbGRSZXN1bHQ8VFlpZWxkPiB7CiAgICBkb25lPzogZmFsc2U7CiAgICB2YWx1ZTogVFlpZWxkOwp9CgppbnRlcmZhY2UgSXRlcmF0b3JSZXR1cm5SZXN1bHQ8VFJldHVybj4gewogICAgZG9uZTogdHJ1ZTsKICAgIHZhbHVlOiBUUmV0dXJuOwp9Cgp0eXBlIEl0ZXJhdG9yUmVzdWx0PFQsIFRSZXR1cm4gPSBhbnk+ID0gSXRlcmF0b3JZaWVsZFJlc3VsdDxUPiB8IEl0ZXJhdG9yUmV0dXJuUmVzdWx0PFRSZXR1cm4+Ow==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-ts"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">interface</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> IteratorYieldResult</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TYield</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> {</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">    done</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">?:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">    value</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> TYield</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">interface</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> IteratorReturnResult</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TReturn</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> {</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">    done</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">    value</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> TReturn</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">type</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> IteratorResult</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TReturn</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> any</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> IteratorYieldResult</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> IteratorReturnResult</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TReturn</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>;</span></span></code></pre></figure>
<h2 id="組み込みの反復可能オブジェクト"><a aria-hidden="true" tabindex="-1" href="#組み込みの反復可能オブジェクト"><span class="icon icon-link"></span></a>組み込みの反復可能オブジェクト</h2>
<p>ECMAScriptで定義されている次の組み込みオブジェクトは<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-iterable-interface" target="_blank" rel="noopener noreferrer"><code>Iterable</code></a>インターフェースを満たしてる。</p>
<ul>
<li><a href="https://tc39.es/ecma262/multipage/text-processing.html#sec-string-objects" target="_blank" rel="noopener noreferrer"><code>String</code></a></li>
<li><a href="https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array-objects" target="_blank" rel="noopener noreferrer"><code>Array</code></a></li>
<li><a href="https://tc39.es/ecma262/multipage/indexed-collections.html#sec-typedarray-objects" target="_blank" rel="noopener noreferrer"><code>TypedArray</code></a></li>
<li><a href="https://tc39.es/ecma262/multipage/keyed-collections.html#sec-map-objects" target="_blank" rel="noopener noreferrer"><code>Map</code></a></li>
<li><a href="https://tc39.es/ecma262/multipage/keyed-collections.html#sec-set-objects" target="_blank" rel="noopener noreferrer"><code>Set</code></a></li>
</ul>
<p>そのため、これらのオブジェクトは、<code>for...of</code>などで直接反復させることができる。</p>
<figure data-code-block="" data-language="ts"><figcaption><span class="code-block-language">ts</span><div class="code-block-actions"><a download="code.ts" href="data:text/plain;charset=utf-8;base64,Zm9yIChjb25zdCBjaGFyIG9mICJhYmMiKSB7CiAgY29uc29sZS5sb2coY2hhcikKfQ==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-ts"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> char</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> of</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "abc"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(char)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<h2 id="イテレーターの反復可能性"><a aria-hidden="true" tabindex="-1" href="#イテレーターの反復可能性"><span class="icon icon-link"></span></a>イテレーターの反復可能性</h2>
<h3 id="iterableiterator"><a aria-hidden="true" tabindex="-1" href="#iterableiterator"><span class="icon icon-link"></span></a>IterableIterator</h3>
<p>ECMAScriptで定義されている上記のような<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-iterator-interface" target="_blank" rel="noopener noreferrer"><code>Iterator</code></a>を満たすオブジェクトは、そのイテレーター自身（<code>this</code>）を返す<code>@@iterator</code>（<a href="https://tc39.es/ecma262/multipage/fundamental-objects.html#sec-symbol.iterator" target="_blank" rel="noopener noreferrer"><code>Symbol.iterator</code></a>）をプロパティとして持つプロトタイプ<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-%iteratorprototype%25-object" target="_blank" rel="noopener noreferrer"><code>%IteratorPrototype%</code></a>を継承しているため、イテレーター自身も<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-iterable-interface" target="_blank" rel="noopener noreferrer"><code>Iterable</code></a>インターフェースを満たしている。</p>
<p>これをTypeScriptでは次のように再帰的に表現している。</p>
<p><a href="https://github.com/microsoft/TypeScript/blob/b1a25fd8b1adec4514809d54d96b64069887652c/src/lib/es2015.iterable.d.ts#L34-L36" target="_blank" rel="noopener noreferrer"><code>src/lib/es2015.iterable.d.ts#L34-L36</code></a></p>
<figure data-code-block="" data-language="ts"><figcaption><span class="code-block-language">ts</span><div class="code-block-actions"><a download="code.ts" href="data:text/plain;charset=utf-8;base64,aW50ZXJmYWNlIEl0ZXJhYmxlSXRlcmF0b3I8VD4gZXh0ZW5kcyBJdGVyYXRvcjxUPiB7CiAgICBbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPFQ+Owp9" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-ts"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">interface</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> IterableIterator</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">extends</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Iterator</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    [Symbol.iterator]()</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> IterableIterator</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<p>これを使って例えば<code>Array</code>の<code>interface</code>の一部は、次のように定義されている。</p>
<p><a href="https://github.com/microsoft/TypeScript/blob/b1a25fd8b1adec4514809d54d96b64069887652c/src/lib/es2015.iterable.d.ts#L38-L56" target="_blank" rel="noopener noreferrer"><code>src/lib/es2015.iterable.d.ts#L38-L56</code></a></p>
<figure data-code-block="" data-language="ts"><figcaption><span class="code-block-language">ts</span><div class="code-block-actions"><a download="code.ts" href="data:text/plain;charset=utf-8;base64,aW50ZXJmYWNlIEFycmF5PFQ+IHsKICAgIFtTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8VD47CiAgICBlbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W251bWJlciwgVF0+OwogICAga2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPG51bWJlcj47CiAgICB2YWx1ZXMoKTogSXRlcmFibGVJdGVyYXRvcjxUPjsKfQ==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-ts"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">interface</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Array</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    [Symbol.iterator]()</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> IterableIterator</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    entries</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> IterableIterator</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">number</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]>;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    keys</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> IterableIterator</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">number</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    values</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> IterableIterator</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<h3 id="asynciterableiterator"><a aria-hidden="true" tabindex="-1" href="#asynciterableiterator"><span class="icon icon-link"></span></a>AsyncIterableIterator</h3>
<p>ECMAScriptで定義されている<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-asynciterator-interface" target="_blank" rel="noopener noreferrer"><code>AsyncIterator</code></a>を満たすオブジェクトもまた、そのイテレーター自身（<code>this</code>）を返す<code>@@asyncIterator</code>（<a href="https://tc39.es/ecma262/multipage/fundamental-objects.html#sec-symbol.asynciterator" target="_blank" rel="noopener noreferrer"><code>Symbol.asyncIterator</code></a>）をプロパティとして持つプロトタイプ<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-asynciteratorprototype" target="_blank" rel="noopener noreferrer"><code>%AsyncIteratorPrototype%</code></a>を継承しているため、イテレーター自身が<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-asynciterable-interface" target="_blank" rel="noopener noreferrer"><code>AsyncIterable</code></a>インターフェースを満たすようになっている。</p>
<p>これもTypeScriptでは同様に次のように再帰的に表現している。</p>
<p><a href="https://github.com/microsoft/TypeScript/blob/b1a25fd8b1adec4514809d54d96b64069887652c/src/lib/es2018.asynciterable.d.ts#L23-L25" target="_blank" rel="noopener noreferrer">src/lib/es2018.asynciterable.d.ts#L23-L25</a></p>
<figure data-code-block="" data-language="ts"><figcaption><span class="code-block-language">ts</span><div class="code-block-actions"><a download="code.ts" href="data:text/plain;charset=utf-8;base64,aW50ZXJmYWNlIEFzeW5jSXRlcmFibGVJdGVyYXRvcjxUPiBleHRlbmRzIEFzeW5jSXRlcmF0b3I8VD4gewogICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOiBBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VD47Cn0=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-ts"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">interface</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> AsyncIterableIterator</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">extends</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> AsyncIterator</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    [Symbol.asyncIterator]()</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> AsyncIterableIterator</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<h2 id="イテレーターと反復可能オブジェクトの作成"><a aria-hidden="true" tabindex="-1" href="#イテレーターと反復可能オブジェクトの作成"><span class="icon icon-link"></span></a>イテレーターと反復可能オブジェクトの作成</h2>
<p>先に挙げたインターフェースを満たすようにオブジェクトを作成すれば、自身でイテレーターや反復可能オブジェクトを作成することもできる。</p>
<p>たとえば、次のコードは<code>1</code>から<code>10</code>を出力する。</p>
<figure data-code-block="" data-language="ts"><figcaption><span class="code-block-language">ts</span><div class="code-block-actions"><a download="code.ts" href="data:text/plain;charset=utf-8;base64,Y29uc3QgT05FX1RPX1RFTiA9IHsKICBbU3ltYm9sLml0ZXJhdG9yXSgpIHsKICAgIGxldCBpID0gMDsKICAgIHJldHVybiB7CiAgICAgIG5leHQ6ICgpID0+IHsKICAgICAgICBpICs9IDE7CiAgICAgICAgcmV0dXJuIGkgPD0gMTAgPyB7CiAgICAgICAgICB2YWx1ZTogaSwKICAgICAgICB9IDogewogICAgICAgICAgZG9uZTogdHJ1ZQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQoKZm9yIChjb25zdCBpIG9mIE9ORV9UT19URU4pIHsKICBjb25zb2xlLmxvZyhpKQp9" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-ts"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> ONE_TO_TEN</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  [Symbol.iterator]() {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">      next</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 10</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> ?</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          value: i,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          done: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> of</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> ONE_TO_TEN</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(i)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<h2 id="ジェネレーター関数とジェネレーター"><a aria-hidden="true" tabindex="-1" href="#ジェネレーター関数とジェネレーター"><span class="icon icon-link"></span></a>ジェネレーター関数とジェネレーター</h2>
<p>組み込みの反復可能オブジェクトのように、<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-iterator-interface" target="_blank" rel="noopener noreferrer"><code>Iterator</code></a>でありかつ<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-iterable-interface" target="_blank" rel="noopener noreferrer"><code>Iterable</code></a>、あるいは<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-asynciterator-interface" target="_blank" rel="noopener noreferrer"><code>AsyncIterator</code></a>でありかつ<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-asynciterable-interface" target="_blank" rel="noopener noreferrer"><code>AsyncIterable</code></a>であるようなイテレーターを作成するために、ECMAScriptではジェネレーター関数というものが用意されている。</p>
<ul>
<li><a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-generatorfunction-objects" target="_blank" rel="noopener noreferrer"><code>GeneratorFunction</code></a></li>
<li><a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-generator-objects" target="_blank" rel="noopener noreferrer"><code>Generator</code></a></li>
<li><a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-asyncgeneratorfunction-objects" target="_blank" rel="noopener noreferrer"><code>AsyncGeneratorFunction</code></a></li>
<li><a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-asyncgenerator-objects" target="_blank" rel="noopener noreferrer"><code>AsyncGenerator</code></a></li>
</ul>
<p><a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-generatorfunction-objects" target="_blank" rel="noopener noreferrer"><code>GeneratorFunction</code></a>は、<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-iterator-interface" target="_blank" rel="noopener noreferrer"><code>Iterator</code></a>でありかつ<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-iterable-interface" target="_blank" rel="noopener noreferrer"><code>Iterable</code></a>なオブジェクト<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-generator-objects" target="_blank" rel="noopener noreferrer"><code>Generator</code></a>を返す関数であり、<code>function*</code>を使って定義される。</p>
<p><a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-asyncgeneratorfunction-objects" target="_blank" rel="noopener noreferrer"><code>AsyncGeneratorFunction</code></a>はその非同期版で、<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-asynciterator-interface" target="_blank" rel="noopener noreferrer"><code>AsyncIterator</code></a>でありかつ<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-asynciterable-interface" target="_blank" rel="noopener noreferrer"><code>AsyncIterable</code></a>なオブジェクト<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-asyncgenerator-objects" target="_blank" rel="noopener noreferrer"><code>AsyncGenerator</code></a>を返す関数であり、<code>async function*</code>を使って定義される。</p>
<p>これらのジェネレーター関数の中では、値を反復の一要素として出力する<code>yield</code>や、処理を別のジェネレーターや反復可能オブジェクトに委任する<code>yield*</code>が使えるため、反復処理を柔軟に記述することができる。</p>
<p>たとえば、<code>ONE_TO_TEN</code>を定義して作成した<code>1</code>から<code>10</code>を出力するコードは、<code>lo</code>から<code>hi</code>まで（両端含む）の<code>number</code>を列挙する<code>range</code>関数をジェネレーター関数として定義することで、次のように書き直すことができる。</p>
<figure data-code-block="" data-language="ts"><figcaption><span class="code-block-language">ts</span><div class="code-block-actions"><a download="code.ts" href="data:text/plain;charset=utf-8;base64,ZnVuY3Rpb24qIHJhbmdlKGxvOiBudW1iZXIsIGhpOiBudW1iZXIpOiBHZW5lcmF0b3I8bnVtYmVyPiB7CiAgZm9yIChsZXQgaSA9IGxvOyBpIDw9IGhpOyBpKyspIHsKICAgIHlpZWxkIGk7CiAgfQp9Cgpmb3IgKGNvbnN0IGkgb2YgcmFuZ2UoMSwgMTApKSB7CiAgY29uc29sZS5sb2coaSkKfQ==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-ts"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">function*</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> range</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">lo</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> number</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">hi</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> number</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Generator</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">number</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> lo; i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> hi; i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    yield</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> of</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> range</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(i)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<p><a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-generator-objects" target="_blank" rel="noopener noreferrer"><code>Generator</code></a>は、TypeScriptでは次のように定義されている。</p>
<p><a href="https://github.com/microsoft/TypeScript/blob/b1a25fd8b1adec4514809d54d96b64069887652c/src/lib/es2015.generator.d.ts#L3-L9" target="_blank" rel="noopener noreferrer"><code>src/lib/es2015.generator.d.ts#L3-L9</code></a></p>
<figure data-code-block="" data-language="ts"><figcaption><span class="code-block-language">ts</span><div class="code-block-actions"><a download="code.ts" href="data:text/plain;charset=utf-8;base64,aW50ZXJmYWNlIEdlbmVyYXRvcjxUID0gdW5rbm93biwgVFJldHVybiA9IGFueSwgVE5leHQgPSB1bmtub3duPiBleHRlbmRzIEl0ZXJhdG9yPFQsIFRSZXR1cm4sIFROZXh0PiB7CiAgICBuZXh0KC4uLmFyZ3M6IFtdIHwgW1ROZXh0XSk6IEl0ZXJhdG9yUmVzdWx0PFQsIFRSZXR1cm4+OwogICAgcmV0dXJuKHZhbHVlOiBUUmV0dXJuKTogSXRlcmF0b3JSZXN1bHQ8VCwgVFJldHVybj47CiAgICB0aHJvdyhlOiBhbnkpOiBJdGVyYXRvclJlc3VsdDxULCBUUmV0dXJuPjsKICAgIFtTeW1ib2wuaXRlcmF0b3JdKCk6IEdlbmVyYXRvcjxULCBUUmV0dXJuLCBUTmV4dD47Cn0=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-ts"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">interface</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Generator</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> unknown</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TReturn</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> any</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TNext</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> unknown</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">extends</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Iterator</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TReturn</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TNext</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    next</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">...</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">args</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TNext</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">])</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> IteratorResult</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TReturn</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">value</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> TReturn</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> IteratorResult</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TReturn</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    throw</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">e</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> any</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> IteratorResult</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TReturn</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    [Symbol.iterator]()</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Generator</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TReturn</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TNext</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<p><code>IterableIterator</code>との違いは、<code>return</code>と<code>throw</code>、およびそれらの引数にあった<code>?</code>がついていない点で、典型的な<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-iterator-interface" target="_blank" rel="noopener noreferrer"><code>Iterator</code></a>の振る舞いとして先に述べておいた、<code>return</code>の場合<code>value</code>をそのまま返して終了し、<code>throw</code>の場合<code>e</code>を<code>throw</code>して終了する、という既定の動作が自動で定義されるようになっている。</p>
<p>また<code>next</code>に対して与えた引数は、<code>yield</code>の返却値として与えられるようになっており、ジェネレーター関数内で受け取れるようになっている。</p>
<figure data-code-block="" data-language="ts"><figcaption><span class="code-block-language">ts</span><div class="code-block-actions"><a download="code.ts" href="data:text/plain;charset=utf-8;base64,ZnVuY3Rpb24qIG1ha2VMb2dnZXIobGltaXQ6IG51bWJlcik6IEdlbmVyYXRvcjx2b2lkLCB2b2lkLCBzdHJpbmc+IHsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGltaXQ7IGkrKykgewogICAgICAgIGNvbnNvbGUubG9nKHlpZWxkKQogICAgfQp9Cgpjb25zdCBsb2dnZXIgPSBtYWtlTG9nZ2VyKDMpCmxvZ2dlci5uZXh0KCJoZWxsbyIpIC8vICJoZWxsbyIKbG9nZ2VyLm5leHQoImhlbGxvIikgLy8gImhlbGxvIgpsb2dnZXIubmV4dCgiaGVsbG8iKSAvLyAiaGVsbG8iCmxvZ2dlci5uZXh0KCJoZWxsbyIpIC8vIOWHuuWKm+OBleOCjOOBquOBhA==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-ts"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">function*</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> makeLogger</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">limit</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> number</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Generator</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">void</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">void</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> limit; i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">yield</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> logger</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> makeLogger</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">logger.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">next</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"hello"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// "hello"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">logger.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">next</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"hello"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// "hello"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">logger.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">next</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"hello"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// "hello"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">logger.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">next</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"hello"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// 出力されない</span></span></code></pre></figure>
<p><code>async function*</code>を使って定義される<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-asyncgeneratorfunction-objects" target="_blank" rel="noopener noreferrer"><code>AsyncGeneratorFunction</code></a>はその非同期版で、返される<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-asyncgenerator-objects" target="_blank" rel="noopener noreferrer"><code>AsyncGenerator</code></a>はTypeScriptで次のように定義されている。</p>
<p><a href="https://github.com/microsoft/TypeScript/blob/b1a25fd8b1adec4514809d54d96b64069887652c/src/lib/es2018.asyncgenerator.d.ts#L3-L9" target="_blank" rel="noopener noreferrer"><code>src/lib/es2018.asyncgenerator.d.ts#L3-L9</code></a></p>
<figure data-code-block="" data-language="ts"><figcaption><span class="code-block-language">ts</span><div class="code-block-actions"><a download="code.ts" href="data:text/plain;charset=utf-8;base64,aW50ZXJmYWNlIEFzeW5jR2VuZXJhdG9yPFQgPSB1bmtub3duLCBUUmV0dXJuID0gYW55LCBUTmV4dCA9IHVua25vd24+IGV4dGVuZHMgQXN5bmNJdGVyYXRvcjxULCBUUmV0dXJuLCBUTmV4dD4gewogICAgbmV4dCguLi5hcmdzOiBbXSB8IFtUTmV4dF0pOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQsIFRSZXR1cm4+PjsKICAgIHJldHVybih2YWx1ZTogVFJldHVybiB8IFByb21pc2VMaWtlPFRSZXR1cm4+KTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxULCBUUmV0dXJuPj47CiAgICB0aHJvdyhlOiBhbnkpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQsIFRSZXR1cm4+PjsKICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTogQXN5bmNHZW5lcmF0b3I8VCwgVFJldHVybiwgVE5leHQ+Owp9" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-ts"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">interface</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> AsyncGenerator</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> unknown</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TReturn</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> any</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TNext</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> unknown</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">extends</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> AsyncIterator</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TReturn</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TNext</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    next</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">...</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">args</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TNext</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">])</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Promise</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">IteratorResult</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TReturn</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>>;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">value</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> TReturn</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> |</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> PromiseLike</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TReturn</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>)</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Promise</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">IteratorResult</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TReturn</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>>;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    throw</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">e</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> any</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Promise</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">IteratorResult</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TReturn</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>>;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    [Symbol.asyncIterator]()</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> AsyncGenerator</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TReturn</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">TNext</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<p>これも返される値（および返される値としてあたえる値）が<code>Promise</code>となっていることを除いて、<a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-generator-objects" target="_blank" rel="noopener noreferrer"><code>Generator</code></a>と同様である。</p>
<figure data-code-block="" data-language="ts"><figcaption><span class="code-block-language">ts</span><div class="code-block-actions"><a download="code.ts" href="data:text/plain;charset=utf-8;base64,YXN5bmMgZnVuY3Rpb24qIGZldGNoQWxsVGV4dCh1cmxzOiBzdHJpbmdbXSk6IEFzeW5jR2VuZXJhdG9yPHN0cmluZz4gewogIGZvciAoY29uc3QgdXJsIG9mIHVybHMpIHsKICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCkKICAgIHlpZWxkIGF3YWl0IHJlcy50ZXh0KCkKICB9Cn0KCmFzeW5jIGZ1bmN0aW9uIG1haW4oKSB7CiAgZm9yIGF3YWl0IChjb25zdCB0ZXh0IG9mIGZldGNoQWxsVGV4dChbXSkpIHsKICAgIGNvbnNvbGUubG9nKHRleHQpCiAgfQp9CgptYWluKCkuY2F0Y2goY29uc29sZS5lcnJvcik=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-ts"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> function*</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> fetchAllText</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">urls</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[])</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> AsyncGenerator</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> url</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> of</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> urls) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> res</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> fetch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(url)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    yield</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> await</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> res.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">text</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">() {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  for</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> await</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> text</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> of</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> fetchAllText</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">([])) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(text)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">().</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">catch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(console.error)</span></span></code></pre></figure>
<h2 id="参考リンク"><a aria-hidden="true" tabindex="-1" href="#参考リンク"><span class="icon icon-link"></span></a>参考リンク</h2>
<ul>
<li>MDN: JavaScript
<ul>
<li>Guide: Iterators and Generators
<ul>
<li><a href="https://developer.mozilla.org/docs/Web/JavaScript/Guide/Iterators_and_Generators" target="_blank" rel="noopener noreferrer">https://developer.mozilla.org/docs/Web/JavaScript/Guide/Iterators_and_Generators</a></li>
</ul>
</li>
<li>Reference: Iteration protocols
<ul>
<li><a href="https://developer.mozilla.org/docs/Web/JavaScript/Reference/Iteration_protocols" target="_blank" rel="noopener noreferrer">https://developer.mozilla.org/docs/Web/JavaScript/Reference/Iteration_protocols</a></li>
</ul>
</li>
<li>Reference: <code>function*</code>
<ul>
<li><a href="https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/function*" target="_blank" rel="noopener noreferrer">https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/function*</a></li>
</ul>
</li>
<li>Reference: <code>function*</code> expression
<ul>
<li><a href="https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators/function*" target="_blank" rel="noopener noreferrer">https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators/function*</a></li>
</ul>
</li>
<li>Reference: <code>yield</code>
<ul>
<li><a href="https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators/yield" target="_blank" rel="noopener noreferrer">https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators/yield</a></li>
</ul>
</li>
<li>Reference: <code>yield*</code>
<ul>
<li><a href="https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators/yield*" target="_blank" rel="noopener noreferrer">https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators/yield*</a></li>
</ul>
</li>
<li>Reference: <code>for...of</code>
<ul>
<li><a href="https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/for...of" target="_blank" rel="noopener noreferrer">https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/for...of</a></li>
</ul>
</li>
<li>Reference: <code>for await...of</code>
<ul>
<li><a href="https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/for-await...of" target="_blank" rel="noopener noreferrer">https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/for-await...of</a></li>
</ul>
</li>
<li>Reference: <code>Symbol.iterator</code>
<ul>
<li><a href="https://developer.mozilla.or/docs/Web/JavaScript/Reference/Global_Objects/Symbol/iterator" target="_blank" rel="noopener noreferrer">https://developer.mozilla.or/docs/Web/JavaScript/Reference/Global_Objects/Symbol/iterator</a></li>
</ul>
</li>
<li>Reference: <code>Symbol.asyncIterator</code>
<ul>
<li><a href="https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Symbol/asyncIterator" target="_blank" rel="noopener noreferrer">https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Symbol/asyncIterator</a></li>
</ul>
</li>
<li>Reference: <code>Generator</code>
<ul>
<li><a href="https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Generator" target="_blank" rel="noopener noreferrer">https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Generator</a></li>
</ul>
</li>
<li>Reference: <code>GeneratorFunction</code>
<ul>
<li><a href="https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/GeneratorFunction" target="_blank" rel="noopener noreferrer">https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/GeneratorFunction</a></li>
</ul>
</li>
</ul>
</li>
<li>TypeScript: Documentation
<ul>
<li>Iterators and Generators
<ul>
<li><a href="https://www.typescriptlang.org/docs/handbook/iterators-and-generators.html" target="_blank" rel="noopener noreferrer">https://www.typescriptlang.org/docs/handbook/iterators-and-generators.html</a></li>
</ul>
</li>
</ul>
</li>
<li>TypeScript: Source
<ul>
<li><code>src/lib/es2015.symbol.d.ts</code>
<ul>
<li><a href="https://github.com/microsoft/TypeScript/blob/main/src/lib/es2015.symbol.d.ts" target="_blank" rel="noopener noreferrer">https://github.com/microsoft/TypeScript/blob/main/src/lib/es2015.symbol.d.ts</a></li>
</ul>
</li>
<li><code>src/lib/es2015.iterable.d.ts</code>
<ul>
<li><a href="https://github.com/microsoft/TypeScript/blob/main/src/lib/es2015.iterable.d.ts" target="_blank" rel="noopener noreferrer">https://github.com/microsoft/TypeScript/blob/main/src/lib/es2015.iterable.d.ts</a></li>
</ul>
</li>
<li><code>src/lib/es2015.generator.d.ts</code>
<ul>
<li><a href="https://github.com/microsoft/TypeScript/blob/main/src/lib/es2015.generator.d.ts" target="_blank" rel="noopener noreferrer">https://github.com/microsoft/TypeScript/blob/main/src/lib/es2015.generator.d.ts</a></li>
</ul>
</li>
<li><code>src/lib/es2018.asynciterable.d.ts</code>
<ul>
<li><a href="https://github.com/microsoft/TypeScript/blob/main/src/lib/es2018.asynciterable.d.ts" target="_blank" rel="noopener noreferrer">https://github.com/microsoft/TypeScript/blob/main/src/lib/es2018.asynciterable.d.ts</a></li>
</ul>
</li>
<li><code>src/lib/es2018.asyncgenerator.d.ts</code>
<ul>
<li><a href="https://github.com/microsoft/TypeScript/blob/main/src/lib/es2018.asyncgenerator.d.ts" target="_blank" rel="noopener noreferrer">https://github.com/microsoft/TypeScript/blob/main/src/lib/es2018.asyncgenerator.d.ts</a></li>
</ul>
</li>
</ul>
</li>
<li>ECMAScript® Language Specification
<ul>
<li>6.1.5.1 Well-Known Symbols
<ul>
<li><a href="https://tc39.es/ecma262/multipage/ecmascript-data-types-and-values.html#sec-well-known-symbols" target="_blank" rel="noopener noreferrer">https://tc39.es/ecma262/multipage/ecmascript-data-types-and-values.html#sec-well-known-symbols</a></li>
<li>Table 1: Well-known Symbols
<ul>
<li><a href="https://tc39.es/ecma262/multipage/ecmascript-data-types-and-values.html#table-well-known-symbols" target="_blank" rel="noopener noreferrer">https://tc39.es/ecma262/multipage/ecmascript-data-types-and-values.html#table-well-known-symbols</a></li>
</ul>
</li>
</ul>
</li>
<li>7.4 Operations on Iterator Objects
<ul>
<li><a href="https://tc39.es/ecma262/#sec-operations-on-iterator-objects" target="_blank" rel="noopener noreferrer">https://tc39.es/ecma262/#sec-operations-on-iterator-objects</a></li>
</ul>
</li>
<li>13.15 Assignment Operators
<ul>
<li><a href="https://tc39.es/ecma262/#sec-assignment-operators" target="_blank" rel="noopener noreferrer">https://tc39.es/ecma262/#sec-assignment-operators</a></li>
</ul>
</li>
<li>14.7 Iteration Statements
<ul>
<li><a href="https://tc39.es/ecma262/multipage/ecmascript-language-statements-and-declarations.html#sec-iteration-statements" target="_blank" rel="noopener noreferrer">https://tc39.es/ecma262/multipage/ecmascript-language-statements-and-declarations.html#sec-iteration-statements</a></li>
</ul>
</li>
<li>15.5 Generator Function Definitions
<ul>
<li><a href="https://tc39.es/ecma262/multipage/ecmascript-language-functions-and-classes.html#sec-generator-function-definitions" target="_blank" rel="noopener noreferrer">https://tc39.es/ecma262/multipage/ecmascript-language-functions-and-classes.html#sec-generator-function-definitions</a></li>
</ul>
</li>
<li>15.6 Async Generator Function Definitions
<ul>
<li><a href="https://tc39.es/ecma262/multipage/ecmascript-language-functions-and-classes.html#sec-async-generator-function-definitions" target="_blank" rel="noopener noreferrer">https://tc39.es/ecma262/multipage/ecmascript-language-functions-and-classes.html#sec-async-generator-function-definitions</a></li>
</ul>
</li>
<li>27.1 Iteration
<ul>
<li><a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-iteration" target="_blank" rel="noopener noreferrer">https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-iteration</a></li>
</ul>
</li>
<li>27.3 GeneratorFunction Objects
<ul>
<li><a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-generatorfunction-objects" target="_blank" rel="noopener noreferrer">https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-generatorfunction-objects</a></li>
</ul>
</li>
<li>27.4 AsyncGeneratorFunction Objects
<ul>
<li><a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-asyncgeneratorfunction-objects" target="_blank" rel="noopener noreferrer">https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-asyncgeneratorfunction-objects</a></li>
</ul>
</li>
<li>27.5 Generator Objects
<ul>
<li><a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-generator-objects" target="_blank" rel="noopener noreferrer">https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-generator-objects</a></li>
</ul>
</li>
<li>27.6 AsyncGenerator Objects
<ul>
<li><a href="https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-asyncgenerator-objects" target="_blank" rel="noopener noreferrer">https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-asyncgenerator-objects</a></li>
</ul>
</li>
</ul>
</li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[計算量の漸近記法（Θ記法・O記法・Ω記法・o記法・ω記法）]]></title>
<link>https://blog.publictheta.com/articles/2022-04-03-notations-intro-algo</link>
<guid isPermaLink="true">https://blog.publictheta.com/articles/2022-04-03-notations-intro-algo</guid>
<description><![CDATA[]]></description>
<pubDate>Sun, 03 Apr 2022 17:36:57 GMT</pubDate>
<category>アルゴリズム</category><category>データ構造</category>
<content:encoded><![CDATA[<p>『<a href="https://www.amazon.co.jp/dp/476490408X/" target="_blank" rel="noopener noreferrer">アルゴリズムイントロダクション 第3版</a>』（原著: <a href="https://www.amazon.co.jp/dp/0262033844/" target="_blank" rel="noopener noreferrer"><em>Introduction to Algorithms</em></a>）で用いられている次の5つの漸近記法について、まとめておく。詳細は第3章（総合版でp.36-）を参照。</p>
<ul>
<li>Θ記法（big-theta notation、上界と下界をあたえる、タイトな限界という）</li>
<li>O記法（big-o notation、上界のみをあたえる、タイトな限界であるとは限らない）</li>
<li>Ω記法（big-omega notation、下界のみをあたえる、タイトな限界であるとは限らない）</li>
<li>o記法（little-o notation、タイトな限界ではない上界をあたえる）</li>
<li>ω記法（little-omega notation、タイトな限界ではない下界をあたえる）</li>
</ul>
<p>たとえば、</p>
<ul>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><msup><mi>n</mi><mn>2</mn></msup><mo>=</mo><mi mathvariant="normal">Θ</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>2</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">2 n^2 = \Theta(n^2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord">2</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord">Θ</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></li>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><msup><mi>n</mi><mn>2</mn></msup><mo mathvariant="normal">≠</mo><mi mathvariant="normal">Θ</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>3</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">2 n^2 \ne \Theta(n^3)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0085em;vertical-align:-0.1944em;"></span><span class="mord">2</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel"><span class="mrel"><span class="mord vbox"><span class="thinbox"><span class="rlap"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="inner"><span class="mord"><span class="mrel"></span></span></span><span class="fix"></span></span></span></span></span><span class="mspace nobreak"></span><span class="mrel">=</span></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord">Θ</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></li>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><msup><mi>n</mi><mn>2</mn></msup><mo mathvariant="normal">≠</mo><mi mathvariant="normal">Θ</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">2 n^2 \ne \Theta(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0085em;vertical-align:-0.1944em;"></span><span class="mord">2</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel"><span class="mrel"><span class="mord vbox"><span class="thinbox"><span class="rlap"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="inner"><span class="mord"><span class="mrel"></span></span></span><span class="fix"></span></span></span></span></span><span class="mspace nobreak"></span><span class="mrel">=</span></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">Θ</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span></li>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><msup><mi>n</mi><mn>2</mn></msup><mo>=</mo><mi>O</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>2</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">2 n^2 = O(n^2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord">2</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">O</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></li>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><msup><mi>n</mi><mn>2</mn></msup><mo>=</mo><mi>O</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>3</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">2 n^2 = O(n^3)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord">2</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">O</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></li>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><msup><mi>n</mi><mn>2</mn></msup><mo>=</mo><mi mathvariant="normal">Ω</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>2</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">2 n^2 = \Omega(n^2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord">2</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord">Ω</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></li>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><msup><mi>n</mi><mn>2</mn></msup><mo>=</mo><mi mathvariant="normal">Ω</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">2 n^2 = \Omega(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord">2</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">Ω</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span></li>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><msup><mi>n</mi><mn>2</mn></msup><mo mathvariant="normal">≠</mo><mi>o</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>2</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">2 n^2 \ne o(n^2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0085em;vertical-align:-0.1944em;"></span><span class="mord">2</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel"><span class="mrel"><span class="mord vbox"><span class="thinbox"><span class="rlap"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="inner"><span class="mord"><span class="mrel"></span></span></span><span class="fix"></span></span></span></span></span><span class="mspace nobreak"></span><span class="mrel">=</span></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord mathnormal">o</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></li>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><msup><mi>n</mi><mn>2</mn></msup><mo>=</mo><mi>o</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>3</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">2 n^2 = o(n^3)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord">2</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord mathnormal">o</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></li>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><msup><mi>n</mi><mn>2</mn></msup><mo mathvariant="normal">≠</mo><mi>ω</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>2</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">2 n^2 \ne \omega(n^2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0085em;vertical-align:-0.1944em;"></span><span class="mord">2</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel"><span class="mrel"><span class="mord vbox"><span class="thinbox"><span class="rlap"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="inner"><span class="mord"><span class="mrel"></span></span></span><span class="fix"></span></span></span></span></span><span class="mspace nobreak"></span><span class="mrel">=</span></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">ω</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></li>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><msup><mi>n</mi><mn>2</mn></msup><mo>=</mo><mi>ω</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">2 n^2 = \omega(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord">2</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">ω</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span></li>
</ul>
<h2 id="θ記法"><a aria-hidden="true" tabindex="-1" href="#θ記法"><span class="icon icon-link"></span></a>Θ記法</h2>
<h3 id="定義"><a aria-hidden="true" tabindex="-1" href="#定義"><span class="icon icon-link"></span></a>定義</h3>
<p>ある関数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">g(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> について、<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">Θ</mi><mo stretchy="false">(</mo><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\Theta(g(n))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">Θ</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span></span></span></span> とは、ある正の定数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>c</mi><mn>2</mn></msub><mo separator="true">,</mo><msub><mi>n</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">c_1, c_2, n_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> が存在して、すべての <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>≥</mo><msub><mi>n</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">n \ge n_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7719em;vertical-align:-0.136em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> に対して、 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0</mn><mo>≤</mo><msub><mi>c</mi><mn>1</mn></msub><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>≤</mo><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>≤</mo><msub><mi>c</mi><mn>2</mn></msub><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">0 \le c_1 g(n) \le f(n) \le c_2 g(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7804em;vertical-align:-0.136em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> を満たすような関数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> の集合である。</p>
<h3 id="説明"><a aria-hidden="true" tabindex="-1" href="#説明"><span class="icon icon-link"></span></a>説明</h3>
<p>Θ記法（big-theta notation）は、漸近的な上界と下界をあたえる。</p>
<p>すなわち、 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> が <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">Θ</mi><mo stretchy="false">(</mo><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\Theta(g(n))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">Θ</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span></span></span></span> である（属する）とは、 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> が十分大きいければ（ <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>≥</mo><msub><mi>n</mi><mn>0</mn></msub><mo>≥</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">n \ge n_0 \ge 0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7719em;vertical-align:-0.136em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.786em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span> ）、 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> が <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">g(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> の定数倍（ <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mn>1</mn></msub><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">c_1 g(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> および <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>c</mi><mn>2</mn></msub><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">c_2 g(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> ）につねに挟まれることを意味する。</p>
<p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>≥</mo><msub><mi>n</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">n \ge n_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7719em;vertical-align:-0.136em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> において、 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">g(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> はつねに <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> と定数倍の範囲で等しくなるので、Θ記法で与えられる <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">g(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> を特に、漸近的にタイトな限界（asymptotically tight bound）という。</p>
<p>たとえば、 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><msup><mi>n</mi><mn>2</mn></msup><mo>=</mo><mi mathvariant="normal">Θ</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>2</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">2 n^2 = \Theta(n^2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord">2</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord">Θ</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> であるが、 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><msup><mi>n</mi><mn>2</mn></msup><mo mathvariant="normal">≠</mo><mi mathvariant="normal">Θ</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>3</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">2 n^2 \ne \Theta(n^3)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0085em;vertical-align:-0.1944em;"></span><span class="mord">2</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel"><span class="mrel"><span class="mord vbox"><span class="thinbox"><span class="rlap"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="inner"><span class="mord"><span class="mrel"></span></span></span><span class="fix"></span></span></span></span></span><span class="mspace nobreak"></span><span class="mrel">=</span></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord">Θ</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>　、 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><msup><mi>n</mi><mn>2</mn></msup><mo mathvariant="normal">≠</mo><mi mathvariant="normal">Θ</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">2 n^2 \ne \Theta(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0085em;vertical-align:-0.1944em;"></span><span class="mord">2</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel"><span class="mrel"><span class="mord vbox"><span class="thinbox"><span class="rlap"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="inner"><span class="mord"><span class="mrel"></span></span></span><span class="fix"></span></span></span></span></span><span class="mspace nobreak"></span><span class="mrel">=</span></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">Θ</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> である。</p>
<p>（正確には <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><msup><mi>n</mi><mn>2</mn></msup><mo>∈</mo><mi mathvariant="normal">Θ</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>2</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">2 n^2 \in \Theta(n^2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8532em;vertical-align:-0.0391em;"></span><span class="mord">2</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord">Θ</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> だが、このように略記する。詳しくは「等式および不等式における漸近記法」総合版でp.41-を参照。）</p>
<p>なお、他の文献ではΘ記法の意味でO記法が用いられる場合もある。</p>
<h2 id="o記法"><a aria-hidden="true" tabindex="-1" href="#o記法"><span class="icon icon-link"></span></a>O記法</h2>
<h3 id="定義-1"><a aria-hidden="true" tabindex="-1" href="#定義-1"><span class="icon icon-link"></span></a>定義</h3>
<p>ある関数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">g(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> について、<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(g(n))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">O</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span></span></span></span> とは、ある正の定数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi><mo separator="true">,</mo><msub><mi>n</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">c, n_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">c</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> が存在して、すべての <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>≥</mo><msub><mi>n</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">n \ge n_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7719em;vertical-align:-0.136em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> に対して、 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0</mn><mo>≤</mo><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>≤</mo><mi>c</mi><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">0 \le f(n) \le c g(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7804em;vertical-align:-0.136em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">c</span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> を満たすような関数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> の集合である。</p>
<h3 id="説明-1"><a aria-hidden="true" tabindex="-1" href="#説明-1"><span class="icon icon-link"></span></a>説明</h3>
<p>O記法（big-o notation）は、 漸近的な上界をあたえる。</p>
<p>すなわち <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> が <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(g(n))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">O</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span></span></span></span> である（属する）とは、 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> が十分大きいければ（ <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>≥</mo><msub><mi>n</mi><mn>0</mn></msub><mo>≥</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">n \ge n_0 \ge 0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7719em;vertical-align:-0.136em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.786em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span> ）、 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> が <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">g(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> の定数倍（ <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">c g(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">c</span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> ）よりつねに小さくなる（上からおさえられる）ことを意味する。</p>
<p>たとえば、 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><msup><mi>n</mi><mn>2</mn></msup><mo>=</mo><mi>O</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>2</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">2 n^2 = O(n^2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord">2</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">O</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> であるが、上界しか示さないので、 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><msup><mi>n</mi><mn>2</mn></msup><mo>=</mo><mi>O</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>3</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">2 n^2 = O(n^3)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord">2</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">O</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> も成り立つ。</p>
<p>なお、他の文献ではΘ記法の意味でO記法が用いられる場合もある。</p>
<h2 id="ω記法"><a aria-hidden="true" tabindex="-1" href="#ω記法"><span class="icon icon-link"></span></a>Ω記法</h2>
<h3 id="定義-2"><a aria-hidden="true" tabindex="-1" href="#定義-2"><span class="icon icon-link"></span></a>定義</h3>
<p>ある関数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">g(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> について、<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">Ω</mi><mo stretchy="false">(</mo><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\Omega(g(n))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">Ω</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span></span></span></span> とは、ある正の定数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi><mo separator="true">,</mo><msub><mi>n</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">c, n_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">c</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> が存在して、すべての <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>≥</mo><msub><mi>n</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">n \ge n_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7719em;vertical-align:-0.136em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> に対して、 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0</mn><mo>≤</mo><mi>c</mi><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>≤</mo><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">0 \le c g(n) \le f(n) </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7804em;vertical-align:-0.136em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">c</span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> を満たすような関数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> の集合である。</p>
<h3 id="説明-2"><a aria-hidden="true" tabindex="-1" href="#説明-2"><span class="icon icon-link"></span></a>説明</h3>
<p>Ω記法（big-omega notation）は、漸近的な下界をあたえる。</p>
<p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> が <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">Ω</mi><mo stretchy="false">(</mo><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\Omega(g(n))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">Ω</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span></span></span></span> である（属する）とは、 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> が十分大きいければ（ <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>≥</mo><msub><mi>n</mi><mn>0</mn></msub><mo>≥</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">n \ge n_0 \ge 0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7719em;vertical-align:-0.136em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.786em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span> ）、 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> が <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">g(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> の定数倍（ <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">c g(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">c</span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> ）よりつねに大きくなる（下からおさえられる）ことを意味する。</p>
<p>たとえば、 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><msup><mi>n</mi><mn>2</mn></msup><mo>=</mo><mi mathvariant="normal">Ω</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>2</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">2 n^2 = \Omega(n^2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord">2</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord">Ω</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> であるが、下界しか示さないので、 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><msup><mi>n</mi><mn>2</mn></msup><mo>=</mo><mi mathvariant="normal">Ω</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">2 n^2 = \Omega(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord">2</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">Ω</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> も成り立つ。</p>
<h2 id="o記法-1"><a aria-hidden="true" tabindex="-1" href="#o記法-1"><span class="icon icon-link"></span></a>o記法</h2>
<h3 id="定義-3"><a aria-hidden="true" tabindex="-1" href="#定義-3"><span class="icon icon-link"></span></a>定義</h3>
<p>ある関数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">g(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> について、<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>o</mi><mo stretchy="false">(</mo><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">o(g(n))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">o</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span></span></span></span> とは、任意の正の定数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi><mo>></mo><mn>0</mn></mrow><annotation encoding="application/x-tex">c \gt 0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mord mathnormal">c</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span> に対して、ある正の定数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>n</mi><mn>0</mn></msub><mo>></mo><mn>0</mn></mrow><annotation encoding="application/x-tex">n_0 \gt 0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6891em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span> が存在して、 すべての <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>≥</mo><msub><mi>n</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">n \ge n_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7719em;vertical-align:-0.136em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> に対して <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0</mn><mo>≤</mo><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>&#x3C;</mo><mi>c</mi><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">0 \le f(n) \lt c g(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7804em;vertical-align:-0.136em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&#x3C;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">c</span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> を満たすような関数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> の集合である。</p>
<h3 id="説明-3"><a aria-hidden="true" tabindex="-1" href="#説明-3"><span class="icon icon-link"></span></a>説明</h3>
<p>o記法（little-o notation）は、漸近的にタイトな限界ではない、漸近的な上界をあたえる。</p>
<p>すなわち、たとえば <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><msup><mi>n</mi><mn>2</mn></msup><mo>=</mo><mi>o</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>3</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">2 n^2 = o(n^3)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord">2</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord mathnormal">o</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> であるが、 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><msup><mi>n</mi><mn>2</mn></msup><mo>=</mo><mi mathvariant="normal">Θ</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>2</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">2 n^2 = \Theta(n^2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord">2</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord">Θ</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> であるため、 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><msup><mi>n</mi><mn>2</mn></msup><mo mathvariant="normal">≠</mo><mi>o</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>2</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">2 n^2 \ne o(n^2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0085em;vertical-align:-0.1944em;"></span><span class="mord">2</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel"><span class="mrel"><span class="mord vbox"><span class="thinbox"><span class="rlap"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="inner"><span class="mord"><span class="mrel"></span></span></span><span class="fix"></span></span></span></span></span><span class="mspace nobreak"></span><span class="mrel">=</span></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord mathnormal">o</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> となる。</p>
<p>o記法では、 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> が大きくなるにつれて、 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> は <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">g(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> に対して相対的に無限小に近づくので、</p>
<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><munder><mrow><mi>lim</mi><mo>⁡</mo></mrow><mrow><mi>n</mi><mo>→</mo><mi mathvariant="normal">∞</mi></mrow></munder><mfrac><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><mrow><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow></mfrac><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">\lim_{n \to \infty} \frac{f(n)}{g(n)} = 0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.363em;vertical-align:-0.936em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em;"><span style="top:-2.4em;margin-left:0em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mrel mtight">→</span><span class="mord mtight">∞</span></span></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span><span class="mop">lim</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.427em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.936em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span></span>
<p>が成立する。</p>
<h2 id="ω記法-1"><a aria-hidden="true" tabindex="-1" href="#ω記法-1"><span class="icon icon-link"></span></a>ω記法</h2>
<h3 id="定義-4"><a aria-hidden="true" tabindex="-1" href="#定義-4"><span class="icon icon-link"></span></a>定義</h3>
<p>ある関数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">g(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> について、<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ω</mi><mo stretchy="false">(</mo><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\omega(g(n))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">ω</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span></span></span></span> とは、任意の正の定数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi><mo>></mo><mn>0</mn></mrow><annotation encoding="application/x-tex">c \gt 0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mord mathnormal">c</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span> に対して、ある正の定数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>n</mi><mn>0</mn></msub><mo>></mo><mn>0</mn></mrow><annotation encoding="application/x-tex">n_0 \gt 0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6891em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span> が存在して、 すべての <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>≥</mo><msub><mi>n</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">n \ge n_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7719em;vertical-align:-0.136em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> に対して <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0</mn><mo>≤</mo><mi>c</mi><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>&#x3C;</mo><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">0 \le c g(n) \lt f(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7804em;vertical-align:-0.136em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">c</span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&#x3C;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> を満たすような関数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> の集合である。</p>
<h3 id="説明-4"><a aria-hidden="true" tabindex="-1" href="#説明-4"><span class="icon icon-link"></span></a>説明</h3>
<p>ω記法（little-omega notation）は、漸近的にタイトな限界ではない、漸近的な下界をあたえる。</p>
<p>すなわち、たとえば <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><msup><mi>n</mi><mn>2</mn></msup><mo>=</mo><mi>ω</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">2 n^2 = \omega(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord">2</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">ω</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> であるが、 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><msup><mi>n</mi><mn>2</mn></msup><mo>=</mo><mi mathvariant="normal">Θ</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>2</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">2 n^2 = \Theta(n^2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord">2</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord">Θ</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> であるため、 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><msup><mi>n</mi><mn>2</mn></msup><mo mathvariant="normal">≠</mo><mi>ω</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>2</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">2 n^2 \ne \omega(n^2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0085em;vertical-align:-0.1944em;"></span><span class="mord">2</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel"><span class="mrel"><span class="mord vbox"><span class="thinbox"><span class="rlap"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="inner"><span class="mord"><span class="mrel"></span></span></span><span class="fix"></span></span></span></span></span><span class="mspace nobreak"></span><span class="mrel">=</span></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">ω</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> となる。</p>
<p>ω記法では、 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> が小さくなるにつれて <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> は <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">g(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> に対して相対的に無限大に近づくので、</p>
<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><munder><mrow><mi>lim</mi><mo>⁡</mo></mrow><mrow><mi>n</mi><mo>→</mo><mi mathvariant="normal">∞</mi></mrow></munder><mfrac><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><mrow><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow></mfrac><mo>=</mo><mi mathvariant="normal">∞</mi></mrow><annotation encoding="application/x-tex">\lim_{n \to \infty} \frac{f(n)}{g(n)} = \infty</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.363em;vertical-align:-0.936em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em;"><span style="top:-2.4em;margin-left:0em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mrel mtight">→</span><span class="mord mtight">∞</span></span></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span><span class="mop">lim</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.427em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.936em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord">∞</span></span></span></span></span>
<p>が成立する。</p>
<h2 id="漸近関係の性質"><a aria-hidden="true" tabindex="-1" href="#漸近関係の性質"><span class="icon icon-link"></span></a>漸近関係の性質</h2>
<p>推移性は、Θ、O、Ω、o、ωのすべてにおいて成り立つ。すなわち、</p>
<ul>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mi mathvariant="normal">Θ</mi><mo stretchy="false">(</mo><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>∧</mo><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mi mathvariant="normal">Θ</mi><mo stretchy="false">(</mo><mi>h</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mtext>  </mtext><mo>⟹</mo><mtext>  </mtext><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mi mathvariant="normal">Θ</mi><mo stretchy="false">(</mo><mi>h</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(n) = \Theta(g(n)) \land g(n) = \Theta(h(n)) \implies f(n) = \Theta(h(n))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">Θ</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">∧</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">Θ</span><span class="mopen">(</span><span class="mord mathnormal">h</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">⟹</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">Θ</span><span class="mopen">(</span><span class="mord mathnormal">h</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span></span></span></span></li>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mi>O</mi><mo stretchy="false">(</mo><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>∧</mo><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mi>O</mi><mo stretchy="false">(</mo><mi>h</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mtext>  </mtext><mo>⟹</mo><mtext>  </mtext><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mi>O</mi><mo stretchy="false">(</mo><mi>h</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(n) = O(g(n)) \land g(n) = O(h(n)) \implies f(n) = O(h(n))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">O</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">∧</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">O</span><span class="mopen">(</span><span class="mord mathnormal">h</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">⟹</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">O</span><span class="mopen">(</span><span class="mord mathnormal">h</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span></span></span></span></li>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mi mathvariant="normal">Ω</mi><mo stretchy="false">(</mo><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>∧</mo><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mi mathvariant="normal">Ω</mi><mo stretchy="false">(</mo><mi>h</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mtext>  </mtext><mo>⟹</mo><mtext>  </mtext><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mi mathvariant="normal">Ω</mi><mo stretchy="false">(</mo><mi>h</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(n) = \Omega(g(n)) \land g(n) = \Omega(h(n)) \implies f(n) = \Omega(h(n))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">Ω</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">∧</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">Ω</span><span class="mopen">(</span><span class="mord mathnormal">h</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">⟹</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">Ω</span><span class="mopen">(</span><span class="mord mathnormal">h</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span></span></span></span></li>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mi>o</mi><mo stretchy="false">(</mo><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>∧</mo><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mi>o</mi><mo stretchy="false">(</mo><mi>h</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mtext>  </mtext><mo>⟹</mo><mtext>  </mtext><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mi>o</mi><mo stretchy="false">(</mo><mi>h</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(n) = o(g(n)) \land g(n) = o(h(n)) \implies f(n) = o(h(n))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">o</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">∧</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">o</span><span class="mopen">(</span><span class="mord mathnormal">h</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">⟹</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">o</span><span class="mopen">(</span><span class="mord mathnormal">h</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span></span></span></span></li>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mi>ω</mi><mo stretchy="false">(</mo><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>∧</mo><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mi>ω</mi><mo stretchy="false">(</mo><mi>h</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mtext>  </mtext><mo>⟹</mo><mtext>  </mtext><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mi>ω</mi><mo stretchy="false">(</mo><mi>h</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(n) = \omega(g(n)) \land g(n) = \omega(h(n)) \implies f(n) = \omega(h(n))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">ω</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">∧</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">ω</span><span class="mopen">(</span><span class="mord mathnormal">h</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">⟹</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">ω</span><span class="mopen">(</span><span class="mord mathnormal">h</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span></span></span></span></li>
</ul>
<p>反射性は、Θ、O、Ωにおいてのみ成り立つ。すなわち、</p>
<ul>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mi mathvariant="normal">Θ</mi><mo stretchy="false">(</mo><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(n) = \Theta(f(n))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">Θ</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span></span></span></span></li>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mi>O</mi><mo stretchy="false">(</mo><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(n) = O(f(n))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">O</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span></span></span></span></li>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mi mathvariant="normal">Ω</mi><mo stretchy="false">(</mo><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(n) = \Omega(f(n))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">Ω</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span></span></span></span></li>
</ul>
<p>対称性は、Θにおいてのみ成り立つ。すなわち、</p>
<ul>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mi mathvariant="normal">Θ</mi><mo stretchy="false">(</mo><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mtext>  </mtext><mo>⟺</mo><mtext>  </mtext><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mi mathvariant="normal">Θ</mi><mo stretchy="false">(</mo><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(n) = \Theta(g(n)) \iff g(n) = \Theta(f(n))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">Θ</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">⟺</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">Θ</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span></span></span></span></li>
</ul>
<p>また、OとΩ、oとωのそれぞれについて転置対称性が成り立つ。すなわち、</p>
<ul>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mi>O</mi><mo stretchy="false">(</mo><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mtext>  </mtext><mo>⟺</mo><mtext>  </mtext><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mi mathvariant="normal">Ω</mi><mo stretchy="false">(</mo><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(n) = O(g(n)) \iff g(n) = \Omega(f(n))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">O</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">⟺</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">Ω</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span></span></span></span></li>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mi>o</mi><mo stretchy="false">(</mo><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mtext>  </mtext><mo>⟺</mo><mtext>  </mtext><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mi>ω</mi><mo stretchy="false">(</mo><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(n) = o(g(n)) \iff g(n) = \omega(f(n))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">o</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">⟺</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">g</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">ω</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span></span></span></span></li>
</ul>
<p>これらの性質について、実数の同値関係・順序関係と比較すると、</p>
<ul>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">Θ</mi><mo>≈</mo><mi>a</mi><mo>=</mo><mi>b</mi></mrow><annotation encoding="application/x-tex">\Theta \approx a = b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord">Θ</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span></span></span></span></li>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo>≈</mo><mi>a</mi><mo>≤</mo><mi>b</mi></mrow><annotation encoding="application/x-tex">O \approx a \le b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">O</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7719em;vertical-align:-0.136em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span></span></span></span></li>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">Ω</mi><mo>≈</mo><mi>a</mi><mo>≥</mo><mi>b</mi></mrow><annotation encoding="application/x-tex">\Omega \approx a \ge b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord">Ω</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7719em;vertical-align:-0.136em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span></span></span></span></li>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>o</mi><mo>≈</mo><mi>a</mi><mo>&#x3C;</mo><mi>b</mi></mrow><annotation encoding="application/x-tex">o \approx a \lt b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4831em;"></span><span class="mord mathnormal">o</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&#x3C;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span></span></span></span></li>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ω</mi><mo>≈</mo><mi>a</mi><mo>></mo><mi>b</mi></mrow><annotation encoding="application/x-tex">\omega \approx a \gt b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4831em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">ω</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span></span></span></span></li>
</ul>
<p>のような類似性が見出されるが、漸近関係についてはかならずしもどれかひとつが成立するとは限らないことに注意。</p>
<h2 id="参考"><a aria-hidden="true" tabindex="-1" href="#参考"><span class="icon icon-link"></span></a>参考</h2>
<ul>
<li>『アルゴリズムイントロダクション 第3版 総合版』2013年、近代科学社
<ul>
<li>原著: <a href="https://www.amazon.co.jp/dp/0262033844/" target="_blank" rel="noopener noreferrer"><em>Introduction to Algorithms</em></a>
<ul>
<li>Thomas H. Cormen</li>
<li>Charles E. Leiserson</li>
<li>Ronald L. Rivest</li>
<li>Clifford Stein</li>
</ul>
</li>
<li>翻訳:
<ul>
<li>浅野 哲夫</li>
<li>岩野 和生</li>
<li>梅尾 博司</li>
<li>山下 雅史</li>
<li>和田 幸一</li>
</ul>
</li>
<li>ISBN: <a href="https://www.amazon.co.jp/dp/476490408X/" target="_blank" rel="noopener noreferrer">978-4764904088</a></li>
</ul>
</li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[アルゴリズム]]></title>
<link>https://blog.publictheta.com/tags/algorithm</link>
<guid isPermaLink="true">https://blog.publictheta.com/tags/algorithm</guid>
<description><![CDATA[]]></description>
<pubDate>Sun, 03 Apr 2022 17:36:57 GMT</pubDate>

<content:encoded><![CDATA[]]></content:encoded>
</item>
<item>
<title><![CDATA[データ構造]]></title>
<link>https://blog.publictheta.com/tags/data-structure</link>
<guid isPermaLink="true">https://blog.publictheta.com/tags/data-structure</guid>
<description><![CDATA[]]></description>
<pubDate>Sun, 03 Apr 2022 17:36:57 GMT</pubDate>

<content:encoded><![CDATA[]]></content:encoded>
</item>
<item>
<title><![CDATA[Denoをはじめる]]></title>
<link>https://blog.publictheta.com/articles/2022-04-02-deno-getting-started</link>
<guid isPermaLink="true">https://blog.publictheta.com/articles/2022-04-02-deno-getting-started</guid>
<description><![CDATA[]]></description>
<pubDate>Sat, 02 Apr 2022 20:53:03 GMT</pubDate>
<category>Deno</category><category>TypeScript</category>
<content:encoded><![CDATA[<p>煩雑な設定なしにTypeScriptを実行/テスト/リント/フォーマットできる環境を試してみたかったので、Denoを改めて使ってみる。</p>
<h2 id="準備"><a aria-hidden="true" tabindex="-1" href="#準備"><span class="icon icon-link"></span></a>準備</h2>
<p>ここではmacOS/VS Codeで進めていく。</p>
<h3 id="denoのインストール"><a aria-hidden="true" tabindex="-1" href="#denoのインストール"><span class="icon icon-link"></span></a>Denoのインストール</h3>
<p>参考リンク: <a href="https://github.com/denoland/deno_install" target="_blank" rel="noopener noreferrer">https://github.com/denoland/deno_install</a></p>
<p>macOSでHomebrewを使う場合は:</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,YnJldyBpbnN0YWxsIGRlbm8=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">brew</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> deno</span></span></code></pre></figure>
<p>公式のインストールスクリプトも用意されている。</p>
<p>Shell（macOS/Linux）の場合:</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,Y3VybCAtZnNTTCBodHRwczovL2Rlbm8ubGFuZC94L2luc3RhbGwvaW5zdGFsbC5zaCB8IHNo" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">curl</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -fsSL</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> https://deno.land/x/install/install.sh</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> |</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> sh</span></span></code></pre></figure>
<p>PowerShell（Windows）の場合:</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,aXdyIGh0dHBzOi8vZGVuby5sYW5kL3gvaW5zdGFsbC9pbnN0YWxsLnBzMSAtdXNlYiB8IGlleA==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">iwr</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> https://deno.land/x/install/install.ps1</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -useb</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> |</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> iex</span></span></code></pre></figure>
<h3 id="denoのcli"><a aria-hidden="true" tabindex="-1" href="#denoのcli"><span class="icon icon-link"></span></a>DenoのCLI</h3>
<p>参考リンク: <a href="https://deno.land/manual/getting_started/command_line_interface" target="_blank" rel="noopener noreferrer">https://deno.land/manual/getting_started/command_line_interface</a></p>
<p>バージョンの確認は次のコマンドで行う:</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,ZGVubyAtLXZlcnNpb24=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --version</span></span></code></pre></figure>
<p>更新は次のコマンドで行う:</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,ZGVubyB1cGdyYWRl" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> upgrade</span></span></code></pre></figure>
<p>ヘルプは次のコマンドで表示される:</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,ZGVubyBoZWxwCmRlbm8gLWgKZGVubyAtLWhlbHA=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> help</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -h</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --help</span></span></code></pre></figure>
<h3 id="denoの設定ファイル"><a aria-hidden="true" tabindex="-1" href="#denoの設定ファイル"><span class="icon icon-link"></span></a>Denoの設定ファイル</h3>
<p>Denoではすべてデフォルトのままで使う場合、設定ファイルは必要ない。ただし、TypeScriptやリンター、フォーマッターの設定を記述したい場合、<code>--config</code>オプションで渡すことのできる<code>.json</code>ファイルまたは<code>.jsonc</code>ファイルを用意しておくことができる。</p>
<p>デフォルトの名前は決められていないが、将来的なサポートのために<code>deno.json</code>または<code>deno.jsonc</code>という名前が推奨されている。</p>
<h3 id="ideの設定"><a aria-hidden="true" tabindex="-1" href="#ideの設定"><span class="icon icon-link"></span></a>IDEの設定</h3>
<p>参考リンク: <a href="https://deno.land/manual/getting_started/setup_your_environment" target="_blank" rel="noopener noreferrer">https://deno.land/manual/getting_started/setup_your_environment</a></p>
<h4 id="vs-code"><a aria-hidden="true" tabindex="-1" href="#vs-code"><span class="icon icon-link"></span></a>VS Code</h4>
<p>参考リンク: <a href="https://deno.land/manual/vscode_deno" target="_blank" rel="noopener noreferrer">https://deno.land/manual/vscode_deno</a></p>
<p>Deno公式拡張機能の<a href="https://marketplace.visualstudio.com/items?itemName=denoland.vscode-deno" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=denoland.vscode-deno</a>をインストールし、設定から<code>Deno: Enable</code>（<code>deno.enable</code>）を有効にする。<code>Deno: Initialize Workspace Configuration</code>コマンドで<code>.vscode/settings.json</code>を作成してもよい。</p>
<p><code>.vscode/settings.json</code>の例:</p>
<figure data-code-block="" data-language="json5"><figcaption><span class="code-block-language">json5</span><div class="code-block-actions"><a download="code.json5" href="data:text/plain;charset=utf-8;base64,ewogICAgImRlbm8uY29uZmlnIjogIi4vZGVuby5qc29uIiwKICAgICJkZW5vLmVuYWJsZSI6IHRydWUsCiAgICAiZGVuby5saW50IjogdHJ1ZSwKICAgICJkZW5vLnVuc3RhYmxlIjogdHJ1ZSwKICAgICJbdHlwZXNjcmlwdF1bdHlwZXNjcmlwdHJlYWN0XVtqYXZhc2NyaXB0XVtqYXZhc2NyaXB0cmVhY3RdW2pzb25dW2pzb25jXVttYXJrZG93bl0iOiB7CiAgICAgICAgImVkaXRvci5kZWZhdWx0Rm9ybWF0dGVyIjogImRlbm9sYW5kLnZzY29kZS1kZW5vIgogICAgfQp9" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-json5"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">    "deno.config"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"./deno.json"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">    "deno.enable"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">    "deno.lint"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">    "deno.unstable"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">    "[typescript][typescriptreact][javascript][javascriptreact][json][jsonc][markdown]"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">        "editor.defaultFormatter"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"denoland.vscode-deno"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<p>なお、設定ファイルの名前に<code>deno.jsonc</code>または<code>deno.json</code>を使っている場合は自動で認識されるので、<code>deno.config</code>で設定する必要はない。</p>
<p><code>tasks.json</code>で使えるタスク定義やプロブレムマッチャーも提供されている。</p>
<p><code>.vscode/tasks.json</code></p>
<figure data-code-block="" data-language="json5"><figcaption><span class="code-block-language">json5</span><div class="code-block-actions"><a download="code.json5" href="data:text/plain;charset=utf-8;base64,ewogICAgInZlcnNpb24iOiAiMi4wLjAiLAogICAgInRhc2tzIjogWwogICAgICAgIHsKICAgICAgICAgICAgInR5cGUiOiAiZGVubyIsCiAgICAgICAgICAgICJjb21tYW5kIjogInJ1biIsCiAgICAgICAgICAgICJhcmdzIjogWyJzcmMvbWFpbi50cyJdLAogICAgICAgICAgICAicHJvYmxlbU1hdGNoZXIiOiBbIiRkZW5vIl0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgInR5cGUiOiAiZGVubyIsCiAgICAgICAgICAgICJjb21tYW5kIjogInRlc3QiLAogICAgICAgICAgICAicHJvYmxlbU1hdGNoZXIiOiBbIiRkZW5vLXRlc3QiXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAidHlwZSI6ICJkZW5vIiwKICAgICAgICAgICAgImNvbW1hbmQiOiAibGludCIsCiAgICAgICAgICAgICJwcm9ibGVtTWF0Y2hlciI6IFsiJGRlbm8tbGludCJdCiAgICAgICAgfQogICAgXQp9" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-json5"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">    "version"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"2.0.0"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">    "tasks"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        {</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">            "type"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"deno"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">            "command"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"run"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">            "args"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"src/main.ts"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">],</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">            "problemMatcher"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"$deno"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        {</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">            "type"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"deno"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">            "command"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"test"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">            "problemMatcher"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"$deno-test"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        {</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">            "type"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"deno"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">            "command"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"lint"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">            "problemMatcher"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"$deno-lint"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    ]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<h4 id="jetbrainsのide"><a aria-hidden="true" tabindex="-1" href="#jetbrainsのide"><span class="icon icon-link"></span></a>JetBrainsのIDE</h4>
<p>JetBrains公式プラグインの<a href="https://plugins.jetbrains.com/plugin/14382-deno" target="_blank" rel="noopener noreferrer">https://plugins.jetbrains.com/plugin/14382-deno</a>をインストールする。</p>
<h2 id="ファイルの実行"><a aria-hidden="true" tabindex="-1" href="#ファイルの実行"><span class="icon icon-link"></span></a>ファイルの実行</h2>
<p>参考リンク: <a href="https://deno.land/manual/getting_started/command_line_interface" target="_blank" rel="noopener noreferrer">https://deno.land/manual/getting_started/command_line_interface</a></p>
<p>Denoでファイルを実行するには<code>deno run</code>コマンドを用いる。</p>
<p><code>hello.ts</code>:</p>
<figure data-code-block="" data-language="ts"><figcaption><span class="code-block-language">ts</span><div class="code-block-actions"><a download="code.ts" href="data:text/plain;charset=utf-8;base64,Y29uc29sZS5sb2coIkhlbGxvLCBXb3JsZCEiKTs=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-ts"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Hello, World!"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">);</span></span></code></pre></figure>
<p>コマンド:</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,ZGVubyBydW4gaGVsbG8udHM=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> hello.ts</span></span></code></pre></figure>
<p>出力:</p>
<figure data-code-block="" data-language="text"><figcaption><span class="code-block-language">text</span><div class="code-block-actions"><a download="code.text" href="data:text/plain;charset=utf-8;base64,SGVsbG8sIFdvcmxkIQ==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-text"><span class="line"><span>Hello, World!</span></span></code></pre></figure>
<p>リモートのファイルも実行できる。</p>
<p>コマンド:</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,IyDmnIDmlrDniYgKZGVubyBydW4gaHR0cHM6Ly9kZW5vLmxhbmQvc3RkL2V4YW1wbGVzL3dlbGNvbWUudHMKIyAwLjEzMy4wCmRlbm8gcnVuIGh0dHBzOi8vZGVuby5sYW5kL3N0ZEAwLjEzMy4wL2V4YW1wbGVzL3dlbGNvbWUudHM=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 最新版</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> https://deno.land/std/examples/welcome.ts</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 0.133.0</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> https://deno.land/std@0.133.0/examples/welcome.ts</span></span></code></pre></figure>
<p>出力:</p>
<figure data-code-block="" data-language="text"><figcaption><span class="code-block-language">text</span><div class="code-block-actions"><a download="code.text" href="data:text/plain;charset=utf-8;base64,V2VsY29tZSB0byBEZW5vIQ==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-text"><span class="line"><span>Welcome to Deno!</span></span></code></pre></figure>
<p>ファイル名の後の引数はすべてスクリプトに対する引数となる。</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,ZGVubyBydW4gbWFpbi50cyAtLWhlbHA=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> main.ts</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --help</span></span></code></pre></figure>
<h2 id="パーミッション"><a aria-hidden="true" tabindex="-1" href="#パーミッション"><span class="icon icon-link"></span></a>パーミッション</h2>
<p>参考リンク: <a href="https://deno.land/manual/getting_started/permissions" target="_blank" rel="noopener noreferrer">https://deno.land/manual/getting_started/permissions</a></p>
<p>Denoではデフォルトでネットワークやファイルシステムへのアクセスがすべてオフになっている。プログラムからのアクセスを許可するには、実行時にオプションやプロンプトから許可を与える必要がある。</p>
<p>以下、オプションを列挙するが、実際に<code>deno run</code>を実行するには実行するファイル名が引数として必要となるとなることには注意。</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,IyDjg43jg4Pjg4jjg6/jg7zjgq/jgqLjgq/jgrvjgrkKZGVubyBydW4gLS1hbGxvdy1uZXQKZGVubyBydW4gLS1hbGxvdy1uZXQ9Z2l0aHViLmNvbSxsb2NhbGhvc3Q6ODA4MAojIOODleOCoeOCpOODq+OCt+OCueODhuODoOOCouOCr+OCu+OCue+8iOiqreOBv+WPluOCiu+8iQpkZW5vIHJ1biAtLWFsbG93LXJlYWQKZGVubyBydW4gLS1hbGxvdy1yZWFkPQojIOODleOCoeOCpOODq+OCt+OCueODhuODoOOCouOCr+OCu+OCue+8iOabuOOBjei+vOOBv++8iQpkZW5vIHJ1biAtLWFsbG93LXdyaXRlCmRlbm8gcnVuIC0tYWxsb3ctd3JpdGU9CiMg55Kw5aKD5aSJ5pWwCmRlbm8gcnVuIC0tYWxsb3ctZW52CmRlbm8gcnVuIC0tYWxsb3ctZW52PUhPTUUsUEFUSAoKIyDpq5jliIbop6Pog73mmYLplpPmuKzlrprvvIhoaWdoLXJlc29sdXRpb24gdGltZSBtZWFzdXJlbWVudO+8iQpkZW5vIHJ1biAtLWFsbG93LWhydGltZQ==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ネットワークアクセス</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --allow-net</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --allow-net=github.com,localhost:8080</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ファイルシステムアクセス（読み取り）</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --allow-read</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --allow-read=</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ファイルシステムアクセス（書き込み）</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --allow-write</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --allow-write=</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 環境変数</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --allow-env</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --allow-env=HOME,PATH</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 高分解能時間測定（high-resolution time measurement）</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --allow-hrtime</span></span></code></pre></figure>
<p>DenoはV8エンジンのサンドボックス機能を使うことでセキュアな実行をサポートしているが、コマンドやFFIはサンドボックス外での実行を許可することになるので、注意が必要となる。</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,IyDjgrPjg57jg7Pjg4nvvIjjgrXjg5bjg5fjg63jgrvjgrnvvInjga7lrp/ooYwKZGVubyBydW4gLS1hbGxvdy1ydW4KZGVubyBydW4gLS1hbGxvdy1ydW49aW1hZ2VtYWdpY2ssZmZtcGVnCgojIEZGSe+8iOWklumDqOmWouaVsOOCpOODs+OCv+ODvOODleOCp+ODvOOCue+8ieOBq+OCiOOCi+ODgOOCpOODiuODn+ODg+OCr+ODqeOCpOODluODqeODquOBruiqrei+vOODu+Wun+ihjApkZW5vIHJ1biAtLWFsbG93LWZmaQ==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># コマンド（サブプロセス）の実行</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --allow-run</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --allow-run=imagemagick,ffmpeg</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># FFI（外部関数インターフェース）によるダイナミックライブラリの読込・実行</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --allow-ffi</span></span></code></pre></figure>
<p>上記のすべてを許可するには<code>--allow-all</code>または<code>-A</code>が使えるが、当然注意が必要となる。</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,IyDjgZnjgbnjgaboqLHlj68KZGVubyBydW4gLS1hbGxvdy1hbGwKZGVubyBydW4gLUE=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># すべて許可</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --allow-all</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -A</span></span></code></pre></figure>
<h2 id="テスト"><a aria-hidden="true" tabindex="-1" href="#テスト"><span class="icon icon-link"></span></a>テスト</h2>
<p>参考リンク: <a href="https://deno.land/manual/testing" target="_blank" rel="noopener noreferrer">https://deno.land/manual/testing</a></p>
<h3 id="テストの記述"><a aria-hidden="true" tabindex="-1" href="#テストの記述"><span class="icon icon-link"></span></a>テストの記述</h3>
<p>ファイル名が以下の形式のファイルが、テストファイルとして認識される。</p>
<ul>
<li><code>test.ts</code></li>
<li><code>*.test.ts</code></li>
<li><code>*_test.ts</code></li>
</ul>
<p><code>hello.test.ts</code></p>
<figure data-code-block="" data-language="ts"><figcaption><span class="code-block-language">ts</span><div class="code-block-actions"><a download="code.ts" href="data:text/plain;charset=utf-8;base64,aW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAiaHR0cHM6Ly9kZW5vLmxhbmQvc3RkQDAuMTMzLjAvdGVzdGluZy9hc3NlcnRzLnRzIgoKRGVuby50ZXN0KCJIZWxsbywgVGVzdCEiLCAoKSA9PiB7CiAgICBhc3NlcnQoIkhlbGxvLCBUZXN0ISIuaW5jbHVkZXMoIlRlc3QiKSkKfSk=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-ts"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { assert } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "https://deno.land/std@0.133.0/testing/asserts.ts"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Deno.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">test</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Hello, Test!"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    assert</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Hello, Test!"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">includes</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Test"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">})</span></span></code></pre></figure>
<p><code>Deno.test</code>のAPIについては:</p>
<ul>
<li><a href="https://doc.deno.land/deno/stable/~/Deno.test" target="_blank" rel="noopener noreferrer">https://doc.deno.land/deno/stable/~/Deno.test</a></li>
</ul>
<p><code>std/testing/asserts.ts</code>モジュールについては:</p>
<ul>
<li><a href="https://doc.deno.land/https://deno.land/std/testing/asserts.ts" target="_blank" rel="noopener noreferrer">https://doc.deno.land/https://deno.land/std/testing/asserts.ts</a></li>
</ul>
<p>をそれぞれ参照。</p>
<h3 id="テストの実行"><a aria-hidden="true" tabindex="-1" href="#テストの実行"><span class="icon icon-link"></span></a>テストの実行</h3>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,ZGVubyB0ZXN0" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> test</span></span></code></pre></figure>
<p>でカレントディレクトリ以下の<code>{*_,*.,}test.{ts, tsx, mts, js, mjs, jsx, cjs, cts}</code>、つまり、</p>
<figure data-code-block="" data-language="text"><figcaption><span class="code-block-language">text</span><div class="code-block-actions"><a download="code.text" href="data:text/plain;charset=utf-8;base64,aGVsbG8vdGVzdC50cwpoZWxsby50ZXN0LnRzCmhlbGxvX3Rlc3QudHM=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-text"><span class="line"><span>hello/test.ts</span></span>
<span class="line"><span>hello.test.ts</span></span>
<span class="line"><span>hello_test.ts</span></span></code></pre></figure>
<p>のようなファイルに記述されているテストがすべて実行される。</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,IyDjg4fjgqPjg6zjgq/jg4jjg6rjga7mjIflrpoKZGVubyB0ZXN0IGhlbGxvLw==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ディレクトリの指定</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> test</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> hello/</span></span></code></pre></figure>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,IyDjg5XjgqHjgqTjg6vjga7mjIflrpoKZGVubyB0ZXN0IGhlbGxvLnRlc3QudHM=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ファイルの指定</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> test</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> hello.test.ts</span></span></code></pre></figure>
<p>も可能。</p>
<figure data-code-block="" data-language="ts"><figcaption><span class="code-block-language">ts</span><div class="code-block-actions"><a download="code.ts" href="data:text/plain;charset=utf-8;base64,aW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAiaHR0cHM6Ly9kZW5vLmxhbmQvc3RkQDAuMTMzLjAvdGVzdGluZy9hc3NlcnRzLnRzIgoKRGVuby50ZXN0KCJIZWxsbywgVGVzdCEiLCB7IHBlcm1pc3Npb25zOiB7IHJlYWQ6IHRydWUgfSB9LCAoKSA9PiB7CiAgICBhc3NlcnQodHJ1ZSkKfSk=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-ts"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { assert } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "https://deno.land/std@0.133.0/testing/asserts.ts"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Deno.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">test</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Hello, Test!"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, { permissions: { read: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> } }, () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    assert</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">})</span></span></code></pre></figure>
<p>のようにパーミッションが必要な場合は、<code>deno run</code>の場合と同様にオプションにより実行に許可を与える。</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,ZGVubyB0ZXN0IC0tYWxsb3ctcmVhZA==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> test</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --allow-read</span></span></code></pre></figure>
<h2 id="リント"><a aria-hidden="true" tabindex="-1" href="#リント"><span class="icon icon-link"></span></a>リント</h2>
<p>参考リンク: <a href="https://deno.land/manual/tools/linter" target="_blank" rel="noopener noreferrer">https://deno.land/manual/tools/linter</a></p>
<p>コードのリントは<code>deno lint</code>コマンドで行う。</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,IyDjgZnjgbnjgabjga7jg5XjgqHjgqTjg6vvvIjjgqvjg6zjg7Pjg4jjg4fjgqPjg6zjgq/jg4jjg6rku6XkuIvvvIkKZGVubyBsaW50CiMg5oyH5a6a44GX44Gf44OH44Kj44Os44Kv44OI44OqCmRlbm8gbGludCBzcmMvCiMg5oyH5a6a44GX44Gf44OV44Kh44Kk44OrCmRlbm8gbGludCBzcmMvbWFpbi50c+OAgHNyYy9saWIudHM=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># すべてのファイル（カレントディレクトリ以下）</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> lint</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 指定したディレクトリ</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> lint</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> src/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 指定したファイル</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> lint</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> src/main.ts　src/lib.ts</span></span></code></pre></figure>
<p>ルールの一覧は:</p>
<ul>
<li><a href="https://lint.deno.land/" target="_blank" rel="noopener noreferrer">https://lint.deno.land/</a></li>
</ul>
<p>を参照。</p>
<p>設定ファイルで、含めるファイルやリントのルールを指定できることもできる。</p>
<figure data-code-block="" data-language="json"><figcaption><span class="code-block-language">json</span><div class="code-block-actions"><a download="code.json" href="data:text/plain;charset=utf-8;base64,ewogICAgImxpbnQiOiB7CiAgICAgICAgImZpbGVzIjogewogICAgICAgICAgICAiaW5jbHVkZSI6IFsic3JjLyJdLAogICAgICAgICAgICAiZXhjbHVkZSI6IFsic3JjL3Rlc3RkYXRhLyJdCiAgICAgICAgfSwKICAgICAgICAicnVsZXMiOiB7CiAgICAgICAgICAgICJ0YWdzIjogWyJyZWNvbW1lbmRlZCJdLAogICAgICAgICAgICAiaW5jbHVkZSI6IFsiYmFuLXVudGFnZ2VkLXRvZG8iXSwKICAgICAgICAgICAgImV4Y2x1ZGUiOiBbIm5vLXVudXNlZC12YXJzIl0KICAgICAgICB9CiAgICB9Cn0=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-json"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "lint"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        "files"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">            "include"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"src/"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">],</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">            "exclude"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"src/testdata/"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        },</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        "rules"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">            "tags"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"recommended"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">],</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">            "include"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"ban-untagged-todo"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">],</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">            "exclude"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"no-unused-vars"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<h2 id="フォーマット"><a aria-hidden="true" tabindex="-1" href="#フォーマット"><span class="icon icon-link"></span></a>フォーマット</h2>
<p>参考リンク: <a href="https://deno.land/manual/tools/formatter" target="_blank" rel="noopener noreferrer">https://deno.land/manual/tools/formatter</a></p>
<p>コードのフォーマットは<code>deno fmt</code>コマンドで行う。</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,IyDjgZnjgbnjgabjga7jg5XjgqHjgqTjg6vvvIjjgqvjg6zjg7Pjg4jjg4fjgqPjg6zjgq/jg4jjg6rku6XkuIvvvIkKZGVubyBmbXQKIyDmjIflrprjgZfjgZ/jg4fjgqPjg6zjgq/jg4jjg6oKZGVubyBmbXQgc3JjLwojIOaMh+WumuOBl+OBn+ODleOCoeOCpOODqwpkZW5vIGZtdCBzcmMvbWFpbi50c+OAgHNyYy9saWIudHM=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># すべてのファイル（カレントディレクトリ以下）</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> fmt</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 指定したディレクトリ</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> fmt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> src/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 指定したファイル</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> fmt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> src/main.ts　src/lib.ts</span></span></code></pre></figure>
<p>設定ファイルで、含めるファイルやフォーマットのオプションを指定することもできる。</p>
<figure data-code-block="" data-language="json"><figcaption><span class="code-block-language">json</span><div class="code-block-actions"><a download="code.json" href="data:text/plain;charset=utf-8;base64,ewogICAgImZtdCI6IHsKICAgICAgICAiZmlsZXMiOiB7CiAgICAgICAgICAgICJpbmNsdWRlIjogWyJzcmMvIl0sCiAgICAgICAgICAgICJleGNsdWRlIjogWyJzcmMvdGVzdGRhdGEvIl0KICAgICAgICB9LAogICAgICAgICJvcHRpb25zIjogewogICAgICAgICAgICAidXNlVGFicyI6IHRydWUsCiAgICAgICAgICAgICJsaW5lV2lkdGgiOiA4MCwKICAgICAgICAgICAgImluZGVudFdpZHRoIjogNCwKICAgICAgICAgICAgInNpbmdsZVF1b3RlIjogdHJ1ZSwKICAgICAgICAgICAgInByb3NlV3JhcCI6ICJwcmVzZXJ2ZSIKICAgICAgICB9CiAgICB9Cn0=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-json"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "fmt"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        "files"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">            "include"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"src/"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">],</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">            "exclude"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"src/testdata/"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        },</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        "options"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">            "useTabs"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">            "lineWidth"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">80</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">            "indentWidth"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">            "singleQuote"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">            "proseWrap"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"preserve"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<h2 id="依存パッケージの管理"><a aria-hidden="true" tabindex="-1" href="#依存パッケージの管理"><span class="icon icon-link"></span></a>依存パッケージの管理</h2>
<h3 id="depsts"><a aria-hidden="true" tabindex="-1" href="#depsts"><span class="icon icon-link"></span></a><code>deps.ts</code></h3>
<p>参考リンク: <a href="https://deno.land/manual/examples/manage_dependencies" target="_blank" rel="noopener noreferrer">https://deno.land/manual/examples/manage_dependencies</a></p>
<p>依存パッケージを何らかのファイルにまとめて管理したい場合は、一つの慣習として次のような名前のファイルにリモートの依存先を記述し、そこから<code>import</code>して使う。</p>
<ul>
<li><code>deps.ts</code>（<code>dependencies</code>）</li>
<li><code>dev_deps.ts</code>（<code>devDependencies</code>）</li>
</ul>
<p><code>src/deps.ts</code>:</p>
<figure data-code-block="" data-language="ts"><figcaption><span class="code-block-language">ts</span><div class="code-block-actions"><a download="code.ts" href="data:text/plain;charset=utf-8;base64,ZXhwb3J0ICogYXMgeWFtbCBmcm9tICJodHRwczovL2Rlbm8ubGFuZC9zdGRAMC4xMzMuMC9lbmNvZGluZy95YW1sLnRzIg==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-ts"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> *</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> as</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> yaml </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "https://deno.land/std@0.133.0/encoding/yaml.ts"</span></span></code></pre></figure>
<p><code>src/main.ts</code>:</p>
<figure data-code-block="" data-language="ts"><figcaption><span class="code-block-language">ts</span><div class="code-block-actions"><a download="code.ts" href="data:text/plain;charset=utf-8;base64,aW1wb3J0IHsgeWFtbCB9IGZyb20gIi4vZGVwcy50cyIKCmNvbnN0IGFydGljbGUgPSB5YW1sLnBhcnNlKGAKdGl0bGU6IEhlbGxvLCBEZW5vIQpkZXNjcmlwdGlvbjogQW4gaW50cm9kdWN0aW9uIHRvIERlbm8uCmApCgpjb25zb2xlLmxvZyhhcnRpY2xlKQ==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-ts"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { yaml } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "./deps.ts"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> article</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> yaml.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">parse</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">`</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">title: Hello, Deno!</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">description: An introduction to Deno.</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">`</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(article)</span></span></code></pre></figure>
<h3 id="lockjson"><a aria-hidden="true" tabindex="-1" href="#lockjson"><span class="icon icon-link"></span></a><code>lock.json</code></h3>
<p>参考リンク: <a href="https://deno.land/manual/linking_to_external_code/integrity_checking.md" target="_blank" rel="noopener noreferrer">https://deno.land/manual/linking_to_external_code/integrity_checking.md</a></p>
<p>複数の環境で本当に同一のパッケージが使われているか整合性を確かめるには、ロックファイルを使う。</p>
<p>ファイル名は公式マニュアルの例では<code>lock.json</code>となっているが、個人的には<code>deno.lock.json</code>を使いたい。</p>
<p>ロックファイルを生成するには:</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,ZGVubyBjYWNoZSAtLWxvY2std3JpdGUgLS1sb2NrPWRlbm8ubG9jay5qc29uIHNyYy9kZXBzLnRz" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> cache</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --lock-write</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --lock=deno.lock.json</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> src/deps.ts</span></span></code></pre></figure>
<p>ロックファイルを使ってキャッシュを再読み込みするには:</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,ZGVubyBjYWNoZSAtLXJlbG9hZCAtLWxvY2s9ZGVuby5sb2NrLmpzb24gc3JjL2RlcHMudHM=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">deno</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> cache</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --reload</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --lock=deno.lock.json</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> src/deps.ts</span></span></code></pre></figure>
<h2 id="感想"><a aria-hidden="true" tabindex="-1" href="#感想"><span class="icon icon-link"></span></a>感想</h2>
<p>Node.jsへの反省として発表されてからしばらく経っているが、当初思ったよりは普及しておらず、開発中の機能も多い。</p>
<p>特に、外部ライブラリを使う起点となるパッケージ管理の仕組みについては、Goが結局<code>go.mod</code>や<code>go.sum</code>を導入したように、ファイルでまとめて管理するように戻してしまったほうがいいのではという感がいなめなず、結果として、外部ライブラリを使うときにこそ良さを発揮するであろうサンドックス機能の恩恵にも与りにくくなっている。</p>
<p>とはいえ、TypeScriptと<code>await</code>がそのまま使えるのと、テストランナーやフォーマッター、リンターがデフォルトでついてくるのは、プロジェクトをミニマルに保ちたい場合にはうれしい利点となっている。</p>
<p>当面はTypeScriptのみで外部ライブラリさえ使わない小さな個人プロジェクトで使いつつ、今後の行く末に期待したい。
$</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Deno]]></title>
<link>https://blog.publictheta.com/tags/deno</link>
<guid isPermaLink="true">https://blog.publictheta.com/tags/deno</guid>
<description><![CDATA[]]></description>
<pubDate>Sat, 02 Apr 2022 20:53:03 GMT</pubDate>

<content:encoded><![CDATA[<h2 id="リンク"><a aria-hidden="true" tabindex="-1" href="#リンク"><span class="icon icon-link"></span></a>リンク</h2>
<ul>
<li>公式サイト: <a href="https://deno.land/" target="_blank" rel="noopener noreferrer">https://deno.land/</a></li>
<li>公式マニュアル: <a href="https://deno.land/manual" target="_blank" rel="noopener noreferrer">https://deno.land/manual</a></li>
<li>リポジトリ: <a href="https://github.com/denoland/deno" target="_blank" rel="noopener noreferrer">https://github.com/denoland/deno</a></li>
<li>ランタイムAPI: <a href="https://doc.deno.land/deno/stable" target="_blank" rel="noopener noreferrer">https://doc.deno.land/deno/stable</a></li>
<li>標準ライブラリ: <a href="https://deno.land/std" target="_blank" rel="noopener noreferrer">https://deno.land/std</a></li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[Next.jsで静的サイトとしてエクスポートする]]></title>
<link>https://blog.publictheta.com/memos/2022-03-21-next-static-export</link>
<guid isPermaLink="true">https://blog.publictheta.com/memos/2022-03-21-next-static-export</guid>
<description><![CDATA[]]></description>
<pubDate>Mon, 21 Mar 2022 17:02:27 GMT</pubDate>
<category>Next.js</category>
<content:encoded><![CDATA[<figure data-code-block="" data-language="bash"><figcaption><span class="code-block-language">bash</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,bmV4dCBidWlsZCAmJiBuZXh0IGV4cG9ydA==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">next</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> build</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> &#x26;&#x26; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">next</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> export</span></span></code></pre></figure>
<p>スクリプトを、</p>
<figure data-code-block="" data-language="json"><figcaption><span class="code-block-language">json</span><div class="code-block-actions"><a download="code.json" href="data:text/plain;charset=utf-8;base64,ewogICJzY3JpcHRzIjogewogICAgImJ1aWxkIjogIm5leHQgYnVpbGQgJiYgbmV4dCBleHBvcnQiCiAgfQp9" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-json"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "scripts"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "build"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"next build &#x26;&#x26; next export"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<p>のようにしておくと便利。</p>
<h2 id="参考"><a aria-hidden="true" tabindex="-1" href="#参考"><span class="icon icon-link"></span></a>参考</h2>
<ul>
<li><a href="https://nextjs.org/docs/advanced-features/static-html-export" target="_blank" rel="noopener noreferrer">https://nextjs.org/docs/advanced-features/static-html-export</a></li>
<li><a href="https://github.com/vercel/next.js/tree/canary/examples/with-static-export" target="_blank" rel="noopener noreferrer">https://github.com/vercel/next.js/tree/canary/examples/with-static-export</a></li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[Next.jsでSass/SCSSを有効にする]]></title>
<link>https://blog.publictheta.com/memos/2022-03-21-next-sass</link>
<guid isPermaLink="true">https://blog.publictheta.com/memos/2022-03-21-next-sass</guid>
<description><![CDATA[]]></description>
<pubDate>Mon, 21 Mar 2022 16:51:53 GMT</pubDate>
<category>Next.js</category><category>Sass/SCSS</category>
<content:encoded><![CDATA[<p>Sassの追加:</p>
<figure data-code-block="" data-language="bash"><figcaption><span class="code-block-language">bash</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,bnBtIGkgLUQgc2Fzcw==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> i</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -D</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> sass</span></span></code></pre></figure>
<p>TypeScriptを作っている場合、<code>custom.d.ts</code>のようなファイルを作り:</p>
<figure data-code-block="" data-language="ts"><figcaption><span class="code-block-language">ts</span><div class="code-block-actions"><a download="code.ts" href="data:text/plain;charset=utf-8;base64,ZGVjbGFyZSBtb2R1bGUgIioubW9kdWxlLmNzcyIKZGVjbGFyZSBtb2R1bGUgIioubW9kdWxlLnNhc3MiCmRlY2xhcmUgbW9kdWxlICIqLm1vZHVsZS5zY3NzIg==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-ts"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">declare</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> module</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "*.module.css"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">declare</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> module</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "*.module.sass"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">declare</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> module</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "*.module.scss"</span></span></code></pre></figure>
<h2 id="参考"><a aria-hidden="true" tabindex="-1" href="#参考"><span class="icon icon-link"></span></a>参考</h2>
<ul>
<li><a href="https://nextjs.org/docs/basic-features/built-in-css-support#sass-support" target="_blank" rel="noopener noreferrer">https://nextjs.org/docs/basic-features/built-in-css-support#sass-support</a></li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[Sass/SCSS]]></title>
<link>https://blog.publictheta.com/tags/sass</link>
<guid isPermaLink="true">https://blog.publictheta.com/tags/sass</guid>
<description><![CDATA[]]></description>
<pubDate>Mon, 21 Mar 2022 16:46:33 GMT</pubDate>

<content:encoded><![CDATA[<h2 id="リンク"><a aria-hidden="true" tabindex="-1" href="#リンク"><span class="icon icon-link"></span></a>リンク</h2>
<ul>
<li>公式サイト: <a href="https://sass-lang.com" target="_blank" rel="noopener noreferrer">https://sass-lang.com</a></li>
<li>リポジトリ: <a href="https://github.com/sass/dart-sass" target="_blank" rel="noopener noreferrer">https://github.com/sass/dart-sass</a></li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[Prettier]]></title>
<link>https://blog.publictheta.com/tags/prettier</link>
<guid isPermaLink="true">https://blog.publictheta.com/tags/prettier</guid>
<description><![CDATA[]]></description>
<pubDate>Mon, 21 Mar 2022 16:34:03 GMT</pubDate>

<content:encoded><![CDATA[<ul>
<li>公式サイト: <a href="https://prettier.io" target="_blank" rel="noopener noreferrer">https://prettier.io</a></li>
<li>リポジトリ: <a href="https://github.com/prettier/prettier" target="_blank" rel="noopener noreferrer">https://github.com/prettier/prettier</a></li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[Next.jsのプロジェクトに`prettier`を追加する]]></title>
<link>https://blog.publictheta.com/memos/2022-03-21-next-prettier</link>
<guid isPermaLink="true">https://blog.publictheta.com/memos/2022-03-21-next-prettier</guid>
<description><![CDATA[]]></description>
<pubDate>Mon, 21 Mar 2022 16:32:22 GMT</pubDate>
<category>Next.js</category><category>Prettier</category>
<content:encoded><![CDATA[<p>依存パッケージの追加:</p>
<figure data-code-block="" data-language="bash"><figcaption><span class="code-block-language">bash</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,bnBtIGkgLUQgcHJldHRpZXIgZXNsaW50LWNvbmZpZy1wcmV0dGllcg==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> i</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -D</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> prettier</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> eslint-config-prettier</span></span></code></pre></figure>
<p><code>.eslintrc.json</code>への追記:</p>
<figure data-code-block="" data-language="json"><figcaption><span class="code-block-language">json</span><div class="code-block-actions"><a download="code.json" href="data:text/plain;charset=utf-8;base64,ewogICJleHRlbmRzIjogWyJuZXh0L2NvcmUtd2ViLXZpdGFscyIsICJwcmV0dGllciJdCn0=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-json"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "extends"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"next/core-web-vitals"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"prettier"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<p><code>.prettierignore</code>への追記:</p>
<figure data-code-block="" data-language=""><figcaption><div class="code-block-actions"><a download="code.txt" href="data:text/plain;charset=utf-8;base64,Ly5uZXh0Lwovb3V0Lwo=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre><code>/.next/
/out/
</code></pre></figure>
<p>npmスクリプトの追加（任意）:</p>
<figure data-code-block="" data-language="json"><figcaption><span class="code-block-language">json</span><div class="code-block-actions"><a download="code.json" href="data:text/plain;charset=utf-8;base64,ewogICJzY3JpcHRzIjogewogICAgImZvcm1hdCI6ICJwcmV0dGllciAtLXdyaXRlIC4iCiAgfSwKfQ==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-json"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "scripts"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "format"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"prettier --write ."</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>]]></content:encoded>
</item>
<item>
<title><![CDATA[Goアプリケーションの作成]]></title>
<link>https://blog.publictheta.com/memos/2022-03-21-go-create-app</link>
<guid isPermaLink="true">https://blog.publictheta.com/memos/2022-03-21-go-create-app</guid>
<description><![CDATA[]]></description>
<pubDate>Mon, 21 Mar 2022 15:52:39 GMT</pubDate>

<content:encoded><![CDATA[<h2 id="プロジェクトの作成"><a aria-hidden="true" tabindex="-1" href="#プロジェクトの作成"><span class="icon icon-link"></span></a>プロジェクトの作成</h2>
<figure data-code-block="" data-language="bash"><figcaption><span class="code-block-language">bash</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,Z28gbW9kIGluaXQgZXhhbXBsZS9oZWxsbw==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">go</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> mod</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> init</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> example/hello</span></span></code></pre></figure>
<p>次のような<code>go.mod</code>が生成される:</p>
<figure data-code-block="" data-language="go-mod"><figcaption><span class="code-block-language">go-mod</span><div class="code-block-actions"><a download="code.go-mod" href="data:text/plain;charset=utf-8;base64,bW9kdWxlIGV4YW1wbGUvaGVsbG8KCmdvIDEuMTgK" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre><code class="language-go-mod">module example/hello

go 1.18
</code></pre></figure>
<p><code>main.go</code>を作成する（ファイル名は任意）:</p>
<figure data-code-block="" data-language="go"><figcaption><span class="code-block-language">go</span><div class="code-block-actions"><a download="code.go" href="data:text/plain;charset=utf-8;base64,cGFja2FnZSBtYWluCgppbXBvcnQgImZtdCIKCmZ1bmMgbWFpbigpIHsKICAgIGZtdC5QcmludGxuKCJIZWxsbywgV29ybGQhIikKfQ==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-go"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">package</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> main</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">fmt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">func</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">() {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    fmt.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Println</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Hello, World!"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<p>実行は:</p>
<figure data-code-block="" data-language="bash"><figcaption><span class="code-block-language">bash</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,Z28gcnVuIC4=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">go</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> .</span></span></code></pre></figure>
<h2 id="パッケージの追加"><a aria-hidden="true" tabindex="-1" href="#パッケージの追加"><span class="icon icon-link"></span></a>パッケージの追加</h2>
<p>例えば:</p>
<figure data-code-block="" data-language="bash"><figcaption><span class="code-block-language">bash</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,Z28gZ2V0IGdpdGh1Yi5jb20vbGFic3RhY2svZWNoby92NA==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">go</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> get</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> github.com/labstack/echo/v4</span></span></code></pre></figure>
<p><code>main.go</code>を次のように書き直して:</p>
<figure data-code-block="" data-language="go"><figcaption><span class="code-block-language">go</span><div class="code-block-actions"><a download="code.go" href="data:text/plain;charset=utf-8;base64,cGFja2FnZSBtYWluCgppbXBvcnQgKAoJIm5ldC9odHRwIgoKCSJnaXRodWIuY29tL2xhYnN0YWNrL2VjaG8vdjQiCikKCmZ1bmMgbWFpbigpIHsKCS8vIEVjaG8gaW5zdGFuY2UKCWUgOj0gZWNoby5OZXcoKQoKCS8vIFJvdXRlcwoJZS5HRVQoIi8iLCBoZWxsbykKCgkvLyBTdGFydCBzZXJ2ZXIKCWUuTG9nZ2VyLkZhdGFsKGUuU3RhcnQoIjoxMzIzIikpCn0KCi8vIEhhbmRsZXIKZnVuYyBoZWxsbyhjIGVjaG8uQ29udGV4dCkgZXJyb3IgewoJcmV0dXJuIGMuU3RyaW5nKGh0dHAuU3RhdHVzT0ssICJIZWxsbywgV29ybGQhIikKfQ==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-go"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">package</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> main</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">	"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">net/http</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">	"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">github.com/labstack/echo/v4</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">func</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">() {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">	// Echo instance</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">	e </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> echo.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">New</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">	// Routes</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">	e.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">GET</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"/"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, hello)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">	// Start server</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">	e.Logger.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Fatal</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(e.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Start</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">":1323"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// Handler</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">func</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> hello</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">c</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> echo</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Context</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">error</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">	return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> c.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(http.StatusOK, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Hello, World!"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<p>実行すると:</p>
<figure data-code-block="" data-language="bash"><figcaption><span class="code-block-language">bash</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,Z28gcnVuIC4=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">go</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> .</span></span></code></pre></figure>
<p><a href="http://localhost:1323/" target="_blank" rel="noopener noreferrer">http://localhost:1323/</a></p>
<p>で<code>"Hello, World!</code>が表示されるようになる。</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[`create-next-app`を使って現在のディレクトリにTypeScriptのNext.jsプロジェクトの雛形を生成する]]></title>
<link>https://blog.publictheta.com/memos/2022-03-17-create-next-app</link>
<guid isPermaLink="true">https://blog.publictheta.com/memos/2022-03-17-create-next-app</guid>
<description><![CDATA[]]></description>
<pubDate>Thu, 17 Mar 2022 21:11:11 GMT</pubDate>
<category>Next.js</category><category>TypeScript</category>
<content:encoded><![CDATA[<p>npm:</p>
<figure data-code-block="" data-language="bash"><figcaption><span class="code-block-language">bash</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,bnB4IGNyZWF0ZS1uZXh0LWFwcEBsYXRlc3QgLS10cyAu" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npx</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> create-next-app@latest</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --ts</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> .</span></span></code></pre></figure>
<p>yarn:</p>
<figure data-code-block="" data-language="bash"><figcaption><span class="code-block-language">bash</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,eWFybiBjcmVhdGUgbmV4dC1hcHAgLS10cyAu" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">yarn</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> create</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> next-app</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --ts</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> .</span></span></code></pre></figure>
<p>pnpm:</p>
<figure data-code-block="" data-language="bash"><figcaption><span class="code-block-language">bash</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,cG5wbSBjcmVhdGUgbmV4dC1hcHAgLS10cyAu" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> create</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> next-app</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --ts</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> .</span></span></code></pre></figure>]]></content:encoded>
</item>
<item>
<title><![CDATA[Next.jsの設定ファイルの型定義]]></title>
<link>https://blog.publictheta.com/memos/2022-03-11-nextjs-config-typing</link>
<guid isPermaLink="true">https://blog.publictheta.com/memos/2022-03-11-nextjs-config-typing</guid>
<description><![CDATA[]]></description>
<pubDate>Fri, 11 Mar 2022 09:53:49 GMT</pubDate>
<category>Next.js</category>
<content:encoded><![CDATA[<p><code>next.config.mjs</code>:</p>
<figure data-code-block="" data-language="js"><figcaption><span class="code-block-language">js</span><div class="code-block-actions"><a download="code.js" href="data:text/plain;charset=utf-8;base64,Ly8gQHRzLWNoZWNrCiJ1c2Ugc3RyaWN0IgoKLyoqCiAqCiAqIEBwYXJhbSB7IHN0cmluZyB9IHBoYXNlCiAqIEBwYXJhbSB7eyBkZWZhdWx0Q29uZmlnOiBpbXBvcnQoIm5leHQiKS5OZXh0Q29uZmlnIH19IGNvbmZpZwogKiBAcmV0dXJucyB7IFByb21pc2U8aW1wb3J0KCJuZXh0IikuTmV4dENvbmZpZz4gfQogKi8KZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlTmV4dENvbmZpZyhwaGFzZSwgeyBkZWZhdWx0Q29uZmlnIH0pIHsKICAgIHJldHVybiB7CiAgICAgICAgcmVhY3RTdHJpY3RNb2RlOiB0cnVlLAogICAgfQp9" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-js"><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// @ts-check</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"use strict"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">/**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> *</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">@param</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> { string }</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> phase</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">@param</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> {{ defaultConfig: import("next").NextConfig }}</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> config</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">@returns</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> { Promise&#x3C;import("next").NextConfig> }</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> */</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> default</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> createNextConfig</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">phase</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, { </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">defaultConfig</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        reactStrictMode: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<h2 id="参考"><a aria-hidden="true" tabindex="-1" href="#参考"><span class="icon icon-link"></span></a>参考</h2>
<ul>
<li><a href="https://github.com/vercel/next.js/blob/e57d621fb38562b1d5ae02fb6f7efd343e1db405/packages/next/server/config-shared.ts#L475-L481" target="_blank" rel="noopener noreferrer">https://github.com/vercel/next.js/blob/e57d621fb38562b1d5ae02fb6f7efd343e1db405/packages/next/server/config-shared.ts#L475-L481</a></li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[Next.js]]></title>
<link>https://blog.publictheta.com/tags/nextjs</link>
<guid isPermaLink="true">https://blog.publictheta.com/tags/nextjs</guid>
<description><![CDATA[]]></description>
<pubDate>Fri, 11 Mar 2022 09:53:49 GMT</pubDate>

<content:encoded><![CDATA[<h2 id="リンク"><a aria-hidden="true" tabindex="-1" href="#リンク"><span class="icon icon-link"></span></a>リンク</h2>
<ul>
<li>公式サイト: <a href="https://nextjs.org/" target="_blank" rel="noopener noreferrer">https://nextjs.org/</a></li>
<li>リポジトリ: <a href="https://github.com/vercel/next.js" target="_blank" rel="noopener noreferrer">https://github.com/vercel/next.js</a></li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[フォントのウェイト名と数値の対応表]]></title>
<link>https://blog.publictheta.com/memos/2022-03-10-font-weight-name</link>
<guid isPermaLink="true">https://blog.publictheta.com/memos/2022-03-10-font-weight-name</guid>
<description><![CDATA[]]></description>
<pubDate>Thu, 10 Mar 2022 20:52:36 GMT</pubDate>
<category>フォント</category><category>CSS</category>
<content:encoded><![CDATA[<table>
<thead>
<tr>
<th>数値</th>
<th>名前</th>
</tr>
</thead>
<tbody>
<tr>
<td>100</td>
<td>Thin</td>
</tr>
<tr>
<td>200</td>
<td>Extra Light (Ultra Light)</td>
</tr>
<tr>
<td>300</td>
<td>Light</td>
</tr>
<tr>
<td>400</td>
<td>Normal</td>
</tr>
<tr>
<td>500</td>
<td>Medium</td>
</tr>
<tr>
<td>600</td>
<td>Semi Bold (Demi Bold)</td>
</tr>
<tr>
<td>700</td>
<td>Bold</td>
</tr>
<tr>
<td>800</td>
<td>Extra Bold (Ultra Bold)</td>
</tr>
<tr>
<td>900</td>
<td>Black (Heavy)</td>
</tr>
</tbody>
</table>
<figure data-code-block="" data-language="css"><figcaption><span class="code-block-language">css</span><div class="code-block-actions"><a download="code.css" href="data:text/plain;charset=utf-8;base64,LmZvbnQtd2VpZ2h0IHsKICAgIGZvbnQtd2VpZ2h0OiAxMDA7IC8qIHRoaW4gKi8KICAgIGZvbnQtd2VpZ2h0OiAyMDA7IC8qIGV4dHJhIGxpZ2h0ICovCiAgICBmb250LXdlaWdodDogMzAwOyAvKiBsaWdodCAqLwogICAgZm9udC13ZWlnaHQ6IDQwMDsgLyogbm9ybWFsICovCiAgICBmb250LXdlaWdodDogNTAwOyAvKiBtZWRpdW0gKi8KICAgIGZvbnQtd2VpZ2h0OiA2MDA7IC8qIHNlbWkgYm9sZCAqLwogICAgZm9udC13ZWlnaHQ6IDcwMDsgLyogYm9sZCAqLwogICAgZm9udC13ZWlnaHQ6IDgwMDsgLyogZXh0cmEgYm9sZCAqLwogICAgZm9udC13ZWlnaHQ6IDkwMDsgLyogYmxhY2sgKi8KfQ==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-css"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">.font-weight</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    font-weight</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">100</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">/* thin */</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    font-weight</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">200</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">/* extra light */</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    font-weight</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">300</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">/* light */</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    font-weight</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">400</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">/* normal */</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    font-weight</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">500</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">/* medium */</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    font-weight</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">600</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">/* semi bold */</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    font-weight</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">700</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">/* bold */</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    font-weight</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">800</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">/* extra bold */</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    font-weight</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">900</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">/* black */</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<h2 id="参考"><a aria-hidden="true" tabindex="-1" href="#参考"><span class="icon icon-link"></span></a>参考</h2>
<ul>
<li><a href="https://www.w3.org/TR/css-fonts-3/#font-weight-numeric-values" target="_blank" rel="noopener noreferrer">https://www.w3.org/TR/css-fonts-3/#font-weight-numeric-values</a></li>
<li><a href="https://docs.microsoft.com/typography/opentype/spec/os2#usweightclass" target="_blank" rel="noopener noreferrer">https://docs.microsoft.com/typography/opentype/spec/os2#usweightclass</a></li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[CSS]]></title>
<link>https://blog.publictheta.com/tags/css</link>
<guid isPermaLink="true">https://blog.publictheta.com/tags/css</guid>
<description><![CDATA[]]></description>
<pubDate>Thu, 10 Mar 2022 20:52:36 GMT</pubDate>

<content:encoded><![CDATA[<h2 id="リンク"><a aria-hidden="true" tabindex="-1" href="#リンク"><span class="icon icon-link"></span></a>リンク</h2>
<ul>
<li>仕様: <a href="https://www.w3.org/TR/css/" target="_blank" rel="noopener noreferrer">https://www.w3.org/TR/css/</a></li>
<li>WG: <a href="https://www.w3.org/Style/CSS/" target="_blank" rel="noopener noreferrer">https://www.w3.org/Style/CSS/</a></li>
<li>MDN: <a href="https://developer.mozilla.org/docs/Web/CSS" target="_blank" rel="noopener noreferrer">https://developer.mozilla.org/docs/Web/CSS</a></li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[フォント]]></title>
<link>https://blog.publictheta.com/tags/font</link>
<guid isPermaLink="true">https://blog.publictheta.com/tags/font</guid>
<description><![CDATA[]]></description>
<pubDate>Thu, 10 Mar 2022 20:52:36 GMT</pubDate>

<content:encoded><![CDATA[<h2 id="リンク"><a aria-hidden="true" tabindex="-1" href="#リンク"><span class="icon icon-link"></span></a>リンク</h2>
<h3 id="仕様"><a aria-hidden="true" tabindex="-1" href="#仕様"><span class="icon icon-link"></span></a>仕様</h3>
<ul>
<li>True Type Font（<code>ttf</code>、<a href="https://developer.apple.com/fonts/TrueType-Reference-Manual/" target="_blank" rel="noopener noreferrer">仕様</a>）</li>
<li>Open Type Font（<code>otf</code>、<a href="https://docs.microsoft.com/typography/opentype/spec/" target="_blank" rel="noopener noreferrer">仕様</a>）</li>
<li>Web Open Font Format（<code>woff</code>、<a href="https://www.w3.org/TR/WOFF/" target="_blank" rel="noopener noreferrer">仕様</a>）</li>
<li>Web Open Font Format 2.0（<code>woff2</code>、<a href="https://www.w3.org/TR/WOFF2/" target="_blank" rel="noopener noreferrer">仕様</a>）</li>
</ul>
<h3 id="資料"><a aria-hidden="true" tabindex="-1" href="#資料"><span class="icon icon-link"></span></a>資料</h3>
<ul>
<li>Microsoft Typography
<ul>
<li><a href="https://docs.microsoft.com/typography/" target="_blank" rel="noopener noreferrer">https://docs.microsoft.com/typography/</a></li>
</ul>
</li>
<li>Adobe
<ul>
<li><a href="https://helpx.adobe.com/fonts/using/adobe-type-resources-faq.html" target="_blank" rel="noopener noreferrer">https://helpx.adobe.com/fonts/using/adobe-type-resources-faq.html</a></li>
<li><a href="https://github.com/adobe-type-tools/font-tech-notes" target="_blank" rel="noopener noreferrer">https://github.com/adobe-type-tools/font-tech-notes</a></li>
</ul>
</li>
<li>FontForge Technical References
<ul>
<li><a href="https://fontforge.org/docs/techref.html" target="_blank" rel="noopener noreferrer">https://fontforge.org/docs/techref.html</a></li>
<li><a href="https://fontforge.org/docs/appendices/bibliography.html" target="_blank" rel="noopener noreferrer">https://fontforge.org/docs/appendices/bibliography.html</a></li>
</ul>
</li>
<li>Google
<ul>
<li><a href="https://fonts.google.com/knowledge" target="_blank" rel="noopener noreferrer">https://fonts.google.com/knowledge</a></li>
<li><a href="https://googlefonts.github.io" target="_blank" rel="noopener noreferrer">https://googlefonts.github.io</a></li>
</ul>
</li>
<li>SIL International
<ul>
<li><a href="https://scripts.sil.org/cms/scripts/page.php?item_id=IWS-Chapter07" target="_blank" rel="noopener noreferrer">https://scripts.sil.org/cms/scripts/page.php?item_id=IWS-Chapter07</a></li>
<li><a href="https://scripts.sil.org/cms/scripts/page.php?item_id=IWS-Chapter08" target="_blank" rel="noopener noreferrer">https://scripts.sil.org/cms/scripts/page.php?item_id=IWS-Chapter08</a></li>
<li><a href="https://scripts.sil.org/IWS-AppendixC" target="_blank" rel="noopener noreferrer">https://scripts.sil.org/IWS-AppendixC</a></li>
</ul>
</li>
</ul>
<h3 id="css"><a aria-hidden="true" tabindex="-1" href="#css"><span class="icon icon-link"></span></a>CSS</h3>
<ul>
<li>CSS Fonts: <a href="https://www.w3.org/TR/css-fonts/" target="_blank" rel="noopener noreferrer">https://www.w3.org/TR/css-fonts/</a></li>
<li>CSS Fonts (Draft): <a href="https://drafts.csswg.org/css-fonts/" target="_blank" rel="noopener noreferrer">https://drafts.csswg.org/css-fonts/</a></li>
<li>MDN <code>@font-face</code>: <a href="https://developer.mozilla.org/docs/Web/CSS/@font-face" target="_blank" rel="noopener noreferrer">https://developer.mozilla.org/docs/Web/CSS/@font-face</a></li>
<li>web.dev - Fonts: <a href="https://web.dev/tags/fonts/" target="_blank" rel="noopener noreferrer">https://web.dev/tags/fonts/</a></li>
</ul>
<h3 id="ブログ"><a aria-hidden="true" tabindex="-1" href="#ブログ"><span class="icon icon-link"></span></a>ブログ</h3>
<ul>
<li><a href="https://fonts.googleblog.com" target="_blank" rel="noopener noreferrer">https://fonts.googleblog.com</a></li>
<li><a href="https://blog.typekit.com" target="_blank" rel="noopener noreferrer">https://blog.typekit.com</a></li>
<li><a href="https://ccjktype.fonts.adobe.com" target="_blank" rel="noopener noreferrer">https://ccjktype.fonts.adobe.com</a></li>
</ul>
<h3 id="実装"><a aria-hidden="true" tabindex="-1" href="#実装"><span class="icon icon-link"></span></a>実装</h3>
<ul>
<li>.NET (WPF)
<ul>
<li>Language: C#</li>
<li>Source: <a href="https://github.com/dotnet/wpf" target="_blank" rel="noopener noreferrer">https://github.com/dotnet/wpf</a>
<ul>
<li><a href="https://github.com/dotnet/wpf/tree/master/src/Microsoft.DotNet.Wpf/src/PresentationCore/MS/internal" target="_blank" rel="noopener noreferrer"><code>MS.Internal</code></a></li>
<li><a href="https://github.com/dotnet/wpf/tree/master/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/Media" target="_blank" rel="noopener noreferrer"><code>System.Windows.Media</code></a></li>
</ul>
</li>
<li>Documentation: <a href="https://docs.microsoft.com/dotnet/" target="_blank" rel="noopener noreferrer">https://docs.microsoft.com/dotnet/</a>
<ul>
<li><a href="https://docs.microsoft.com/dotnet/api/system.windows.media" target="_blank" rel="noopener noreferrer"><code>System.Windows.Media</code></a></li>
</ul>
</li>
<li>Note: Developed by Microsoft. Used by Windows.</li>
</ul>
</li>
<li>Core Text
<ul>
<li>Language: C with Objective-C/Swift API</li>
<li>Source: Closed.</li>
<li>Documentation: <a href="https://developer.apple.com/documentation/coretext" target="_blank" rel="noopener noreferrer">https://developer.apple.com/documentation/coretext</a></li>
<li>Note: Developed by Apple. Used by iOS, macOS, tvOS, and watchOS.</li>
</ul>
</li>
<li>Adobe Font Development Kit for OpenType (AFDKO)
<ul>
<li>Language: C</li>
<li>Source: <a href="https://github.com/adobe-type-tools/afdko" target="_blank" rel="noopener noreferrer">https://github.com/adobe-type-tools/afdko</a></li>
<li>Documentation: <a href="https://adobe-type-tools.github.io/afdko/" target="_blank" rel="noopener noreferrer">https://adobe-type-tools.github.io/afdko/</a></li>
<li>Note: Developed by Adobe.</li>
</ul>
</li>
<li>FreeType
<ul>
<li>Language: C</li>
<li>Source: <a href="https://gitlab.freedesktop.org/freetype/freetype/" target="_blank" rel="noopener noreferrer">https://gitlab.freedesktop.org/freetype/freetype/</a></li>
<li>Documentation: <a href="https://www.freetype.org/freetype2/docs/documentation.html" target="_blank" rel="noopener noreferrer">https://www.freetype.org/freetype2/docs/documentation.html</a></li>
<li>Note: Used by iOS, Android, Chromium, GNU/Linus, and more.</li>
</ul>
</li>
<li>HarfBuzz
<ul>
<li>Language: C++</li>
<li>Source: <a href="https://github.com/harfbuzz/harfbuzz" target="_blank" rel="noopener noreferrer">https://github.com/harfbuzz/harfbuzz</a></li>
<li>Documentation: <a href="https://harfbuzz.github.io" target="_blank" rel="noopener noreferrer">https://harfbuzz.github.io</a></li>
<li>Note: Used with FreeType by Android, Chromium, Firefox, and more.</li>
</ul>
</li>
<li>fontTools
<ul>
<li>Language: Python</li>
<li>Source: <a href="https://github.com/fonttools/fonttools" target="_blank" rel="noopener noreferrer">https://github.com/fonttools/fonttools</a></li>
<li>Documentation: <a href="https://fonttools.readthedocs.io" target="_blank" rel="noopener noreferrer">https://fonttools.readthedocs.io</a></li>
<li>Note: Used by Google and Adobe.</li>
</ul>
</li>
<li>OpenType Sanitizer
<ul>
<li>Language: C++</li>
<li>Source: <a href="https://github.com/khaledhosny/ots" target="_blank" rel="noopener noreferrer">https://github.com/khaledhosny/ots</a></li>
<li>Documentation: <a href="https://github.com/khaledhosny/ots/tree/main/docs" target="_blank" rel="noopener noreferrer">https://github.com/khaledhosny/ots/tree/main/docs</a></li>
<li>Note: Used by Chromium and Firefox to validate font files.</li>
</ul>
</li>
<li><code>golang.org/x/image/font</code>
<ul>
<li>Language: Go</li>
<li>Source: <a href="https://github.com/golang/image" target="_blank" rel="noopener noreferrer">https://github.com/golang/image</a></li>
<li>Documentation: <a href="https://pkg.go.dev/golang.org/x/image/font" target="_blank" rel="noopener noreferrer">https://pkg.go.dev/golang.org/x/image/font</a></li>
<li>Note: Go's library.</li>
</ul>
</li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[`html-webpack-plugin`でReactをテンプレートに使う]]></title>
<link>https://blog.publictheta.com/memos/2022-03-10-webpack-html-react</link>
<guid isPermaLink="true">https://blog.publictheta.com/memos/2022-03-10-webpack-html-react</guid>
<description><![CDATA[]]></description>
<pubDate>Thu, 10 Mar 2022 12:56:45 GMT</pubDate>
<category>webpack</category><category>React</category><category>TypeScript</category>
<content:encoded><![CDATA[<p>テンプレートに指定したファイルから<code>module.exports</code>で<code>string</code>またはそれを返す関数、<code>Promise</code>を出力すればいいので、</p>
<figure data-code-block="" data-language="js"><figcaption><span class="code-block-language">js</span><div class="code-block-actions"><a download="code.js" href="data:text/plain;charset=utf-8;base64,Y29uc3QgSHRtbFdlYnBhY2tQbHVnaW4gPSByZXF1aXJlKCJodG1sLXdlYnBhY2stcGx1Z2luIikKCm1vZHVsZS5leHBvcnRzID0gewogICAgLy8gLi4uCiAgICBwbHVnaW5zOiBbCiAgICAgICAgLy8gLi4uCiAgICAgICAgbmV3IEh0bWxXZWJwYWNrUGx1Z2luKHsKICAgICAgICAgICAgZmlsZW5hbWU6ICJpbmRleC5odG1sIiwKICAgICAgICAgICAgdGVtcGxhdGU6ICJzcmMvaW5kZXguaHRtbC50c3giLAogICAgICAgIH0pLAogICAgXSwKfTs=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-js"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> HtmlWebpackPlugin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> require</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"html-webpack-plugin"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">exports</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    // ...</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    plugins: [</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">        // ...</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> HtmlWebpackPlugin</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">({</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            filename: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"index.html"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            template: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"src/index.html.tsx"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }),</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    ],</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">};</span></span></code></pre></figure>
<p>のように設定し、<code>index.html.tsx</code>で、</p>
<figure data-code-block="" data-language="tsx"><figcaption><span class="code-block-language">tsx</span><div class="code-block-actions"><a download="code.tsx" href="data:text/plain;charset=utf-8;base64,aW1wb3J0IFJlYWN0IGZyb20gInJlYWN0IgppbXBvcnQgeyByZW5kZXJUb1N0YXRpY01hcmt1cCB9IGZyb20gInJlYWN0LWRvbS9zZXJ2ZXIiCgpleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gKAogICAgICAgIGA8IURPQ1RZUEUgaHRtbD5gICsKICAgICAgICByZW5kZXJUb1N0YXRpY01hcmt1cCgKICAgICAgICAgICAgPGh0bWwgbGFuZz0iZW4iPgogICAgICAgICAgICAgICAgPGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPG1ldGEgY2hhclNldD0idXRmLTgiIC8+CiAgICAgICAgICAgICAgICAgICAgPG1ldGEKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0idmlld3BvcnQiCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCxpbml0aWFsLXNjYWxlPTEuMCIKICAgICAgICAgICAgICAgICAgICAvPgogICAgICAgICAgICAgICAgICAgIDx0aXRsZT5UaXRsZTwvdGl0bGU+CiAgICAgICAgICAgICAgICA8L2hlYWQ+CiAgICAgICAgICAgICAgICA8Ym9keT4KICAgICAgICAgICAgICAgICAgICA8cD5IZWxsbywgaHRtbC13ZWJwYWNrLXBsdWdpbi48L3A+CiAgICAgICAgICAgICAgICA8L2JvZHk+CiAgICAgICAgICAgIDwvaHRtbD4KICAgICAgICApCiAgICApCn0=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-tsx"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> React </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "react"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { renderToStaticMarkup } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "react-dom/server"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> default</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> function</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> () {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">        `&#x3C;!DOCTYPE html>`</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> +</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">        renderToStaticMarkup</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">html</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> lang</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"en"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">head</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                    &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">meta</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> charSet</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"utf-8"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> /></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                    &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">meta</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">                        name</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"viewport"</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">                        content</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"width=device-width,initial-scale=1.0"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                    /></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                    &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">title</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>Title&#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">title</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                &#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">head</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">body</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                    &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">p</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>Hello, html-webpack-plugin.&#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">p</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                &#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">body</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            &#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">html</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        )</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    )</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<p>のように、<a href="https://reactjs.org/docs/react-dom-server.html#rendertostaticmarkup" target="_blank" rel="noopener noreferrer"><code>renderToStaticMarkup</code></a>を使って文字列を返す関数を<code>export</code>すればよい。</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[React]]></title>
<link>https://blog.publictheta.com/tags/react</link>
<guid isPermaLink="true">https://blog.publictheta.com/tags/react</guid>
<description><![CDATA[]]></description>
<pubDate>Thu, 10 Mar 2022 12:56:45 GMT</pubDate>

<content:encoded><![CDATA[<h2 id="リンク"><a aria-hidden="true" tabindex="-1" href="#リンク"><span class="icon icon-link"></span></a>リンク</h2>
<ul>
<li>公式サイト: <a href="https://reactjs.org" target="_blank" rel="noopener noreferrer">https://reactjs.org</a></li>
<li>リポジトリ: <a href="https://github.com/facebook/react/" target="_blank" rel="noopener noreferrer">https://github.com/facebook/react/</a></li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[TypeScript]]></title>
<link>https://blog.publictheta.com/tags/typescript</link>
<guid isPermaLink="true">https://blog.publictheta.com/tags/typescript</guid>
<description><![CDATA[]]></description>
<pubDate>Sun, 06 Mar 2022 21:08:08 GMT</pubDate>

<content:encoded><![CDATA[<h2 id="リンク"><a aria-hidden="true" tabindex="-1" href="#リンク"><span class="icon icon-link"></span></a>リンク</h2>
<ul>
<li>公式サイト: <a href="https://www.typescriptlang.org/" target="_blank" rel="noopener noreferrer">https://www.typescriptlang.org/</a></li>
<li>リポジトリ: <a href="https://github.com/microsoft/TypeScript" target="_blank" rel="noopener noreferrer">https://github.com/microsoft/TypeScript</a></li>
<li>FAQs: <a href="https://github.com/microsoft/TypeScript/wiki/FAQ" target="_blank" rel="noopener noreferrer">https://github.com/microsoft/TypeScript/wiki/FAQ</a></li>
<li>古い仕様: <a href="https://github.com/microsoft/TypeScript/blob/main/doc/spec-ARCHIVED.md" target="_blank" rel="noopener noreferrer">https://github.com/microsoft/TypeScript/blob/main/doc/spec-ARCHIVED.md</a></li>
<li>コンパイラ資料: <a href="https://github.com/microsoft/TypeScript-Compiler-Notes/" target="_blank" rel="noopener noreferrer">https://github.com/microsoft/TypeScript-Compiler-Notes/</a></li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[TypeScriptでNominalな型付けを実現する]]></title>
<link>https://blog.publictheta.com/memos/2022-03-06-typescript-nominal</link>
<guid isPermaLink="true">https://blog.publictheta.com/memos/2022-03-06-typescript-nominal</guid>
<description><![CDATA[]]></description>
<pubDate>Sun, 06 Mar 2022 21:06:25 GMT</pubDate>
<category>TypeScript</category>
<content:encoded><![CDATA[<p>TypeScript公式リポジトリの<a href="https://github.com/microsoft/TypeScript/wiki/" target="_blank" rel="noopener noreferrer">Wiki</a>内にあるFAQ「<a href="https://github.com/microsoft/TypeScript/wiki/FAQ#can-i-make-a-type-alias-nominal" target="_blank" rel="noopener noreferrer">Can I make a type alias nominal?</a>」でワークアラウンドとして紹介されているように、交差型（<code>&#x26;</code>）を利用する。</p>
<p>たとえば次のような型を用意しておけば:</p>
<figure data-code-block="" data-language="ts"><figcaption><span class="code-block-language">ts</span><div class="code-block-actions"><a download="code.ts" href="data:text/plain;charset=utf-8;base64,dHlwZSBOb21pbmFsPFQgZXh0ZW5kcyBzdHJpbmc+ID0gewogICAgX19ub21pbmFsX186IFQKfQ==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-ts"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">type</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Nominal</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> extends</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">    __nominal__</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> T</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<p>次のように型でのみ区別可能な文字列型を作ることができる:</p>
<figure data-code-block="" data-language="ts"><figcaption><span class="code-block-language">ts</span><div class="code-block-actions"><a download="code.ts" href="data:text/plain;charset=utf-8;base64,dHlwZSBQbGFjZUlkID0gc3RyaW5nICYgTm9taW5hbDwiUGxhY2VJZCI+CnR5cGUgRXZlbnRJZCA9IHN0cmluZyAmIE5vbWluYWw8IkV2ZW50SWQiPg==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-ts"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">type</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> PlaceId</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> string</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &#x26;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Nominal</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"PlaceId"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">type</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> EventId</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> string</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &#x26;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Nominal</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"EventId"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span></code></pre></figure>
<p>ただし次のように型アサーションが必要となる:</p>
<figure data-code-block="" data-language="ts"><figcaption><span class="code-block-language">ts</span><div class="code-block-actions"><a download="code.ts" href="data:text/plain;charset=utf-8;base64,Y29uc3QgcGxhY2VJZCA9ICJwbGFjZTEiIGFzIFBsYWNlSWQKY29uc3QgZXZlbnRJZCA9ICJldmVudDEiIGFzIEV2ZW50SWQ=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-ts"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> placeId</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "place1"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> as</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> PlaceId</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> eventId</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "event1"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> as</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> EventId</span></span></code></pre></figure>]]></content:encoded>
</item>
<item>
<title><![CDATA[HTMLの特殊文字をJavaScriptでエスケープする]]></title>
<link>https://blog.publictheta.com/memos/2022-03-05-html-escape-js</link>
<guid isPermaLink="true">https://blog.publictheta.com/memos/2022-03-05-html-escape-js</guid>
<description><![CDATA[]]></description>
<pubDate>Sat, 05 Mar 2022 17:37:12 GMT</pubDate>
<category>HTML</category><category>JavaScript</category>
<content:encoded><![CDATA[<figure data-code-block="" data-language="ts"><figcaption><span class="code-block-language">ts</span><div class="code-block-actions"><a download="code.ts" href="data:text/plain;charset=utf-8;base64,ZnVuY3Rpb24gZXNjYXBlKGh0bWw6IHN0cmluZykgewogICAgcmV0dXJuIGh0bWwucmVwbGFjZUFsbCgvWzw+JiciXS9nLCBjID0+IHsKICAgICAgICBzd2l0Y2ggKGMpIHsKICAgICAgICAgICAgY2FzZSAiPCI6CiAgICAgICAgICAgICAgICByZXR1cm4gIiZsdDsiCiAgICAgICAgICAgIGNhc2UgIj4iOgogICAgICAgICAgICAgICAgcmV0dXJuICImZ3Q7IgogICAgICAgICAgICBjYXNlICImIjoKICAgICAgICAgICAgICAgIHJldHVybiAiJmFtcDsiCiAgICAgICAgICAgIGNhc2UgIiciOgogICAgICAgICAgICAgICAgcmV0dXJuICImYXBvczsiCiAgICAgICAgICAgIGNhc2UgJyInOgogICAgICAgICAgICAgICAgcmV0dXJuICImcXVvdDsiCiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gYwogICAgICAgIH0KICAgIH0pCn0=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-ts"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> escape</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">html</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> html.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">replaceAll</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">[&#x3C;>&#x26;'"]</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">g</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">c</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        switch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (c) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">            case</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "&#x3C;"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">                return</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "&#x26;lt;"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">            case</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ">"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">                return</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "&#x26;gt;"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">            case</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "&#x26;"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">                return</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "&#x26;amp;"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">            case</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "'"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">                return</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "&#x26;apos;"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">            case</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> '"'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">                return</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "&#x26;quot;"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">            default</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">                return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> c</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    })</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>]]></content:encoded>
</item>
<item>
<title><![CDATA[HTML]]></title>
<link>https://blog.publictheta.com/tags/html</link>
<guid isPermaLink="true">https://blog.publictheta.com/tags/html</guid>
<description><![CDATA[]]></description>
<pubDate>Sat, 05 Mar 2022 17:37:12 GMT</pubDate>

<content:encoded><![CDATA[<h2 id="リンク"><a aria-hidden="true" tabindex="-1" href="#リンク"><span class="icon icon-link"></span></a>リンク</h2>
<ul>
<li>HTML Standard: <a href="https://html.spec.whatwg.org/multipage/" target="_blank" rel="noopener noreferrer">https://html.spec.whatwg.org/multipage/</a></li>
<li>MDN: <a href="https://developer.mozilla.org/docs/Web/HTML" target="_blank" rel="noopener noreferrer">https://developer.mozilla.org/docs/Web/HTML</a></li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[JavaScript]]></title>
<link>https://blog.publictheta.com/tags/javascript</link>
<guid isPermaLink="true">https://blog.publictheta.com/tags/javascript</guid>
<description><![CDATA[]]></description>
<pubDate>Sat, 05 Mar 2022 17:37:12 GMT</pubDate>

<content:encoded><![CDATA[<h2 id="リンク"><a aria-hidden="true" tabindex="-1" href="#リンク"><span class="icon icon-link"></span></a>リンク</h2>
<ul>
<li>ECMAScript Language Specification: <a href="https://tc39.es/ecma262/multipage/" target="_blank" rel="noopener noreferrer">https://tc39.es/ecma262/multipage/</a></li>
<li>HTML Standard 8.1 Scripting: <a href="https://html.spec.whatwg.org/multipage/webappapis.html#scripting" target="_blank" rel="noopener noreferrer">https://html.spec.whatwg.org/multipage/webappapis.html#scripting</a></li>
<li>MDN: <a href="https://developer.mozilla.org/docs/Web/JavaScript" target="_blank" rel="noopener noreferrer">https://developer.mozilla.org/docs/Web/JavaScript</a></li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[Cargo]]></title>
<link>https://blog.publictheta.com/tags/cargo</link>
<guid isPermaLink="true">https://blog.publictheta.com/tags/cargo</guid>
<description><![CDATA[]]></description>
<pubDate>Fri, 04 Mar 2022 14:45:09 GMT</pubDate>

<content:encoded><![CDATA[<h2 id="リンク"><a aria-hidden="true" tabindex="-1" href="#リンク"><span class="icon icon-link"></span></a>リンク</h2>
<ul>
<li>The Cargo Book: <a href="https://doc.rust-lang.org/cargo/" target="_blank" rel="noopener noreferrer">https://doc.rust-lang.org/cargo/</a></li>
<li>リポジトリ: <a href="https://github.com/rust-lang/cargo/" target="_blank" rel="noopener noreferrer">https://github.com/rust-lang/cargo/</a></li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[Cargoのワークスペース]]></title>
<link>https://blog.publictheta.com/articles/2022-03-04-cargo-workspace</link>
<guid isPermaLink="true">https://blog.publictheta.com/articles/2022-03-04-cargo-workspace</guid>
<description><![CDATA[]]></description>
<pubDate>Fri, 04 Mar 2022 14:42:43 GMT</pubDate>
<category>Rust</category><category>Cargo</category>
<content:encoded><![CDATA[<p><a href="https://www.rust-lang.org/" target="_blank" rel="noopener noreferrer">Rust</a>のパッケージマネージャーである<a href="https://doc.rust-lang.org/cargo" target="_blank" rel="noopener noreferrer">Cargo</a>には、複数のパッケージの依存パッケージのバージョンや、出力ディレクトリ、プロファイルなどの設定を共有できる<a href="https://doc.rust-lang.org/cargo/reference/workspaces.html" target="_blank" rel="noopener noreferrer">ワークスペース</a>機能がある。</p>
<h2 id="ワークスペースのマニフェスト"><a aria-hidden="true" tabindex="-1" href="#ワークスペースのマニフェスト"><span class="icon icon-link"></span></a>ワークスペースのマニフェスト</h2>
<p>ワークスペースは<a href="https://doc.rust-lang.org/cargo/reference/workspaces.html#the-workspace-section" target="_blank" rel="noopener noreferrer"><code>[workspace]</code></a>セクションのある<a href="https://doc.rust-lang.org/cargo/reference/manifest.html" target="_blank" rel="noopener noreferrer"><code>Cargo.toml</code></a>によって定義され、そのマニフェストファイルのあるディレクトリはワークスペースのルートディレクトリと呼ばれる。</p>
<figure data-code-block="" data-language="toml"><figcaption><span class="code-block-language">toml</span><div class="code-block-actions"><a download="code.toml" href="data:text/plain;charset=utf-8;base64,W3dvcmtzcGFjZV0KbWVtYmVycyA9IFtdCmRlZmF1bHQtbWVtYmVycyA9IFtdCmV4Y2x1ZGUgPSBbXQ==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-toml"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">workspace</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">members = []</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">default-members = []</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">exclude = []</span></span></code></pre></figure>
<p><code>[workspace]</code>セクションは<a href="https://doc.rust-lang.org/cargo/reference/manifest.html#the-package-section" target="_blank" rel="noopener noreferrer"><code>[package]</code></a>セクションを持つパッケージのマニフェストにも追加可能で、その場合そのパッケージはワークスペースのルートパッケージと呼ばれる。反対に<code>[package]</code>セクションを持たないワークスペースのマニフェストは、バーチャルマニフェストと呼ばれる。</p>
<h2 id="ワークスペースのメンバー"><a aria-hidden="true" tabindex="-1" href="#ワークスペースのメンバー"><span class="icon icon-link"></span></a>ワークスペースのメンバー</h2>
<p>ワークスペース内のパッケージは、ワークスペースのメンバーと呼ばれる。</p>
<p>メンバーは<code>[workspace]</code>セクションの<code>members</code>キーで指定することができる（<code>?</code>や<code>*</code>などの<a href="https://docs.rs/glob/0.3.0/glob/struct.Pattern.html" target="_blank" rel="noopener noreferrer">グロブパターン</a>が使用可能）。</p>
<figure data-code-block="" data-language="toml"><figcaption><span class="code-block-language">toml</span><div class="code-block-actions"><a download="code.toml" href="data:text/plain;charset=utf-8;base64,W3dvcmtzcGFjZV0KbWVtYmVycyA9IFsicGF0aC90by9tZW1iZXIxIiwgIi4uL2V4dGVybmFsL21lbWJlcjIiLCAibWVtYmVycy8qIl0=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-toml"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">workspace</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">members = [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"path/to/member1"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"../external/member2"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"members/*"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span></code></pre></figure>
<p>その他、ルートパッケージやメンバーのマニフェストに記載されている依存パッケージのうち、ワークスペースのルートディレクトリに含まれる<code>path</code>によって指定されているもの（<a href="https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html?#specifying-path-dependencies" target="_blank" rel="noopener noreferrer">path dependency</a>）も、自動的にワークスペースのメンバーとなる。</p>
<p>そのため、ルートパッケージの<code>[workspace]</code>セクションが空となることもありうる。</p>
<figure data-code-block="" data-language="toml"><figcaption><span class="code-block-language">toml</span><div class="code-block-actions"><a download="code.toml" href="data:text/plain;charset=utf-8;base64,W3BhY2thZ2VdCm5hbWUgPSAibXktcm9vdC1wYWNrYWdlIgp2ZXJzaW9uID0gIjAuMS4wIgoKW2RlcGVuZGVuY2llc10KbWVtYmVyMSA9IHsgcGF0aCA9ICIuL21lbWJlcjEiIH0KClt3b3Jrc3BhY2Vd" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-toml"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">package</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">name = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"my-root-package"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">version = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"0.1.0"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">dependencies</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">member1 = { path = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"./member1"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">workspace</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span></code></pre></figure>
<p><code>path</code>による依存パッケージが自動でメンバーに追加されるのを防いだり、一部パッケージをグロブパターンから除外したりのするには、<code>exclude</code>キーを使うことができる。なお<code>exclude</code>ではグロブパターンは使えず、指定されたパス以下のすべてのパッケージがメンバーから除外される仕様になっている。</p>
<figure data-code-block="" data-language="toml"><figcaption><span class="code-block-language">toml</span><div class="code-block-actions"><a download="code.toml" href="data:text/plain;charset=utf-8;base64,W3dvcmtzcGFjZV0KbWVtYmVycyA9IFsiY3JhdGVzLyoiXQpleGNsdWRlID0gWyJjcmF0ZXMvYmFyIl0=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-toml"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">workspace</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">members = [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"crates/*"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">exclude = [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"crates/bar"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span></code></pre></figure>
<h2 id="ワークスペースの認識"><a aria-hidden="true" tabindex="-1" href="#ワークスペースの認識"><span class="icon icon-link"></span></a>ワークスペースの認識</h2>
<p>ワークスペースのマニフェストはCargoによって、自動的に親ディレクトリへと遡って探索される。ワークスペースのメンバーがルートディレクトリ外にある場合などのようにこの動作の上書きがしたい場合は、パッケージのマニフェストで<a href="https://doc.rust-lang.org/cargo/reference/manifest.html#the-workspace-field" target="_blank" rel="noopener noreferrer"><code>package.workspace</code></a>キーを用いることで、パッケージの属するワークスペースを指定することができる。</p>
<figure data-code-block="" data-language="toml"><figcaption><span class="code-block-language">toml</span><div class="code-block-actions"><a download="code.toml" href="data:text/plain;charset=utf-8;base64,W3BhY2thZ2VdCm5hbWUgPSAibWVtYmVyIgp2ZXJzaW9uID0gIjAuMS4wIgp3b3Jrc3BhY2UgPSAiLi4vLi4vcGF0aC90by93b3Jrc3BhY2Ui" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-toml"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">package</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">name = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"member"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">version = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"0.1.0"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">workspace = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"../../path/to/workspace"</span></span></code></pre></figure>
<h2 id="ワークスペースの機能"><a aria-hidden="true" tabindex="-1" href="#ワークスペースの機能"><span class="icon icon-link"></span></a>ワークスペースの機能</h2>
<p>ワークスペースによってメンバーは以下を共有することになる。</p>
<ul>
<li>依存パッケージの解決
<ul>
<li><code>Cargo.lock</code>ファイルはワークスペースのルートディレクトリにのみ置かれる</li>
</ul>
</li>
<li>出力ディレクトリ
<ul>
<li>デフォルトではワークスペースのルートディレクトリ直下の<code>target</code></li>
</ul>
</li>
<li><code>Cargo.toml</code>の<a href="https://doc.rust-lang.org/cargo/reference/overriding-dependencies.html#the-patch-section" target="_blank" rel="noopener noreferrer"><code>[patch]</code></a>、<a href="https://doc.rust-lang.org/cargo/reference/overriding-dependencies.html#the-replace-section" target="_blank" rel="noopener noreferrer"><code>[replace]</code></a>、<a href="https://doc.rust-lang.org/cargo/reference/profiles.html" target="_blank" rel="noopener noreferrer"><code>[profile.*]</code></a>セクション
<ul>
<li>ワークスペースのマニフェストのもののみが認識され、メンバーのマニフェストのものは無視される</li>
</ul>
</li>
</ul>
<figure data-code-block="" data-language="toml"><figcaption><span class="code-block-language">toml</span><div class="code-block-actions"><a download="code.toml" href="data:text/plain;charset=utf-8;base64,W3dvcmtzcGFjZV0KbWVtYmVycyA9IFsiY3JhdGVzLyoiXQoKW3Byb2ZpbGVdCm9wdC1sZXZlbCA9IHM=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-toml"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">workspace</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">members = [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"crates/*"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">profile</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">opt-level = s</span></span></code></pre></figure>
<p>また、<code>cargo new</code>や<code>cargo init</code>で行われる<code>git</code>リポジトリの初期化も、作成されるパッケージが属することになるワークスペースが既にバージョン管理されている場合は行われなくなる。</p>
<p>そのほか<a href="https://doc.rust-lang.org/cargo/reference/manifest.html#the-metadata-table" target="_blank" rel="noopener noreferrer"><code>package.metadata</code></a>と同様に<a href="https://doc.rust-lang.org/cargo/reference/workspaces.html#the-workspacemetadata-table" target="_blank" rel="noopener noreferrer"><code>workspace.metadata</code></a>テーブルも許容されており、Cargo以外のツールが自由に使うことが可能となっている。</p>
<figure data-code-block="" data-language="toml"><figcaption><span class="code-block-language">toml</span><div class="code-block-actions"><a download="code.toml" href="data:text/plain;charset=utf-8;base64,W3dvcmtzcGFjZV0KbWVtYmVycyA9IFsiY3JhdGVzLyoiXQoKW3dvcmtzcGFjZS5tZXRhZGF0YS5zaXRlXQp0aXRsZSA9ICJQcm9qZWN0IFNpdGUiCmljb24gPSB7IHBhdGggPSAiaWNvbi5wbmciIH0=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-toml"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">workspace</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">members = [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"crates/*"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">workspace</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">metadata</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">site</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">title = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Project Site"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">icon = { path = </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"icon.png"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span></code></pre></figure>
<h2 id="cliのオプション"><a aria-hidden="true" tabindex="-1" href="#cliのオプション"><span class="icon icon-link"></span></a>CLIのオプション</h2>
<p>Cargoのコマンドでは、<code>-p</code>（<code>--package</code>）オブションを使うことで、カレントディレクトリが属するワークスペース内にあるパッケージを指定することができる。</p>
<figure data-code-block="" data-language="bash"><figcaption><span class="code-block-language">bash</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,Y2FyZ28gcnVuIC1wIG1lbWJlcjE=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">cargo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> member1</span></span></code></pre></figure>
<p>また<code>--workspace</code>オプションを使うと、カレントディレクトリが属するワークスペース内にあるすべてのパッケージを対象に、そのコマンドが実行される。</p>
<figure data-code-block="" data-language="bash"><figcaption><span class="code-block-language">bash</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,Y2FyZ28gdGVzdCAtLXdvcmtzcGFjZQ==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">cargo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> test</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --workspace</span></span></code></pre></figure>
<p>何も指定しなかった場合は、カレントディレクトリが属するパッケージに対して、コマンドが実行される（メンバーのディレクトリ内ではない場合は、ルートパッケージ）。</p>
<figure data-code-block="" data-language="bash"><figcaption><span class="code-block-language">bash</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,Y2FyZ28gYnVpbGQ=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">cargo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> build</span></span></code></pre></figure>
<p>属するパッケージがなく、代わりにバーチャルマニフェストに属するディレクトリで実行した場合は、デフォルトでは<code>--workspace</code>を指定した場合と同様に振る舞うが、<code>default-members</code>キーを用いるとその際実行されるメンバーを指定しておくことができる。なお<code>default-members</code>でもグロブパターンは使えるが、メンバーに含まれないパッケージが選択されることはない。</p>
<figure data-code-block="" data-language="toml"><figcaption><span class="code-block-language">toml</span><div class="code-block-actions"><a download="code.toml" href="data:text/plain;charset=utf-8;base64,W3dvcmtzcGFjZV0KbWVtYmVycyA9IFsiY3JhdGVzLyoiLCAib3RoZXJzLyoiXQpkZWZhdWx0LW1lbWJlcnMgPSBbImNyYXRlcy8qIl0KZXhjbHVkZSA9IFsiY3JhdGVzL2JhciJd" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-toml"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">workspace</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">members = [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"crates/*"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"others/*"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">default-members = [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"crates/*"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">exclude = [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"crates/bar"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span></code></pre></figure>
<h2 id="参考"><a aria-hidden="true" tabindex="-1" href="#参考"><span class="icon icon-link"></span></a>参考</h2>
<ul>
<li><a href="https://doc.rust-lang.org/cargo/reference/workspaces.html" target="_blank" rel="noopener noreferrer">https://doc.rust-lang.org/cargo/reference/workspaces.html</a></li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[Rustのスローガンが「効率的で信頼できるソフトウェアを誰もがつくれる言語」になったタイミング]]></title>
<link>https://blog.publictheta.com/memos/2022-03-02-rust-slogan</link>
<guid isPermaLink="true">https://blog.publictheta.com/memos/2022-03-02-rust-slogan</guid>
<description><![CDATA[]]></description>
<pubDate>Wed, 02 Mar 2022 20:40:09 GMT</pubDate>
<category>Rust</category>
<content:encoded><![CDATA[<p><a href="https://blog.rust-lang.org/" target="_blank" rel="noopener noreferrer">Rust Blog</a>の2018-11-29の記事「<a href="https://blog.rust-lang.org/2018/11/29/a-new-look-for-rust-lang-org.html" target="_blank" rel="noopener noreferrer">A new look for rust-lang.org</a>」に次の記載がある:</p>
<blockquote>
<p>We have also revised the slogan. Historically, it has been:</p>
<blockquote>
<p>Rust is a systems programming language that runs blazingly fast, prevents segfaults, and guarantees thread safety.</p>
</blockquote>
<p>Like the bullet list of features, this doesn't convey what you can do with Rust. So we've updated the slogan:</p>
<blockquote>
<p>Rust: The programming language that empowers everyone to become a systems programmer.</p>
</blockquote>
</blockquote>
<p>ここで「システムプログラミング言語」としてのRustから、現在の「効率的で信頼できるソフトウェアを誰もがつくれる言語（A language empowering everyone
to build reliable and efficient software.）」としてのRustに変わったらしい。</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Monaco Editorをwebpackのプロジェクトに追加する]]></title>
<link>https://blog.publictheta.com/memos/2022-03-01-monaco-editor-webpack</link>
<guid isPermaLink="true">https://blog.publictheta.com/memos/2022-03-01-monaco-editor-webpack</guid>
<description><![CDATA[]]></description>
<pubDate>Tue, 01 Mar 2022 17:43:22 GMT</pubDate>
<category>Monaco Editor</category><category>webpack</category>
<content:encoded><![CDATA[<p><a href="https://github.com/microsoft/monaco-editor/tree/main/webpack-plugin" target="_blank" rel="noopener noreferrer"><code>monaco-editor-webpack-plugin</code></a>を使うのが簡単:</p>
<figure data-code-block="" data-language="bash"><figcaption><span class="code-block-language">bash</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,bnBtIGkgLUQgbW9uYWNvLWVkaXRvci13ZWJwYWNrLXBsdWdpbg==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> i</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -D</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> monaco-editor-webpack-plugin</span></span></code></pre></figure>
<p>次のようにプラグインとして追加するだけで、勝手に設定してくれる:</p>
<figure data-code-block="" data-language="js"><figcaption><span class="code-block-language">js</span><div class="code-block-actions"><a download="code.js" href="data:text/plain;charset=utf-8;base64,Y29uc3QgTW9uYWNvRWRpdG9yV2VicGFja1BsdWdpbiA9IHJlcXVpcmUoIm1vbmFjby1lZGl0b3Itd2VicGFjay1wbHVnaW4iKQoKbW9kdWxlLmV4cG9ydHMgPSB7CiAgICBwbHVnaW5zOiBbbmV3IE1vbmFjb0VkaXRvcldlYnBhY2tQbHVnaW4oKV0sCn0=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-js"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> MonacoEditorWebpackPlugin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> require</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"monaco-editor-webpack-plugin"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">exports</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    plugins: [</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> MonacoEditorWebpackPlugin</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()],</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<p>プレビュー用にここでは以下を追加:</p>
<figure data-code-block="" data-language="bash"><figcaption><span class="code-block-language">bash</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,bnBtIGkgLUQgd2VicGFjay1jbGkgd2VicGFjay1kZXYtc2VydmVyIGh0bWwtd2VicGFjay1wbHVnaW4=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> i</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -D</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> webpack-cli</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> webpack-dev-server</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> html-webpack-plugin</span></span></code></pre></figure>
<p><code>webpack.config.js</code>:</p>
<figure data-code-block="" data-language="js"><figcaption><span class="code-block-language">js</span><div class="code-block-actions"><a download="code.js" href="data:text/plain;charset=utf-8;base64,Y29uc3QgcGF0aCA9IHJlcXVpcmUoInBhdGgiKQpjb25zdCBNb25hY29FZGl0b3JXZWJwYWNrUGx1Z2luID0gcmVxdWlyZSgibW9uYWNvLWVkaXRvci13ZWJwYWNrLXBsdWdpbiIpCmNvbnN0IEh0bWxXZWJwYWNrUGx1Z2luID0gcmVxdWlyZSgiaHRtbC13ZWJwYWNrLXBsdWdpbiIpCgptb2R1bGUuZXhwb3J0cyA9IHsKICAgIGVudHJ5OiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAic3JjIiwgImluZGV4LmpzIiksCiAgICBwbHVnaW5zOiBbbmV3IE1vbmFjb0VkaXRvcldlYnBhY2tQbHVnaW4oKSwgbmV3IEh0bWxXZWJwYWNrUGx1Z2luKCldLAogICAgLy8gd2VicGFjayA2IOOBp+OBr+OBhOOCieOBquOBj+OBquOCi+OBr+OBmjoKICAgIGV4cGVyaW1lbnRzOiB7CiAgICAgICAgY3NzOiB0cnVlLAogICAgfSwKfQ==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-js"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> path</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> require</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"path"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> MonacoEditorWebpackPlugin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> require</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"monaco-editor-webpack-plugin"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> HtmlWebpackPlugin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> require</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"html-webpack-plugin"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">exports</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    entry: path.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">resolve</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(__dirname, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"src"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"index.js"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">),</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    plugins: [</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> MonacoEditorWebpackPlugin</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(), </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> HtmlWebpackPlugin</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()],</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    // webpack 6 ではいらなくなるはず:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    experiments: {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        css: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<p>例えば次のようなJavaScriptとCSSを読み込むと:</p>
<p><code>src/index.js</code></p>
<figure data-code-block="" data-language="js"><figcaption><span class="code-block-language">js</span><div class="code-block-actions"><a download="code.js" href="data:text/plain;charset=utf-8;base64,aW1wb3J0ICogYXMgbW9uYWNvIGZyb20gIm1vbmFjby1lZGl0b3IiCmltcG9ydCAiLi9pbmRleC5jc3MiCgptb25hY28uZWRpdG9yLmNyZWF0ZSgKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpLAogICAgewogICAgICAgIGxhbmd1YWdlOiAiamF2YXNjcmlwdCIsCiAgICAgICAgdmFsdWU6IGBjb25zb2xlLmxvZygiSGVsbG8sIOS4lueVjCIpYCwKICAgIH0KKQ==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-js"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> *</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> as</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> monaco </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "monaco-editor"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "./index.css"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">monaco.editor.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">create</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    document.body.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">appendChild</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(document.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">createElement</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"div"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)),</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        language: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"javascript"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        value: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">`console.log("Hello, 世界")`</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span></code></pre></figure>
<p><code>src/index.css</code></p>
<figure data-code-block="" data-language="css"><figcaption><span class="code-block-language">css</span><div class="code-block-actions"><a download="code.css" href="data:text/plain;charset=utf-8;base64,aHRtbCwKYm9keSwKYm9keSA+IGRpdiB7CiAgICBoZWlnaHQ6IDEwMCU7Cn0=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-css"><span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">html</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">body</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">body</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> ></span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D"> div</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    height</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">100</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">%</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<p>画面いっぱいにMonaco Editorが表示されるはず:</p>
<figure data-code-block="" data-language="bash"><figcaption><span class="code-block-language">bash</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,d2VicGFjayBzZXJ2ZSAtLW1vZGUgZGV2ZWxvcG1lbnQ=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-bash"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">webpack</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> serve</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --mode</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> development</span></span></code></pre></figure>]]></content:encoded>
</item>
<item>
<title><![CDATA[Monaco Editor]]></title>
<link>https://blog.publictheta.com/tags/monaco-editor</link>
<guid isPermaLink="true">https://blog.publictheta.com/tags/monaco-editor</guid>
<description><![CDATA[]]></description>
<pubDate>Tue, 01 Mar 2022 17:43:22 GMT</pubDate>

<content:encoded><![CDATA[<h2 id="リンク"><a aria-hidden="true" tabindex="-1" href="#リンク"><span class="icon icon-link"></span></a>リンク</h2>
<ul>
<li>公式サイト: <a href="https://microsoft.github.io/monaco-editor/" target="_blank" rel="noopener noreferrer">https://microsoft.github.io/monaco-editor/</a></li>
<li>リポジトリ: <a href="https://github.com/microsoft/monaco-editor" target="_blank" rel="noopener noreferrer">https://github.com/microsoft/monaco-editor</a></li>
<li>API: <a href="https://microsoft.github.io/monaco-editor/api/index.html" target="_blank" rel="noopener noreferrer">https://microsoft.github.io/monaco-editor/api/index.html</a>
<ul>
<li><a href="https://github.com/microsoft/monaco-editor/blob/main/website/typedoc/monaco.d.ts" target="_blank" rel="noopener noreferrer"><code>monaco.d.ts</code></a>が生成元</li>
</ul>
</li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[webpack]]></title>
<link>https://blog.publictheta.com/tags/webpack</link>
<guid isPermaLink="true">https://blog.publictheta.com/tags/webpack</guid>
<description><![CDATA[]]></description>
<pubDate>Tue, 01 Mar 2022 17:43:22 GMT</pubDate>

<content:encoded><![CDATA[<h2 id="リンク"><a aria-hidden="true" tabindex="-1" href="#リンク"><span class="icon icon-link"></span></a>リンク</h2>
<ul>
<li>公式サイト: <a href="https://webpack.js.org/" target="_blank" rel="noopener noreferrer">https://webpack.js.org/</a></li>
<li>リポジトリ: <a href="https://github.com/webpack/webpack" target="_blank" rel="noopener noreferrer">https://github.com/webpack/webpack</a></li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[RFC 2119: RFCにおいて要求レベルを示すために用いるキーワード]]></title>
<link>https://blog.publictheta.com/memos/2022-03-01-rfc2119</link>
<guid isPermaLink="true">https://blog.publictheta.com/memos/2022-03-01-rfc2119</guid>
<description><![CDATA[]]></description>
<pubDate>Tue, 01 Mar 2022 07:59:17 GMT</pubDate>
<category>RFC</category>
<content:encoded><![CDATA[<p>RFC 2119は、各種RFCにおいて次の用語や表現がどの程度の要求レベルを示すと解釈されるべきかを定義している。</p>
<ul>
<li><code>MUST</code></li>
<li><code>MUST NOT</code></li>
<li><code>REQUIRED</code></li>
<li><code>SHALL</code></li>
<li><code>SHALL NOT</code></li>
<li><code>SHOULD</code></li>
<li><code>SHOULD NOT</code></li>
<li><code>RECOMMENDED</code></li>
<li><code>MAY</code></li>
<li><code>OPTIONAL</code></li>
</ul>
<p>すべてのRFCがこの解釈に従うわけではないが、多くのRFCがこのRFCを参照することで、表現を厳密に解釈できるようにしている。</p>
<p>本文は:</p>
<ul>
<li><a href="https://datatracker.ietf.org/doc/html/rfc2119" target="_blank" rel="noopener noreferrer">https://datatracker.ietf.org/doc/html/rfc2119</a></li>
</ul>
<p>日本語訳には、たとえば:</p>
<ul>
<li><a href="https://www.ipa.go.jp/security/rfc/RFC2119JA.html" target="_blank" rel="noopener noreferrer">https://www.ipa.go.jp/security/rfc/RFC2119JA.html</a></li>
</ul>
<p>なお<a href="https://datatracker.ietf.org/doc/html/rfc8174" target="_blank" rel="noopener noreferrer">RFC 8174</a>は大文字で表記されている場合のみRFC 2119の意味で解釈することで曖昧さをなくそうというRFCであり、RFC 2119とともに参照されることが多い。</p>
<h2 id="しなければならない必要"><a aria-hidden="true" tabindex="-1" href="#しなければならない必要"><span class="icon icon-link"></span></a>しなければならない（必要）</h2>
<ul>
<li><code>MUST</code>（「しなければならない」）</li>
<li><code>REQUIRED</code>（「要求される」）</li>
<li><code>SHALL</code>（「することになる」）</li>
</ul>
<p>は仕様を満たすには絶対必要であることを示す。</p>
<p>強い要求なので、この表現を用いる場合は、細心の注意が必要となる。</p>
<h2 id="してはならない禁止"><a aria-hidden="true" tabindex="-1" href="#してはならない禁止"><span class="icon icon-link"></span></a>してはならない（禁止）</h2>
<ul>
<li><code>MUST NOT</code>（「してはならない」）</li>
<li><code>SHALL NOT</code>（「することはない」）</li>
</ul>
<p>は仕様を満たすには絶対禁止であることを示す。</p>
<p>強い要求なので、この表現を用いる場合は、細心の注意が必要となる。</p>
<h2 id="すべきである推奨"><a aria-hidden="true" tabindex="-1" href="#すべきである推奨"><span class="icon icon-link"></span></a>すべきである（推奨）</h2>
<ul>
<li><code>SHOULD</code>（「すべきである」）</li>
<li><code>RECOMMENDED</code>（「推奨される」）</li>
</ul>
<p>は特定の条件における正当な理由なく、その項目を無視してはならないことを示す。</p>
<p>その項目を無視するには、細心の注意が必要となる。</p>
<h2 id="すべきでない非推奨"><a aria-hidden="true" tabindex="-1" href="#すべきでない非推奨"><span class="icon icon-link"></span></a>すべきでない（非推奨）</h2>
<ul>
<li><code>SHOULD NOT</code>（「すべきでない」）</li>
<li><code>NOT RECOMMENDED</code>（「推奨されない」）</li>
</ul>
<p>は特定の条件における正当な理由なく、その項目を満たしてはならないことを示す。</p>
<p>その項目を満たすには、細心の注意が必要となる。</p>
<h2 id="してもよい任意"><a aria-hidden="true" tabindex="-1" href="#してもよい任意"><span class="icon icon-link"></span></a>してもよい（任意）</h2>
<ul>
<li><code>MAY</code>（「してもよい」）</li>
<li><code>OPTIONAL</code>（「任意である」）</li>
</ul>
<p>は、その項目を満たすか満たさないかが実装者に任されることを示す。</p>
<p>逆にいえば、その項目を満たしてる実装も満たしていない実装も両方仕様を満たしているものとして正当に扱わなければならない。</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[RFC]]></title>
<link>https://blog.publictheta.com/tags/rfc</link>
<guid isPermaLink="true">https://blog.publictheta.com/tags/rfc</guid>
<description><![CDATA[]]></description>
<pubDate>Tue, 01 Mar 2022 07:59:17 GMT</pubDate>

<content:encoded><![CDATA[<h2 id="リンク"><a aria-hidden="true" tabindex="-1" href="#リンク"><span class="icon icon-link"></span></a>リンク</h2>
<ul>
<li><a href="https://www.ietf.org/standards/rfcs/" target="_blank" rel="noopener noreferrer">https://www.ietf.org/standards/rfcs/</a></li>
<li><a href="https://www.rfc-editor.org" target="_blank" rel="noopener noreferrer">https://www.rfc-editor.org</a></li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[Cloudflare Pagesでエラー`Only file and data URLs are supported by the default ESM loader`がでる]]></title>
<link>https://blog.publictheta.com/memos/2022-02-26-cloudflare-pages-err-unsupported-esm-url-scheme</link>
<guid isPermaLink="true">https://blog.publictheta.com/memos/2022-02-26-cloudflare-pages-err-unsupported-esm-url-scheme</guid>
<description><![CDATA[]]></description>
<pubDate>Sat, 26 Feb 2022 08:54:37 GMT</pubDate>
<category>Cloudflare</category><category>Cloudflare Pages</category>
<content:encoded><![CDATA[<p>Cloudflare PagesでNode.jsのプロジェクトをビルドする際に、次のようなエラーが出た。</p>
<figure data-code-block="" data-language="txt"><figcaption><span class="code-block-language">txt</span><div class="code-block-actions"><a download="code.txt" href="data:text/plain;charset=utf-8;base64,RXJyb3IgW0VSUl9VTlNVUFBPUlRFRF9FU01fVVJMX1NDSEVNRV06IE9ubHkgZmlsZSBhbmQgZGF0YSBVUkxzIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGRlZmF1bHQgRVNNIGxvYWRlcg==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-txt"><span class="line"><span>Error [ERR_UNSUPPORTED_ESM_URL_SCHEME]: Only file and data URLs are supported by the default ESM loader</span></span></code></pre></figure>
<p>原因はどうやら現時点でのCloudflare PagesのデフォルトのNode.jsのバージョンが<a href="https://developers.cloudflare.com/pages/platform/build-configuration/#language-support-and-tools" target="_blank" rel="noopener noreferrer"><code>12.18.0</code>である</a>ことだったようなので、環境変数の<code>NODE_VERSION</code>をひとまず<code>16</code>に設定すると解決した。</p>
<p>なお<code>.nvmrc</code>や<code>.node-version</code>などのファイルもサポートされているので、これで指定しておくとより取り回しがきくかもしれない。</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Cloudflare]]></title>
<link>https://blog.publictheta.com/tags/cloudflare</link>
<guid isPermaLink="true">https://blog.publictheta.com/tags/cloudflare</guid>
<description><![CDATA[]]></description>
<pubDate>Sat, 26 Feb 2022 08:54:37 GMT</pubDate>

<content:encoded><![CDATA[<h2 id="リンク"><a aria-hidden="true" tabindex="-1" href="#リンク"><span class="icon icon-link"></span></a>リンク</h2>
<ul>
<li>公式サイト: <a href="https://www.cloudflare.com/" target="_blank" rel="noopener noreferrer">https://www.cloudflare.com/</a></li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[Cloudflare Pages]]></title>
<link>https://blog.publictheta.com/tags/cloudflare-pages</link>
<guid isPermaLink="true">https://blog.publictheta.com/tags/cloudflare-pages</guid>
<description><![CDATA[]]></description>
<pubDate>Sat, 26 Feb 2022 08:54:37 GMT</pubDate>

<content:encoded><![CDATA[<h2 id="リンク"><a aria-hidden="true" tabindex="-1" href="#リンク"><span class="icon icon-link"></span></a>リンク</h2>
<ul>
<li>公式サイト: <a href="https://pages.cloudflare.com/" target="_blank" rel="noopener noreferrer">https://pages.cloudflare.com/</a></li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[husky]]></title>
<link>https://blog.publictheta.com/tags/husky</link>
<guid isPermaLink="true">https://blog.publictheta.com/tags/husky</guid>
<description><![CDATA[]]></description>
<pubDate>Sat, 26 Feb 2022 08:11:40 GMT</pubDate>

<content:encoded><![CDATA[<h2 id="リンク"><a aria-hidden="true" tabindex="-1" href="#リンク"><span class="icon icon-link"></span></a>リンク</h2>
<ul>
<li>公式サイト: <a href="https://typicode.github.io/husky/" target="_blank" rel="noopener noreferrer">https://typicode.github.io/husky/</a></li>
<li>リポジトリ: <a href="https://github.com/typicode/husky" target="_blank" rel="noopener noreferrer">https://github.com/typicode/husky</a></li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[`husky`を追加する]]></title>
<link>https://blog.publictheta.com/memos/2022-02-26-add-husky</link>
<guid isPermaLink="true">https://blog.publictheta.com/memos/2022-02-26-add-husky</guid>
<description><![CDATA[]]></description>
<pubDate>Sat, 26 Feb 2022 08:11:05 GMT</pubDate>
<category>husky</category>
<content:encoded><![CDATA[<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,bnBtIGluc3RhbGwgaHVza3kgLUQ=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> husky</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -D</span></span></code></pre></figure>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,bnBtIHNldC1zY3JpcHQgcHJlcGFyZSAiaHVza3kgaW5zdGFsbCIKbnBtIHJ1biBwcmVwYXJl" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> set-script</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> prepare</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "husky install"</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> prepare</span></span></code></pre></figure>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,bnB4IGh1c2t5IGFkZCAuaHVza3kvcHJlLWNvbW1pdCAibnBtIHJ1biBwcmVjb21taXQi" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npx</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> husky</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> add</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> .husky/pre-commit</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "npm run precommit"</span></span></code></pre></figure>
<p>例えば、</p>
<figure data-code-block="" data-language="shell"><figcaption><span class="code-block-language">shell</span><div class="code-block-actions"><a download="code.sh" href="data:text/plain;charset=utf-8;base64,bnBtIHNldC1zY3JpcHQgcHJlY29tbWl0ICJucG0gcnVuIGNoZWNrICYmIG5wbSBydW4gbGludCAmJiBucG0gcnVuIGZvcm1hdCI=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-shell"><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> set-script</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> precommit</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "npm run check &#x26;&#x26; npm run lint &#x26;&#x26; npm run format"</span></span></code></pre></figure>]]></content:encoded>
</item>
<item>
<title><![CDATA[プライバシーポリシー]]></title>
<link>https://blog.publictheta.com/privacy</link>
<guid isPermaLink="true">https://blog.publictheta.com/privacy</guid>
<description><![CDATA[プライバシーポリシーについてはこちらをご覧ください。]]></description>
<pubDate>Wed, 16 Feb 2022 11:28:12 GMT</pubDate>

<content:encoded><![CDATA[<p>本サイトはGoogleの提供するGoogleアナリティクスを利用しています。</p>
<h2 id="googleアナリティクス"><a aria-hidden="true" tabindex="-1" href="#googleアナリティクス"><span class="icon icon-link"></span></a>Googleアナリティクス</h2>
<p>本サイトはGoogleの提供するGoogleアナリティクスを利用しています。またそれによって、Cookie、モバイルデバイスの識別情報（Android の広告識別子、iOS の広告識別子など）、およびその他データの収集に使われる類似の技術なども利用しています。Googleアナリティクスでデータが収集、処理される仕組みについては、「<a href="https://www.google.com/intl/ja/policies/privacy/partners/" target="_blank" rel="noopener noreferrer">ユーザーが Google パートナーのサイトやアプリを使用する際の Google によるデータ使用</a>」をご覧ください。</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Rust]]></title>
<link>https://blog.publictheta.com/tags/rust</link>
<guid isPermaLink="true">https://blog.publictheta.com/tags/rust</guid>
<description><![CDATA[]]></description>
<pubDate>Sun, 13 Feb 2022 15:27:42 GMT</pubDate>

<content:encoded><![CDATA[<h2 id="リンク"><a aria-hidden="true" tabindex="-1" href="#リンク"><span class="icon icon-link"></span></a>リンク</h2>
<ul>
<li>公式サイト: <a href="https://www.rust-lang.org/" target="_blank" rel="noopener noreferrer">https://www.rust-lang.org/</a></li>
<li>リポジトリ: <a href="https://github.com/rust-lang/rust" target="_blank" rel="noopener noreferrer">https://github.com/rust-lang/rust</a></li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[RustでREADME.mdをドキュメントコメントとしてインクルードする]]></title>
<link>https://blog.publictheta.com/memos/2022-02-13-rust-include-str-doc</link>
<guid isPermaLink="true">https://blog.publictheta.com/memos/2022-02-13-rust-include-str-doc</guid>
<description><![CDATA[]]></description>
<pubDate>Sun, 13 Feb 2022 15:25:26 GMT</pubDate>
<category>Rust</category>
<content:encoded><![CDATA[<figure data-code-block="" data-language="rust"><figcaption><span class="code-block-language">rust</span><div class="code-block-actions"><a download="code.rs" href="data:text/plain;charset=utf-8;base64,IyFbZG9jID0gaW5jbHVkZV9zdHIhKCIuLi9SRUFETUUubWQiKV0=" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-rust"><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">#![doc </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> include_str</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">!</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"../README.md"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)]</span></span></code></pre></figure>]]></content:encoded>
</item>
<item>
<title><![CDATA[Rustで文字列スライスのポインタ間の距離を測る]]></title>
<link>https://blog.publictheta.com/memos/2022-02-13-rust-str-distance</link>
<guid isPermaLink="true">https://blog.publictheta.com/memos/2022-02-13-rust-str-distance</guid>
<description><![CDATA[]]></description>
<pubDate>Sun, 13 Feb 2022 15:24:44 GMT</pubDate>
<category>Rust</category>
<content:encoded><![CDATA[<figure data-code-block="" data-language="rust"><figcaption><span class="code-block-language">rust</span><div class="code-block-actions"><a download="code.rs" href="data:text/plain;charset=utf-8;base64,cHViIGZuIGRpc3RhbmNlX3B0cihhOiAmc3RyLCBiOiAmc3RyKSAtPiB1c2l6ZSB7CiAgICAoYi5hc19wdHIoKSBhcyB1c2l6ZSkgLSAoYS5hc19wdHIoKSBhcyB1c2l6ZSkKfQ==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-rust"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">pub</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> distance_ptr</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(a</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &#x26;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, b</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &#x26;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-></span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> usize</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    (b</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">as_ptr</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">as</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> usize</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (a</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">as_ptr</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">as</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> usize</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>
<p>コンパイルすると:</p>
<figure data-code-block="" data-language="asm"><figcaption><span class="code-block-language">asm</span><div class="code-block-actions"><a download="code.asm" href="data:text/plain;charset=utf-8;base64,bW92cSAlcmR4LCAlcmF4CnN1YnEgJXJkaSwgJXJheApyZXRx" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-asm"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">movq</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> %</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">rdx</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, %</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">rax</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">subq %</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">rdi</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, %</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">rax</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">retq</span></span></code></pre></figure>
<h2 id="補足"><a aria-hidden="true" tabindex="-1" href="#補足"><span class="icon icon-link"></span></a>補足</h2>
<p>これを使うと、ある文字列（<code>source</code>）に対してその部分文字列（<code>span</code>）がどの位置や範囲にあるかを、追加情報なしに取得することができるはず（安全な操作かどうかは正直なところ分からない）。</p>
<p>なお<code>_unwrap</code>のついている関数では、<code>span</code>として与えられた文字列スライスが本当に<code>source</code>の範囲内にあるかを確認して<code>Option</code>で返すようになっている。</p>
<figure data-code-block="" data-language="rust"><figcaption><span class="code-block-language">rust</span><div class="code-block-actions"><a download="code.rs" href="data:text/plain;charset=utf-8;base64,Zm4gcG9zaXRpb25fcHRyX3Vud3JhcChzb3VyY2U6ICZzdHIsIHNwYW46ICZzdHIpIC0+IHVzaXplIHsKICAgIGxldCBzb3VyY2Vfc3RhcnQgPSBzb3VyY2UuYXNfcHRyKCkgYXMgdXNpemU7CiAgICBsZXQgc3Bhbl9zdGFydCA9IHNwYW4uYXNfcHRyKCkgYXMgdXNpemU7CiAgICBzcGFuX3N0YXJ0IC0gc291cmNlX3N0YXJ0Cn0KCmZuIHBvc2l0aW9uX3B0cihzb3VyY2U6ICZzdHIsIHNwYW46ICZzdHIpIC0+IE9wdGlvbjx1c2l6ZT4gewogICAgbGV0IHNvdXJjZV9zdGFydCA9IHNvdXJjZS5hc19wdHIoKSBhcyB1c2l6ZTsKICAgIGxldCBzcGFuX3N0YXJ0ID0gc3Bhbi5hc19wdHIoKSBhcyB1c2l6ZTsKCiAgICBpZiBzcGFuX3N0YXJ0IDwgc291cmNlX3N0YXJ0IHsKICAgICAgICByZXR1cm4gTm9uZTsKICAgIH0KCiAgICBsZXQgc291cmNlX2VuZCA9IHNvdXJjZV9zdGFydC5jaGVja2VkX2FkZChzb3VyY2UubGVuKCkpPzsKICAgIGxldCBzcGFuX2VuZCA9IHNwYW5fc3RhcnQuY2hlY2tlZF9hZGQoc3Bhbi5sZW4oKSk/OwoKICAgIGlmIHNvdXJjZV9lbmQgPCBzcGFuX2VuZCB7CiAgICAgICAgcmV0dXJuIE5vbmU7CiAgICB9CgogICAgU29tZShzcGFuX3N0YXJ0IC0gc291cmNlX3N0YXJ0KQp9CgpmbiByYW5nZV9wdHJfdW53cmFwKHNvdXJjZTogJnN0ciwgc3BhbjogJnN0cikgLT4gY29yZTo6b3BzOjpSYW5nZTx1c2l6ZT4gewogICAgbGV0IHNvdXJjZV9zdGFydCA9IHNvdXJjZS5hc19wdHIoKSBhcyB1c2l6ZTsKICAgIGxldCBzcGFuX3N0YXJ0ID0gc3Bhbi5hc19wdHIoKSBhcyB1c2l6ZTsKICAgIGxldCByYW5nZV9zdGFydCA9IHNwYW5fc3RhcnQgLSBzb3VyY2Vfc3RhcnQ7CiAgICByYW5nZV9zdGFydC4uKHJhbmdlX3N0YXJ0ICsgc3Bhbi5sZW4oKSkKfQoKZm4gcmFuZ2VfcHRyKHNvdXJjZTogJnN0ciwgc3BhbjogJnN0cikgLT4gT3B0aW9uPGNvcmU6Om9wczo6UmFuZ2U8dXNpemU+PiB7CiAgICBsZXQgc291cmNlX3N0YXJ0ID0gc291cmNlLmFzX3B0cigpIGFzIHVzaXplOwogICAgbGV0IHNwYW5fc3RhcnQgPSBzcGFuLmFzX3B0cigpIGFzIHVzaXplOwoKICAgIGlmIHNwYW5fc3RhcnQgPCBzb3VyY2Vfc3RhcnQgewogICAgICAgIHJldHVybiBOb25lOwogICAgfQoKICAgIGxldCBzb3VyY2VfZW5kID0gc291cmNlX3N0YXJ0LmNoZWNrZWRfYWRkKHNvdXJjZS5sZW4oKSk/OwogICAgbGV0IHNwYW5fZW5kID0gc3Bhbl9zdGFydC5jaGVja2VkX2FkZChzcGFuLmxlbigpKT87CgogICAgaWYgc291cmNlX2VuZCA8IHNwYW5fZW5kIHsKICAgICAgICByZXR1cm4gTm9uZTsKICAgIH0KCiAgICBsZXQgcmFuZ2Vfc3RhcnQgPSBzcGFuX3N0YXJ0IC0gc291cmNlX3N0YXJ0OwogICAgbGV0IHJhbmdlID0gcmFuZ2Vfc3RhcnQuLihyYW5nZV9zdGFydCArIHNwYW4ubGVuKCkpOwogICAgU29tZShyYW5nZSkKfQ==" class="code-block-action code-block-download" aria-label="Download code"><span class="icon" aria-hidden="true">↓</span></a><button type="button" class="code-block-action code-block-copy" aria-label="Copy code"><span class="icon" aria-hidden="true">⎘</span></button></div></figcaption><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-rust"><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> position_ptr_unwrap</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(source</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &#x26;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, span</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &#x26;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-></span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> usize</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> source_start </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> source</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">as_ptr</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">as</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> usize</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> span_start </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> span</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">as_ptr</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">as</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> usize</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    span_start </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> source_start</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> position_ptr</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(source</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &#x26;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, span</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &#x26;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-></span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Option</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">usize</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> source_start </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> source</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">as_ptr</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">as</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> usize</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> span_start </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> span</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">as_ptr</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">as</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> usize</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> span_start </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> source_start {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        return</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> None</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> source_end </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> source_start</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">checked_add</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(source</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">len</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">())</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">?</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> span_end </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> span_start</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">checked_add</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(span</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">len</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">())</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">?</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> source_end </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> span_end {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        return</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> None</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    Some</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(span_start </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> source_start)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> range_ptr_unwrap</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(source</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &#x26;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, span</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &#x26;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-></span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> core</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">ops</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Range</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">usize</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> source_start </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> source</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">as_ptr</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">as</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> usize</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> span_start </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> span</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">as_ptr</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">as</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> usize</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> range_start </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> span_start </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> source_start;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    range_start</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">..</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(range_start </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> span</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">len</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">())</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">fn</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> range_ptr</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(source</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &#x26;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, span</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &#x26;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-></span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Option</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;core</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ops</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Range</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">usize</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> source_start </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> source</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">as_ptr</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">as</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> usize</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> span_start </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> span</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">as_ptr</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">as</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> usize</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> span_start </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> source_start {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        return</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> None</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> source_end </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> source_start</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">checked_add</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(source</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">len</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">())</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">?</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> span_end </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> span_start</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">checked_add</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(span</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">len</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">())</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">?</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> source_end </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> span_end {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        return</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> None</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> range_start </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> span_start </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> source_start;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> range </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> range_start</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">..</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(range_start </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> span</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">len</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">());</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    Some</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(range)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre></figure>]]></content:encoded>
</item>
</channel>
</rss>