<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Abyssal Tarantella</title><description>Software engineering notes by chaya2z: what I built, where I got stuck, and what I learned.</description><link>https://blog.chaya2z.com/</link><atom:link href="https://blog.chaya2z.com/rss.xml" rel="self" type="application/rss+xml"/><item><title>JetBrainsのAll Products Packを購入した</title><link>https://blog.chaya2z.com/ja/posts/jetbrains-all-products-pack/</link><guid isPermaLink="true">https://blog.chaya2z.com/ja/posts/jetbrains-all-products-pack/</guid><description>学生ライセンスが切れたので、2023 年に 25% から 40% に上がった卒業割引で All Products Pack を買った。会社が買ってくれるのは業務で使う IDE だけで、趣味で使う IDE は自分で買う必要があった。</description><pubDate>Mon, 31 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Jetbrains 社の IDE の個人ライセンスを購入した。&lt;/p&gt;
&lt;h2 id=&quot;購入したライセンス&quot;&gt;購入したライセンス&lt;/h2&gt;
&lt;p&gt;All Products Pack という10個以上の IDE を使える料金形態で購入した。&lt;/p&gt;
&lt;p&gt;使いたい IDE は利用頻度順に並べると以下の６つ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WebStorm&lt;/li&gt;
&lt;li&gt;CLion&lt;/li&gt;
&lt;li&gt;GoLand&lt;/li&gt;
&lt;li&gt;PyCharm Professional&lt;/li&gt;
&lt;li&gt;Intellij IDEA Ultimate&lt;/li&gt;
&lt;li&gt;DataGrip&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jetbrains.com/ja-jp/all/&quot;&gt;https://www.jetbrains.com/ja-jp/all/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;卒業割引&quot;&gt;卒業割引&lt;/h2&gt;
&lt;p&gt;学生ライセンスを使っていた卒業生は卒業割引が使て、40%割引でライセンスを購入できる。今まで25%だった割引が2023年から40%に変わった&lt;sup&gt;&lt;a href=&quot;https://blog.chaya2z.com/ja/posts/jetbrains-all-products-pack/#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;
&lt;p&gt;私は学生ライセンスで IDE を使っていたが、卒業して先日ライセンスの期限が切れた。案内のメールが来ていたので、卒業割引を使ってライセンスを購入した。&lt;/p&gt;
&lt;h2 id=&quot;私にとって-jetbrains-の-ide-とは&quot;&gt;私にとって Jetbrains の IDE とは&lt;/h2&gt;
&lt;p&gt;学生時代、プログラミングに入門して本格的に勉強し始めたときに使い始めたのが Jetbrains 社の IDE。デフォルトで機能が揃っていることと、「最強の IDE」と書かれている記事を見て選んだ記憶。&lt;/p&gt;
&lt;p&gt;プログラミングを好きになれたのは Jetbrains の IDE があったからだと思う。&lt;/p&gt;
&lt;h2 id=&quot;会社に買ってもらわないの&quot;&gt;会社に買ってもらわないの？&lt;/h2&gt;
&lt;p&gt;多くの会社ではお願いすれば買ってもらえると思うし、実際に今の会社で入社前のアルバイトを始めたときから WebStorm のライセンスを買ってもらった。&lt;/p&gt;
&lt;p&gt;しかし、買ってもらえるのは業務で使う言語の IDE で、趣味で使う言語の IDE は個人で購入する必要があった。&lt;/p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;学生時代の目標に Jetbrains の IDE にお金を払えるくらいの所得を得られるエンジニアになる、というものがあったので、叶ってよかった。&lt;/p&gt;
&lt;section data-footnotes=&quot;&quot; class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;卒業割引が 25% から 40% に: &lt;a href=&quot;https://blog.jetbrains.com/ja/education/2023/03/06/discount-for-former-students-increased-from-25-to-40/&quot;&gt;https://blog.jetbrains.com/ja/education/2023/03/06/discount-for-former-students-increased-from-25-to-40/&lt;/a&gt; &lt;a href=&quot;https://blog.chaya2z.com/ja/posts/jetbrains-all-products-pack/#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded></item><item><title>Kinesis Advantage360 Pro で接続先を切り替える</title><link>https://blog.chaya2z.com/ja/posts/kinesis-advantage360-switch-profiles/</link><guid isPermaLink="true">https://blog.chaya2z.com/ja/posts/kinesis-advantage360-switch-profiles/</guid><description>Advantage360 Pro には最大 5 台の端末を登録でき、Mod + 1〜5 で接続先を切り替えられる。2 台目以降を登録する手順と、Mod + Right Windows でプロファイルを消す方法もまとめた。</description><pubDate>Thu, 27 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Kinesis Advantage360 Pro を複数端末に接続し、接続先を切り替える方法をメモ。&lt;/p&gt;
&lt;p&gt;インターネットのガイドはここから。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Adv360 Pro User’s Manual 3-10-22.pub . &lt;a href=&quot;https://kinesis-ergo.com/wp-content/uploads/Advantage360-ZMK-KB360-PRO-Users-Manual-v3-10-23.pdf&quot;&gt;https://kinesis-ergo.com/wp-content/uploads/Advantage360-ZMK-KB360-PRO-Users-Manual-v3-10-23.pdf&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;この記事では、「5.0 Basic Keyboard Use」を参考にしてます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;tldr&quot;&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Switch Profiles: Mod + 1 - 5&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;やること&quot;&gt;やること&lt;/h2&gt;
&lt;p&gt;Kinesis Advantage360 Pro は最大で５台の接続先 (プロファイル) を登録することができます。&lt;/p&gt;
&lt;p&gt;この記事では、すでに１台の端末と接続していることを前提に、２台目以降を登録・切り替える手順を書きます。&lt;/p&gt;
&lt;h2 id=&quot;設定&quot;&gt;設定&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Mod + 2 を入力&lt;/li&gt;
&lt;li&gt;左手のキーボードの真ん中の LED (Profile LED) が青色に光っているのを確認&lt;/li&gt;
&lt;li&gt;２台目の接続先として登録したい端末の Bluetooth 設定から Adv360 Pro に接続&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;切り替え&quot;&gt;切り替え&lt;/h2&gt;
&lt;p&gt;Mod + 1-5 で接続先を切り替えます。&lt;/p&gt;
&lt;h2 id=&quot;プロファイルを削除&quot;&gt;プロファイルを削除&lt;/h2&gt;
&lt;p&gt;Mod + Right Windows で現在のプロファイルを削除できます。&lt;/p&gt;
</content:encoded></item><item><title>Linuxデスクトップ環境とdotfilesの管理（2022年）</title><link>https://blog.chaya2z.com/ja/posts/linux-desktop-2022/</link><guid isPermaLink="true">https://blog.chaya2z.com/ja/posts/linux-desktop-2022/</guid><description>Gnome のメモリ消費が気になり、Fedora 36 で i3-gaps を中心としたデスクトップに移行した。polybar や rofi の設定は git で管理し、Python の fire で書いたスクリプトでシンボリックリンクを張っている。</description><pubDate>Thu, 18 Aug 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;i3-gaps を中心とした Linux の環境構築についてと、それらのファイルの管理について書きました。&lt;/p&gt;
&lt;h2 id=&quot;タイル型ウィンドウマネージャへ移行するモチベーション&quot;&gt;タイル型ウィンドウマネージャへ移行するモチベーション&lt;/h2&gt;
&lt;p&gt;今のラップトップを使い始めて４年目であることに加えて、１週間に何度も Linux をビルドしていたらバッテリーの寿命が縮んでしまったみたいで、メモリや CPU の使用率が気になり始めました。&lt;/p&gt;
&lt;p&gt;特に Gnome がメモリを食ってるのが気になって、軽量なウィンドウマネージャを使うことにしました。&lt;/p&gt;
&lt;p&gt;軽量なデスクトップ環境はありますが、一時期タイル型ウィンドウマネージャを使っていたことがあり便利なことは知っていたので、また使うことにしました。&lt;/p&gt;
&lt;h2 id=&quot;見た目&quot;&gt;見た目&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;デスクトップのスクリーンショット&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;720&quot; height=&quot;405&quot; src=&quot;https://blog.chaya2z.com/_astro/i3-gaps-desktop.DLAPgSdh_Z1O4rSR.webp&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;かんたんな説明&quot;&gt;かんたんな説明&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;i3-gaps&lt;/strong&gt;&lt;br&gt;
タイル型ウィンドウマネージャの i3 のフォークです。タイル間に隙間 ( gaps ) を入れることができます。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;polybar&lt;/strong&gt;&lt;br&gt;
画像上部にあるステータスバーです&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;rofi&lt;/strong&gt;&lt;br&gt;
画像中央に表示されている、多機能なアプリケーションランチャーです。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;i3status&lt;/strong&gt;&lt;br&gt;
画像下部にあるステータスバーです。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;picom&lt;/strong&gt;&lt;br&gt;
compton のフォークのコンポジタです。ウィンドウの透過に使っています。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;feh&lt;/strong&gt;&lt;br&gt;
画像ビュワーです。壁紙の管理に使っています。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ちなみに、ディストリビューションは Fedora36 です。&lt;/p&gt;
&lt;h2 id=&quot;dotfiles-の管理&quot;&gt;dotfiles の管理&lt;/h2&gt;
&lt;p&gt;上記の通り、複数のツールを使っていて、それぞれにコンフィグファイルがあります。ここからは、それらのファイル ( 以下: dotfiles ) の管理方法について紹介します。&lt;/p&gt;
&lt;p&gt;dotfiles は git を使って管理しています。リポジトリを &lt;code&gt;~/.local/share/dotfiles&lt;/code&gt; に置き、シンボリックリンクを使って設定を反映させています。&lt;/p&gt;
&lt;p&gt;例えば、 i3-gaps の設定ファイルは &lt;code&gt;~/.config/i3/config&lt;/code&gt; に置けば読み込まれるので、&lt;code&gt;~/.config/i3&lt;/code&gt; という &lt;code&gt;~/.local/share/dotfiles/i3&lt;/code&gt; へ向けたリンクを作ります。この方法で複数の設定ファイルを１つのリポジトリで管理することができます。&lt;/p&gt;
&lt;p&gt;しかし、手動でそれをやるのは面倒なのでスクリプトを書きました。&lt;/p&gt;
&lt;h3 id=&quot;リポジトリ&quot;&gt;リポジトリ&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/chaya2z/dotfiles&quot;&gt;https://github.com/chaya2z/dotfiles&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;スクリプトについて&quot;&gt;スクリプトについて&lt;/h2&gt;
&lt;p&gt;中身は ln コマンド / unlink コマンドを叩いているだけです。 fire&lt;sup&gt;&lt;a href=&quot;https://blog.chaya2z.com/ja/posts/linux-desktop-2022/#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; というライブラリに依存しているためそこがネックですが、個人で使う分には十分に感じます。&lt;/p&gt;
&lt;p&gt;dotfiles の管理ツールはいくつかあります&lt;sup&gt;&lt;a href=&quot;https://blog.chaya2z.com/ja/posts/linux-desktop-2022/#user-content-fn-2&quot; id=&quot;user-content-fnref-2&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; が、個人的にシンボリックリンクが簡単だと思ったのでそれらは使いませんでした。&lt;/p&gt;
&lt;h2 id=&quot;fire&quot;&gt;fire&lt;/h2&gt;
&lt;p&gt;最後に、スクリプトに使用した fire というライブラリを紹介します。&lt;/p&gt;
&lt;p&gt;fire は Python のライブラリで、CLI ツールの作成においてコマンドライン引数の処理を簡単にします。&lt;/p&gt;
&lt;p&gt;例えば、以下のようなコードで link コマンドと unlink コマンドを作れます。クラスや関数を fire に渡すと、それをコマンドにできます。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; fire&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Command&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; link&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(self, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;files):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        &quot;&quot;&quot;how to use link&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;        # link コマンドを実行したときの処理&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        pass&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; unlink&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(self, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;files):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;        # unlink コマンドを実行したときの処理&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        pass&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;fire.Fire(Command)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;また、fire は help メッセージを生成してくれます。docstring を書いておけば help に表示してくれます。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;helpメッセージ&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;728&quot; height=&quot;512&quot; src=&quot;https://blog.chaya2z.com/_astro/python-fire-help.By6r5oqr_ZiE37u.webp&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;おわり&quot;&gt;おわり&lt;/h2&gt;
&lt;p&gt;私はいままで Ubuntu ユーザで、デスクトップ環境を変えず使っていましたが、いろいろ弄り始めると楽しいですね。&lt;/p&gt;
&lt;p&gt;最後まで読んでくださりありがとうございます。&lt;/p&gt;
&lt;section data-footnotes=&quot;&quot; class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;fire: &lt;a href=&quot;https://github.com/google/python-fire&quot;&gt;https://github.com/google/python-fire&lt;/a&gt; &lt;a href=&quot;https://blog.chaya2z.com/ja/posts/linux-desktop-2022/#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-2&quot;&gt;
&lt;p&gt;ドットファイル: &lt;a href=&quot;https://wiki.archlinux.jp/index.php/%E3%83%89%E3%83%83%E3%83%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB&quot;&gt;https://wiki.archlinux.jp/index.php/%E3%83%89%E3%83%83%E3%83%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB&lt;/a&gt; &lt;a href=&quot;https://blog.chaya2z.com/ja/posts/linux-desktop-2022/#user-content-fnref-2&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded></item><item><title>自宅インフラ構成の紹介（2022年）</title><link>https://blog.chaya2z.com/ja/posts/homelab-2022/</link><guid isPermaLink="true">https://blog.chaya2z.com/ja/posts/homelab-2022/</guid><description>ProLiant サーバ 3 台と Cisco Catalyst のスイッチで組んだ自宅インフラの構成。ESXi と直結した SAN、Sophos Firewall、OSPF によるルーティング、VLAN ID に合わせたアドレス設計を紹介する。</description><pubDate>Mon, 27 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;趣味でやっている自宅サーバの紹介です。&lt;/p&gt;
&lt;h1 id=&quot;トポロジ&quot;&gt;トポロジ&lt;/h1&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;333&quot; height=&quot;506&quot; src=&quot;https://blog.chaya2z.com/_astro/homelab-topology.BNwJLOmd_ZNLkAo.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;小規模なネットワークとして一般的な形だと思います。&lt;/p&gt;
&lt;p&gt;後述しますが、SAN として動くサーバとは直接接続しています。&lt;/p&gt;
&lt;h2 id=&quot;置いてる機材&quot;&gt;置いてる機材&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;機材一覧&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;720&quot; height=&quot;540&quot; src=&quot;https://blog.chaya2z.com/_astro/homelab-equipment.CMBUwg4M_2nMjAE.webp&quot;&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;番号&lt;/th&gt;
&lt;th&gt;役割&lt;/th&gt;
&lt;th&gt;機種名&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;サーバ&lt;/td&gt;
&lt;td&gt;HTE Proliant DL380 Gen8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;サーバ&lt;/td&gt;
&lt;td&gt;HTE Proliant ML310e Gen8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;サーバ&lt;/td&gt;
&lt;td&gt;HTE Proliant ML310e Gen8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;ファイアウォール&lt;/td&gt;
&lt;td&gt;NTT BizBox&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;L2 スイッチ&lt;/td&gt;
&lt;td&gt;Cisco Catalyst 2960X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;L3 スイッチ&lt;/td&gt;
&lt;td&gt;Cisco Catalyst 3750X&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1 id=&quot;動かしてるもの&quot;&gt;動かしてるもの&lt;/h1&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;720&quot; height=&quot;540&quot; src=&quot;https://blog.chaya2z.com/_astro/homelab-services.DIOGZCo-_Z1OE98o.webp&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;esxi&quot;&gt;ESXi&lt;/h2&gt;
&lt;p&gt;ストレージサーバ、Kubernetes、DNS サーバなどを運用しています。&lt;/p&gt;
&lt;h2 id=&quot;san&quot;&gt;SAN&lt;/h2&gt;
&lt;p&gt;EXSi のデータストア用です。ESXi と直結しています。&lt;/p&gt;
&lt;h2 id=&quot;監視&quot;&gt;監視&lt;/h2&gt;
&lt;p&gt;サーバやネットワーク機器の監視をしています。&lt;/p&gt;
&lt;h2 id=&quot;fw--ファイアウォール-&quot;&gt;FW ( ファイアウォール )&lt;/h2&gt;
&lt;p&gt;Sophos Firewall Home Edition をインストールして使っています。無償利用できて、機能も豊富なのでおすすめです。特に L7 でのフィルタリングと VPN 機能はすごいなと思いました。&lt;/p&gt;
&lt;p&gt;初期設定だとフィルタリングされすぎてしまうので注意。&lt;/p&gt;
&lt;h2 id=&quot;ネットワーク&quot;&gt;ネットワーク&lt;/h2&gt;
&lt;p&gt;ルーティングは OSPF を使った動的ルーティングをしています。 フィーチャーセットの問題で L3 スイッチが BGP を喋れないため OSPF を選びました。&lt;/p&gt;
&lt;p&gt;VLAN 管理は L3 スイッチにやらせています。ネットワークの分割は 192.168.0.0/16 から VLAN に /24 を切り分けます。例えば、監視用には VLAN4 で 192.168.4.0/24 というネットワークを割り当てる感じです ( つまり、VLAN id と IP アドレスを関連させたかった ) 。&lt;/p&gt;
&lt;h2 id=&quot;おわり&quot;&gt;おわり&lt;/h2&gt;
&lt;p&gt;特殊なことはしていないので、あまり面白味は無いかもしれませんが、紹介は以上です。&lt;/p&gt;
</content:encoded></item><item><title>サークルの1年を振り返る（2021年）</title><link>https://blog.chaya2z.com/ja/posts/tech-club-2021/</link><guid isPermaLink="true">https://blog.chaya2z.com/ja/posts/tech-club-2021/</guid><description>コロナ禍で新入生を勧誘できず、サーバなどの技術継承が途切れた情報系サークルで、部長として過ごした 2021 年を振り返る。学校の協力で 2 学年を勧誘し、20 名ほどの新入部員を迎えた。</description><pubDate>Mon, 27 Dec 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;はじめに&quot;&gt;はじめに&lt;/h2&gt;
&lt;p&gt;この記事は &lt;a href=&quot;https://adventar.org/calendars/6368&quot;&gt;ITRC Advent Calendar 2021&lt;/a&gt; の25日目の記事です ( 遅れてごめんなさい )．&lt;/p&gt;
&lt;p&gt;私は専門学校の情報系サークル&lt;sup&gt;&lt;a href=&quot;https://blog.chaya2z.com/ja/posts/tech-club-2021/#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;にて部長を務めています．年末なので今年1年を振り返ってみようと思います．&lt;/p&gt;
&lt;h2 id=&quot;サークルを取り巻く状況&quot;&gt;サークルを取り巻く状況&lt;/h2&gt;
&lt;p&gt;コロナ禍に入ってから学校はオンライン授業が始まり，また，オフラインでの部活動が禁止されました．それにより新入生の勧誘ができず，新入部員を入れることができませんでした．そこで起きた問題は技術継承がうまくいかなかったことです．サークルでは管理しているサーバを始め，さまざまなリソースが引き継げていません．&lt;/p&gt;
&lt;p&gt;先生にお願いし，何とか1年生への勧誘と，1年遅れで2年生へサークルへの勧誘ができました．そのおかげで現在では20名程の新入部員を迎えることができました．&lt;/p&gt;
&lt;h2 id=&quot;主なできごと&quot;&gt;主なできごと&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;4月&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;先輩からサークルを引き継ぎ&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5月&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;SECCON Beginners CTF 2021 に参加&lt;/p&gt;
&lt;p&gt;2年生が入部&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6月&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;2年生との自己紹介を兼ねたサークル内 LT 大会&lt;/p&gt;
&lt;p&gt;サークル内 wiki を運用開始&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8月&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ICT トラブルシューティングコンテストに参加&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;12月&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;サークルメンバーでアドベントカレンダー&lt;/p&gt;
&lt;p&gt;1年生が入部&lt;/p&gt;
&lt;p&gt;1年生との自己紹介を兼ねたサークル内 LT 大会&lt;/p&gt;
&lt;h2 id=&quot;おわり&quot;&gt;おわり&lt;/h2&gt;
&lt;p&gt;現状，未だオフライン活動はできません．せっかく先輩方が立ち上げてくださったサークルなので，自分たちの代で終わらせないようがんばりたいです．&lt;/p&gt;
&lt;section data-footnotes=&quot;&quot; class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;諸々の事情があり学校名などは出せませんが、「山の上の学校」と言うと伝わることがあるところです． &lt;a href=&quot;https://blog.chaya2z.com/ja/posts/tech-club-2021/#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded></item><item><title>VLANの設定で学んだこと</title><link>https://blog.chaya2z.com/ja/posts/vlan-notes/</link><guid isPermaLink="true">https://blog.chaya2z.com/ja/posts/vlan-notes/</guid><description>Native VLAN を、機器で最初から設定されている VLAN 1 のことだと勘違いしていた。Access Port、Trunk Port、Native VLAN がそれぞれどんなフレームを流すのかを整理した。</description><pubDate>Thu, 23 Dec 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;はじめに&quot;&gt;はじめに&lt;/h2&gt;
&lt;p&gt;最近 VLAN の設定を行う機会があったのですが，そこで VLAN について理解不足な部分があることがわかったのでまとめます．&lt;/p&gt;
&lt;h2 id=&quot;access-port&quot;&gt;Access Port&lt;/h2&gt;
&lt;p&gt;まずは Access Port について．&lt;/p&gt;
&lt;h3 id=&quot;access-port-とは&quot;&gt;Access Port とは&lt;/h3&gt;
&lt;p&gt;Access Port とは，１つの VLAN にしか所属できないポートのこと．VLAN タグの付かないフレームが流れる．PC は基本的に１つの VLAN にのみ所属するので，PC を繋ぐのに使われることが多い．&lt;/p&gt;
&lt;h2 id=&quot;trunk-port&quot;&gt;Trunk Port&lt;/h2&gt;
&lt;p&gt;次に Trunk Port について．&lt;/p&gt;
&lt;h3 id=&quot;trunk-port-とは&quot;&gt;Trunk port とは&lt;/h3&gt;
&lt;p&gt;Trunk Port とは，複数の VLAN が所属できるポートのこと．VLAN タグの付くフレームが流れる．この仕様は IEEE802.1Q で定義され，これを実装した機器同士で通信するのに用いられることが多い ( 例外として以下に説明する Native VLAN がある )．&lt;/p&gt;
&lt;h2 id=&quot;native-vlan&quot;&gt;Native VLAN&lt;/h2&gt;
&lt;p&gt;最後に Native VLAN について．&lt;/p&gt;
&lt;h3 id=&quot;native-vlan-とは&quot;&gt;Native VLAN とは&lt;/h3&gt;
&lt;p&gt;Native VLAN は Trunk Port に設定する VLAN で，Trunk Port にてタグのないフレームを流すことができる仕様のこと．Trunk Port でないポートを接続して利用できる．Native VLAN 同士を接続することもできる．&lt;/p&gt;
&lt;h2 id=&quot;おわりに&quot;&gt;おわりに&lt;/h2&gt;
&lt;p&gt;Native VLAN のことを，そのネットワーク機器でデフォルトで設定される VLAN 番号のことだと勘違いしていました．多くのネットワーク機器では VLAN 1 がデフォルトで設定されていると思うのですが，その VLAN 1 というのは他の VLAN 番号と違い，特別なものだと思ってました．&lt;/p&gt;
&lt;p&gt;Native VLAN を全然使っていませんでしたが，便利だと思ったので使っていきたいです．&lt;/p&gt;
</content:encoded></item><item><title>JetBrains ToolboxでIDEをCLIから起動する</title><link>https://blog.chaya2z.com/ja/posts/jetbrains-toolbox-cli-launch/</link><guid isPermaLink="true">https://blog.chaya2z.com/ja/posts/jetbrains-toolbox-cli-launch/</guid><description>Toolbox の「Generate shell scripts」を有効にすると、idea hoge.md のように IDE をコマンドから起動できる。保存先を ~/ 以下にすることと、ディレクトリ選択欄の末尾に入る空白を消すことがつまずきどころ。</description><pubDate>Tue, 14 Dec 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;この記事は &lt;a href=&quot;https://adventar.org/calendars/6368&quot;&gt;ITRC Advent Calendar 2021&lt;/a&gt; の14日目の記事です．&lt;/p&gt;
&lt;h2 id=&quot;やりたいこと&quot;&gt;やりたいこと&lt;/h2&gt;
&lt;p&gt;コマンドラインから Jetbrains の IDE を起動できるようにする．例えば以下のような感じのことをできるようにする．&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;idea&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; hoge.md&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;環境&quot;&gt;環境&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;GNU/Linux Ubuntu Desktop 20.04&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Toolbox を使って IDE を管理しているとする．&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;設定手順&quot;&gt;設定手順&lt;/h2&gt;
&lt;p&gt;1.まずは Toolbox を開く．&lt;/p&gt;
&lt;p&gt;2.ウィンドウの右上の六角形のマークを押下し「Settings」を開く ( もしくは &lt;code&gt;Ctrl + ,&lt;/code&gt; を入力 ) ．&lt;/p&gt;
&lt;p&gt;3.「 Generate shell scripts」にチェックを入れる．&lt;/p&gt;
&lt;p&gt;4.任意の &lt;code&gt;~/&lt;/code&gt; 以下のディレクトリを入力する (&lt;strong&gt;&lt;code&gt;/usr/local/bin&lt;/code&gt; には権限がなく書きこめないため&lt;/strong&gt; ) ．&lt;/p&gt;
&lt;p&gt;5.入力欄の下の「 Change… 」を押下する．&lt;/p&gt;
&lt;p&gt;6.ディレクトリ選択のダイアログが開く．&lt;strong&gt;「 Selection 」の入力欄の末尾に謎の空白があるので削除する&lt;/strong&gt;．&lt;/p&gt;
&lt;p&gt;7.「 OK 」を押下してダイアログを閉じる．&lt;/p&gt;
&lt;p&gt;8.作成したディレクトリにパスを通す．&lt;/p&gt;
&lt;h3 id=&quot;補足&quot;&gt;補足&lt;/h3&gt;
&lt;p&gt;この画面の「 Generate shell scripts」を設定する．ここでは &lt;code&gt;/home/chaya2z/.local/share/JetBrains/bin&lt;/code&gt; を使っている．&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;設定画面&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;448&quot; height=&quot;729&quot; src=&quot;https://blog.chaya2z.com/_astro/toolbox-shell-scripts-setting.z7_B1V94_Z2q49OK.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;「 Selection 」の入力欄の末尾に謎の空白がある&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;447&quot; height=&quot;490&quot; src=&quot;https://blog.chaya2z.com/_astro/toolbox-selection-trailing-space.IOgN7Ns6_29O3rp.webp&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;参考&quot;&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pleiades.io/help/idea/working-with-the-ide-features-from-command-line.html&quot;&gt;https://pleiades.io/help/idea/working-with-the-ide-features-from-command-line.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>VyOSにコントリビュートした</title><link>https://blog.chaya2z.com/ja/posts/my-first-vyos-contribution/</link><guid isPermaLink="true">https://blog.chaya2z.com/ja/posts/my-first-vyos-contribution/</guid><description>VyOS で出たエラーから、Perl スクリプトで $ がエスケープされていないバグを見つけ、初めて OSS に PR を出した。この経験から、最新版を使うことと英語を避けないことをコントリビュートのこつとして挙げる。</description><pubDate>Mon, 06 Dec 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;この記事は &lt;a href=&quot;https://adventar.org/calendars/6368&quot;&gt;ITRC Advent Calendar 2021&lt;/a&gt; の6日目の記事です．&lt;/p&gt;
&lt;p&gt;前の記事は &lt;a href=&quot;https://twitter.com/gamoutatsumi&quot;&gt;@waka&lt;/a&gt; の &lt;a href=&quot;https://zenn.dev/gamoutatsumi/articles/26745357cffa44&quot;&gt;最近のVim事情&lt;/a&gt; です．&lt;/p&gt;
&lt;h2 id=&quot;はじめに&quot;&gt;はじめに&lt;/h2&gt;
&lt;p&gt;OSS に初めてコントリビュートしたので，その内容と考えたことを書きます．コントリビュートしたのは VyOS です．コントリビュートの内容は後述しますが，大したことはないのでその内容には期待しないでください．&lt;/p&gt;
&lt;h2 id=&quot;pr&quot;&gt;PR&lt;/h2&gt;
&lt;p&gt;私の出した PR はこちらになります．&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/vyos/vyatta-cfg-system/pull/170&quot;&gt;https://github.com/vyos/vyatta-cfg-system/pull/170&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$&lt;/code&gt; がエスケープされず変数としてみなされている部分があったのでそこをエスケープしました．&lt;/p&gt;
&lt;h2 id=&quot;どうやってバグを見つけたか&quot;&gt;どうやってバグを見つけたか&lt;/h2&gt;
&lt;p&gt;VyOS を使っていたらエラーが出たのでそれでバグに気づきました．&lt;/p&gt;
&lt;p&gt;出力されたエラーは次のものです．&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Global symbol &quot;$generate&quot; requires explicit package name (did you forget to declare &quot;my $generate&quot;?) at /opt/vyatta/sbin/vyatta-load-user-key.pl line 162.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Execution of /opt/vyatta/sbin/vyatta-load-user-key.pl aborted due to compilation errors.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[edit]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;エラーに &lt;code&gt;/opt/vyatta/sbin/vyatta-load-user-key.pl&lt;/code&gt; の 162 行目の &lt;code&gt;&quot;$generate&quot;&lt;/code&gt; がおかしいというようなことが書かれているのでそのとおりコードを確認しました．&lt;/p&gt;
&lt;h2 id=&quot;oss-にコントリビュートするには&quot;&gt;OSS にコントリビュートするには&lt;/h2&gt;
&lt;p&gt;これを読んだ方は「これくらいの修正なら自分でもできそう」と思ったのではないでしょうか．以下はこのようなレベルのバグが他の OSS にもある前提で書きます．&lt;/p&gt;
&lt;p&gt;まずはコントリビュートしたい OSS の最新版を使いましょう．このような比較的修正の簡単なバグはおそらく安定版にはありません．今回の PR も最新版に対して出したものです．最新版 ( いわば不安定版 ) のソフトを使うというのは OSS に貢献したいのなら当たり前かもしれませんが，実際には意識しないとやらないことだと思います．&lt;/p&gt;
&lt;p&gt;あとは英語を拒絶しないことです ( これは意外に思う方もいるかもしれませんが，英語のページだとわかった瞬間ブラウザバック刷る人もいるようです )．私は英語が苦手なので DeepL や辞書を頼りました．&lt;/p&gt;
&lt;h2 id=&quot;さいごに&quot;&gt;さいごに&lt;/h2&gt;
&lt;p&gt;この記事が OSS のコントリビュートのきっかけになる方がいれば幸いです．&lt;/p&gt;
</content:encoded></item><item><title>ConoHa-VPSにVyOSをインストールする</title><link>https://blog.chaya2z.com/ja/posts/vyos-on-conoha-vps/</link><guid isPermaLink="true">https://blog.chaya2z.com/ja/posts/vyos-on-conoha-vps/</guid><description>ConoHa VPS は ISO イメージを http でしか取得できないので、nginx で VyOS の ISO を公開し、conoha-iso でダウンロードしてインストールした。この手順なら任意の ISO イメージでサーバを作れる。</description><pubDate>Sat, 04 Dec 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;この記事は &lt;a href=&quot;https://adventar.org/calendars/6368&quot;&gt;ITRC Advent Calendar 2021&lt;/a&gt; の4日目の記事です．&lt;/p&gt;
&lt;p&gt;前日は &lt;a href=&quot;https://twitter.com/saba383810&quot;&gt;@saba&lt;/a&gt; の &lt;a href=&quot;https://sabanogames.com/tips/305/&quot;&gt;【Unity】重い処理はメインスレッド以外の別スレッドで動かそう！！【非同期処理】&lt;/a&gt; でした．&lt;/p&gt;
&lt;p&gt;次は &lt;a href=&quot;https://twitter.com/gamoutatsumi&quot;&gt;@waka&lt;/a&gt; の &lt;a href=&quot;https://zenn.dev/gamoutatsumi/articles/26745357cffa44&quot;&gt;最近のVim事情&lt;/a&gt; です．&lt;/p&gt;
&lt;h2 id=&quot;1-conoha-の-vps-を契約しサーバを建てる&quot;&gt;1. ConoHa の VPS を契約しサーバを建てる&lt;/h2&gt;
&lt;p&gt;OS は何でもいい&lt;sup&gt;&lt;a href=&quot;https://blog.chaya2z.com/ja/posts/vyos-on-conoha-vps/#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; のでサーバを契約します．&lt;/p&gt;
&lt;h2 id=&quot;2-ウェブサーバを建てて-iso-イメージを公開する&quot;&gt;2. ウェブサーバを建てて ISO イメージを公開する&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://qiita.com/marukei/items/6b6ccee3e7a553f64f1e&quot;&gt;https://qiita.com/marukei/items/6b6ccee3e7a553f64f1e&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;この記事によると ConoHa の VPS では ISO イメージのダウンロードに http 接続しか使えないみたいです．&lt;/p&gt;
&lt;p&gt;VyOS の ISO イメージは https で配布されているので，http 接続のためにウェブサーバを建てる必要があります．自分でビルドする場合も同じです．&lt;/p&gt;
&lt;h3 id=&quot;21-nginxでウェブサーバを建てる&quot;&gt;2.1 nginxでウェブサーバを建てる&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;nginx のインストール&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; apt&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; update&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; apt&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nginx&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;ISO イメージファイルの公開&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /var/www/html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; wget&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://downloads.vyos.io/rolling/current/amd64/vyos-rolling-latest.iso&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;ISO イメージファイルにアクセスできるようにする&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Nginx のデフォルト設定では，ブラウザから &lt;code&gt;/vyos*.iso&lt;/code&gt; にアクセスしても ISO イメージファイルにアクセスできません．&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/etc/nginx/nginx.conf&lt;/code&gt; を編集します．&lt;/p&gt;
&lt;p&gt;&lt;code&gt;http&lt;/code&gt; ディレクティブに &lt;code&gt;server&lt;/code&gt; ディレクティブを追加します．&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;http {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    server {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        location / {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            try_files $uri $uri/ =404;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;こうすると，ブラウザから &lt;code&gt;/vyos*.iso&lt;/code&gt; にアクセスしたときにそのファイルがあるか探し，存在しなければ404を返すようになります．&lt;/p&gt;
&lt;h2 id=&quot;3-conohaにiso-イメージをダウンロードする&quot;&gt;3. ConoHaにISO イメージをダウンロードする&lt;/h2&gt;
&lt;h3 id=&quot;31-conoha-iso-を使う&quot;&gt;3.1 conoha-iso を使う&lt;/h3&gt;
&lt;p&gt;conoha-iso は，ISO イメージのダウンロードを簡単に行えるツールです．ツールのダウンロードは以下のページの手順を参考にします．&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://support.conoha.jp/v/clitools/&quot;&gt;https://support.conoha.jp/v/clitools/&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;32-conoha-iso-の確認&quot;&gt;3.2 conoha-iso の確認&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;./conoha-iso list -u [APIユーザ名] \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                  -p [APIパスワード] \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                  -n [テナント名] \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                  -r [リージョン]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ISO イメージのダウンロードが初めてなら，ISO イメージは空なので &lt;code&gt;No ISO images&lt;/code&gt; と返ってきます．&lt;/p&gt;
&lt;h3 id=&quot;33-iso-イメージのダウンロード&quot;&gt;3.3 ISO イメージのダウンロード&lt;/h3&gt;
&lt;p&gt;(2) で建てたウェブサーバからISOイメージをダウンロードします．&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;./conoha-iso download -i http://{ConoHaのサーバのIP}/{vyosのISOイメージのファイル名} \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                      -u [APIユーザ名] \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                      -p [APIパスワード] \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                      -n [テナント名] \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                      -r [リージョン]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;もう一度上記の &lt;code&gt;./conoha-iso list&lt;/code&gt; コマンドを使い，ISO イメージが追加されたか確認します．&lt;/p&gt;
&lt;h2 id=&quot;4--1--で建てたサーバに-iso-イメージを挿入する&quot;&gt;4. ( 1 ) で建てたサーバに ISO イメージを挿入する&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;./conoha-iso insert&lt;/code&gt; コマンドで ISO イメージを挿入します．これは，ISO を焼いた USB メモリをサーバに挿した状態と同じです．&lt;/p&gt;
&lt;h2 id=&quot;5-vyos-をインストールする&quot;&gt;5. VyOS をインストールする&lt;/h2&gt;
&lt;p&gt;VyOS のインストーラが立ち上がるのでインストールします．&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;install image&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;poweroff&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;6-iso-イメージを排出する&quot;&gt;6. ISO イメージを排出する&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;./conoha-iso eject&lt;/code&gt; コマンドで ISO イメージを排出します．&lt;/p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;この手順でなら任意の ISO イメージを使ったサーバ作成が可能です。&lt;/p&gt;
&lt;p&gt;ただ，ここまでするなら別の VPS 使ったほうがいいですね… 無料お試しサービスがあればそれを使いましょう．&lt;/p&gt;
&lt;h2 id=&quot;参考&quot;&gt;参考&lt;/h2&gt;
&lt;p&gt;ConoHaのドキュメント．全体の流れはここを参照．&lt;br&gt;
&lt;a href=&quot;https://support.conoha.jp/v/clitools/&quot;&gt;https://support.conoha.jp/v/clitools/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ウェブサーバを建ててISOイメージをダウンロードするアイデアはここから．&lt;br&gt;
&lt;a href=&quot;https://himakan.net/program/conoha-vps-install-rancheros&quot;&gt;https://himakan.net/program/conoha-vps-install-rancheros&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;nginxの公式ドキュメント．locationの書き方はここを参照．&lt;br&gt;
&lt;a href=&quot;https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/&quot;&gt;https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/&lt;/a&gt;&lt;/p&gt;
&lt;section data-footnotes=&quot;&quot; class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;Ubuntu 20.04 で確認済み．ウェブサーバが建てられればなんでもいい． &lt;a href=&quot;https://blog.chaya2z.com/ja/posts/vyos-on-conoha-vps/#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded></item><item><title>自宅インフラ構成の紹介（2021年）</title><link>https://blog.chaya2z.com/ja/posts/homelab-2021/</link><guid isPermaLink="true">https://blog.chaya2z.com/ja/posts/homelab-2021/</guid><description>IPv6 が来ていない自宅に、ConoHa VPS と OpenVPN の L2 接続で IPv6 アドレスを引き込んだ。VyOS の L2TPv3 over WireGuard から乗り換えて、VPS までのレイテンシは 40ms から 5ms に下がった。</description><pubDate>Wed, 01 Dec 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;この記事は &lt;a href=&quot;https://adventar.org/calendars/6368&quot;&gt;ITRC Advent Calendar 2021&lt;/a&gt; の1日目の記事です．&lt;/p&gt;
&lt;p&gt;次は &lt;a href=&quot;https://twitter.com/AsteriskSV&quot;&gt;@Asterisk&lt;/a&gt; の &lt;a href=&quot;https://note.com/asterisk_sv/n/n95d9a1bf435d&quot;&gt;Flask触ってみた（初級）&lt;/a&gt; です．&lt;/p&gt;
&lt;p&gt;私の自宅ネットワークインフラの紹介をします．いままで大したことをしてなかったので外部に公開するのは憚られていたのですが，少しは以前よりマシになったと思いたいです．&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;サーバの写真&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;450&quot; height=&quot;600&quot; src=&quot;https://blog.chaya2z.com/_astro/homelab-servers.fiY8dg5z_ZcRQVO.webp&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;トポロジ図&quot;&gt;トポロジ図&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;トポロジ&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1648&quot; height=&quot;867&quot; src=&quot;https://blog.chaya2z.com/_astro/homelab-topology.D6ZbvjW8_jDuzd.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;この画像の右側の黄色い部分 ( DMZ ) の話をします．&lt;/p&gt;
&lt;h2 id=&quot;ネットワーク&quot;&gt;ネットワーク&lt;/h2&gt;
&lt;p&gt;私の自宅には IPv6 のグローバルアドレスが提供されていません．そこで IPv6 の提供される VPS を契約して VPN を繋ぎ，オーバーレイネットワークを作ることで自宅にそれらのアドレスを割り当てました．契約したのは ConoHa VPS で， ConoHa VPS では１つの NIC につき 17個の IPv6 グローバルアドレスがもらえます．&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;IPアドレス&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;453&quot; height=&quot;573&quot; src=&quot;https://blog.chaya2z.com/_astro/conoha-ipv6-addresses.Dq6XHWQW_1bK7V6.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;こんな感じで固定の IPv6 アドレスが貰えます．プレフィックスは &lt;code&gt;/64&lt;/code&gt; です．&lt;/p&gt;
&lt;h3 id=&quot;vpn&quot;&gt;VPN&lt;/h3&gt;
&lt;p&gt;VPN は Ubuntu に入れた OpenVPN を使っています．OpenVPN は他の VPN プロトコルと比べると ( 証明書を用いた方式の場合 ) 設定が複雑です．しかし以下の条件に当てはまるプロトコルだったので選択しました．&lt;/p&gt;
&lt;p&gt;- 両方のノードがグローバル IP アドレスを持っている必要がない&lt;/p&gt;
&lt;p&gt;- L2 レベルで接続できる&lt;/p&gt;
&lt;p&gt;オーバーレイネットワークは次の図のようになります．&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;オーバーレイネットワーク&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;385&quot; height=&quot;346&quot; src=&quot;https://blog.chaya2z.com/_astro/overlay-network.CVqDQJQL_Z16QBjx.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;最初は VyOS を使って L2TPv3 over WireGuard なんてことをしていたのですが，オーバーヘッドが大きくレイテンシが高くなってしまったのでやめました．&lt;/p&gt;
&lt;p&gt;その結果 自宅 - VPS 間の平均レイテンシが 40ms から 5ms になりました．&lt;/p&gt;
&lt;p&gt;Before&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;rtt min/avg/max/mdev = 39.541/48.039/80.300/16.134 ms&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;rtt min/avg/max/mdev = 4.629/5.247/8.509/1.114 ms&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;まだ検証はしていませんが，40ms もかかっていたのは，&lt;/p&gt;
&lt;p&gt;1.VyOS の処理が遅い&lt;/p&gt;
&lt;p&gt;2.WireGuard が遅い&lt;/p&gt;
&lt;p&gt;のどちらかが原因で，WireGuard がそんなに遅いとは思えないので VyOS が原因なんだろうなと思ってます．&lt;/p&gt;
&lt;h3 id=&quot;ルーティング&quot;&gt;ルーティング&lt;/h3&gt;
&lt;p&gt;ルーティングでは設定の手間を省くためダイナミックルーティングを行っています．使っているプロトコルは BGP と OSPF です．これらのプロトコルの ECMP で負荷分散ができるところが好みです．BGP と OSPF の２種類のプロトコルを使っているのは BGP に対応していない機器 ( 具体的には Cisco の IP-Base のイメージの入った L3 スイッチ ) があるせいです．&lt;/p&gt;
&lt;h2 id=&quot;サーバ&quot;&gt;サーバ&lt;/h2&gt;
&lt;p&gt;サーバでは Kubernetes を中心に運用しています．Kubernetes は最近勉強し始めました．&lt;/p&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;これからもいろいろ遊んでいきたいです．他の人とネットワーク作るようなことをしていく予定です．&lt;/p&gt;
</content:encoded></item><item><title>OPNsenseのファイアウォール設定でつまずいたこと</title><link>https://blog.chaya2z.com/ja/posts/opnsense-firewall-notes/</link><guid isPermaLink="true">https://blog.chaya2z.com/ja/posts/opnsense-firewall-notes/</guid><description>OPNsense の LAN net が指すのはインターフェイスが直接つながるネットワークだけで、その先のネットワークは含まない。自動生成ルールや評価順の確認、pfctl -d で WEB GUI に戻る方法など、引っかかった点をまとめた。</description><pubDate>Tue, 17 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;ところどころつまずいたので残します．&lt;/p&gt;
&lt;h2 id=&quot;lan-net-という項目&quot;&gt;LAN net という項目&lt;/h2&gt;
&lt;p&gt;例えば，LAN という名前のインターフェイスがあったとき，ファイアウォールのルールの Source や Destination の選択肢で「LAN address」や「LAN net」という項目が選べます．&lt;/p&gt;
&lt;p&gt;この LAN net というのは &lt;strong&gt;LAN インターフェイスが所属するネットワークだけ&lt;/strong&gt;を指し，それより下のネットワークのことではないです．&lt;/p&gt;
&lt;p&gt;例えば、下図のように，LAN net が 192.0.2.0/24 であるとします．そのとき、送信先が LAN net のパケットを Reject する項目を追加しても，192.0.2.0/24 しか Reject しません．&lt;br&gt;
つまり，下図のルータの下に 192.0.2.0/24 以外のネットワークがあったとしても，そのネットワークは LAN net の対象ではないということです．&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;298&quot; height=&quot;201&quot; src=&quot;https://blog.chaya2z.com/_astro/opnsense-lan-net-scope.BV-yb9pt_1RY886.webp&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;自動生成されるファイアウォールルールを確認する&quot;&gt;自動生成されるファイアウォールルールを確認する&lt;/h2&gt;
&lt;p&gt;自動生成されるルールはウェブページを開いたときに隠れているので，表示して確認します．&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1424&quot; height=&quot;147&quot; src=&quot;https://blog.chaya2z.com/_astro/opnsense-automatic-rules.CNHRweDC_1FwQbt.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;ここにトラブルの原因があるかも知れません．&lt;/p&gt;
&lt;h2 id=&quot;ファイアウォールルールの順番確認する&quot;&gt;ファイアウォールルールの順番確認する&lt;/h2&gt;
&lt;p&gt;まずはドキュメントを参照するといいです．&lt;br&gt;
&lt;a href=&quot;https://docs.opnsense.org/manual/firewall.html&quot;&gt;https://docs.opnsense.org/manual/firewall.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ドキュメントによると，ファイアウォールは次の順番で評価されます．&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Floating ( 全インタフェイス ) での設定&lt;/li&gt;
&lt;li&gt;グループでの設定&lt;/li&gt;
&lt;li&gt;インターフェイスごとの設定&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;表の上のものが優先されて&lt;/strong&gt;評価されます．&lt;/p&gt;
&lt;h2 id=&quot;natルールを確認する&quot;&gt;NATルールを確認する&lt;/h2&gt;
&lt;p&gt;恐らくデフォルトで有効になっています．&lt;/p&gt;
&lt;p&gt;NAT しない場合は「Disable outbound NAT rule generation」を選択するといいです．&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1090&quot; height=&quot;299&quot; src=&quot;https://blog.chaya2z.com/_astro/opnsense-outbound-nat.MUAu2dyl_ZG43r2.webp&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;web-guiに繋げなくなったとき&quot;&gt;WEB GUIに繋げなくなったとき&lt;/h2&gt;
&lt;p&gt;ファイアウォールの設定を消してしまい，WEB GUI への接続がはじかれてしまったときの対処法を説明します ( CLI が使えることが前提 )．&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pfctl&lt;/code&gt; コマンドを使って CLI から pf ( BSD 系 OS のパケットフィルタ ) の設定を行います．&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;pfctl -d&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;-d&lt;/code&gt; は disable のことで，ファイアウォールを無効にします．&lt;br&gt;
これで WEB GUI に繋がるので、設定を再開できます．&lt;/p&gt;
&lt;p&gt;再び有効にするには WEB GUI で設定を適用するか，&lt;code&gt;pfctl&lt;/code&gt; コマンドを使います．&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;pfctl -e&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;-e&lt;/code&gt; は enable のことで，ファイアウォールを有効にします．&lt;/p&gt;
&lt;h2 id=&quot;同じネットワークのアドレスをインターフェイスに振ってはいけない&quot;&gt;同じネットワークのアドレスをインターフェイスに振ってはいけない&lt;/h2&gt;
&lt;p&gt;2つ以上のインターフェイスに同じネットワークの IP アドレスを振ると，その設定が無効化され接続できなくなります．&lt;/p&gt;
&lt;p&gt;同じネットワークに所属させるために bridge 機能があります ( この記事では説明しませんが )．&lt;/p&gt;
</content:encoded></item><item><title>Dockerコンテナ間のパケットをキャプチャしてみた</title><link>https://blog.chaya2z.com/ja/posts/docker-container-packet-capture/</link><guid isPermaLink="true">https://blog.chaya2z.com/ja/posts/docker-container-packet-capture/</guid><description>Ubuntu と nginx のコンテナ間で ping を送り、docker0 を Wireshark でキャプチャした。コンテナ間を流れていたのは、Ethernet、IPv4、ICMP からなる普通のパケットだった。</description><pubDate>Mon, 14 Dec 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Docker コンテナ間のパケットの流れが知りたかったので実験をしてみました．&lt;/p&gt;
&lt;p&gt;&lt;del&gt;Part-1(この記事)でパケットキャプチャを，後半の Part-2 では実験後調べてわかったことをまとめています．&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;追記: Part-2 の公開予定はありません．&lt;/p&gt;
&lt;h2 id=&quot;実験&quot;&gt;実験&lt;/h2&gt;
&lt;p&gt;Docker コンテナを２つ作り，その間を通るパケットをキャプチャします．&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;ネットワーク略図&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;325&quot; height=&quot;205&quot; src=&quot;https://blog.chaya2z.com/_astro/container-network.SPwh-Tb4_Z1EEbDl.webp&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;環境&quot;&gt;環境&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;GNU/Linux Ubuntu20:04&lt;/li&gt;
&lt;li&gt;Docker version 20.10.0 build 7287ab3&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;1-docker-コンテナを２つ作成する&quot;&gt;1. Docker コンテナを２つ作成する&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;nginx のコンテナ&lt;/li&gt;
&lt;li&gt;ubuntu20.04 のコンテナ&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;イメージの取得&quot;&gt;イメージの取得&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pull&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ubuntu:focal&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pull&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nginx:stable&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;イメージが取得できたか確認します．&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; images&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;ubuntu              focal               f643c72bc252        12 days ago         72.9MB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;nginx               stable              2562b6bef976        13 days ago         133MB&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;コンテナ作成&quot;&gt;コンテナ作成&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -dit&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ubuntu&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ubuntu:focal&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -d&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nginx&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -p&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 8080:80&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nginx:stable&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;コンテナが作成できたか確認します．&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; container&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ps&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -a&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;CONTAINER ID   IMAGE                       COMMAND                  CREATED          STATUS                    PORTS                  NAMES&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;d548a1da6a21   ubuntu:focal                &quot;/bin/bash&quot;              10 minutes ago   Up 10 minutes                                    ubuntu&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;04fc8579cf2d   nginx:stable                &quot;/docker-entrypoint.…&quot;   13 minutes ago   Up 12 minutes             0.0.0.0:8080-&amp;gt;80/tcp   nginx&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;2-コンテナ間で疎通&quot;&gt;2. コンテナ間で疎通&lt;/h2&gt;
&lt;h3 id=&quot;ping-を飛ばせるようにする&quot;&gt;ping を飛ばせるようにする&lt;/h3&gt;
&lt;p&gt;Ubuntu のコンテナに必要なパッケージのインストールを行います．&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ping&lt;/code&gt; コマンドを使いたいので &lt;code&gt;iputils-ping&lt;/code&gt; パッケージをインストールします．&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; exec&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -t&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ubuntu&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; apt&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; update&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; exec&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -t&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ubuntu&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; apt&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -y&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; iputils-ping&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;ping&lt;/code&gt; が飛ばせるか確認します．&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; exec&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -it&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ubuntu&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ping&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 8.8.8.8&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;64 bytes from 8.8.8.8: icmp_seq=1 ttl=113 time=4.19 ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;64 bytes from 8.8.8.8: icmp_seq=2 ttl=113 time=4.54 ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;64 bytes from 8.8.8.8: icmp_seq=3 ttl=113 time=4.05 ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;64 bytes from 8.8.8.8: icmp_seq=4 ttl=113 time=4.05 ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;64 bytes from 8.8.8.8: icmp_seq=5 ttl=113 time=3.92 ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;^C&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;--- 8.8.8.8 ping statistics ---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;5 packets transmitted, 5 received, 0% packet loss, time 4006ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;rtt min/avg/max/mdev = 3.923/4.150/4.538/0.210 ms&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;コンテナの-ip-アドレスを確認する&quot;&gt;コンテナの ip アドレスを確認する&lt;/h3&gt;
&lt;p&gt;IP アドレスは &lt;code&gt;hostname&lt;/code&gt; コマンドでわかります．&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; exec&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nginx&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; hostname&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -i&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;172.17.0.2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;２つのコンテナの IP アドレスは表の通り．&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;コンテナ&lt;/th&gt;
&lt;th&gt;IP アドレス&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ubuntu&lt;/td&gt;
&lt;td&gt;172.17.0.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;nginx&lt;/td&gt;
&lt;td&gt;172.17.0.3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;疎通確認&quot;&gt;疎通確認&lt;/h3&gt;
&lt;p&gt;Ubuntu コンテナ側から &lt;code&gt;ping&lt;/code&gt; を飛ばしてみます．&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; exec&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -it&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ubuntu&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ping&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 172.17.0.3&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.015 ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.049 ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.044 ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;64 bytes from 172.17.0.3: icmp_seq=4 ttl=64 time=0.049 ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;64 bytes from 172.17.0.3: icmp_seq=5 ttl=64 time=0.054 ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;^C&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;--- 172.17.0.3 ping statistics ---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;5 packets transmitted, 5 received, 0% packet loss, time 4100ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;rtt min/avg/max/mdev = 0.015/0.042/0.054/0.013 ms&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;3-パケットキャプチャ&quot;&gt;3. パケットキャプチャ&lt;/h2&gt;
&lt;p&gt;Wireshark を開き，インターフェースに &lt;code&gt;docker0&lt;/code&gt; を選択してパケットキャプチャを行います．&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;919&quot; src=&quot;https://blog.chaya2z.com/_astro/docker0-packet-capture.CTWFrkZi_Z26zpVs.webp&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;4-わかったこと&quot;&gt;4. わかったこと&lt;/h2&gt;
&lt;p&gt;Wireshark のスクリーンショットの右下にパケットの構造が表示されています．Ethernet の中に IPv4 があり，そのデータ部分に ICMP があります．&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;517&quot; height=&quot;534&quot; src=&quot;https://blog.chaya2z.com/_astro/docker0-packet-details.xkIaOXUT_thRfW.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;ここからわかるのは流れているのは普通のパケットと同じ構造のものということです．&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;del&gt;Part-2 に続きます．&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt;次：Part-2(今月中に投稿する予定)&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;追記: Part-2 の公開予定はありません．&lt;/p&gt;
</content:encoded></item><item><title>eBPFでシステムコールを監視してみた</title><link>https://blog.chaya2z.com/ja/posts/trying-ebpf-syscall-monitoring/</link><guid isPermaLink="true">https://blog.chaya2z.com/ja/posts/trying-ebpf-syscall-monitoring/</guid><description>eBPF Summit 2020 の入門セッションで公開されたコードを Ubuntu 20.04 で動かし、clone システムコールの発行回数をユーザー ID ごとに数えた。</description><pubDate>Thu, 03 Dec 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;この記事は&lt;a href=&quot;https://adventar.org/calendars/5535&quot;&gt;ITRC Advent Calendar 2020&lt;/a&gt; の 3 日目の記事です．&lt;/p&gt;
&lt;p&gt;前の記事は&lt;a href=&quot;https://twitter.com/site0801&quot;&gt;@site0801&lt;/a&gt; の &lt;a href=&quot;https://www.notion.so/nested-73404cdaa2864d95895969c25b5eaf3e&quot;&gt;nested 対応してるクラウド事業者リスト&lt;/a&gt; です．&lt;/p&gt;
&lt;p&gt;次の記事は&lt;a href=&quot;https://twitter.com/bluekey0725&quot;&gt;@bluekey0725&lt;/a&gt; の &lt;a href=&quot;https://qiita.com/blue_key/items/82facd82e9383c711534&quot;&gt;TUN モジュールによる Docker のロードエラーと linux カーネル&lt;/a&gt; です．&lt;/p&gt;
&lt;h2 id=&quot;はじめに&quot;&gt;はじめに&lt;/h2&gt;
&lt;p&gt;この記事は 2020/10/28 - 29 に開催された、eBPF summit の Day 1 の「A Beginner’s Guide to eBPF Programming」の内容を受けて書いています．&lt;/p&gt;
&lt;p&gt;eBPF summit の内容は公開されています．&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://ebpf.io/summit-2020/&quot;&gt;https://ebpf.io/summit-2020/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;実際に自分の環境で公開されているコードを実行してみました．&lt;/p&gt;
&lt;h2 id=&quot;環境&quot;&gt;環境&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;OS: Gnu/Linux Ubuntu20.04&lt;/li&gt;
&lt;li&gt;Python: 3.8&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ソースコードはプレゼンを行った lizrice 氏の GitHub にて公開されています．それを使わせていただきました．&lt;br&gt;
&lt;a href=&quot;https://github.com/lizrice/ebpf-beginners&quot;&gt;https://github.com/lizrice/ebpf-beginners&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;やること&quot;&gt;やること&lt;/h2&gt;
&lt;p&gt;clone システムコールの監視を行います．&lt;/p&gt;
&lt;p&gt;ターミナルを２つ開き，１つのターミナルで監視するプログラムを実行，もう１つのターミナルで&lt;code&gt;ls&lt;/code&gt;コマンドを実行し、clone システムコールを発行します．&lt;/p&gt;
&lt;h2 id=&quot;結果&quot;&gt;結果&lt;/h2&gt;
&lt;p&gt;ID 0 が追加されたところが，root ユーザで&lt;code&gt;ls&lt;/code&gt;コマンドを実行したところです．&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;$ sudo python3 ebpf.py&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;No entries yet&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;No entries yet&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;ID 1000: 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;ID 1000: 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;ID 1000: 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;ID 1000: 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;ID 1000: 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;ID 1000: 2	ID 0: 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;ID 1000: 2	ID 0: 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;ID 1000: 2	ID 0: 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;ID 1000: 2	ID 0: 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;ID 1000: 3	ID 0: 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;ID 1000: 6	ID 0: 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;ID 1000: 7	ID 0: 1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Tkinterで画面の明るさを調整するアプリを作った</title><link>https://blog.chaya2z.com/ja/posts/tkinter-brightness-app/</link><guid isPermaLink="true">https://blog.chaya2z.com/ja/posts/tkinter-brightness-app/</guid><description>i3 には GNOME や KDE のような明るさの設定アプリがないため、Python の Tkinter で画面の明るさを変えるだけの GUI アプリを作った。polybar から呼び出して使う予定。</description><pubDate>Fri, 02 Oct 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Python の Tkinter を使い，ラップトップの画面の明るさを変えるだけの GUI アプリを作りました．&lt;/p&gt;
&lt;p&gt;ソースコードは&lt;a href=&quot;https://github.com/chaya2z/DeviceManager&quot;&gt;こちら&lt;/a&gt;．&lt;/p&gt;
&lt;h2 id=&quot;外観&quot;&gt;外観&lt;/h2&gt;
&lt;p&gt;アプリのスクリーンショットです．&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;636&quot; height=&quot;331&quot; src=&quot;https://blog.chaya2z.com/_astro/brightness-app.BnEebFR5_C55tQ.webp&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;目的&quot;&gt;目的&lt;/h2&gt;
&lt;p&gt;私はウィンドウマネージャの i3 を使っており，GNOME や KDE といったデスクトップ環境は入れていません．それらのデスクトップ環境にあるような画面の明るさや音量を変える設定アプリは無いため，自分で作ることにしました．すでに他の人が作ったものはありますが，勉強のため画面の明るさを変えるアプリを作ることにしました．&lt;/p&gt;
&lt;h2 id=&quot;おわりに&quot;&gt;おわりに&lt;/h2&gt;
&lt;p&gt;polybar から呼び出せるようにして使っていく予定です．rofi とは別によく使う項目をここに機能追加していく予定.&lt;/p&gt;
</content:encoded></item><item><title>Gatsbyでブログを作った</title><link>https://blog.chaya2z.com/ja/posts/building-blog-with-gatsby/</link><guid isPermaLink="true">https://blog.chaya2z.com/ja/posts/building-blog-with-gatsby/</guid><description>テーマを入れただけだった Hexo のブログを、React と GraphQL を学びながら Gatsby で作り直した。ブログ用テーマは使わずに記事の読み込みを自作し、記事一覧は CSS Grid で組んだ。</description><pubDate>Sun, 27 Sep 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;このブログを公開するまでの話．&lt;/p&gt;
&lt;h2 id=&quot;gatsby-を選んだ理由&quot;&gt;Gatsby を選んだ理由&lt;/h2&gt;
&lt;p&gt;以前，Hexo を使ってブログを作成したのですが，テーマを入れただけでそのソースコードは改造しませんでした．そのソースコードを読むのも大変で，記事を書くモチベーションは低かったです．そこでブログを作り直そうと考えていました．&lt;/p&gt;
&lt;p&gt;最初は手元で Markdown のテキストファイルを HTML に変換し，必要な部分だけをデプロイするプログラムを作ろうかと思ったのですが，当時 React を勉強していた友人に React を勧められ，Gatsby を使うことにしました．&lt;/p&gt;
&lt;h2 id=&quot;躓いたうまくいったところ&quot;&gt;躓いた|うまくいったところ&lt;/h2&gt;
&lt;h3 id=&quot;the-gatsby-blog-theme&quot;&gt;The Gatsby Blog theme&lt;/h3&gt;
&lt;p&gt;最初は「The Gatsby Blog theme」というブログ用のプラグインを使おうとしていました．しかし，このプラグインを使いながら自分で作ったデザインを使うのは難しかったです．&lt;/p&gt;
&lt;p&gt;結局，このプラグインは使わず，このプラグインの行っていた &lt;code&gt;.md&lt;/code&gt; ファイルを記事として認識するといったプログラムは自分で実装しました．&lt;/p&gt;
&lt;p&gt;このプラグインは自分でデザインを作りたい人には向きません（多分）．&lt;/p&gt;
&lt;p&gt;実際大きく書き換えることになるならフォークして作ったほうがはやいみたいなので，自分でいろいろ弄りたいなら使わないでやったほうがいいと思います．&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you find yourself shadowing a large number of components in a particular theme, it might make sense to fork and modify the theme instead.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.gatsbyjs.com/docs/themes/shadowing/&quot;&gt;https://www.gatsbyjs.com/docs/themes/shadowing/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;記事カードを並べる&quot;&gt;記事カードを並べる&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.chaya2z.com/posts/&quot;&gt;記事一覧ページ&lt;/a&gt;で記事カードが並んでいる部分は CSS で実装しています．ここはサークルの先輩に「grid レイアウトがすごい」と聞いていて，それがやりたかったのもあってこのようなデザインになっています．&lt;/p&gt;
&lt;p&gt;grid レイアウトは強力なので，ぜひ使ってみてください．&lt;/p&gt;
&lt;h3 id=&quot;react-や-graphql&quot;&gt;React や GraphQL&lt;/h3&gt;
&lt;p&gt;まず，React と GraphQL は初めて触ったのですが，思ったよりもわかりやすかったです．React は学習コストが高いと聞いていたのですが，とりあえず動かすのは（作っているものが単純なこともあり）簡単でした．GraphQL は GraphQL IDE を使ったのであまり苦労しませんでした．&lt;/p&gt;
&lt;h2 id=&quot;おわりに&quot;&gt;おわりに&lt;/h2&gt;
&lt;p&gt;修正箇所や追加したい機能はまだまだあるので完成とは言えませんが，公開できてよかったです．&lt;/p&gt;
</content:encoded></item><item><title>ハノイの塔と再帰について考えた</title><link>https://blog.chaya2z.com/ja/posts/tower-of-hanoi-and-recursion/</link><guid isPermaLink="true">https://blog.chaya2z.com/ja/posts/tower-of-hanoi-and-recursion/</guid><description>ハノイの塔の最小移動回数を漸化式から 2^n - 1 と求め、同じ分け方で手順を出す再帰関数を Python で書く。『入門 データ構造とアルゴリズム』2 章の、n ビット列と k 進数列を生成する課題も解いた。</description><pubDate>Tue, 28 Apr 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;『入門 データ構造とアルゴリズム』&lt;sup&gt;&lt;a href=&quot;https://blog.chaya2z.com/ja/posts/tower-of-hanoi-and-recursion/#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; の 2 章「再帰と後戻り」の課題を Python で書いてみました．ハノイの塔が例として出てくるのですが，私にはそれが初見だと難しかったので残します．&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%8E%E3%82%A4%E3%81%AE%E5%A1%94&quot;&gt;ハノイの塔とは（Wikipedia）&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;再帰の問題&quot;&gt;再帰の問題&lt;/h2&gt;
&lt;h3 id=&quot;問題-2-1-ハノイの塔を論ぜよ&quot;&gt;問題 2-1 ハノイの塔を論ぜよ&lt;/h3&gt;
&lt;p&gt;Python でハノイの塔の最小移動回数の手順を求めるプログラムを書いてみます．コード自体は短いですが，理解するのが難しかったので順を追って説明します．&lt;/p&gt;
&lt;p&gt;この記事では本に従って以下のように用語を使います．&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;用語&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;522&quot; height=&quot;121&quot; src=&quot;https://blog.chaya2z.com/_astro/hanoi-terms.7xrf9i2y_Z1zfPOO.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;「Source にある円盤を Destination に移動させよ．その際に Auxiliary を用いてよい．」という感じです．&lt;/p&gt;
&lt;h3 id=&quot;最小移動回数を求める&quot;&gt;最小移動回数を求める&lt;/h3&gt;
&lt;p&gt;ハノイの塔の解説を読むと，「 &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; 番目の円盤を Source から Destination に移す．」「 &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n-1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt;枚の円盤を，Auxiliary から Destination に移す．」という説明が出てきます．しかし，どういうきっかけでそれを思いつけばいいのかわからなかったので書きます．&lt;/p&gt;
&lt;p&gt;最初に，漸化式を使って最小移動回数を求めます．&lt;/p&gt;
&lt;p&gt;まず，円盤の枚数が &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; 枚， &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;2&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; 枚，&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;3&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; 枚 &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo&gt;…&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\dots&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n-1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; 枚， &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; 枚のときの最小移動回数からなる数列を，数列 &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;{&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;}&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\lbrace a_n \rbrace&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; とします．初項 &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;a_1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; は 1 枚の円盤を Destination に移すだけなので，&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;a_1 = 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; となります．&lt;/p&gt;
&lt;p&gt;以下の図のように &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; 段円盤があるときには，その最小移動回数は　&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;a_n = n&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; 回ということですね．&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;n段の最小移動回数&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;542&quot; height=&quot;252&quot; src=&quot;https://blog.chaya2z.com/_astro/minimum-moves-formula.BG9bbhSi_Z2lwyj7.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;まず，円盤が 1 枚のときは最小移動回数は &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;a_1 = 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; 回です．&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;1枚のとき&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;522&quot; height=&quot;162&quot; src=&quot;https://blog.chaya2z.com/_astro/move-one-disk.YiGYAVbi_Z1nycK7.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;次に &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;a_{n + 1}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; の時を考えます．&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;a_{n + 1}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; を Destination に移動させるには，最終的に以下の作業が必要になります．&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; 段の円盤を Auxiliary に移動する．&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n + 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; 枚目 ( Source にある一番下の段 ) を Destination に移動する．&lt;/li&gt;
&lt;li&gt;Auxiliary に移動した n 段の円盤を &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n + 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; の上に載せるように Destination に移動する．&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n + 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; の山が完成する．&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;つまり，&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;a_{n + 1} = a_n + 1 + a_n = 2a_n + 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; となります． これについて図で考えてみます．&lt;/p&gt;
&lt;p&gt;まず， &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; 段を Auxiliary へ移動する最小移動回数は &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;a_n&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; です．&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;n段をAuxiliaryへ&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;542&quot; height=&quot;252&quot; src=&quot;https://blog.chaya2z.com/_astro/move-n-disks-to-auxiliary.DY5X8t9Z_TeDL1.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;次に， &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n + 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; 段を移動する最小移動回数は 1 です．&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;n+1段目をDestinationへ&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;542&quot; height=&quot;163&quot; src=&quot;https://blog.chaya2z.com/_astro/move-largest-disk-to-destination.uCEcldTl_DLRVk.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;最後に， &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; 段を Destination へ移動する最小移動回数は &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;a_n&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; です．&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;n段をDestinationへ&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;542&quot; height=&quot;261&quot; src=&quot;https://blog.chaya2z.com/_astro/move-n-disks-to-destination.CUsuAFfE_Z2sjNoN.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;これが &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;a_{n + 1} = a_n + 1 + a_n = 2a_n + 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; の意味です．&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;a_{n + 1} = 2a_n + 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; を変形すると&lt;br&gt;
&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;a_{n + 1} - 1 = 2(a_n + 1)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;ここで， &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;a_n + 1 = b_n&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; とおくと&lt;br&gt;
&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/msub&gt;&lt;mtext&gt;，&lt;/mtext&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;b_{n + 1} = 2b_n，b_1 = a_1 + 1 = 1 + 1 = 2&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;よって数列 &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;{&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;}&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\lbrace b_n \rbrace&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; は初項 &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;2&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; ，公比 &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;2&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; の等比数列であるから&lt;br&gt;
&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;∙&lt;/mo&gt;&lt;msup&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;msup&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;b_n = 2 \bullet 2^{n-1} = 2^n&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;したがって &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;msup&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/msup&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;a_n = b_n - 1 = 2^n - 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;というわけで円盤 n 枚のときのハノイの塔の最小移動回数は &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msup&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/msup&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;2^n - 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; とわかりました．&lt;br&gt;
その過程で &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; 枚目の円盤と &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n-1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; 枚の円盤に分ける考え方が理解できたと思います．&lt;/p&gt;
&lt;h3 id=&quot;なぜ再帰関数か&quot;&gt;なぜ再帰関数か&lt;/h3&gt;
&lt;p&gt;なぜ再帰関数で求められるのかを考えます．再帰であるということは，繰り返されている処理と入れ子になっている処理があるはずなので，それを見つけます．&lt;/p&gt;
&lt;h4 id=&quot;繰り返されている部分&quot;&gt;繰り返されている部分&lt;/h4&gt;
&lt;p&gt;私は以下の図のイメージで繰り返されている部分に気づきました．再帰に気づくヒントになると思います．この図では &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n = 4&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; の場合までしか載っていませんが，それ以上の場合も変わりません．&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;再帰のイメージ&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;522&quot; height=&quot;141&quot; src=&quot;https://blog.chaya2z.com/_astro/tower-of-hanoi.BsMs95jJ_28No8Y.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;繰り返されているのは以下の処理です．&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n - 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; 段を真ん中に作る．&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n - 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; 段を Auxiliary に移動する．&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; 段目を Destination に移動する．&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n - 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; 段を Auxiliary から Destination に移動する．&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これは何段であっても同じです．&lt;/p&gt;
&lt;p&gt;次に上の図では省略されている &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n - 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; 段を Destination から Auxiliary に移動する部分を考えてみます．&lt;/p&gt;
&lt;p&gt;例えば， &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n = 4&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; のとき Destination に積まれた 3 段の円盤を Auxiliary にスライドしています．ここは &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n = 3&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; のときに Source から Destination に移動するのと使う場所が違うだけでやることは変わりません．ただ移動元と移動先が変わるだけです．&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;やっていることは変わらない&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;522&quot; height=&quot;412&quot; src=&quot;https://blog.chaya2z.com/_astro/move-three-disks.BL44G0eo_1uJWGd.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;では，そもそも &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n = 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; 段を Source から Destination に移動するにはどうすればいいでしょうか．上の GIF 画像を見ながら考えてみてください．&lt;br&gt;
&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n = 2&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; で作れる円盤を利用して &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n = 3&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; を作っています．そして &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n = 2&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; を作るのに &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n = 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; を利用しています．&lt;br&gt;
&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; 段を移動するのに &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n - 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; 段を利用し，&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n - 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; 段を作るのに &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n - 2&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; 段を利用し，&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n - 2&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; 段を作るのに &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n - 3&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; を &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo&gt;⋯&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\cdots&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; と入れ子になっているのです．&lt;/p&gt;
&lt;h3 id=&quot;手順を求める&quot;&gt;手順を求める&lt;/h3&gt;
&lt;p&gt;それでは，どのような手順で円盤を操作すれば最小移動回数でハノイの塔の目標を達成できるか，再帰関数を使ってコードを書いていきます．&lt;/p&gt;
&lt;p&gt;まず， &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; 段目（一番上）を移動します．1 段目を利用して &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;2&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; 段の山を Destination に作ることができます．そして同じように 3 段目を作ることができ &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo&gt;⋯&lt;/mo&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\cdots\ n&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; 段目が完成します．&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; towers_of_Hanoi&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(n, frompeg, topeg, auxpeg):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    # First, move disk 1.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Move disk 1 from peg&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, frompeg, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;to peg&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, topeg)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        return&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    # move n - 1 pegs from source to auxiliary.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    towers_of_Hanoi(n &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, frompeg, auxpeg, topeg)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Move disk&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, n, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;from peg&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, frompeg, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;to peg&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, topeg)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    # move n - 1 pegs from auxiliary to destination&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    towers_of_Hanoi(n &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, auxpeg, topeg, frompeg)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;towers_of_Hanoi(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;A&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;B&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;C&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;後戻りの問題&quot;&gt;後戻りの問題&lt;/h2&gt;
&lt;h3 id=&quot;問題-2-2-n-ビットのすべての列を生成せよa0n-1をサイズが-n-の配列と仮定せよ&quot;&gt;問題 2-2 n ビットのすべての列を生成せよ．A[0..n-1]をサイズが n の配列と仮定せよ．&lt;/h3&gt;
&lt;p&gt;例えば， &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;n = 2&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; なら &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;00&lt;/mn&gt;&lt;mtext&gt;，&lt;/mtext&gt;&lt;mn&gt;01&lt;/mn&gt;&lt;mtext&gt;，&lt;/mtext&gt;&lt;mn&gt;10&lt;/mn&gt;&lt;mtext&gt;，&lt;/mtext&gt;&lt;mn&gt;11&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;00，01，10，11&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; を出力するということです．やり方はいろいろありますがここでは本に載っているやり方と同じような考え方でやります．&lt;/p&gt;
&lt;p&gt;コードを追うと 0 と 1 で分岐する図が想像できると思います．&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;bit: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;())&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;A &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; bit&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; binary&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(n):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(A)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    else&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        A[n &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        binary(n &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        A[n &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        binary(n &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;binary(bit)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;問題-2-3-0k-1-を要素とする長さ-n-の列をすべて生成せよ&quot;&gt;問題 2-3 0..k-1 を要素とする長さ n の列をすべて生成せよ．&lt;/h3&gt;
&lt;p&gt;問題 2-2 では 2 進数の場合を考えましたが，今度は &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;k&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; 進数の場合を考えます．こちらも本に載っているやり方と同じような考え方でやります．&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;digit, nary &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; map&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;().split())&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;A &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; digit&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; k_string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(n, k):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        print&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(A)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    else&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; range&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(k):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            A[n &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            k_string(n &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, k)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;k_string(digit, nary)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例えば，3 桁の &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;k&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/span&gt; 進数と言われれば 3 重に for 文でループを回せばすべての列を生成できます．しかし今回のような列の長さがわからない場合に再帰がうまく使えます．&lt;/p&gt;
&lt;h2 id=&quot;おわりに&quot;&gt;おわりに&lt;/h2&gt;
&lt;p&gt;ハノイの塔が難しかったです．階乗を再帰で計算するのとはやっていることが全然違うものに思えて理解するのに時間がかかりました．再帰は遅くて実際のコード中ではほとんど使われない（大抵が反復を使う）イメージがあるので，解きながら問題の難易度と実用性が見合わないのではないかと感じていました．本によると再帰の問題が後のページで出てくるようなので，今回の勉強が役に立つといいです．&lt;/p&gt;
&lt;section data-footnotes=&quot;&quot; class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;『入門データ構造とアルゴリズム』 ( Narasimha Karumanchi 著 黒川 利明・木下 哲也 訳 ) オライリージャパン &lt;a href=&quot;https://blog.chaya2z.com/ja/posts/tower-of-hanoi-and-recursion/#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded></item><item><title>秋葉原で集める電子部品</title><link>https://blog.chaya2z.com/ja/posts/z80-parts-in-akihabara/</link><guid isPermaLink="true">https://blog.chaya2z.com/ja/posts/z80-parts-in-akihabara/</guid><description>『コンピュータはなぜ動くのか』の Z80 コンピュータを作るため、秋葉原で部品を探した。秋月や千石になかった Z80 はラジオデパートで見つかり、クロックジェネレータの正体が水晶発振器だと 2003 年のブログで知った。</description><pubDate>Mon, 23 Dec 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;先日秋葉原にて電子パーツを買ってきました. きっかけは「コンピュータはなぜ動くのか」という本です. 「コンピュータを作ってみよう」という内容があり, それに必要なものを買いました. もちろん実際にコンピュータを作らなくても読み進められるのですが, 作ってみたかったのでやろうと思いました. ただ, まだ完成はしていないので, そのパーツ集めの話をしようと思います.&lt;/p&gt;
&lt;h2 id=&quot;z80&quot;&gt;Z80&lt;/h2&gt;
&lt;p&gt;作るコンピュータは Z80 CPU を使ったものです. Z80 は有名なチップなので知っている人も多いと思います. とはいえ作られたのは今(2019)から約 40 年前の 1976 年ですので少しこれについて説明します.&lt;/p&gt;
&lt;p&gt;Z80 は 8bit の CPU で, 開発にはあの嶋正利さんが関わっています. Z80 の発表は 1976 年で Zilog(ザイログ)という会社が作りました. あと I/O ポートもあります. Z80 は人気あるチップなのでこれを扱った記事がたくさんあります.&lt;/p&gt;
&lt;h2 id=&quot;パーツ集め&quot;&gt;パーツ集め&lt;/h2&gt;
&lt;p&gt;秋葉原に行けばあるだろうと思い秋葉原へ行きました. 最初に訪れたのは何度か買い物したことのある, 秋月, 千石, マルツです. しかしここでは見つかりませんでした. ここ以外の店は知らなかったので店舗で買うのは諦めていました.&lt;/p&gt;
&lt;p&gt;その後, 別の理由で秋葉原に来ていました. Z80 との出会いは偶然で, ふと立ち寄ったラジオデパートで見つけました. 2 階にある光南電気という半導体を扱っている店で, 半導体の並んだショーケースの中にありました. Z80 CPU 以外にもこの店で聞いたところ全部ではなかったですがありました.&lt;/p&gt;
&lt;p&gt;実は私は, ラジオデパートが創業 70 年の電気街と深く関わりある建物ということは後から知りました. 40 年前のパーツが手に入る電気街秋葉原はすごいですね.&lt;/p&gt;
&lt;h2 id=&quot;先人に学ぶ&quot;&gt;先人に学ぶ&lt;/h2&gt;
&lt;p&gt;Z80 と他にいくつかのパーツは手に入れたものの, 一つ見つけられなかったものがあります. それは本にクロックジェネレータと書いてあるパーツです. そもそもクロックジェネレータという分類を店で見つけられなかったので調べたところ, なんと同じ本を読んでさらにクロックジェネレータを探した人がいました. クロックジェネレータは水晶発振器だということがわかったので秋葉原に探しに行くと見つかりました. これはラジオデパートの 2 階のサン・エレクトロという半導体を扱う店で買いました.&lt;/p&gt;
&lt;p&gt;参考にさせてもらったブログは 2003 年に書かれたもので, そのときですら Z80 を中心としたパーツ集めに苦労したようです. 創業 70 年のビルで 40 年前のパーツを 20 年前のネットの記事を参考に買うというなかなかできそうにない経験をしました.&lt;/p&gt;
&lt;h2 id=&quot;さいごに&quot;&gt;さいごに&lt;/h2&gt;
&lt;p&gt;探すのに苦労したものの, 今回のパーツ探しは楽しかったです. Z80 はとても思い入れのあるチップの一つになりそうです. 通販でパーツを買う人も多い時代ですがまだまだ秋葉原は電気街ですね(当時を知らない自分がいうのはおこがましいことは承知).&lt;/p&gt;
&lt;p&gt;ここまで読んでくださりありがとうございます. 完成したら記事にしたいと思います.&lt;/p&gt;
&lt;h2 id=&quot;参考紹介&quot;&gt;参考・紹介&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://coconut.sys.eng.shizuoka.ac.jp/docs/z80.html&quot;&gt;Z80 秋葉原 (2003 年 6 月 28 日)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.tokyoradiodepart.co.jp/&quot;&gt;東京ラジオデパート&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Hexoでブログを作った</title><link>https://blog.chaya2z.com/ja/posts/building-blog-with-hexo/</link><guid isPermaLink="true">https://blog.chaya2z.com/ja/posts/building-blog-with-hexo/</guid><description>Blogger、HTML の手書き、Pelican と半年で 3 回ブログを作り替え、Netlify CMS が使える Hexo に落ち着いた。ブログの作り方を選ぶときに重視した 4 つの基準も挙げる。</description><pubDate>Mon, 09 Dec 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;はじめに&quot;&gt;はじめに&lt;/h2&gt;
&lt;p&gt;はじめまして.&lt;/p&gt;
&lt;p&gt;このブログは静的サイトジェネレータのHexoを使って作りました. 最初の投稿のテストを兼ねて, 記事を書こうと思います.&lt;/p&gt;
&lt;p&gt;サイトの作成の方法は公式ドキュメントや他の人が書いたものがあるのでここでは説明しません.&lt;/p&gt;
&lt;h2 id=&quot;ブログ制作で迷走&quot;&gt;ブログ制作で迷走&lt;/h2&gt;
&lt;p&gt;私はこのブログが4回目のブログ制作になります. そのほとんどは作っただけで使わなかったのですが, 以下のサービスを利用しました.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;blogger&lt;/p&gt;
&lt;p&gt;googleのブログ投稿サービスです. いくつか記事を投稿したものの, アウトプットとWWWの勉強を兼ねてブログを使いたかったので, ほとんどコードを触らないbloggerはやめることにしました.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;NetlifyにHTMLをホスティング&lt;/p&gt;
&lt;p&gt;Webの知識は無かったので一昔前のブログが完成しました. HTMLとCSSしか使われていません(他のものは知らないので). これはどうすればいいのかわからなすぎてやめました.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pelican&lt;/p&gt;
&lt;p&gt;Pythonの静的サイトジェネレータのPelicaを使ってブログを作成しました. これは形にはなったのですが, Netlify CMSがいろいろなサービスに対応していることと, PythonしかできないからPythonを使うのではなく, 知らないことがあったら勉強するべきだろうと思い, やめました.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hexo(このブログ)&lt;/p&gt;
&lt;p&gt;Netlify CMSが使えるなかでHexoはブログ向けだと知ったのでHexoを使うことにしました.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;これらを約半年の間に使ったのですが, まあ迷走してます(笑).&lt;/p&gt;
&lt;p&gt;だいたい以下の基準で選んでいます.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;無料でホスティングできる&lt;/li&gt;
&lt;li&gt;Markdownで書ける&lt;/li&gt;
&lt;li&gt;公式ドキュメントにチュートリアルが載っている&lt;/li&gt;
&lt;li&gt;テーマやプラグインが充実している&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;おわりに&quot;&gt;おわりに&lt;/h2&gt;
&lt;p&gt;この記事の投稿時点では, まだデザインやコンテンツは完成していません. 変更したことはどこかにまとめられたらと思っています.&lt;/p&gt;
&lt;p&gt;おそらく, しばらくはこのブログを使うと思うので, 見てくれると嬉しいです.&lt;/p&gt;
&lt;h2 id=&quot;ブログ作成時に参考にしたサイト&quot;&gt;ブログ作成時に参考にしたサイト&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.netlify.com/blog/2015/10/26/a-step-by-step-guide-hexo-on-netlify/&quot;&gt;A Step-by-Step Guide: Hexo on Netlify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.netlifycms.org/docs/add-to-your-site/&quot;&gt;Add to Your Site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.unsweets.net/2017/03/write-blog-with-netlify-cms/&quot;&gt;Netlify CMSを使ってHexoに記事を投稿する&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item></channel></rss>