<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Kangetsu Blog RSS Feed]]></title><description><![CDATA[学習メモや読書記録など]]></description><link>https://kangetsu121.work</link><generator>GatsbyJS</generator><lastBuildDate>Tue, 03 Jan 2023 07:57:12 GMT</lastBuildDate><item><title><![CDATA[GitHub の Secrets に JSON などの構造化データを登録してはいけない]]></title><description><![CDATA[JSON などは GitHub Secrets にそのまま登録してはいけない 表題の通り、JSON をはじめとした構造化データを GitHub の Secrets に登録することは非推奨です。
これは GitHub 公式ドキュメントで、以下の通り明言されています 。 To he…]]></description><link>https://kangetsu121.work2023/do-not-register-structured-secret</link><guid isPermaLink="false">https://kangetsu121.work2023/do-not-register-structured-secret</guid><pubDate>Tue, 03 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;json-などは-github-secrets-にそのまま登録してはいけない&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#json-%E3%81%AA%E3%81%A9%E3%81%AF-github-secrets-%E3%81%AB%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E7%99%BB%E9%8C%B2%E3%81%97%E3%81%A6%E3%81%AF%E3%81%84%E3%81%91%E3%81%AA%E3%81%84&quot; aria-label=&quot;json などは github secrets にそのまま登録してはいけない permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;JSON などは GitHub Secrets にそのまま登録してはいけない&lt;/h2&gt;&lt;p&gt;表題の通り、JSON をはじめとした構造化データを GitHub の Secrets に登録することは非推奨です。
これは GitHub 公式ドキュメントで、以下の通り明言されています&lt;sup id=&quot;fnref-1&quot;&gt;&lt;a href=&quot;#fn-1&quot; class=&quot;footnote-ref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;To help ensure that GitHub redacts your secret in logs, avoid using structured data as the values of secrets. For example, avoid creating secrets that contain JSON or encoded Git blobs.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;具体的には、一例として &lt;a href=&quot;https://github.com/actions/runner/issues/1488&quot;&gt;actions/runner&lt;/a&gt; の Issue で問題になったケースが報告されています。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;I have this json secrets.
And this will give readable prints which is not very secret.
Only { and } are masked.&lt;/p&gt;&lt;p&gt;Registered secrets&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;123&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&amp;quot;uname&amp;quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;quot;john-doe&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&amp;quot;password&amp;quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;quot;foobar&amp;quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Workflow example&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yml&quot;&gt;&lt;pre class=&quot;language-yml&quot;&gt;&lt;code class=&quot;language-yml&quot;&gt;      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  echo &amp;quot;$&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; secrets.ITEM_JSON &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Output&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;txt&quot;&gt;&lt;pre class=&quot;language-txt&quot;&gt;&lt;code class=&quot;language-txt&quot;&gt;***
  id: 123,
  uname: john-doe,
  password: foobar
***&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;このケースでは、Secrets に登録した JSON のうち &lt;code class=&quot;language-text&quot;&gt;{}&lt;/code&gt; のみが秘匿化され、本当に隠したいはずのその内側の key / value ペアはそのまま出力されてしまっています。
このように、JSON 形式の Secrets を登録しても、適切に Secrets が秘匿化されずに露出するなどの問題が起きる場合があります。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;JSON 形式の秘密情報を GitHub Secrets に登録している記事をいくつか見かけますが、非推奨なのでご注意ください&lt;/strong&gt;。&lt;/p&gt;&lt;h2 id=&quot;代替案&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#%E4%BB%A3%E6%9B%BF%E6%A1%88&quot; aria-label=&quot;代替案 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;代替案&lt;/h2&gt;&lt;p&gt;では JSON のようなデータを Secrets で扱いたい場合どうしたら良いかですが、公式ドキュメントに記載がある方法を使えます。&lt;/p&gt;&lt;h3 id=&quot;1-base64-でフラットな構造にする&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#1-base64-%E3%81%A7%E3%83%95%E3%83%A9%E3%83%83%E3%83%88%E3%81%AA%E6%A7%8B%E9%80%A0%E3%81%AB%E3%81%99%E3%82%8B&quot; aria-label=&quot;1 base64 でフラットな構造にする permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. Base64 でフラットな構造にする&lt;/h3&gt;&lt;p&gt;例えば、Base64 でフラットなデータ構造にして登録することは可能です。
そしてそのデータを取り出す時にデコードして利用します。&lt;/p&gt;&lt;p&gt;&lt;em&gt;cf&lt;/em&gt;. &lt;a href=&quot;https://docs.github.com/en/actions/security-guides/encrypted-secrets#storing-base64-binary-blobs-as-secrets&quot;&gt;https://docs.github.com/en/actions/security-guides/encrypted-secrets#storing-base64-binary-blobs-as-secrets&lt;/a&gt;&lt;/p&gt;&lt;p&gt;base64 コマンドの利用方法は &lt;code class=&quot;language-text&quot;&gt;base64(1)&lt;/code&gt; の man などを参照してください。&lt;/p&gt;&lt;p&gt;なお、&lt;strong&gt;Base64 エンコーディングは容易にデコード可能なので、Base64 エンコードした値が露出することは必ず避けてください&lt;/strong&gt;。&lt;br/&gt;
言うまでもなく、&lt;strong&gt;Base64 でデコードした値ももちろん露出させてはいけません&lt;/strong&gt;。&lt;/p&gt;&lt;h4 id=&quot;base64-エンコーディング時の注意点&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#base64-%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E6%99%82%E3%81%AE%E6%B3%A8%E6%84%8F%E7%82%B9&quot; aria-label=&quot;base64 エンコーディング時の注意点 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Base64 エンコーディング時の注意点&lt;/h4&gt;&lt;p&gt;Base64 エンコードしたデータを Secrets に登録する際は、&lt;strong&gt;エンコードした値から改行コードを取り除いてから Secrets に登録&lt;/strong&gt; する必要があります。&lt;br/&gt;
これをしないと、デコード時に改行コード部分までで区切られてしまい、中途半端なデータしか得られませんのでご注意ください。&lt;/p&gt;&lt;h3 id=&quot;2-暗号化したファイルをリポジトリに登録しそのファイルの複合キーパスフレーズを-secrets-に登録する&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#2-%E6%9A%97%E5%8F%B7%E5%8C%96%E3%81%97%E3%81%9F%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AB%E7%99%BB%E9%8C%B2%E3%81%97%E3%81%9D%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E8%A4%87%E5%90%88%E3%82%AD%E3%83%BC%E3%83%91%E3%82%B9%E3%83%95%E3%83%AC%E3%83%BC%E3%82%BA%E3%82%92-secrets-%E3%81%AB%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B&quot; aria-label=&quot;2 暗号化したファイルをリポジトリに登録しそのファイルの複合キーパスフレーズを secrets に登録する permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. 暗号化したファイルをリポジトリに登録し、そのファイルの複合キー・パスフレーズを Secrets に登録する&lt;/h3&gt;&lt;p&gt;大きいサイズの Secrets を利用する workaround として紹介されているものですが、&lt;a href=&quot;https://docs.github.com/en/actions/security-guides/encrypted-secrets#storing-large-secrets&quot;&gt;Storing large secrets&lt;/a&gt; の方法も使えます。&lt;/p&gt;&lt;h2 id=&quot;結論&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#%E7%B5%90%E8%AB%96&quot; aria-label=&quot;結論 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;結論&lt;/h2&gt;&lt;p&gt;JSON をはじめとする構造化データは GitHub Secrets に登録する際は気をつけてください。&lt;br/&gt;
Base64 でフラットな構造にする、暗号化したファイルの複合キー・パスフレーズを Secrets に登録して利用するなどの workaround が公式ドキュメントで紹介されているのでそちらを参照して利用してください。&lt;/p&gt;&lt;div class=&quot;footnotes&quot;&gt;&lt;hr/&gt;&lt;ol&gt;&lt;li id=&quot;fn-1&quot;&gt;&lt;a href=&quot;https://docs.github.com/en/actions/security-guides/encrypted-secrets#naming-your-secrets&quot;&gt;https://docs.github.com/en/actions/security-guides/encrypted-secrets#naming-your-secrets&lt;/a&gt;&lt;a href=&quot;#fnref-1&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Discord フォーラムチャンネルの仕様について]]></title><description><![CDATA[Discord のフォーラムチャンネル (Forum Channel) は一週間投稿がないと自動アーカイブされる とあるきっかけで、Discord のフォーラムチャンネルについて調べる機会がありました。
問題としては、「勝手に Discord のフォーラムチャンネルが見えなくな…]]></description><link>https://kangetsu121.work2022/12/info-on-discord-forum-channels</link><guid isPermaLink="false">https://kangetsu121.work2022/12/info-on-discord-forum-channels</guid><pubDate>Thu, 29 Dec 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;discord-のフォーラムチャンネル-forum-channel-は一週間投稿がないと自動アーカイブされる&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#discord-%E3%81%AE%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A9%E3%83%A0%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB-forum-channel-%E3%81%AF%E4%B8%80%E9%80%B1%E9%96%93%E6%8A%95%E7%A8%BF%E3%81%8C%E3%81%AA%E3%81%84%E3%81%A8%E8%87%AA%E5%8B%95%E3%82%A2%E3%83%BC%E3%82%AB%E3%82%A4%E3%83%96%E3%81%95%E3%82%8C%E3%82%8B&quot; aria-label=&quot;discord のフォーラムチャンネル forum channel は一週間投稿がないと自動アーカイブされる permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Discord のフォーラムチャンネル (Forum Channel) は一週間投稿がないと自動アーカイブされる&lt;/h2&gt;&lt;p&gt;とあるきっかけで、Discord のフォーラムチャンネルについて調べる機会がありました。
問題としては、「勝手に Discord のフォーラムチャンネルが見えなくなって困るが回避方法はあるか」というものでした。&lt;/p&gt;&lt;p&gt;簡単に調べたところ、2022年12月現在では、&lt;strong&gt;一週間そのチャンネルに投稿がないと自動でアーカイブされる&lt;/strong&gt; ようです。
参考にしたのは、以下の公式への Feedback です。
&lt;a href=&quot;https://support.discord.com/hc/en-us/community/posts/8043171964183-Add-a-forum-archive-timer-for-a-month-year-or-infinite&quot;&gt;https://support.discord.com/hc/en-us/community/posts/8043171964183-Add-a-forum-archive-timer-for-a-month-year-or-infinite&lt;/a&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The layout of the forum cards in a forum channel are great too but it&amp;#x27;s a shame they dissapear quickly after a week. That way I can not scroll forums for hours looking at interesting older posts about the game of the discord that I&amp;#x27;m in.&lt;/p&gt;&lt;p&gt;I&amp;#x27;d say extend the archive timer to months, years, inifinite. I know it will cost resources to upkeep these forum posts so maybe limit a forum post of x amount of MB to only a X amount of time.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Reddit にも同様の意見が投稿されています。
&lt;a href=&quot;https://www.reddit.com/r/discordapp/comments/xrvuvy/feature_request_ability_to_disable_automatic/&quot;&gt;https://www.reddit.com/r/discordapp/comments/xrvuvy/feature_request_ability_to_disable_automatic/&lt;/a&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;We&amp;#x27;ve noticed that these forum posts automatically get archived after a week of inactivity, causing our members to longer be able to see the channels. Can we please get the option to turn this automatic archiving off?&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;回避策としては、その場凌ぎ感は否めませんが、定期的にフォーラムチャンネルに投稿を行う bot を利用するなどはあります。&lt;/p&gt;&lt;p&gt;私自身は Discord のフォーラムチャンネルは使っていないのですが、困る人がいそうな仕様だけど、日本語の情報が見つけられなかったので記録しておきます。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[作成済みの multipass インスタンスのリソースを後から変更する]]></title><description><![CDATA[multipass の disk を後から変更したかった 今使っているマシンが M1 Mac で, 開発には  multipass  の Ubuntu を使っています。
開発中にインスタンスがディスクフルになってしまい, 事後的にディスクサイズを更新したのでその方法をメモします…]]></description><link>https://kangetsu121.work2022/08/modify-multipass-instance-afterwards</link><guid isPermaLink="false">https://kangetsu121.work2022/08/modify-multipass-instance-afterwards</guid><pubDate>Mon, 29 Aug 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;multipass-の-disk-を後から変更したかった&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#multipass-%E3%81%AE-disk-%E3%82%92%E5%BE%8C%E3%81%8B%E3%82%89%E5%A4%89%E6%9B%B4%E3%81%97%E3%81%9F%E3%81%8B%E3%81%A3%E3%81%9F&quot; aria-label=&quot;multipass の disk を後から変更したかった permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;multipass の disk を後から変更したかった&lt;/h2&gt;&lt;p&gt;今使っているマシンが M1 Mac で, 開発には &lt;a href=&quot;https://multipass.run/&quot;&gt;multipass&lt;/a&gt; の Ubuntu を使っています。
開発中にインスタンスがディスクフルになってしまい, 事後的にディスクサイズを更新したのでその方法をメモします。&lt;/p&gt;&lt;p&gt;日本語であまり記事がなかったのと, これから困る人も出そうだから書き残しておきます。
なお, ディスクだけでなく CPU やメモリなどの他のリソースも更新可能とのことです。&lt;/p&gt;&lt;h2 id=&quot;方法-code-classlanguage-textmultipass-set-localltinstance-namecpusdiskmemorycode&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#%E6%96%B9%E6%B3%95-code-classlanguage-textmultipass-set-localltinstance-namecpusdiskmemorycode&quot; aria-label=&quot;方法 code classlanguage textmultipass set localltinstance namecpusdiskmemorycode permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;方法: &lt;code class=&quot;language-text&quot;&gt;multipass set local.&amp;lt;instance-name&amp;gt;.(cpus|disk|memory)&lt;/code&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://multipass.run/docs/modify-an-instance#heading--set-the-cpu-ram-or-disk-of-an-instance&quot;&gt;公式ドキュメント&lt;/a&gt; にあります。
multipass バージョン 1.1.0 から利用可能で, 2022/8/29 現在プレビュー機能です。&lt;/p&gt;&lt;p&gt;ドキュメントの通り, インスタンスを停止後, 以下のコマンドを実行すれば良いです:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;multipass &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; local.&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;instance-name&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt;.&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cpus&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;disk&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;memory&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;例えば, 私の場合ディスクを 40GB から 60GB にしたかったので, インスタンスの停止後に以下のコマンドを実行しました (&lt;code class=&quot;language-text&quot;&gt;ubuntu20&lt;/code&gt; は私のインスタンス名)。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;multipass &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;local.Ubuntu20.disk&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;60GB&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ヘルプを見るともっとわかりやすいかもしれません。
&lt;code class=&quot;language-text&quot;&gt;&amp;lt;key&amp;gt;&lt;/code&gt; が &lt;code class=&quot;language-text&quot;&gt;local.Ubuntu20.disk&lt;/code&gt; で, &lt;code class=&quot;language-text&quot;&gt;value&lt;/code&gt; が &lt;code class=&quot;language-text&quot;&gt;60GB&lt;/code&gt; ですね。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell-session&quot;&gt;&lt;pre class=&quot;language-shell-session&quot;&gt;&lt;code class=&quot;language-shell-session&quot;&gt;&lt;span class=&quot;token command&quot;&gt;&lt;span class=&quot;token shell-symbol important&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;token bash language-bash&quot;&gt;multipass &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-h&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token output&quot;&gt;Usage: multipass set [options] &amp;lt;key&amp;gt;[=&amp;lt;value&amp;gt;]
Set, to the given value, the configuration setting corresponding to the given key.

Some common settings keys are:
  - client.gui.autostart
  - local.driver
  - local.privileged-mounts

Use `multipass get --keys` to obtain the full list of available settings at any given time.

Options:
  -h, --help     Displays help on commandline options
  -v, --verbose  Increase logging verbosity. Repeat the &amp;#x27;v&amp;#x27; in the short option
                 for more detail. Maximum verbosity is obtained with 4 (or more)
                 v&amp;#x27;s, i.e. -vvvv.

Arguments:
  keyval         A key, or a key-value pair. The key specifies a path to the
                 setting to configure. The value is its intended value. If only
                 the key is given, the value will be prompted for.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;コマンドが成功したらインスタンスを起動すれば終わりです。
簡単にできてありがたい限り。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[jsx ファイルを tsx ファイルに一括置換する]]></title><description><![CDATA[TypeScript 移行するときに既存の JSX ファイルを一括置換したかった このブログは Gatsby.js で書いているのですが, JavaScript から TypeScript に移行しました。
このときに,  .jsx  から  .tsx  にファイルの拡張子を置…]]></description><link>https://kangetsu121.work2022/08/replace-jsx-with-tsx</link><guid isPermaLink="false">https://kangetsu121.work2022/08/replace-jsx-with-tsx</guid><pubDate>Fri, 19 Aug 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;typescript-移行するときに既存の-jsx-ファイルを一括置換したかった&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#typescript-%E7%A7%BB%E8%A1%8C%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AB%E6%97%A2%E5%AD%98%E3%81%AE-jsx-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%B8%80%E6%8B%AC%E7%BD%AE%E6%8F%9B%E3%81%97%E3%81%9F%E3%81%8B%E3%81%A3%E3%81%9F&quot; aria-label=&quot;typescript 移行するときに既存の jsx ファイルを一括置換したかった permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;TypeScript 移行するときに既存の JSX ファイルを一括置換したかった&lt;/h2&gt;&lt;p&gt;このブログは Gatsby.js で書いているのですが, JavaScript から TypeScript に移行しました。
このときに, &lt;code class=&quot;language-text&quot;&gt;.jsx&lt;/code&gt; から &lt;code class=&quot;language-text&quot;&gt;.tsx&lt;/code&gt; にファイルの拡張子を置換したのですが, 一つ一つやっているととても大変なのでワンライナーでやりました。&lt;/p&gt;&lt;p&gt;そのメモです。&lt;/p&gt;&lt;h2 id=&quot;コマンド&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89&quot; aria-label=&quot;コマンド permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;コマンド&lt;/h2&gt;&lt;p&gt;以下のコマンドで実行しました。
なお, もし実行する際は &lt;strong&gt;必ず &lt;code class=&quot;language-text&quot;&gt;echo&lt;/code&gt; などで期待結果になるか確かめてから実行してください。当ブログでは実行の結果に責任を持ちません&lt;/strong&gt;。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# カレントディレクトリ以下の jsx ファイルを tsx ファイルに置換する&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# echo による確認を必ず先にする&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt; ./ &lt;span class=&quot;token parameter variable&quot;&gt;-name&lt;/span&gt; *.jsx &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;read&lt;/span&gt; f&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$f&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;${f&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;.*}&lt;/span&gt;.tsx&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# mv で実際に置換する&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt; ./ &lt;span class=&quot;token parameter variable&quot;&gt;-name&lt;/span&gt; *.jsx &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;read&lt;/span&gt; f&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;mv&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$f&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;${f&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;.*}&lt;/span&gt;.tsx&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;コマンドの解説&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E8%A7%A3%E8%AA%AC&quot; aria-label=&quot;コマンドの解説 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;コマンドの解説&lt;/h3&gt;&lt;p&gt;分解して順に解説します。&lt;/p&gt;&lt;h4 id=&quot;1-code-classlanguage-textfind---name-jsxcode&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#1-code-classlanguage-textfind---name-jsxcode&quot; aria-label=&quot;1 code classlanguage textfind   name jsxcode permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. &lt;code class=&quot;language-text&quot;&gt;find ./ -name *.jsx&lt;/code&gt;&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;実行内容: カレントディレクトリ以下の &lt;code class=&quot;language-text&quot;&gt;.jsx&lt;/code&gt; ファイルのパスを全て取得&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;実行例:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell-session&quot;&gt;&lt;pre class=&quot;language-shell-session&quot;&gt;&lt;code class=&quot;language-shell-session&quot;&gt;&lt;span class=&quot;token command&quot;&gt;&lt;span class=&quot;token info punctuation&quot;&gt;&lt;span class=&quot;token user&quot;&gt;kangetsu@ubuntu20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token path&quot;&gt;~/work/my_blog&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token shell-symbol important&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;token bash language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt; ./ &lt;span class=&quot;token parameter variable&quot;&gt;-name&lt;/span&gt; *.jsx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token output&quot;&gt;./src/components/footer/Footer.jsx
./src/components/util/Note.jsx
./src/components/pagination/Pagination.jsx
./src/components/header/HeaderMenu.jsx
./src/components/header/Header.jsx
./src/components/sideMenu/SideMenu.jsx
./src/components/sideMenu/Tags.jsx
./src/components/sideMenu/SideSocialList.jsx
./src/components/sideMenu/SideAuthorProfile.jsx
./src/components/sideMenu/SideAboutBlog.jsx
./src/components/Layout.jsx
./src/components/main/Main.jsx
./src/components/main/ArticleSummary.jsx
./src/components/Seo.jsx
./src/templates/tagPages.jsx
./src/templates/articleList.jsx
./src/pages/{mdx.slug}.jsx
./src/pages/404.jsx
kangetsu@ubuntu20:~/work/my_blog$&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;./&lt;/code&gt;: カレントディレクトリを指す&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;-name&lt;/code&gt;: &lt;code class=&quot;language-text&quot;&gt;-name&lt;/code&gt; の後で指定したパターンにマッチするファイルを検索する&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;詳細は &lt;code class=&quot;language-text&quot;&gt;find&lt;/code&gt; コマンドの &lt;code class=&quot;language-text&quot;&gt;man&lt;/code&gt; を見てください。
単純に名前パターンで &lt;code class=&quot;language-text&quot;&gt;jsx&lt;/code&gt; ファイルのパスを取得しているだけ。&lt;/p&gt;&lt;h4 id=&quot;2-code-classlanguage-text-while-read-f-do-mv-f-ftsx-donecode&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#2-code-classlanguage-text-while-read-f-do-mv-f-ftsx-donecode&quot; aria-label=&quot;2 code classlanguage text while read f do mv f ftsx donecode permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. &lt;code class=&quot;language-text&quot;&gt;| while read f; do mv $f ${f%.*}.tsx; done&lt;/code&gt;&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;実行内容: &lt;code class=&quot;language-text&quot;&gt;1. find ./ -name *.jsx&lt;/code&gt; で得られた結果 (カレントディレクトリ以下の全ての &lt;code class=&quot;language-text&quot;&gt;.jsx&lt;/code&gt; ファイルのパス) を &lt;code class=&quot;language-text&quot;&gt;|&lt;/code&gt; で標準入力として渡して, &lt;code class=&quot;language-text&quot;&gt;while&lt;/code&gt; ループで回して一つずつ &lt;code class=&quot;language-text&quot;&gt;mv&lt;/code&gt; コマンドで &lt;code class=&quot;language-text&quot;&gt;.tsx&lt;/code&gt; にリネーム&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;mv&lt;/code&gt; ではなく &lt;code class=&quot;language-text&quot;&gt;echo&lt;/code&gt; の&lt;/strong&gt; 実行例:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell-session&quot;&gt;&lt;pre class=&quot;language-shell-session&quot;&gt;&lt;code class=&quot;language-shell-session&quot;&gt;&lt;span class=&quot;token command&quot;&gt;&lt;span class=&quot;token info punctuation&quot;&gt;&lt;span class=&quot;token user&quot;&gt;kangetsu@ubuntu20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token path&quot;&gt;~/work/my_blog&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token shell-symbol important&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;token bash language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt; ./ &lt;span class=&quot;token parameter variable&quot;&gt;-name&lt;/span&gt; *.jsx &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;read&lt;/span&gt; f&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$f&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;${f&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;.*}&lt;/span&gt;.tsx&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token output&quot;&gt;./src/components/footer/Footer.jsx ./src/components/footer/Footer.tsx
./src/components/util/Note.jsx ./src/components/util/Note.tsx
./src/components/pagination/Pagination.jsx ./src/components/pagination/Pagination.tsx
./src/components/header/HeaderMenu.jsx ./src/components/header/HeaderMenu.tsx
./src/components/header/Header.jsx ./src/components/header/Header.tsx
./src/components/sideMenu/SideMenu.jsx ./src/components/sideMenu/SideMenu.tsx
./src/components/sideMenu/Tags.jsx ./src/components/sideMenu/Tags.tsx
./src/components/sideMenu/SideSocialList.jsx ./src/components/sideMenu/SideSocialList.tsx
./src/components/sideMenu/SideAuthorProfile.jsx ./src/components/sideMenu/SideAuthorProfile.tsx
./src/components/sideMenu/SideAboutBlog.jsx ./src/components/sideMenu/SideAboutBlog.tsx
./src/components/Layout.jsx ./src/components/Layout.tsx
./src/components/main/Main.jsx ./src/components/main/Main.tsx
./src/components/main/ArticleSummary.jsx ./src/components/main/ArticleSummary.tsx
./src/components/Seo.jsx ./src/components/Seo.tsx
./src/templates/tagPages.jsx ./src/templates/tagPages.tsx
./src/templates/articleList.jsx ./src/templates/articleList.tsx
./src/pages/{mdx.slug}.jsx ./src/pages/{mdx.slug}.tsx
./src/pages/404.jsx ./src/pages/404.tsx
kangetsu@ubuntu20:~/work/my_blog$&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;while read f&lt;/code&gt;: 標準入力を一行ずつ読み込む。&lt;code class=&quot;language-text&quot;&gt;f&lt;/code&gt; は仮引数みたいなもの (変数名)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;${f%.*}.tsx&lt;/code&gt;: ↑で指定した変数名 &lt;code class=&quot;language-text&quot;&gt;f&lt;/code&gt; を参照して, &lt;code class=&quot;language-text&quot;&gt;$f&lt;/code&gt;の拡張子を &lt;code class=&quot;language-text&quot;&gt;.tsx&lt;/code&gt; に置換&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;${f%.*}&lt;/code&gt;: シェルの変数参照で, &lt;code class=&quot;language-text&quot;&gt;${f}&lt;/code&gt; の内容のうち &lt;code class=&quot;language-text&quot;&gt;%&lt;/code&gt; の後で指定した部分の後方最短一致で除去する。つまり &lt;code class=&quot;language-text&quot;&gt;./src/pages/404.jsx&lt;/code&gt; だと &lt;code class=&quot;language-text&quot;&gt;.*&lt;/code&gt; に後方最短一致する部分を除去するので, &lt;code class=&quot;language-text&quot;&gt;.jsx&lt;/code&gt; がマッチして除去され &lt;code class=&quot;language-text&quot;&gt;./src/pages/404&lt;/code&gt; となる (&lt;code class=&quot;language-text&quot;&gt;${f%.*}.tsx&lt;/code&gt; としているので除去された結果の &lt;code class=&quot;language-text&quot;&gt;./src/pages/404&lt;/code&gt; に &lt;code class=&quot;language-text&quot;&gt;.tsx&lt;/code&gt; がつき, &lt;code class=&quot;language-text&quot;&gt;./src/pages/404.tsx&lt;/code&gt; になる)。以下の bash の man 参照 (dash も同様):&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;man&quot;&gt;&lt;pre class=&quot;language-man&quot;&gt;&lt;code class=&quot;language-man&quot;&gt;[...]
    ${parameter%word}
    ${parameter%%word}
            Remove matching suffix pattern.  The word is expanded to produce a pattern just as in pathname expansion, and matched against the expanded value of parameter using the rules described under Pat‐
            tern Matching below.  If the pattern matches a trailing portion of the expanded value of parameter, then the result of the expansion is the expanded value of parameter with the shortest matching
            pattern (the ``%&amp;#x27;&amp;#x27; case) or the longest matching pattern (the ``%%&amp;#x27;&amp;#x27; case) deleted.  If parameter is @ or *, the pattern removal operation is applied to each positional parameter  in  turn,  and
            the  expansion  is the resultant list.  If parameter is an array variable subscripted with @ or *, the pattern removal operation is applied to each member of the array in turn, and the expansion
            is the resultant list.
[...]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;もっと良い方法があるのかもしれないけど, とりあえずわたしはこれでやりたいことは実現できました。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[GitHub 上で markdown ファイルをそのまま表示する]]></title><description><![CDATA[GitHub でのレビューで Markdown ファイルでも行数指定したい: モチベーション 短いので TL;DR なしで。 GitHub で, markdown ファイルをレビューするときがあります。
GitHub でのレビュー時, コードであればビューの左にある行数の部分を…]]></description><link>https://kangetsu121.work2022/05/view-plain-markdown-on-github</link><guid isPermaLink="false">https://kangetsu121.work2022/05/view-plain-markdown-on-github</guid><pubDate>Tue, 31 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;github-でのレビューで-markdown-ファイルでも行数指定したい-モチベーション&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#github-%E3%81%A7%E3%81%AE%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%81%A7-markdown-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A7%E3%82%82%E8%A1%8C%E6%95%B0%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%9F%E3%81%84-%E3%83%A2%E3%83%81%E3%83%99%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3&quot; aria-label=&quot;github でのレビューで markdown ファイルでも行数指定したい モチベーション permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;GitHub でのレビューで Markdown ファイルでも行数指定したい: モチベーション&lt;/h2&gt;&lt;p&gt;短いので TL;DR なしで。&lt;/p&gt;&lt;p&gt;GitHub で, markdown ファイルをレビューするときがあります。
GitHub でのレビュー時, コードであればビューの左にある行数の部分をクリックすると、その行を指定した URL を取得できます。
よくコードレビュー時に使う方が多いと思います。&lt;/p&gt;&lt;p&gt;しかし, markdown のファイルは, &lt;strong&gt;GitHub では通常 HTML に変換されて表示されるため, この行数指定ができません&lt;/strong&gt;。
このため, これまで私は苦肉の策として blame 画面で行数をポイントしていましたが, 本来の趣旨とは異なるので少し気持ち悪さがありました。&lt;/p&gt;&lt;p&gt;ところが, 先日他の方が GitHub 上で, blame を使わずに markdown ファイルの行数を指定した URL を取得できているのを発見しました。
周知なのかもしれませんが, とても便利なので記録 &amp;amp; 共有します。&lt;/p&gt;&lt;h2 id=&quot;方法&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#%E6%96%B9%E6%B3%95&quot; aria-label=&quot;方法 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;方法&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;GitHub 上で markdown ファイルを表示し, URL 末尾に &lt;code class=&quot;language-text&quot;&gt;?plain=1&lt;/code&gt; をつける&lt;/strong&gt; です。&lt;/p&gt;&lt;p&gt;例: &lt;a href=&quot;https://github.com/kangetsu121/my_blog/blob/e2ef0be04a90a7acc952e8da7331c97861d74a6f/README.md?plain=1#L1&quot;&gt;https://github.com/kangetsu121/my_blog/blob/e2ef0be04a90a7acc952e8da7331c97861d74a6f/README.md?plain=1#L1&lt;/a&gt;&lt;/p&gt;&lt;p&gt;なお, これは有名ですが, GitHub のリポジトリ上のファイルを開いている状態で &lt;code class=&quot;language-text&quot;&gt;y&lt;/code&gt; を押すと URL がパーマネントリンクになるので, これも組み合わせるのが便利です&lt;sup id=&quot;fnref-1&quot;&gt;&lt;a href=&quot;#fn-1&quot; class=&quot;footnote-ref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;。&lt;br/&gt;
例えば &lt;code class=&quot;language-text&quot;&gt;y&lt;/code&gt; を押さない &lt;a href=&quot;https://github.com/kangetsu121/my_blog/blob/main/README.md?plain=1&quot;&gt;https://github.com/kangetsu121/my_blog/blob/main/README.md?plain=1&lt;/a&gt; だと, URL が &lt;code class=&quot;language-text&quot;&gt;/main/&lt;/code&gt; になっているので main リポジトリのそのファイルの内容が変わると URL が指し示す内容も変わるのですが, パーマネントリンクなら main が更新されてもその時の内容のままになります。&lt;/p&gt;&lt;h2 id=&quot;公式ドキュメント&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#%E5%85%AC%E5%BC%8F%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88&quot; aria-label=&quot;公式ドキュメント permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;公式ドキュメント&lt;/h2&gt;&lt;p&gt;GitHub 公式ドキュメントはこちらです。&lt;a href=&quot;https://docs.github.com/en/github-ae@latest/get-started/writing-on-github/working-with-advanced-formatting/creating-a-permanent-link-to-a-code-snippet#linking-to-markdown&quot;&gt;Linking to Markdown&lt;/a&gt;&lt;/p&gt;&lt;p&gt;History を見ると, この機能のドキュメントは 2022 年 1 月 12 日に公開されたようです。&lt;br/&gt;
&lt;a href=&quot;https://github.com/github/docs/commits/main/content/get-started/writing-on-github/working-with-advanced-formatting/creating-a-permanent-link-to-a-code-snippet.md&quot;&gt;https://github.com/github/docs/commits/main/content/get-started/writing-on-github/working-with-advanced-formatting/creating-a-permanent-link-to-a-code-snippet.md&lt;/a&gt;&lt;/p&gt;&lt;p&gt;だから知らなかったのか。機能追加が嬉しい。&lt;/p&gt;&lt;p&gt;非常に便利なので積極的に使っていきたいですね。&lt;/p&gt;&lt;div class=&quot;footnotes&quot;&gt;&lt;hr/&gt;&lt;ol&gt;&lt;li id=&quot;fn-1&quot;&gt;&lt;a href=&quot;https://docs.github.com/en/github-ae@latest/repositories/working-with-files/using-files/getting-permanent-links-to-files&quot;&gt;Getting permanent links to files&lt;/a&gt;&lt;a href=&quot;#fnref-1&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Markdown All in One と mdx ファイルを関連づける]]></title><description><![CDATA[TL;DR mdx  形式のファイルを Markdown All in One に関連づけると,  md  の時と同じように自動補完などが使えて書きやすい やり方は VS Code の settings から  mdx  を  markdown  で解釈させるよう設定追加するだ…]]></description><link>https://kangetsu121.work2022/05/associate-mdx-with-markdown-plugin</link><guid isPermaLink="false">https://kangetsu121.work2022/05/associate-mdx-with-markdown-plugin</guid><pubDate>Sun, 29 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;tldr&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#tldr&quot; aria-label=&quot;tldr permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;TL;DR&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;mdx&lt;/code&gt; 形式のファイルを Markdown All in One に関連づけると, &lt;code class=&quot;language-text&quot;&gt;md&lt;/code&gt; の時と同じように自動補完などが使えて書きやすい&lt;ul&gt;&lt;li&gt;やり方は VS Code の settings から &lt;code class=&quot;language-text&quot;&gt;mdx&lt;/code&gt; を &lt;code class=&quot;language-text&quot;&gt;markdown&lt;/code&gt; で解釈させるよう設定追加するだけ&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;ただし 2022 年 5 月 29 日現在で機能としては未対応なので JSX を書いた部分はハイライトされない&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;mdx-でブログを書いているのでもっと便利に書きたい&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#mdx-%E3%81%A7%E3%83%96%E3%83%AD%E3%82%B0%E3%82%92%E6%9B%B8%E3%81%84%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%A7%E3%82%82%E3%81%A3%E3%81%A8%E4%BE%BF%E5%88%A9%E3%81%AB%E6%9B%B8%E3%81%8D%E3%81%9F%E3%81%84&quot; aria-label=&quot;mdx でブログを書いているのでもっと便利に書きたい permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;MDX でブログを書いているのでもっと便利に書きたい&lt;/h2&gt;&lt;p&gt;私はエディタは VS Code を使っており, 読書メモなんかも markdown で書いているので, VS Code 拡張である &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one&quot;&gt;Markdown All in One&lt;/a&gt; には大変お世話になっています。
これを使うと, 例えば &lt;code class=&quot;language-text&quot;&gt;-&lt;/code&gt; や &lt;code class=&quot;language-text&quot;&gt;1.&lt;/code&gt; などでリストを書いたときに, Enter を押しただけで次の行頭に &lt;code class=&quot;language-text&quot;&gt;-&lt;/code&gt; や &lt;code class=&quot;language-text&quot;&gt;2.&lt;/code&gt; を自動挿入してくれたり, 単語を選択して &lt;code class=&quot;language-text&quot;&gt;_&lt;/code&gt; や &lt;code class=&quot;language-text&quot;&gt;*&lt;/code&gt; を入力するとその単語の前後に挿入してくれて, 強調などが楽になるなど, 良い感じの補完をしてくれます。また, 私はほぼ書きませんが, 数式も書けます。&lt;/p&gt;&lt;p&gt;しかし, 先日&lt;a href=&quot;/2022/01/migration-to-gatsby&quot;&gt;はてなブログから Gatsby を使った自作ブログに移行&lt;/a&gt;したことで, &lt;a href=&quot;https://mdxjs.com/&quot;&gt;mdx&lt;/a&gt; でブログを書くようになりました (今のところブログ移行の話を毎回書いてる気がする)。&lt;/p&gt;&lt;p&gt;この記事も mdx で書いているのですが, 残念ながら MArkdown All in One は 2022 年 5 月 29 日現在, mdx に対応していません。
それでも mdx はほぼ markdown だし, JSX を書かないこともあるので, なんとか Markdown All in One を mdx でも使えないか調べました。&lt;/p&gt;&lt;h2 id=&quot;結論-vs-code-の設定で-mdx-を関連づければ良いだけ&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#%E7%B5%90%E8%AB%96-vs-code-%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%A7-mdx-%E3%82%92%E9%96%A2%E9%80%A3%E3%81%A5%E3%81%91%E3%82%8C%E3%81%B0%E8%89%AF%E3%81%84%E3%81%A0%E3%81%91&quot; aria-label=&quot;結論 vs code の設定で mdx を関連づければ良いだけ permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;結論: VS Code の設定で mdx を関連づければ良いだけ&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Ctrl (Command)&lt;/code&gt; + &lt;code class=&quot;language-text&quot;&gt;Shift&lt;/code&gt; + &lt;code class=&quot;language-text&quot;&gt;P&lt;/code&gt; でコマンドパレットを開く&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;settings&lt;/code&gt; と入力&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;出た候補の中から &lt;code class=&quot;language-text&quot;&gt;Preferences: Open Workspace Settings&lt;/code&gt; を開く (現在のワークスペースのみに反映させたい場合。常に適用したい場合は, ローカルの場合は &lt;code class=&quot;language-text&quot;&gt;Open Settings (UI)&lt;/code&gt;, Remote Code で開発している場合は &lt;code class=&quot;language-text&quot;&gt;Open Remote Settings (SSH: &amp;lt;HOST&amp;gt;)&lt;/code&gt;)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Markdown All in One Associations&lt;/code&gt; などで検索し, &lt;code class=&quot;language-text&quot;&gt;Files: Associations&lt;/code&gt; の &lt;code class=&quot;language-text&quot;&gt;Item&lt;/code&gt; に &lt;code class=&quot;language-text&quot;&gt;*mdx&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;Value&lt;/code&gt; に &lt;code class=&quot;language-text&quot;&gt;markdown&lt;/code&gt; と入力&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:650px&quot;&gt;
      &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/a4ff76f9ff413f80792b26b5fe449754/8b640/VSCode_settings.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom:71.77914110429448%;position:relative;bottom:0;left:0;background-image:url(&amp;#x27;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB9ElEQVQoz3WQ2XLiMBBF+ZOZhFjYWmxrlyWvkm0MBAh5SfL/PzIlyJBUTabqPEgt3e7bd5URxXVT8IqUuuAVlQ4S8WudPSToMcGP4JOHBP1+ginm2gWuOlLqFItVluucO+1C1U6mHm03c90x3ebMJpADJO48ZYyqfn5+X07vu/OHdNMqJYowJ63X9aSsZ7rD1MLCZLkBSG5wBPwlyw2mNaaO8BoW1SqBXJghbE+y8qg069i+7cZDNz2344HwmnCX8zq/HjC1mNpYEfWGqBVAgsrWddtC1BssEyikDfPhddy9XLmMu5d5/zruLmE5j8utctbNBLCMYkytaSZZ+ZSoBApm+iYcXL80fu/6xfVb0862X+ph1/i9dIFwl+Z6g+Xqa6vrhgAJwpvp+U01yxMU8RNRG6KvqDtZYaLtm/g7iFqmO2l9qTpwa/2ZnLpeVYSor8l3EixLO/rpGJazn4+yGoQZdB24GZh0SjsuI5RbgH4SF3b081FUg7JeWi+rwTSTckFWgzSdMJ12PmcWIPHzZFkN65TF/JAoZavrmO3V6s2wSon+wTbAChsflgszMfwYQVkpFwiNo1IiUxy5ff5XLCFrbL9nJgAkssKg0sKiQqVFpb212/xPHJ+RWKc0gTyB3DTL9vixPb4vp4/5+JaLFkB+F/8B6XCrabVmEEwAAAAASUVORK5CYII=&amp;#x27;);background-size:cover;display:block&quot;&gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source srcSet=&quot;/static/a4ff76f9ff413f80792b26b5fe449754/0cbef/VSCode_settings.avif 163w,/static/a4ff76f9ff413f80792b26b5fe449754/bffb7/VSCode_settings.avif 325w,/static/a4ff76f9ff413f80792b26b5fe449754/69c29/VSCode_settings.avif 650w,/static/a4ff76f9ff413f80792b26b5fe449754/6d24a/VSCode_settings.avif 975w,/static/a4ff76f9ff413f80792b26b5fe449754/a2baf/VSCode_settings.avif 1300w,/static/a4ff76f9ff413f80792b26b5fe449754/66e41/VSCode_settings.avif 1454w&quot; sizes=&quot;(max-width: 650px) 100vw, 650px&quot; type=&quot;image/avif&quot;/&gt;&lt;source srcSet=&quot;/static/a4ff76f9ff413f80792b26b5fe449754/94563/VSCode_settings.webp 163w,/static/a4ff76f9ff413f80792b26b5fe449754/647a8/VSCode_settings.webp 325w,/static/a4ff76f9ff413f80792b26b5fe449754/c1dc5/VSCode_settings.webp 650w,/static/a4ff76f9ff413f80792b26b5fe449754/1e975/VSCode_settings.webp 975w,/static/a4ff76f9ff413f80792b26b5fe449754/063bf/VSCode_settings.webp 1300w,/static/a4ff76f9ff413f80792b26b5fe449754/7017d/VSCode_settings.webp 1454w&quot; sizes=&quot;(max-width: 650px) 100vw, 650px&quot; type=&quot;image/webp&quot;/&gt;
          &lt;source srcSet=&quot;/static/a4ff76f9ff413f80792b26b5fe449754/222b7/VSCode_settings.png 163w,/static/a4ff76f9ff413f80792b26b5fe449754/ff46a/VSCode_settings.png 325w,/static/a4ff76f9ff413f80792b26b5fe449754/a6d36/VSCode_settings.png 650w,/static/a4ff76f9ff413f80792b26b5fe449754/e548f/VSCode_settings.png 975w,/static/a4ff76f9ff413f80792b26b5fe449754/3c492/VSCode_settings.png 1300w,/static/a4ff76f9ff413f80792b26b5fe449754/8b640/VSCode_settings.png 1454w&quot; sizes=&quot;(max-width: 650px) 100vw, 650px&quot; type=&quot;image/png&quot;/&gt;
          &lt;img class=&quot;gatsby-resp-image-image&quot; src=&quot;/static/a4ff76f9ff413f80792b26b5fe449754/a6d36/VSCode_settings.png&quot; alt=&quot;settings での入力&quot; title=&quot;settings での入力&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot;/&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;または &lt;code class=&quot;language-text&quot;&gt;settings.json&lt;/code&gt; を直接編集する場合は, 以下のように記述&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&amp;quot;files.associations&amp;quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&amp;quot;*.mdx&amp;quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;quot;markdown&amp;quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;調査内容&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#%E8%AA%BF%E6%9F%BB%E5%86%85%E5%AE%B9&quot; aria-label=&quot;調査内容 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;調査内容&lt;/h2&gt;&lt;p&gt;ということで, プラグインのオプションから関連づけてやればいいだけでした。一応ここに至るまで少し調べもしたので, その内容を書いておきます。&lt;/p&gt;&lt;p&gt;やはり同じことを考えた方はいたようで, Markdown All in One のリポジトリの Issue が存在しました。&lt;br/&gt;
&lt;a href=&quot;https://github.com/yzhang-gh/vscode-markdown/issues/758&quot;&gt;Suggestion: Allow extension to work within MDX files #758&lt;/a&gt;&lt;/p&gt;&lt;p&gt;この Issue は 2022 年 5 月 29 日現在, Open のままです。ただし, 上で書いたような暫定解決策が, プラグイン作者である yzhang-gh さんによって&lt;a href=&quot;https://github.com/yzhang-gh/vscode-markdown/issues/758#issuecomment-662959624&quot;&gt;コメント&lt;/a&gt;されています。私もこれを読んで解決しました。&lt;/p&gt;&lt;p&gt;なお, &lt;a href=&quot;https://github.com/yzhang-gh/vscode-markdown/pull/759&quot;&gt;Allow extension to activate in MDX files #759&lt;/a&gt; で一度実装されたのですが, 実装が不適切だったようで revert されてますね。Issue は Closed になってますが, Issue #758 の通り依然根本解決はしていないままです。&lt;/p&gt;&lt;h2 id=&quot;補足-この解決法の問題や-gatsby-での-mdx-利用でつらいところ&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#%E8%A3%9C%E8%B6%B3-%E3%81%93%E3%81%AE%E8%A7%A3%E6%B1%BA%E6%B3%95%E3%81%AE%E5%95%8F%E9%A1%8C%E3%82%84-gatsby-%E3%81%A7%E3%81%AE-mdx-%E5%88%A9%E7%94%A8%E3%81%A7%E3%81%A4%E3%82%89%E3%81%84%E3%81%A8%E3%81%93%E3%82%8D&quot; aria-label=&quot;補足 この解決法の問題や gatsby での mdx 利用でつらいところ permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;補足: この解決法の問題や Gatsby での MDX 利用でつらいところ&lt;/h2&gt;&lt;p&gt;なお, この解決法は, 単純に &lt;code class=&quot;language-text&quot;&gt;mdx&lt;/code&gt; ファイルを &lt;code class=&quot;language-text&quot;&gt;markdown&lt;/code&gt; として認識させただけです。&lt;strong&gt;MDX にあって Markdown にない, JSX などの記法は当然 Markdown All in One 本家が未対応なので, ハイライトされません&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;また, このブログは Gatsby を利用していますが, &lt;strong&gt;2022 年 5 月 29 日現在, Gatsby は MDX v2.0 に対応していません&lt;/strong&gt;。
&lt;a href=&quot;https://mdxjs.com/blog/v2/&quot;&gt;MDX 公式&lt;/a&gt;によると, MDX v2.0 では JavaScript の式が評価されるようになったり, コンパイル速度が速くなったり, バンドルサイズが小さくなったり, markdown 記法と JSX の組み合わせがより柔軟になったりと, 嬉しいことが多いので是非対応を待ちたいですね。&lt;/p&gt;&lt;p&gt;例えば MDX v2 では以下のようなコードを書いたときに, JSX の内部に markdown 記法で書いた文字列もちゃんと markdown として評価してくれます！ (v1 では &lt;code class=&quot;language-text&quot;&gt;# hi?&lt;/code&gt; は &lt;code class=&quot;language-text&quot;&gt;&amp;lt;h1&amp;gt;&amp;lt;h1?/h1&amp;gt;&lt;/code&gt; にならないのです。素直に書いて評価されなかった時は思わずため息が出る気持ちになった)&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;*hi*?&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
  # hi?
&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;

    # hi?

  &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Gatsby 公式でも着々と対応の準備は進んでいるようなので, 楽しみに待ちたいですね。&lt;br/&gt;
&lt;a href=&quot;https://github.com/gatsbyjs/gatsby/pull/35650&quot;&gt;Feat: MDX v2 #35650&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Gatsby で React の JSX Transform の新方式を導入し, ついでに新旧比較をしてみた]]></title><description><![CDATA[TL;DR Gatsby で React 17 から使える new JSX transform を試してみた パフォーマンスやバンドルサイズに影響が出るかと思い旧来の方式と比較した 結果はパフォーマンスもバンドルサイズも旧方式の方が良かった ただし偏ったサンプルの結果であるので…]]></description><link>https://kangetsu121.work2022/05/comparison-of-jsx-transform</link><guid isPermaLink="false">https://kangetsu121.work2022/05/comparison-of-jsx-transform</guid><pubDate>Sat, 28 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;div class=&quot;Note-module--wrapper--akHP-&quot;&gt;&lt;p class=&quot;Note-module--heading--DFwaK&quot;&gt;&lt;b&gt;&lt;svg stroke=&quot;currentColor&quot; fill=&quot;currentColor&quot; stroke-width=&quot;0&quot; viewBox=&quot;0 0 512 512&quot; height=&quot;1em&quot; width=&quot;1em&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path d=&quot;M352 96c0-53.02-42.98-96-96-96s-96 42.98-96 96 42.98 96 96 96 96-42.98 96-96zM233.59 241.1c-59.33-36.32-155.43-46.3-203.79-49.05C13.55 191.13 0 203.51 0 219.14v222.8c0 14.33 11.59 26.28 26.49 27.05 43.66 2.29 131.99 10.68 193.04 41.43 9.37 4.72 20.48-1.71 20.48-11.87V252.56c-.01-4.67-2.32-8.95-6.42-11.46zm248.61-49.05c-48.35 2.74-144.46 12.73-203.78 49.05-4.1 2.51-6.41 6.96-6.41 11.63v245.79c0 10.19 11.14 16.63 20.54 11.9 61.04-30.72 149.32-39.11 192.97-41.4 14.9-.78 26.49-12.73 26.49-27.06V219.14c-.01-15.63-13.56-28.01-29.81-27.09z&quot;&gt;&lt;/path&gt;&lt;/svg&gt; Note&lt;/b&gt;&lt;/p&gt;&lt;p class=&quot;Note-module--text--DM9b2&quot;&gt;本記事はフロントエンド技術に関わるものですが, 筆者はフロントエンドを本業でやっている人間ではありません。 また, 本記事の結果は, あくまで偏った 1サンプルの結果のメモに過ぎないことにご留意ください。&lt;/p&gt;&lt;/div&gt;&lt;h2 id=&quot;tldr&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#tldr&quot; aria-label=&quot;tldr permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;TL;DR&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Gatsby で React 17 から使える new JSX transform を試してみた&lt;/li&gt;&lt;li&gt;パフォーマンスやバンドルサイズに影響が出るかと思い旧来の方式と比較した&lt;ul&gt;&lt;li&gt;結果はパフォーマンスもバンドルサイズも旧方式の方が良かった&lt;/li&gt;&lt;li&gt;ただし偏ったサンプルの結果であるので注意。おそらくそれなりの規模の環境では, 公式ドキュメントにあるように新方式の方がパフォーマンスやバンドルサイズが改善すると思われる。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;きっかけ-自分のソースコードから-code-classlanguage-textimport-react-from-reactcode-を消してスッキリさせたい&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#%E3%81%8D%E3%81%A3%E3%81%8B%E3%81%91-%E8%87%AA%E5%88%86%E3%81%AE%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8B%E3%82%89-code-classlanguage-textimport-react-from-reactcode-%E3%82%92%E6%B6%88%E3%81%97%E3%81%A6%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%81%95%E3%81%9B%E3%81%9F%E3%81%84&quot; aria-label=&quot;きっかけ 自分のソースコードから code classlanguage textimport react from reactcode を消してスッキリさせたい permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;きっかけ: 自分のソースコードから &lt;code class=&quot;language-text&quot;&gt;import React from &amp;#x27;react&amp;#x27;;&lt;/code&gt; を消してスッキリさせたい&lt;/h2&gt;&lt;p&gt;先日, ブログをはてなブログから Gatsby を利用した自作ブログへと移行しました&lt;sup id=&quot;fnref-1&quot;&gt;&lt;a href=&quot;#fn-1&quot; class=&quot;footnote-ref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;。
より保守性・生産性の高いコードにしたい, スキルを身につけたいという思いがあり, TypeScript で実装しようと当初考えたのですが, とりあえずものを作りたかったので, ひとまず JavaScript で実装しました。&lt;/p&gt;&lt;p&gt;そろそろ TypeScript への移行を始めたいと思いましたが, まだまだ React のことも理解できていないので, React と TypeScript を一緒に学べる&lt;a href=&quot;https://oukayuka.booth.pm/&quot;&gt;『りあクト！ TypeScript で始めるつらくない React 開発』シリーズ&lt;/a&gt;を読み直していました。&lt;/p&gt;&lt;p&gt;すると, 気になる記述が目に入りました。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;「...React 17.0 以降はパフォーマンス改善などを目的とした新しい変換形式が導入されてて、Create React App でも 2020 年 10 月にリリースされた 4.0 からはデフォルトの設定はそっちが有効になってるのね。...」&lt;sup id=&quot;fnref-2&quot;&gt;&lt;a href=&quot;#fn-2&quot; class=&quot;footnote-ref&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;「...ちなみに TypeScript 4.1 以降では React 17.0 から導入された新しい JSX 変換形式に対応してて、&lt;code class=&quot;language-text&quot;&gt;tsconfig.json&lt;/code&gt; の &lt;code class=&quot;language-text&quot;&gt;jsx&lt;/code&gt; オプション設定が &lt;code class=&quot;language-text&quot;&gt;react-jsx&lt;/code&gt; になってるとそれが有効になる。こっちはこんなふうにインポート文込みで変換されるので、&lt;code class=&quot;language-text&quot;&gt;import React from &amp;#x27;react&amp;#x27;&lt;/code&gt; が省略できるよ」&lt;sup id=&quot;fnref-3&quot;&gt;&lt;a href=&quot;#fn-3&quot; class=&quot;footnote-ref&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;詳しくは React 公式の &lt;a href=&quot;https://reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html&quot;&gt;Introducing the New JSX Transform&lt;/a&gt; で紹介されているのですが, つまるところ以下の内容です。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;React 17.0 から JSX の変換で, &lt;code class=&quot;language-text&quot;&gt;React.createElement()&lt;/code&gt; に変換されない新形式が使えるようになった&lt;/li&gt;&lt;li&gt;新形式では &lt;code class=&quot;language-text&quot;&gt;import React from &amp;#x27;react&amp;#x27;&lt;/code&gt; のインポート文が不要になる&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;そして, 新方式の恩恵として, 上記の React のドキュメントでは以下が挙げられています。&lt;/p&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;With the new transform, you can use JSX without importing React.&lt;/li&gt;&lt;li&gt;Depending on your setup, its compiled output may slightly improve the bundle size.&lt;/li&gt;&lt;li&gt;It will enable future improvements that reduce the number of concepts you need to learn React.&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;p&gt;確かに, Gatsby でコードを書いているとき, &lt;strong&gt;全ての JSX ファイルの冒頭に &lt;code class=&quot;language-text&quot;&gt;import React from &amp;#x27;react&amp;#x27;;&lt;/code&gt; を書いており&lt;/strong&gt;, 冗長だなと思っていました。
もはや JSX ファイルを作成したらまず無心でタイプする, 魔法の文字列じみた状態でした。
それが省略でき, かつパフォーマンスなども上がるのであれば, これは是非導入してみたい。
ただし, 先ほども触れたように, 私はまだ TypeScript を修得していないので, TypeScript 前提で書かれている『りあクト！』の記述をそのままは使えません。
JavaScript で, かつ Gatsby でこの新方式を導入できるのか調べる必要があります。&lt;/p&gt;&lt;p&gt;ということで, &lt;strong&gt;本記事では, Gatsby + JavaScript で React の JSX Transform の新方式を利用する方法&lt;/strong&gt; を調べました。
また, 旧方式とのパフォーマンス比較も, せっかくなのでごく簡易にではありますが試してみました。&lt;/p&gt;&lt;h2 id=&quot;gatsby-で-react-jsx-transform-の新方式を導入する&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#gatsby-%E3%81%A7-react-jsx-transform-%E3%81%AE%E6%96%B0%E6%96%B9%E5%BC%8F%E3%82%92%E5%B0%8E%E5%85%A5%E3%81%99%E3%82%8B&quot; aria-label=&quot;gatsby で react jsx transform の新方式を導入する permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Gatsby で React JSX Transform の新方式を導入する&lt;/h2&gt;&lt;p&gt;TypeScript であれば, &lt;code class=&quot;language-text&quot;&gt;tsconfig.json&lt;/code&gt; を編集すれば良いようです。
しかし, Gatsby ではどうすれば良いか。&lt;/p&gt;&lt;h3 id=&quot;gatsby-の設定&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#gatsby-%E3%81%AE%E8%A8%AD%E5%AE%9A&quot; aria-label=&quot;gatsby の設定 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Gatsby の設定&lt;/h3&gt;&lt;p&gt;検索していたら, まず次の issue にたどり着きました。&lt;br/&gt;
&lt;a href=&quot;https://github.com/gatsbyjs/gatsby/issues/28657&quot;&gt;React 17 new JSX Transform: ReferenceError: React is not defined #28657&lt;/a&gt;&lt;/p&gt;&lt;p&gt;この Issue の末尾から, 根本的に解決された Issue も確認できました。&lt;br/&gt;
&lt;a href=&quot;https://github.com/gatsbyjs/gatsby/pull/33050&quot;&gt;feat(gatsby): Add JSX Runtime options to gatsby-config.js #33050&lt;/a&gt;&lt;/p&gt;&lt;p&gt;どうやら, Gatsby でもちゃんと新方式に対応しているようです。
ちなみにリリースノートもちゃんとあり, Gatsby 4.1 から対応したようでした。&lt;br/&gt;
&lt;a href=&quot;https://www.gatsbyjs.com/docs/reference/release-notes/v4.1/#jsx-runtime-options-in-gatsby-configjs&quot;&gt;JSX Runtime Options in &lt;code class=&quot;language-text&quot;&gt;gatsby-config.js&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;これらの記述によれば, &lt;code class=&quot;language-text&quot;&gt;gatsby-config.js&lt;/code&gt; に以下のエントリを足してやれば良いようです。&lt;/p&gt;&lt;undefined&gt;
        &lt;div class=&quot;gatsby-code-title&quot;&gt;
          &lt;span&gt;gatsby-config.js&lt;/span&gt;
        &lt;/div&gt;
       &lt;/undefined&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;jsxRuntime&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;automatic&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;eslint-の設定&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#eslint-%E3%81%AE%E8%A8%AD%E5%AE%9A&quot; aria-label=&quot;eslint の設定 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;ESLint の設定&lt;/h3&gt;&lt;p&gt;これで無事冗長な &lt;code class=&quot;language-text&quot;&gt;import React from &amp;#x27;react&amp;#x27;;&lt;/code&gt; を消せる, と思って消したら, ESLint に怒られました。
&lt;code class=&quot;language-text&quot;&gt;Prevent missing React when using JSX (react/react-in-jsx-scope)&lt;/code&gt; に抵触しているようです。
それはそう。&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/react-in-jsx-scope.md&quot;&gt;抵触したこのルールのドキュメント&lt;/a&gt;に飛ぶと, 末尾に以下のように書かれています。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;If you are using the &lt;a href=&quot;https://reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html#removing-unused-react-imports&quot;&gt;new JSX transform from React 17&lt;/a&gt;, you should disable this rule by extending &lt;a href=&quot;https://github.com/jsx-eslint/eslint-plugin-react/blob/8cf47a8ac2242ee00ea36eac4b6ae51956ba4411/index.js#L165-L179&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;react/jsx-runtime&lt;/code&gt;&lt;/a&gt; in your eslint config (add &lt;code class=&quot;language-text&quot;&gt;&amp;quot;plugin:react/jsx-runtime&amp;quot;&lt;/code&gt; to &lt;code class=&quot;language-text&quot;&gt;&amp;quot;extends&amp;quot;&lt;/code&gt;).&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;素直に従って, ESLint の設定ファイルに追記しましょう。
私の場合は, &lt;code class=&quot;language-text&quot;&gt;.eslintrc.json&lt;/code&gt; の &lt;code class=&quot;language-text&quot;&gt;&amp;quot;extends&amp;quot;&lt;/code&gt; 部分が以下のようになりました。&lt;/p&gt;&lt;undefined&gt;
        &lt;div class=&quot;gatsby-code-title&quot;&gt;
          &lt;span&gt;.eslintrc.json&lt;/span&gt;
        &lt;/div&gt;
       &lt;/undefined&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;&amp;quot;extends&amp;quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&amp;quot;eslint:recommended&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&amp;quot;plugin:import/recommended&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&amp;quot;plugin:jsx-a11y/recommended&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&amp;quot;plugin:react/recommended&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&amp;quot;plugin:react/jsx-runtime&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&amp;quot;plugin:react-hooks/recommended&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&amp;quot;prettier&amp;quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで, &lt;code class=&quot;language-text&quot;&gt;import React from &amp;#x27;react&amp;#x27;;&lt;/code&gt; を消しても ESLint に怒られなくなりました。
安心して全ての jsx ファイルから冒頭一行を消し去ります。
ビルドも無事できたので, 問題なさそうです。&lt;/p&gt;&lt;h2 id=&quot;新旧方式でのパフォーマンス比較&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#%E6%96%B0%E6%97%A7%E6%96%B9%E5%BC%8F%E3%81%A7%E3%81%AE%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E6%AF%94%E8%BC%83&quot; aria-label=&quot;新旧方式でのパフォーマンス比較 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;新旧方式でのパフォーマンス比較&lt;/h2&gt;&lt;p&gt;せっかくなので, パフォーマンスが良くなるということなので計測してみます。
と言っても全然記事のないブログで, 大して凝った作りもしていないので, 厳密ではなく簡易に様子を見る程度でやってみます。&lt;/p&gt;&lt;h3 id=&quot;環境情報&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#%E7%92%B0%E5%A2%83%E6%83%85%E5%A0%B1&quot; aria-label=&quot;環境情報 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;環境情報&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;主要 npm package&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell-session&quot;&gt;&lt;pre class=&quot;language-shell-session&quot;&gt;&lt;code class=&quot;language-shell-session&quot;&gt;&lt;span class=&quot;token command&quot;&gt;&lt;span class=&quot;token info punctuation&quot;&gt;&lt;span class=&quot;token user&quot;&gt;kangetsu@ubuntu20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token path&quot;&gt;~/work/my_blog&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token shell-symbol important&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;token bash language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-E&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27; gatsby@| react@| react-dom@&amp;#x27;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token output&quot;&gt;├── gatsby@4.12.1
├── react-dom@17.0.2
├── react@17.0.2
kangetsu@ubuntu20:~/work/my_blog$&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;ビルドタイム&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#%E3%83%93%E3%83%AB%E3%83%89%E3%82%BF%E3%82%A4%E3%83%A0&quot; aria-label=&quot;ビルドタイム permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;ビルドタイム&lt;/h3&gt;&lt;p&gt;まず, ビルドタイムを測ってみます。
Gatsby なので, &lt;code class=&quot;language-text&quot;&gt;gatsby clean&lt;/code&gt; 後に &lt;code class=&quot;language-text&quot;&gt;gatsby build&lt;/code&gt; の時間を見ます。&lt;/p&gt;&lt;p&gt;とりあえず 5 回分計測しました, 結果は以下の通り (単位: sec)。&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;旧&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;新&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;1 回目&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;30.89&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;34.67&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;2 回目&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;32.26&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;34.03&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;3 回目&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;32.25&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;35.20&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;4 回目&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;31.99&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;34.37&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;5 回目&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;30.06&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;33.69&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;平均&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;31.49&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;34.39&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;正直結果を疑いましたが, 私の手元では旧方式の方が早かったです。&lt;/p&gt;&lt;h3 id=&quot;バンドルサイズ&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#%E3%83%90%E3%83%B3%E3%83%89%E3%83%AB%E3%82%B5%E3%82%A4%E3%82%BA&quot; aria-label=&quot;バンドルサイズ permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;バンドルサイズ&lt;/h3&gt;&lt;p&gt;では, せめてバンドルサイズは良くなっているのではないか。これは一回計測すれば十分です。
Gatsby では, &lt;code class=&quot;language-text&quot;&gt;public/&lt;/code&gt; 以下に出力されるので, このサイズを比べます。&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;旧&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;新&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;サイズ (KB)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;4208&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;4212&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;ここでも わずかながら旧方式の方が軽いという, 旧方式の方が優れた結果となりました。&lt;/p&gt;&lt;h3 id=&quot;パフォーマンス&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9&quot; aria-label=&quot;パフォーマンス permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;パフォーマンス&lt;/h3&gt;&lt;p&gt;最後の頼みの綱, パフォーマンスです。
どう測るか迷いましたが, CLI の &lt;a href=&quot;https://www.npmjs.com/package/lighthouse&quot;&gt;lighthouse&lt;/a&gt; を使うことにしました。&lt;/p&gt;&lt;p&gt;と言ってもそのまま実行したら大量にログが出たので, &lt;a href=&quot;https://qiita.com/mizchi/items/105308f44cb1cc18fa8a&quot;&gt;mizchi さんの記事&lt;/a&gt;を参考に, 必要なデータだけ抜き出しました。
中身がほぼない軽量なブログなので, 結果としてはほぼ天井を打っていたので, 差分だけ抽出します。
diff をとった結果は以下です。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell-session&quot;&gt;&lt;pre class=&quot;language-shell-session&quot;&gt;&lt;code class=&quot;language-shell-session&quot;&gt;&lt;span class=&quot;token command&quot;&gt;&lt;span class=&quot;token shell-symbol important&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;token bash language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;diff&lt;/span&gt; default_lighthouse_score.log new_lighthouse_score.log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token output&quot;&gt;59c59
&amp;lt;   &amp;#x27;unused-javascript&amp;#x27;: 0.93,
---
&amp;gt;   &amp;#x27;unused-javascript&amp;#x27;: 0.88,&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;差分はこの &amp;#x27;unused-javascript&amp;#x27; のみですが, 見方を間違えてなければ, やはり旧方式の方がスコアが優れていました。&lt;/p&gt;&lt;h4 id=&quot;unused-javascript-はどこで差が出ているのか&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#unused-javascript-%E3%81%AF%E3%81%A9%E3%81%93%E3%81%A7%E5%B7%AE%E3%81%8C%E5%87%BA%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%8B&quot; aria-label=&quot;unused javascript はどこで差が出ているのか permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;unused-javascript はどこで差が出ているのか？&lt;/h4&gt;&lt;p&gt;一体どこで差が出たのか。
lighthouse の CLI では, 具体的にどの JavaScript がどれくらいのサイズなのか, などはパッと出せなかったので, 結局 GUI の lighthouse で確認しました。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;旧方式:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:650px&quot;&gt;
      &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/80142a3c6e979e5178528f36dbdc0e4b/0e904/lighthouse-score_old_transformation.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom:69.32515337423312%;position:relative;bottom:0;left:0;background-image:url(&amp;#x27;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB0UlEQVQoz22SaXKcMBBGuUgGoQ219g0kwWxxxuP73ygFOFNOnFevBD/6o1FXd1iPIQTvfdgfeGQ/DDtZftLspFmPh77ve/R5ILS9oR1CSAdGpZRCCCnnlJKxRgUrg1XeKG+lUlpppZTW2/kCADDG3ciZNlanauIEUhKM6bBJhoFiTAmhlNC/YYwRQhBCHeUCtDXGWOeMMdoY56NN1ZWLmZqOVcdZSrl3EyCEEAAAUkrOeYcJ4eNotN6TWlsXysXN57DchbKEMso53mFcjALY3pkxRinthmFA/9CfDgeE8LCBCUaolzb4XI421lopZXfc4TVDhNDwh2/fPPV9b4whBDvnAKAbx9F5b61V2zw1SCm2q4GAT78ipXTOSaV8CFrrThvzeH8+Pz6ut/vleqttSXnK0/wypnwYYiq1Pd6fpba3X49aWycAprnU2pb1fD5f1i+2Za1tOWKHMeW2rClPpS0p5S28rOf7z7fr7XZU17aU2uZSQ0w+xFfyCF9v95yn9XyZ59IJASnlWltb1piSdf5w29cjE+LLGFNb15jy/kdpG9iyLK21GKPbM855rQ39BiEEAEopAJBzcs51GGPO+b5xdF/Gz7rhf2yrwhjG+Cj7DUDSj+HKApi7AAAAAElFTkSuQmCC&amp;#x27;);background-size:cover;display:block&quot;&gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source srcSet=&quot;/static/80142a3c6e979e5178528f36dbdc0e4b/0cbef/lighthouse-score_old_transformation.avif 163w,/static/80142a3c6e979e5178528f36dbdc0e4b/bffb7/lighthouse-score_old_transformation.avif 325w,/static/80142a3c6e979e5178528f36dbdc0e4b/69c29/lighthouse-score_old_transformation.avif 650w,/static/80142a3c6e979e5178528f36dbdc0e4b/6d24a/lighthouse-score_old_transformation.avif 975w,/static/80142a3c6e979e5178528f36dbdc0e4b/a2baf/lighthouse-score_old_transformation.avif 1300w,/static/80142a3c6e979e5178528f36dbdc0e4b/34666/lighthouse-score_old_transformation.avif 1384w&quot; sizes=&quot;(max-width: 650px) 100vw, 650px&quot; type=&quot;image/avif&quot;/&gt;&lt;source srcSet=&quot;/static/80142a3c6e979e5178528f36dbdc0e4b/94563/lighthouse-score_old_transformation.webp 163w,/static/80142a3c6e979e5178528f36dbdc0e4b/647a8/lighthouse-score_old_transformation.webp 325w,/static/80142a3c6e979e5178528f36dbdc0e4b/c1dc5/lighthouse-score_old_transformation.webp 650w,/static/80142a3c6e979e5178528f36dbdc0e4b/1e975/lighthouse-score_old_transformation.webp 975w,/static/80142a3c6e979e5178528f36dbdc0e4b/063bf/lighthouse-score_old_transformation.webp 1300w,/static/80142a3c6e979e5178528f36dbdc0e4b/878c0/lighthouse-score_old_transformation.webp 1384w&quot; sizes=&quot;(max-width: 650px) 100vw, 650px&quot; type=&quot;image/webp&quot;/&gt;
          &lt;source srcSet=&quot;/static/80142a3c6e979e5178528f36dbdc0e4b/222b7/lighthouse-score_old_transformation.png 163w,/static/80142a3c6e979e5178528f36dbdc0e4b/ff46a/lighthouse-score_old_transformation.png 325w,/static/80142a3c6e979e5178528f36dbdc0e4b/a6d36/lighthouse-score_old_transformation.png 650w,/static/80142a3c6e979e5178528f36dbdc0e4b/e548f/lighthouse-score_old_transformation.png 975w,/static/80142a3c6e979e5178528f36dbdc0e4b/3c492/lighthouse-score_old_transformation.png 1300w,/static/80142a3c6e979e5178528f36dbdc0e4b/0e904/lighthouse-score_old_transformation.png 1384w&quot; sizes=&quot;(max-width: 650px) 100vw, 650px&quot; type=&quot;image/png&quot;/&gt;
          &lt;img class=&quot;gatsby-resp-image-image&quot; src=&quot;/static/80142a3c6e979e5178528f36dbdc0e4b/a6d36/lighthouse-score_old_transformation.png&quot; alt=&quot;旧方式の Unused JavaScript&quot; title=&quot;旧方式の Unused JavaScript&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot;/&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;新方式:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:650px&quot;&gt;
      &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/b2e970b4b8548c86935b1fd4fe4d9842/e8814/lighthouse-score_new_transformation.png&quot; style=&quot;display:block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom:69.32515337423312%;position:relative;bottom:0;left:0;background-image:url(&amp;#x27;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAAAsTAAALEwEAmpwYAAABz0lEQVQoz22RiW7cIBRF/SPjhdXsYDAY7MlMkona/v8PVZhpFqlHRw8kuA8B3SSIqWhrtLMWUnyRqJe4F6gXaIDTMAzDeJbxHIbnHADQzZL7EJxz3vsQgjJaLFq4KrdKSCGlFOJZP2GM1TDBWCol/abcyrmAAKDmNKEJYISaCFfQSZuM49ghQmehlNLaGCUrxjq1JB0PFbL0m/SJ8+dpjM1nZZxzQkgHIMSEKimVOrNK23Q16bD5zqSFCCNMIYQAAExnOjOMMTlBCHVTZfzO0Pdj9TKNQ1sFAIxDz7SzIcl6f6W15px3EEKCcXvAxvSPHy3Haegvw9ArpQAAWmvGWEcIMcZqrYWUQgrO+TyzKnv6Dc4418YIIay1UqmOcf72ePz6/ed2f72+3Mp++LCGNVZjCjEtPjTd4mPa3h8fMW1v7+85l45SusaUtlz2Yz+O/bg+3Y8tly2XFmsuPrTuWy4hrB2lcy777f768nLPZd9ySVtuusVbt3wmW/h2u/s1lv2Iaasnt06l7D6s2lhtrLH2K+aWLxefy774kLbsQ+gQxiVXnHPG1JQxRkqJEII/AQDM8xxjnCn13ltru/r7J21HzZyp6X8AABBCrUII/wK8zY94KtRXqwAAAABJRU5ErkJggg==&amp;#x27;);background-size:cover;display:block&quot;&gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source srcSet=&quot;/static/b2e970b4b8548c86935b1fd4fe4d9842/0cbef/lighthouse-score_new_transformation.avif 163w,/static/b2e970b4b8548c86935b1fd4fe4d9842/bffb7/lighthouse-score_new_transformation.avif 325w,/static/b2e970b4b8548c86935b1fd4fe4d9842/69c29/lighthouse-score_new_transformation.avif 650w,/static/b2e970b4b8548c86935b1fd4fe4d9842/6d24a/lighthouse-score_new_transformation.avif 975w,/static/b2e970b4b8548c86935b1fd4fe4d9842/a2baf/lighthouse-score_new_transformation.avif 1300w,/static/b2e970b4b8548c86935b1fd4fe4d9842/88279/lighthouse-score_new_transformation.avif 1392w&quot; sizes=&quot;(max-width: 650px) 100vw, 650px&quot; type=&quot;image/avif&quot;/&gt;&lt;source srcSet=&quot;/static/b2e970b4b8548c86935b1fd4fe4d9842/94563/lighthouse-score_new_transformation.webp 163w,/static/b2e970b4b8548c86935b1fd4fe4d9842/647a8/lighthouse-score_new_transformation.webp 325w,/static/b2e970b4b8548c86935b1fd4fe4d9842/c1dc5/lighthouse-score_new_transformation.webp 650w,/static/b2e970b4b8548c86935b1fd4fe4d9842/1e975/lighthouse-score_new_transformation.webp 975w,/static/b2e970b4b8548c86935b1fd4fe4d9842/063bf/lighthouse-score_new_transformation.webp 1300w,/static/b2e970b4b8548c86935b1fd4fe4d9842/f3c7c/lighthouse-score_new_transformation.webp 1392w&quot; sizes=&quot;(max-width: 650px) 100vw, 650px&quot; type=&quot;image/webp&quot;/&gt;
          &lt;source srcSet=&quot;/static/b2e970b4b8548c86935b1fd4fe4d9842/222b7/lighthouse-score_new_transformation.png 163w,/static/b2e970b4b8548c86935b1fd4fe4d9842/ff46a/lighthouse-score_new_transformation.png 325w,/static/b2e970b4b8548c86935b1fd4fe4d9842/a6d36/lighthouse-score_new_transformation.png 650w,/static/b2e970b4b8548c86935b1fd4fe4d9842/e548f/lighthouse-score_new_transformation.png 975w,/static/b2e970b4b8548c86935b1fd4fe4d9842/3c492/lighthouse-score_new_transformation.png 1300w,/static/b2e970b4b8548c86935b1fd4fe4d9842/e8814/lighthouse-score_new_transformation.png 1392w&quot; sizes=&quot;(max-width: 650px) 100vw, 650px&quot; type=&quot;image/png&quot;/&gt;
          &lt;img class=&quot;gatsby-resp-image-image&quot; src=&quot;/static/b2e970b4b8548c86935b1fd4fe4d9842/a6d36/lighthouse-score_new_transformation.png&quot; alt=&quot;新方式の Unused JavaScript&quot; title=&quot;新方式の Unused JavaScript&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot;/&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;&lt;p&gt;数字上は, 以下の違いがあります。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;app-[0-9a-z]+\.js&lt;/code&gt; の Transfer Size が旧方式の方が大きいが, Potential Savings も大きい&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;fontawesome-svg-core/index.es.js&lt;/code&gt; の Potential Savings が 0.1KiB 小さい&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;あとは誤差レベルのもののようです。
細かい数字が異なるのは分かりますが, 新旧どちらも &amp;quot;Potential saving of 44 KiB&amp;quot; と, 潜在的な削減可能容量は 44KiB と表示されています。
すなわち, 削減可能サイズも少なくとも 1KiB = 1024 Byte 内の誤差ではあるようです。&lt;/p&gt;&lt;p&gt;lighthouse の &amp;#x27;unused-javascript&amp;#x27; のスコア算出方法がどうなっているのか次第ですが, またドツボにハマって「気楽に記事を書く」が達成できなくなるので, 今回は深追いするのはやめておきます。&lt;/p&gt;&lt;h2 id=&quot;まとめ&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#%E3%81%BE%E3%81%A8%E3%82%81&quot; aria-label=&quot;まとめ permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;まとめ&lt;/h2&gt;&lt;p&gt;ということで, 私の環境では新方式の JSX Transform を使ってもパフォーマンスの向上は見られませんでした。
しかし, 冒頭に書いた通り, 計測の方法も環境も適切とは言えないので, 参考にしなくて良いと思います。
パフォーマンス値については気になって調べて, せっかくなのでメモとして記録を残した, というのみです。
私は &lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;import React from &amp;#x27;react&amp;#x27;;&lt;/code&gt; を削除できただけで満足&lt;/strong&gt; です。
もし React を書いていて, 冗長なコードが気になる方は, ぜひ新方式の JSX Transform を利用してみると良いかなと思います。&lt;/p&gt;&lt;div class=&quot;footnotes&quot;&gt;&lt;hr/&gt;&lt;ol&gt;&lt;li id=&quot;fn-1&quot;&gt;移行報告は &lt;a href=&quot;/2022/01/migration-to-gatsby&quot;&gt;過去の記事&lt;/a&gt; で書いています。&lt;a href=&quot;#fnref-1&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-2&quot;&gt;大岡由佳, &lt;a href=&quot;https://oukayuka.booth.pm/items/2368019&quot;&gt;りあクト！ TypeScript で始めるつらくない React 開発 第 3.1 版【Ⅱ. React 基礎編】&lt;/a&gt;, p.12.&lt;a href=&quot;#fnref-2&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-3&quot;&gt;大岡由佳, &lt;a href=&quot;https://oukayuka.booth.pm/items/2368019&quot;&gt;りあクト！ TypeScript で始めるつらくない React 開発 第 3.1 版【Ⅱ. React 基礎編】&lt;/a&gt;, p.30.&lt;a href=&quot;#fnref-3&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[「コンテナには OS はない」ということについて]]></title><description><![CDATA[TL;DR コンテナには OS はない Ubuntu や CentOS のコンテナは存在するが, カーネルを含まないディストリビューションのようなものであり OS ではない コンテナは Linux カーネルの機能で実現しているので, ホスト OS に Linux カーネルが必須…]]></description><link>https://kangetsu121.work2022/02/container-is-without-os</link><guid isPermaLink="false">https://kangetsu121.work2022/02/container-is-without-os</guid><pubDate>Fri, 11 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;tldr&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#tldr&quot; aria-label=&quot;tldr permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;TL;DR&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;コンテナには OS はない&lt;ul&gt;&lt;li&gt;Ubuntu や CentOS のコンテナは存在するが, カーネルを含まないディストリビューションのようなものであり OS ではない&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;コンテナは Linux カーネルの機能で実現しているので, ホスト OS に Linux カーネルが必須&lt;ul&gt;&lt;li&gt;Windows や Mac でも Docker が使えるのは Docker Desktop が Linux VM のようなものを作ってその上で動かしているため&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;コンテナと-os-の関係&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%A8-os-%E3%81%AE%E9%96%A2%E4%BF%82&quot; aria-label=&quot;コンテナと os の関係 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;コンテナと OS の関係&lt;/h2&gt;&lt;p&gt;コンテナ技術の話になるとよく「コンテナに OS はない」という話を目にします。これまできちんと理解できていませんでしたが, 調べて納得したので記録しておきます。&lt;/p&gt;&lt;h3 id=&quot;ubuntu-や-ceontos-などのコンテナイメージは何者か&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#ubuntu-%E3%82%84-ceontos-%E3%81%AA%E3%81%A9%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%81%AF%E4%BD%95%E8%80%85%E3%81%8B&quot; aria-label=&quot;ubuntu や ceontos などのコンテナイメージは何者か permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Ubuntu や CeontOS などのコンテナイメージは何者か&lt;/h3&gt;&lt;p&gt;Dokcer 公式のレジストリである &lt;a href=&quot;https://hub.docker.com/&quot;&gt;Docker Hub&lt;/a&gt; には, &lt;a href=&quot;https://hub.docker.com/_/ubuntu&quot;&gt;Ubuntu&lt;/a&gt; や &lt;a href=&quot;https://hub.docker.com/_/centos&quot;&gt;CentOS&lt;/a&gt; のイメージが存在します。
これを見て, 「コンテナにも OS があるのでは」と思ってしまいがち&lt;sup id=&quot;fnref-1&quot;&gt;&lt;a href=&quot;#fn-1&quot; class=&quot;footnote-ref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; ですが, これは &lt;strong&gt;「ディストリビューション」「カーネル」「OS」に関する誤解&lt;/strong&gt; に基づきます。&lt;/p&gt;&lt;p&gt;まず, 重要な点として, Ubuntu や CentOS はディストリビューションです。ディストリビューションは大抵, &lt;strong&gt;Linux カーネル + 基本ソフトウェア群&lt;/strong&gt; を指します。
シェルや, 普段よく使うコマンド群 (例えば &lt;code class=&quot;language-text&quot;&gt;echo&lt;/code&gt; や &lt;code class=&quot;language-text&quot;&gt;grep&lt;/code&gt;) も「基本ソフトウェア群」の範疇です。
ただしややこしいのですが, ディストリビューションは &lt;strong&gt;「広義の OS」&lt;/strong&gt; と呼ばれることもあります。&lt;/p&gt;&lt;p&gt;一方カーネルは, ディストリビューションに比べ, よりコアの部分を指し, 例えばハードウェアとソフトウェアの仲介を行います。
&lt;strong&gt;「狭義の OS」&lt;/strong&gt; と呼ばれることもあります。
上述の通りシェルもカーネルに含まれないので, カーネルだけでは通常は何もできません&lt;sup id=&quot;fnref-2&quot;&gt;&lt;a href=&quot;#fn-2&quot; class=&quot;footnote-ref&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;。
ちなみに Linux カーネルは &lt;a href=&quot;https://github.com/torvalds/linux&quot;&gt;GitHub 上&lt;/a&gt; で開発されています&lt;sup id=&quot;fnref-3&quot;&gt;&lt;a href=&quot;#fn-3&quot; class=&quot;footnote-ref&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;&lt;p&gt;ここからが本題ですが, では Docker Hub にある Ubuntu や CentOS のコンテナは何なのでしょうか。&lt;/p&gt;&lt;h4 id=&quot;コンテナの仕組み&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF&quot; aria-label=&quot;コンテナの仕組み permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;コンテナの仕組み&lt;/h4&gt;&lt;p&gt;そもそもですが, コンテナは &lt;strong&gt;Linux kernel の&lt;/strong&gt; &lt;code class=&quot;language-text&quot;&gt;namespaces&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;cgroups&lt;/code&gt; などの機能によって実現されています&lt;sup id=&quot;fnref-4&quot;&gt;&lt;a href=&quot;#fn-4&quot; class=&quot;footnote-ref&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://man7.org/linux/man-pages/man7/namespaces.7.html&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;namespaces&lt;/code&gt;&lt;/a&gt;: プロセス, ネットワーク, ユーザーなどのグローバルなリソースを独立させる&lt;sup id=&quot;fnref-5&quot;&gt;&lt;a href=&quot;#fn-5&quot; class=&quot;footnote-ref&quot;&gt;5&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://man7.org/linux/man-pages/man7/cgroups.7.html&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;cgroups&lt;/code&gt;&lt;/a&gt;: CPU, メモリなどのリソース割り当てをプロセスごとに制限する&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;このため, 前提として, 通常は &lt;strong&gt;Linux kernel 上でないと Docker をはじめとするコンテナは作れません&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;そしてコンテナは, これらの機能によって, &lt;strong&gt;ホスト OS の一部を論理的に切り離している&lt;/strong&gt; に過ぎないと言えます。
このように, あくまでコンテナは「ホスト OS の一部」なので, Linux 以外のコンテナは存在しません。
Docker Hub などのコンテナレジストリを見ても Windows や macOS のコンテナが存在しないのはこのためです。&lt;/p&gt;&lt;h4 id=&quot;実際のコンテナの様子を確認する&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#%E5%AE%9F%E9%9A%9B%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AE%E6%A7%98%E5%AD%90%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B&quot; aria-label=&quot;実際のコンテナの様子を確認する permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;実際のコンテナの様子を確認する&lt;/h4&gt;&lt;p&gt;では実際に操作して確認してみます。
Docker を動かすホスト OS は Ubuntu 20.04, コンテナは Docker Hub にある CentOS イメージを使います。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;ホスト OS&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell-session&quot;&gt;&lt;pre class=&quot;language-shell-session&quot;&gt;&lt;code class=&quot;language-shell-session&quot;&gt;&lt;span class=&quot;token command&quot;&gt;&lt;span class=&quot;token info punctuation&quot;&gt;&lt;span class=&quot;token user&quot;&gt;kangetsu@ubuntu20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token path&quot;&gt;~&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token shell-symbol important&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;token bash language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;uname&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token output&quot;&gt;Linux ubuntu20 5.4.0-97-generic #110-Ubuntu SMP Thu Jan 13 18:28:08 UTC 2022 aarch64 aarch64 aarch64 GNU/Linux
kangetsu@ubuntu20:~$&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;コンテナ&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell-session&quot;&gt;&lt;pre class=&quot;language-shell-session&quot;&gt;&lt;code class=&quot;language-shell-session&quot;&gt;&lt;span class=&quot;token command&quot;&gt;&lt;span class=&quot;token info punctuation&quot;&gt;&lt;span class=&quot;token user&quot;&gt;kangetsu@ubuntu20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token path&quot;&gt;~&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token shell-symbol important&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;token bash language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; image inspect centos &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; jq &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;.[].RepoTags[]&amp;#x27;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token output&quot;&gt;centos:latest
kangetsu@ubuntu20:~$&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;まずコンテナのディストリビューションを確認します。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell-session&quot;&gt;&lt;pre class=&quot;language-shell-session&quot;&gt;&lt;code class=&quot;language-shell-session&quot;&gt;&lt;span class=&quot;token output&quot;&gt;[root@fdda8cec6fe2 /]# cat /etc/os-release
NAME=&amp;quot;CentOS Linux&amp;quot;
VERSION=&amp;quot;8&amp;quot;
ID=&amp;quot;centos&amp;quot;
ID_LIKE=&amp;quot;rhel fedora&amp;quot;
VERSION_ID=&amp;quot;8&amp;quot;
PLATFORM_ID=&amp;quot;platform:el8&amp;quot;
PRETTY_NAME=&amp;quot;CentOS Linux 8&amp;quot;
ANSI_COLOR=&amp;quot;0;31&amp;quot;
CPE_NAME=&amp;quot;cpe:/o:centos:centos:8&amp;quot;
HOME_URL=&amp;quot;https://centos.org/&amp;quot;
BUG_REPORT_URL=&amp;quot;https://bugs.centos.org/&amp;quot;
CENTOS_MANTISBT_PROJECT=&amp;quot;CentOS-8&amp;quot;
CENTOS_MANTISBT_PROJECT_VERSION=&amp;quot;8&amp;quot;
[root@fdda8cec6fe2 /]#&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ホスト OS は Ubuntu であるにもかかわらず, 確かにコンテナのディストリビューションは CentOS になっていました。
次に, Ubuntu, CentOS それぞれが &lt;strong&gt;標準で実行できるはずのパッケージ管理コマンド&lt;/strong&gt; を実行してみます。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell-session&quot;&gt;&lt;pre class=&quot;language-shell-session&quot;&gt;&lt;code class=&quot;language-shell-session&quot;&gt;&lt;span class=&quot;token output&quot;&gt;[root@fdda8cec6fe2 /]# dpkg -l
bash: dpkg: command not found
[root@fdda8cec6fe2 /]# apt-get
bash: apt-get: command not found
[root@fdda8cec6fe2 /]#

[root@fdda8cec6fe2 /]# rpm -l
[root@fdda8cec6fe2 /]# yum history
Failed to set locale, defaulting to C.UTF-8
ID     | Command line                                                                                                                                                    | Date and time    | Action(s)      | Altered
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
[root@fdda8cec6fe2 /]#&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;コンテナ上では, Ubuntu なら通常は実行できるはずの &lt;code class=&quot;language-text&quot;&gt;dpkg&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;apt-get&lt;/code&gt; が実行できず, CentOS が通常実行できる &lt;code class=&quot;language-text&quot;&gt;rpm&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;yum&lt;/code&gt; が実行できました。&lt;/p&gt;&lt;p&gt;ここでもう一度, 今度は &lt;code class=&quot;language-text&quot;&gt;uname -a&lt;/code&gt; でコンテナの OS の情報を見てみます。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell-session&quot;&gt;&lt;pre class=&quot;language-shell-session&quot;&gt;&lt;code class=&quot;language-shell-session&quot;&gt;&lt;span class=&quot;token output&quot;&gt;[root@fdda8cec6fe2 /]# uname -a
Linux fdda8cec6fe2 5.4.0-97-generic #110-Ubuntu SMP Thu Jan 13 18:28:08 UTC 2022 aarch64 aarch64 aarch64 GNU/Linux
[root@fdda8cec6fe2 /]#&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;よく見ると, &lt;code class=&quot;language-text&quot;&gt;/etc/os-release&lt;/code&gt; には CentOS と書いてあったのに, &lt;code class=&quot;language-text&quot;&gt;uname -a&lt;/code&gt; の結果は Ubuntu になっており, ホスト OS 上で実行した結果とほぼ同じになっています。
ただし, ホスト名のみコンテナ名になっており, コンテナ上で &lt;code class=&quot;language-text&quot;&gt;hostname&lt;/code&gt; を実行した結果と同じになっています。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell-session&quot;&gt;&lt;pre class=&quot;language-shell-session&quot;&gt;&lt;code class=&quot;language-shell-session&quot;&gt;&lt;span class=&quot;token output&quot;&gt;[root@fdda8cec6fe2 /]# hostname
fdda8cec6fe2
[root@fdda8cec6fe2 /]#&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;結論&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#%E7%B5%90%E8%AB%96&quot; aria-label=&quot;結論 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;結論&lt;/h2&gt;&lt;p&gt;上の実験から, 以下のことがわかりました。&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Ubuntu のホスト OS 上で, ディストリビューションの異なる CentOS のコンテナが動かせた&lt;/li&gt;&lt;li&gt;CentOS コンテナ上では CentOS に含まれるコマンド群が実行でき, Ubuntu に含まれるコマンド群は実行できなかった&lt;sup id=&quot;fnref-6&quot;&gt;&lt;a href=&quot;#fn-6&quot; class=&quot;footnote-ref&quot;&gt;6&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;uname -a&lt;/code&gt; の結果は, コンテナ上での実行でもホスト OS とほぼ同じ&lt;sup id=&quot;fnref-7&quot;&gt;&lt;a href=&quot;#fn-7&quot; class=&quot;footnote-ref&quot;&gt;7&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;以上から, 結論ありきであれば, 「コンテナに OS はない」ということに納得できるのではないでしょうか。
コンテナレジストリなどにあるディストリビューション別のコンテナは, 確かに固有の OS (カーネル) があるわけではなく, &lt;strong&gt;ディストリビューションからカーネル部分を除いた, ファイルシステムやソフトウェア, コマンド群のパッケージ&lt;/strong&gt; と言えそうです (カーネルがないので広義の OS ですらない)。&lt;/p&gt;&lt;p&gt;少なくとも自分はこの辺りを確認できたので, 「コンテナに OS はない」の意味に納得できました。&lt;/p&gt;&lt;h2 id=&quot;おまけ-1-docker-desktop-の仕組み&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#%E3%81%8A%E3%81%BE%E3%81%91-1-docker-desktop-%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF&quot; aria-label=&quot;おまけ 1 docker desktop の仕組み permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;おまけ 1: Docker Desktop の仕組み&lt;/h2&gt;&lt;p&gt;上で「Linux kernel 上でないと Docker をはじめとするコンテナは作れません」と書きましたが, では Linux カーネルではない Windows や Mac でなぜ Docker が使えるのでしょうか。&lt;/p&gt;&lt;p&gt;Windows や Mac では, Dokcer 使用時には &lt;a href=&quot;https://www.docker.com/products/docker-desktop&quot;&gt;Docker Desktop&lt;/a&gt; を使えます&lt;sup id=&quot;fnref-8&quot;&gt;&lt;a href=&quot;#fn-8&quot; class=&quot;footnote-ref&quot;&gt;8&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;&lt;p&gt;Docker Desktop がどのようにコンテナを Windows, Mac などの非 Linux カーネル上で実現しているかというと, 実は軽量の Linux VM を構築して, その上で Docker を動かしています。
この仕組みは例えば, Docker 公式ブログの記事, &lt;a href=&quot;https://www.docker.com/blog/the-magic-behind-the-scenes-of-docker-desktop/&quot;&gt;The Magic Behind the Scenes of Docker Desktop&lt;/a&gt; で次のように説明されています。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;At the heart of Docker Desktop we have a lightweight LinuxKit VM that Docker manages for you.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;おまけ-2-コンテナ上でosを停止しようとするとどうなるか&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#%E3%81%8A%E3%81%BE%E3%81%91-2-%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E4%B8%8A%E3%81%A7os%E3%82%92%E5%81%9C%E6%AD%A2%E3%81%97%E3%82%88%E3%81%86%E3%81%A8%E3%81%99%E3%82%8B%E3%81%A8%E3%81%A9%E3%81%86%E3%81%AA%E3%82%8B%E3%81%8B&quot; aria-label=&quot;おまけ 2 コンテナ上でosを停止しようとするとどうなるか permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;おまけ 2: コンテナ上で「OS」を停止しようとするとどうなるか&lt;/h2&gt;&lt;p&gt;本筋に関係ない実験 1。&lt;/p&gt;&lt;p&gt;少し怖いですが実験として, &lt;code class=&quot;language-text&quot;&gt;shutdown&lt;/code&gt; や &lt;code class=&quot;language-text&quot;&gt;poweroff --halt&lt;/code&gt; を実行して, コンテナの「OS の」電源を切れるか試してみます。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell-session&quot;&gt;&lt;pre class=&quot;language-shell-session&quot;&gt;&lt;code class=&quot;language-shell-session&quot;&gt;&lt;span class=&quot;token output&quot;&gt;[root@fdda8cec6fe2 /]# poweroff
System has not been booted with systemd as init system (PID 1). Can&amp;#x27;t operate.
Failed to connect to bus: Host is down
Failed to talk to init daemon.
[root@fdda8cec6fe2 /]# shutdown --halt
System has not been booted with systemd as init system (PID 1). Can&amp;#x27;t operate.
Failed to connect to bus: Host is down
[root@fdda8cec6fe2 /]#&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;エラーになりました。
エラーメッセージに「&lt;code class=&quot;language-text&quot;&gt;systemd&lt;/code&gt; が init system (PID 1) として実行されていない」と出ているので, プロセスを確認します。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell-session&quot;&gt;&lt;pre class=&quot;language-shell-session&quot;&gt;&lt;code class=&quot;language-shell-session&quot;&gt;&lt;span class=&quot;token output&quot;&gt;[root@fdda8cec6fe2 /]# ps auxf
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.0   3916  2908 pts/0    Ss   12:00   0:00 /bin/bash
root          48  0.0  0.0   8604  3024 pts/0    R+   12:17   0:00 ps auxf
[root@fdda8cec6fe2 /]#&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;docker run&lt;/code&gt; した時に指定した &lt;code class=&quot;language-text&quot;&gt;/bin/bash&lt;/code&gt; が PID 1 になっています。
通常は init プロセスが存在して, それを頂点とするプロセスツリーができているはずなのですが, コンテナはこのようになります。
ホスト OS の方では, 確かに &lt;code class=&quot;language-text&quot;&gt;init&lt;/code&gt; プロセス (&lt;code class=&quot;language-text&quot;&gt;systemd&lt;/code&gt;) が PID 1 になっていることを確認できます。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell-session&quot;&gt;&lt;pre class=&quot;language-shell-session&quot;&gt;&lt;code class=&quot;language-shell-session&quot;&gt;&lt;span class=&quot;token command&quot;&gt;&lt;span class=&quot;token info punctuation&quot;&gt;&lt;span class=&quot;token user&quot;&gt;kangetsu@ubuntu20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token path&quot;&gt;~&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token shell-symbol important&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;token bash language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;ps&lt;/span&gt; auxf&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token output&quot;&gt;USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
[...]
root           1  0.0  0.1 101664 10416 ?        Ss   16:09   0:01 /sbin/init splash
root         400  0.0  0.4  83780 38560 ?        S&amp;lt;s  16:09   0:00 /lib/systemd/systemd-journald
root         429  0.0  0.0  18448  4704 ?        Ss   16:09   0:00 /lib/systemd/systemd-udevd
root         530  0.0  0.2 279988 16352 ?        SLsl 16:09   0:09 /sbin/multipathd -d -s
systemd+     584  0.0  0.0  90324  6284 ?        Ssl  16:09   0:00 /lib/systemd/systemd-timesyncd
systemd+     628  0.0  0.0  26284  6824 ?        Ss   16:09   0:00 /lib/systemd/systemd-networkd
systemd+     630  0.0  0.1  23892 10940 ?        Ss   16:09   0:00 /lib/systemd/systemd-resolved
root         669  0.0  0.1 240816  8456 ?        Ssl  16:09   0:01 /usr/lib/accountsservice/accounts-daemon
root         674  0.0  0.0   8336  2580 ?        Ss   16:09   0:00 /usr/sbin/cron -f
message+     675  0.0  0.0   8268  4308 ?        Ss   16:09   0:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
root         681  0.0  0.0  80908  2932 ?        Ssl  16:09   0:01 /usr/sbin/irqbalance --foreground
root         684  0.0  0.2  35188 18652 ?        Ss   16:09   0:00 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
syslog       685  0.0  0.0 220936  4044 ?        Ssl  16:09   0:00 /usr/sbin/rsyslogd -n -iNONE
root         687  0.0  0.4 1093412 36980 ?       Ssl  16:09   0:04 /usr/lib/snapd/snapd
root         692  0.0  0.0  16448  6536 ?        Ss   16:09   0:00 /lib/systemd/systemd-logind
root         693  0.0  0.0  15904  5788 ?        Ss   16:09   0:00 /lib/systemd/systemd-machined
root         698  0.0  0.1 393692 12368 ?        Ssl  16:09   0:00 /usr/lib/udisks2/udisksd
daemon       703  0.0  0.0   3592  1844 ?        Ss   16:09   0:00 /usr/sbin/atd -f
root         704  0.6  0.4 1407488 38180 ?       Ssl  16:09   2:00 /usr/bin/containerd
root         721  0.0  0.0   6836  1756 ?        Ss+  16:09   0:00 /sbin/agetty -o -p -- \u --keep-baud 115200,38400,9600 ttyAMA0 vt220
root         725  0.0  0.0   5312  1484 tty1     Ss+  16:09   0:00 /sbin/agetty -o -p -- \u --noclear tty1 linux
root         728  0.0  0.0  12212  6404 ?        Ss   16:09   0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
root        1245  0.0  0.0  15336  7648 ?        Ss   16:09   0:00  \_ sshd: kangetsu [priv]
kangetsu    1366  0.0  0.0  15352  4212 ?        S    16:09   0:01  |   \_ sshd: kangetsu@pts/0
kangetsu    1367  0.0  0.0   9928  4880 pts/0    Ss   16:09   0:00  |       \_ -bash
kangetsu   10428  0.1  0.5 1418496 45464 pts/0   Sl+  21:00   0:01  |           \_ docker run -it centos /bin/bash
[...]
&lt;/span&gt;&lt;span class=&quot;token command&quot;&gt;&lt;span class=&quot;token info punctuation&quot;&gt;&lt;span class=&quot;token user&quot;&gt;kangetsu@ubuntu20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token path&quot;&gt;~&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token shell-symbol important&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;token bash language-bash&quot;&gt;pstree&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token output&quot;&gt;systemd─┬─accounts-daemon───2*[{accounts-daemon}]
        ├─2*[agetty]
        ├─atd
        ├─containerd───9*[{containerd}]
        ├─containerd-shim─┬─bash
        │                 └─10*[{containerd-shim}]
[...]
kangetsu@ubuntu20:~$

&lt;/span&gt;&lt;span class=&quot;token command&quot;&gt;&lt;span class=&quot;token info punctuation&quot;&gt;&lt;span class=&quot;token user&quot;&gt;kangetsu@ubuntu20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token path&quot;&gt;~&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token shell-symbol important&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;token bash language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-la&lt;/span&gt; /sbin/init&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token output&quot;&gt;lrwxrwxrwx 1 root root 20 Jan 10 13:56 /sbin/init -&amp;gt; /lib/systemd/systemd
kangetsu@ubuntu20:~$&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;おまけ-3-コンテナ上で保存した一時データの行方&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#%E3%81%8A%E3%81%BE%E3%81%91-3-%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E4%B8%8A%E3%81%A7%E4%BF%9D%E5%AD%98%E3%81%97%E3%81%9F%E4%B8%80%E6%99%82%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E8%A1%8C%E6%96%B9&quot; aria-label=&quot;おまけ 3 コンテナ上で保存した一時データの行方 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;おまけ 3: コンテナ上で保存した一時データの行方&lt;/h2&gt;&lt;p&gt;本筋に関係ない実験 2。&lt;/p&gt;&lt;p&gt;コンテナ上で保存したデータがホスト上のどこに保存されているのか見ます。&lt;/p&gt;&lt;p&gt;まずコンテナ上で, 1GB のファイルを作成します。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell-session&quot;&gt;&lt;pre class=&quot;language-shell-session&quot;&gt;&lt;code class=&quot;language-shell-session&quot;&gt;&lt;span class=&quot;token output&quot;&gt;[root@fdda8cec6fe2 /]# df -h /
Filesystem      Size  Used Avail Use% Mounted on
overlay          39G   18G   21G  46% /
[root@fdda8cec6fe2 /]# dd if=/dev/zero of=/data.dat bs=1G count=1
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 0.556696 s, 1.9 GB/s
[root@fdda8cec6fe2 /]# df -h /
Filesystem      Size  Used Avail Use% Mounted on
overlay          39G   19G   20G  49% /
[root@fdda8cec6fe2 /]#&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この時, 当然ホストにも 1GB のファイルが増えていることになります。
このようにしてコンテナ上で作られたファイルがどこにあるかというと, &lt;code class=&quot;language-text&quot;&gt;/var/lib/docker/overlay2/&lt;/code&gt; 以下にありました (後述する &lt;code class=&quot;language-text&quot;&gt;docker image inspect&lt;/code&gt; であたりをつけた後, 愚直にファイル作成前後で &lt;code class=&quot;language-text&quot;&gt;du&lt;/code&gt; して探しました)。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell-session&quot;&gt;&lt;pre class=&quot;language-shell-session&quot;&gt;&lt;code class=&quot;language-shell-session&quot;&gt;&lt;span class=&quot;token command&quot;&gt;&lt;span class=&quot;token info punctuation&quot;&gt;&lt;span class=&quot;token user&quot;&gt;kangetsu@ubuntu20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token path&quot;&gt;~&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token shell-symbol important&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;token bash language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-l&lt;/span&gt; /var/lib/docker/overlay2/337886ef932e709fecd0e4b11e0977bbf5da390c022be2deebd1dc8f7042e1d4/diff&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token output&quot;&gt;total 1048592
-rw-r--r-- 1 root root 1073741824 Feb 11 22:26 data.dat
drwxrwxrwt 2 root root       4096 Feb 11 21:08 tmp
drwxr-xr-x 5 root root       4096 Sep 15 23:25 var
kangetsu@ubuntu20:~$&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このようなコンテナ上に作成されたファイルは, コンテナを停止しても消えませんが,&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell-session&quot;&gt;&lt;pre class=&quot;language-shell-session&quot;&gt;&lt;code class=&quot;language-shell-session&quot;&gt;&lt;span class=&quot;token command&quot;&gt;&lt;span class=&quot;token info punctuation&quot;&gt;&lt;span class=&quot;token user&quot;&gt;kangetsu@ubuntu20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token path&quot;&gt;~&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token shell-symbol important&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;token bash language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; container start fdda8cec6fe2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token output&quot;&gt;fdda8cec6fe2
&lt;/span&gt;&lt;span class=&quot;token command&quot;&gt;&lt;span class=&quot;token info punctuation&quot;&gt;&lt;span class=&quot;token user&quot;&gt;kangetsu@ubuntu20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token path&quot;&gt;~&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token shell-symbol important&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;token bash language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-it&lt;/span&gt; fdda8cec6fe2 /bin/bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token output&quot;&gt;[root@fdda8cec6fe2 /]# ls /data.dat
/data.dat
[root@fdda8cec6fe2 /]#&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell-session&quot;&gt;&lt;pre class=&quot;language-shell-session&quot;&gt;&lt;code class=&quot;language-shell-session&quot;&gt;&lt;span class=&quot;token command&quot;&gt;&lt;span class=&quot;token info punctuation&quot;&gt;&lt;span class=&quot;token user&quot;&gt;kangetsu@ubuntu20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token path&quot;&gt;~&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token shell-symbol important&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;token bash language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-l&lt;/span&gt; /var/lib/docker/overlay2/337886ef932e709fecd0e4b11e0977bbf5da390c022be2deebd1dc8f7042e1d4/diff/data.dat&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token output&quot;&gt;-rw-r--r-- 1 root root 1073741824 Feb 11 22:41 /var/lib/docker/overlay2/337886ef932e709fecd0e4b11e0977bbf5da390c022be2deebd1dc8f7042e1d4/diff/data.dat
kangetsu@ubuntu20:~$&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;コンテナのインスタンス削除時に一緒に消えます。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell-session&quot;&gt;&lt;pre class=&quot;language-shell-session&quot;&gt;&lt;code class=&quot;language-shell-session&quot;&gt;&lt;span class=&quot;token command&quot;&gt;&lt;span class=&quot;token info punctuation&quot;&gt;&lt;span class=&quot;token user&quot;&gt;kangetsu@ubuntu20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token path&quot;&gt;~&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token shell-symbol important&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;token bash language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; container &lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; fdda8cec6fe2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token output&quot;&gt;fdda8cec6fe2
kangetsu@ubuntu20:~$&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell-session&quot;&gt;&lt;pre class=&quot;language-shell-session&quot;&gt;&lt;code class=&quot;language-shell-session&quot;&gt;&lt;span class=&quot;token command&quot;&gt;&lt;span class=&quot;token info punctuation&quot;&gt;&lt;span class=&quot;token user&quot;&gt;kangetsu@ubuntu20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token path&quot;&gt;~&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token shell-symbol important&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;token bash language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-l&lt;/span&gt; /var/lib/docker/overlay2/337886ef932e709fecd0e4b11e0977bbf5da390c022be2deebd1dc8f7042e1d4/diff/data.dat&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token output&quot;&gt;ls: cannot access &amp;#x27;/var/lib/docker/overlay2/337886ef932e709fecd0e4b11e0977bbf5da390c022be2deebd1dc8f7042e1d4/diff/data.dat&amp;#x27;: No such file or directory
&lt;/span&gt;&lt;span class=&quot;token command&quot;&gt;&lt;span class=&quot;token info punctuation&quot;&gt;&lt;span class=&quot;token user&quot;&gt;kangetsu@ubuntu20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token path&quot;&gt;~&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token shell-symbol important&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;token bash language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-l&lt;/span&gt; /var/lib/docker/overlay2/337886ef932e709fecd0e4b11e0977bbf5da390c022be2deebd1dc8f7042e1d4/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token output&quot;&gt;ls: cannot access &amp;#x27;/var/lib/docker/overlay2/337886ef932e709fecd0e4b11e0977bbf5da390c022be2deebd1dc8f7042e1d4/&amp;#x27;: No such file or directory
kangetsu@ubuntu20:~$&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ちなみに &lt;code class=&quot;language-text&quot;&gt;docker image inspect&lt;/code&gt; に &lt;code class=&quot;language-text&quot;&gt;.GraphDriver.Data&lt;/code&gt; という key があり, value が &lt;code class=&quot;language-text&quot;&gt;/var/lib/docker/overlay2&lt;/code&gt; 以下のパスになっているのですが, 上で作った &lt;code class=&quot;language-text&quot;&gt;data.dat&lt;/code&gt; が保存されたのはそことは違うディレクトリでした。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell-session&quot;&gt;&lt;pre class=&quot;language-shell-session&quot;&gt;&lt;code class=&quot;language-shell-session&quot;&gt;&lt;span class=&quot;token command&quot;&gt;&lt;span class=&quot;token info punctuation&quot;&gt;&lt;span class=&quot;token user&quot;&gt;kangetsu@ubuntu20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token path&quot;&gt;~&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token shell-symbol important&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;token bash language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; image inspect centos &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; jq &lt;span class=&quot;token string&quot;&gt;&amp;#x27;.[].GraphDriver&amp;#x27;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token output&quot;&gt;{
  &amp;quot;Data&amp;quot;: {
    &amp;quot;MergedDir&amp;quot;: &amp;quot;/var/lib/docker/overlay2/4c506c18e194df7f7396d93a287027d81e0ceac12856df9b7e5c25175fd169f5/merged&amp;quot;,
    &amp;quot;UpperDir&amp;quot;: &amp;quot;/var/lib/docker/overlay2/4c506c18e194df7f7396d93a287027d81e0ceac12856df9b7e5c25175fd169f5/diff&amp;quot;,
    &amp;quot;WorkDir&amp;quot;: &amp;quot;/var/lib/docker/overlay2/4c506c18e194df7f7396d93a287027d81e0ceac12856df9b7e5c25175fd169f5/work&amp;quot;
  },
  &amp;quot;Name&amp;quot;: &amp;quot;overlay2&amp;quot;
}
kangetsu@ubuntu20:~$&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この辺りは理解できていないので, また後で調べてみようと思います。&lt;/p&gt;&lt;div class=&quot;footnotes&quot;&gt;&lt;hr/&gt;&lt;ol&gt;&lt;li id=&quot;fn-1&quot;&gt;私はそう思ってました&lt;a href=&quot;#fnref-1&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-2&quot;&gt;頑張ればもちろんいろいろできるけどユーザーが直接使うようなものではない&lt;a href=&quot;#fnref-2&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-3&quot;&gt;本来 Linux はこの Linux カーネルのみを指す, と言われる&lt;a href=&quot;#fnref-3&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-4&quot;&gt;一緒に語られることもありますが, 呼び出したプロセスにとってのルートディレクトリ (&lt;code class=&quot;language-text&quot;&gt;/&lt;/code&gt;) を変更する &lt;a href=&quot;https://man7.org/linux/man-pages/man2/chroot.2.html&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;chroot&lt;/code&gt;&lt;/a&gt; はコンテナ技術とは別物です&lt;a href=&quot;#fnref-4&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-5&quot;&gt;プログラミングにおける「名前空間」をイメージするとわかりやすい&lt;a href=&quot;#fnref-5&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-6&quot;&gt;コマンドや関連ファイルがあるかないかの違いなので, 厳密には Ubuntu などの Debian 系で &lt;code class=&quot;language-text&quot;&gt;rpm&lt;/code&gt; や &lt;code class=&quot;language-text&quot;&gt;yum&lt;/code&gt; を実行することもできるはず。逆も同様。デフォルトで入っていないというだけ&lt;a href=&quot;#fnref-6&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-7&quot;&gt;本当は実装をちゃんと見ないとこれが証拠になるかは断言できないが&lt;a href=&quot;#fnref-7&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;fn-8&quot;&gt;Docker Desktop を使わなくても, Windows でも例えば WSL (Windows Subsystem for Linux) などを使えば Docker を使える&lt;a href=&quot;#fnref-8&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[はてなブログから Gatsby を利用した自作ブログに移行しました]]></title><description><![CDATA[TL;DR Gatsby  を利用した自作ブログを作成 (ここ) 記事は markdown で書ける フロント, React, React base の framework の良い練習になった Gatsby に移行しました 表題の通り, ブログをはてなブログから自作ブログに移行…]]></description><link>https://kangetsu121.work2022/01/migration-to-gatsby</link><guid isPermaLink="false">https://kangetsu121.work2022/01/migration-to-gatsby</guid><pubDate>Fri, 14 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;tldr&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#tldr&quot; aria-label=&quot;tldr permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;TL;DR&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.gatsbyjs.com/&quot;&gt;Gatsby&lt;/a&gt; を利用した自作ブログを作成 (ここ)&lt;/li&gt;&lt;li&gt;記事は markdown で書ける&lt;/li&gt;&lt;li&gt;フロント, React, React base の framework の良い練習になった&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;gatsby-に移行しました&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#gatsby-%E3%81%AB%E7%A7%BB%E8%A1%8C%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F&quot; aria-label=&quot;gatsby に移行しました permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Gatsby に移行しました&lt;/h2&gt;&lt;p&gt;表題の通り, ブログをはてなブログから自作ブログに移行しました。&lt;br/&gt;
主な動機は, フロントエンドに全然触れていないので練習をしたいと思ったこと, 手頃な題材がブログだと思ったこと, ブログのデザインも自作すればカスタマイズしやすいかも, と考えたことです。&lt;/p&gt;&lt;p&gt;Gatsby には &lt;a href=&quot;https://www.gatsbyjs.com/starters/&quot;&gt;Gatsby Starter Library&lt;/a&gt; というテンプレートのようなものもあるのですが, このような動機なので, Starter Library は使っていません。&lt;br/&gt;
リポジトリも公開しておくので, 実装が気になる方がもしいれば閲覧は可能です。&lt;br/&gt;
&lt;a href=&quot;https://github.com/kangetsu121/my_blog&quot;&gt;https://github.com/kangetsu121/my_blog&lt;/a&gt;&lt;br/&gt;
なお, 実装はきれいではないと思うので悪しからず。&lt;br/&gt;
フロント経験を積みながらリファクタリングしたり機能追加, デザイン更新をしていきたいです。&lt;/p&gt;&lt;h2 id=&quot;フロントエンドのキャッチアップ&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%82%A8%E3%83%B3%E3%83%89%E3%81%AE%E3%82%AD%E3%83%A3%E3%83%83%E3%83%81%E3%82%A2%E3%83%83%E3%83%97&quot; aria-label=&quot;フロントエンドのキャッチアップ permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;フロントエンドのキャッチアップ&lt;/h2&gt;&lt;p&gt;仕事で触れることがほぼないフロントエンドでしたが, キャッチアップについては, 大体以下にお世話になりました。&lt;br/&gt;
いつかまとめ記事を書くかもしれません。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;HTML/CSS: &lt;a href=&quot;https://www.sbcr.jp/product/4797398892/&quot;&gt;1 冊ですべて身につく HTML &amp;amp; CSS と Web デザイン入門講座&lt;/a&gt;&lt;/li&gt;&lt;li&gt;JavaScript: &lt;a href=&quot;https://jsprimer.net/&quot;&gt;JavaScript Primer 迷わないための入門書&lt;/a&gt;&lt;/li&gt;&lt;li&gt;React:&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://reactjs.org/&quot;&gt;公式 Document&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://oukayuka.booth.pm/items/2368045&quot;&gt;りあクト！ TypeScript で始めるつらくない React 開発 第 3.1 版【Ⅰ. 言語・環境編】&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://oukayuka.booth.pm/items/2368019&quot;&gt;りあクト！ TypeScript で始めるつらくない React 開発 第 3.1 版【Ⅱ. React 基礎編】&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Gatsby: &lt;a href=&quot;https://www.gatsbyjs.com/docs&quot;&gt;公式 Document&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;分かりやすい公式 Document は偉大ですね。&lt;br/&gt;
Gatsby は Document の &lt;a href=&quot;https://www.gatsbyjs.com/docs/tutorial/&quot;&gt;Tutorial&lt;/a&gt; が結構親切でした。&lt;br/&gt;
また, JavaScript Primer と『りあクト！』シリーズは現代の JavaScript 入門者に本当にありがたい存在だと思います。&lt;br/&gt;
『りあクト！』の【Ⅰ. 言語・環境編】でも JavaScript の解説があり, これもとても親切でした&lt;sup id=&quot;fnref-1&quot;&gt;&lt;a href=&quot;#fn-1&quot; class=&quot;footnote-ref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;&lt;p&gt;もちろんこれだけで必要な知識は網羅できるわけではなく, 都度調べたりしています。&lt;/p&gt;&lt;h2 id=&quot;今後&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#%E4%BB%8A%E5%BE%8C&quot; aria-label=&quot;今後 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;今後&lt;/h2&gt;&lt;p&gt;しばらくはてなブログの更新は止まっていましたが, ブログ移行を考えていたことも理由の一つでした。&lt;br/&gt;
これからは気楽に学習メモをためていきたいです。&lt;/p&gt;&lt;p&gt;アクティブに更新するのは, 今後はこのブログと Zenn にしようと考えてます。&lt;br/&gt;
今年こそは三日坊主にならないように。&lt;/p&gt;&lt;div class=&quot;footnotes&quot;&gt;&lt;hr/&gt;&lt;ol&gt;&lt;li id=&quot;fn-1&quot;&gt;これらが難しいと感じる場合は, &lt;a href=&quot;https://prog-8.com/&quot;&gt;Progate&lt;/a&gt; などから進めるのがお勧めです (私もまともにプログラミング始めたのは progate からでした)。&lt;a href=&quot;#fnref-1&quot; class=&quot;footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Privacy Policy]]></title><description><![CDATA[アクセス解析ツールについて 当ブログでは、Google によるアクセス解析ツール「Google アナリティクス」を利用しています。 Google アナリティクスはトラフィックデータの収集のために Cookie を使用しています。 このトラフィックデータは匿名で収集されており、個…]]></description><link>https://kangetsu121.workdocuments/privacy-policy</link><guid isPermaLink="false">https://kangetsu121.workdocuments/privacy-policy</guid><pubDate>Mon, 03 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;アクセス解析ツールについて&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E8%A7%A3%E6%9E%90%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6&quot; aria-label=&quot;アクセス解析ツールについて permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;アクセス解析ツールについて&lt;/h2&gt;&lt;p&gt;当ブログでは、Google によるアクセス解析ツール「Google アナリティクス」を利用しています。&lt;br/&gt;
Google アナリティクスはトラフィックデータの収集のために Cookie を使用しています。&lt;br/&gt;
このトラフィックデータは匿名で収集されており、個人を特定するものではありません。&lt;br/&gt;
この機能は Cookie を無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。&lt;/p&gt;&lt;p&gt;この規約に関して、詳しくは &lt;a href=&quot;https://marketingplatform.google.com/about/analytics/terms/jp/&quot;&gt;Google アナリティクス利用規約&lt;/a&gt;、
または &lt;a href=&quot;https://policies.google.com/technologies/partner-sites?hl=ja&quot;&gt;Google のサービスを使用するサイトやアプリから収集した情報の Google による使用&lt;/a&gt; をご参照ください。&lt;/p&gt;&lt;p&gt;運営者情報&lt;br/&gt;
運営者: kangetsu_121&lt;br/&gt;
更新日: 2022 年 1 月 3 日&lt;/p&gt;</content:encoded></item><item><title><![CDATA[免責事項]]></title><description><![CDATA[免責事項 当ブログからのリンク遷移先で提供される情報、サービス等について、一切の責任を負いません。 また当ブログのコンテンツ・情報について、できる限り正確な情報を提供するように努めておりますが、正確性や安全性を保証するものではありません。情報が古くなっていることもございます。 …]]></description><link>https://kangetsu121.workdocuments/disclaimer</link><guid isPermaLink="false">https://kangetsu121.workdocuments/disclaimer</guid><pubDate>Mon, 03 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;免責事項&quot; style=&quot;position:relative&quot;&gt;&lt;a href=&quot;#%E5%85%8D%E8%B2%AC%E4%BA%8B%E9%A0%85&quot; aria-label=&quot;免責事項 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;免責事項&lt;/h2&gt;&lt;p&gt;当ブログからのリンク遷移先で提供される情報、サービス等について、一切の責任を負いません。&lt;br/&gt;
また当ブログのコンテンツ・情報について、できる限り正確な情報を提供するように努めておりますが、正確性や安全性を保証するものではありません。情報が古くなっていることもございます。&lt;br/&gt;
当ブログに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。&lt;/p&gt;</content:encoded></item></channel></rss>