<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Ubuntu on ポンコツ地方エンジニアの技術ブログ</title><link>https://blog.ponkotools.com/tags/ubuntu/</link><description>Recent content in Ubuntu on ポンコツ地方エンジニアの技術ブログ</description><generator>Hugo -- gohugo.io</generator><language>ja-jp</language><lastBuildDate>Sun, 12 Jul 2026 00:00:00 +0900</lastBuildDate><atom:link href="https://blog.ponkotools.com/tags/ubuntu/index.xml" rel="self" type="application/rss+xml"/><item><title>Ubuntu で Orca を使う</title><link>https://blog.ponkotools.com/posts/2026/07/12/orca/</link><pubDate>Sun, 12 Jul 2026 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2026/07/12/orca/</guid><description>&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Ubuntu 24.04&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ダウンロード"&gt;&lt;a href="#%e3%83%80%e3%82%a6%e3%83%b3%e3%83%ad%e3%83%bc%e3%83%89" class="header-anchor"&gt;&lt;/a&gt;ダウンロード
&lt;/h2&gt;&lt;p&gt;以下から Linux 用の AppImage をダウンロードします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.onorca.dev/" target="_blank" rel="noopener"
 &gt;https://www.onorca.dev/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="実行手順"&gt;&lt;a href="#%e5%ae%9f%e8%a1%8c%e6%89%8b%e9%a0%86" class="header-anchor"&gt;&lt;/a&gt;実行手順
&lt;/h2&gt;&lt;p&gt;実行権限を与えて実行するだけです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod +x orca-linux.AppImage
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./orca-linux.AppImage
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="エラーがでた場合"&gt;&lt;a href="#%e3%82%a8%e3%83%a9%e3%83%bc%e3%81%8c%e3%81%a7%e3%81%9f%e5%a0%b4%e5%90%88" class="header-anchor"&gt;&lt;/a&gt;エラーがでた場合
&lt;/h2&gt;&lt;p&gt;私の環境では以下のエラーが出ました。&lt;/p&gt;
&lt;h3 id="libfuse2-がない"&gt;&lt;a href="#libfuse2-%e3%81%8c%e3%81%aa%e3%81%84" class="header-anchor"&gt;&lt;/a&gt;libfuse2 がない
&lt;/h3&gt;&lt;p&gt;エラー内容は以下です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;dlopen&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="n"&gt;loading&lt;/span&gt; &lt;span class="n"&gt;libfuse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;so&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AppImages&lt;/span&gt; &lt;span class="n"&gt;require&lt;/span&gt; &lt;span class="n"&gt;FUSE&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;You&lt;/span&gt; &lt;span class="n"&gt;might&lt;/span&gt; &lt;span class="n"&gt;still&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;able&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;extract&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;contents&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;AppImage&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;appimage&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;extract&lt;/span&gt; &lt;span class="n"&gt;option&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;See&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;AppImage&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;AppImageKit&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wiki&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;FUSE&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;more&lt;/span&gt; &lt;span class="n"&gt;information&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;libfuse2&lt;/code&gt; が必要みたいなので、以下で追加しました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo add-apt-repository universe
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install libfuse2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="chrome-sandbox-の権限エラー"&gt;&lt;a href="#chrome-sandbox-%e3%81%ae%e6%a8%a9%e9%99%90%e3%82%a8%e3%83%a9%e3%83%bc" class="header-anchor"&gt;&lt;/a&gt;chrome-sandbox の権限エラー
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[40727:0718/110452.982911:FATAL:sandbox/linux/suid/client/setuid_sandbox_host.cc:166] The SUID sandbox helper binary was found, but is not configured correctly. Rather than run without sandboxing I&amp;#39;m aborting now. You need to make sure that /tmp/.mount_orca-lhdNQH6/chrome-sandbox is owned by root and has mode 4755.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Trace/breakpoint trap (コアダンプ)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;--no-sandbox&lt;/code&gt; をつければとりあえず起動できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./orca-linux.AppImage --no-sandbox
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="原因"&gt;&lt;a href="#%e5%8e%9f%e5%9b%a0" class="header-anchor"&gt;&lt;/a&gt;原因
&lt;/h4&gt;&lt;p&gt;Electron製のOrcaは、内部のChromiumプロセスを隔離するため、Linuxでは主に次のいずれかのsandbox方式を使います。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;user namespace sandbox&lt;/strong&gt;
一般ユーザー権限のままLinux namespaceを作成する方式&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SUID sandbox&lt;/strong&gt;
&lt;code&gt;chrome-sandbox&lt;/code&gt; をroot所有・権限&lt;code&gt;4755&lt;/code&gt;で実行する方式&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ubuntu 22.04では1のuser namespace方式がそのまま利用できたため、AppImage内のchrome-sandboxがSUID設定されていなくても起動できました。&lt;/p&gt;
&lt;p&gt;Ubuntu 24.04ではAppArmorによる以下の制限が既定で有効になっています。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kernel.apparmor_restrict_unprivileged_userns=1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これによりOrcaがuser namespace sandboxを作れずエラーになります。&lt;/p&gt;
&lt;p&gt;制限をUbuntu 22.04相当に戻す方法もありますが、システム上の全アプリケーションに対して非特権user namespaceの制限を解除することになります。&lt;/p&gt;
&lt;p&gt;とりあえずは Orca 側の対応待ちという感じです。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;以上で無事起動しました。&lt;br&gt;
使い方などは気が向いたらまた別途。&lt;/p&gt;</description></item><item><title>Codex のレート制限リセット権の有効期限の確認方法</title><link>https://blog.ponkotools.com/posts/2026/07/09/codex/</link><pubDate>Thu, 09 Jul 2026 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2026/07/09/codex/</guid><description>&lt;p&gt;Codex で付与されたレート制限リセット権は有効期限が30日間となっていますが、現状、有効期限がいつまでかを簡単に確認する術がないようです。&lt;br&gt;
以下に Windows 環境で確認するためのスクリプトが記載されていたので、これを参考に Ubuntu 用のスクリプトを作成しました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://note.com/moz_ai_tech/n/n84feff773b79" target="_blank" rel="noopener"
 &gt;https://note.com/moz_ai_tech/n/n84feff773b79&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="スクリプトの作成"&gt;&lt;a href="#%e3%82%b9%e3%82%af%e3%83%aa%e3%83%97%e3%83%88%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;スクリプトの作成
&lt;/h2&gt;&lt;p&gt;ファイル名は何でもよいですが、例えば &lt;code&gt;check_codex_reset_credits.sh&lt;/code&gt; として、以下の内容を保存してください。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -euo pipefail
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;AUTH_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/.codex/auth.json&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;API_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://chatgpt.com/backend-api/wham/rate-limit-reset-credits&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; ! &lt;span class="nb"&gt;command&lt;/span&gt; -v jq &amp;gt;/dev/null 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;1&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ERROR: jq が見つかりません。先にインストールしてください。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; sudo apt update &amp;amp;&amp;amp; sudo apt install -y jq&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; ! &lt;span class="nb"&gt;command&lt;/span&gt; -v curl &amp;gt;/dev/null 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;1&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ERROR: curl が見つかりません。先にインストールしてください。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; sudo apt update &amp;amp;&amp;amp; sudo apt install -y curl&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; ! -f &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$AUTH_FILE&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ERROR: 認証ファイルが見つかりません: &lt;/span&gt;&lt;span class="nv"&gt;$AUTH_FILE&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Codex にログイン済みか確認してください。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ACCESS_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;jq -r &lt;span class="s1"&gt;&amp;#39;.tokens.access_token // empty&amp;#39;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$AUTH_FILE&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ACCOUNT_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;jq -r &lt;span class="s1"&gt;&amp;#39;.tokens.account_id // empty&amp;#39;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$AUTH_FILE&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -z &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$ACCESS_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ERROR: access_token が取得できませんでした。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$AUTH_FILE&lt;/span&gt;&lt;span class="s2"&gt; の形式が想定と異なるか、Codex の認証状態が無効です。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;TMP_RESPONSE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;mktemp&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;trap&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;rm -f &amp;#34;$TMP_RESPONSE&amp;#34;&amp;#39;&lt;/span&gt; EXIT
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -n &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$ACCOUNT_ID&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;HTTP_CODE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; curl -sS &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -o &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$TMP_RESPONSE&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -w &lt;span class="s2"&gt;&amp;#34;%{http_code}&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;Authorization: Bearer &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ACCESS_TOKEN&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;OpenAI-Beta: codex-1&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;originator: Codex Desktop&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;ChatGPT-Account-ID: &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ACCOUNT_ID&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --max-time &lt;span class="m"&gt;30&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$API_URL&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;HTTP_CODE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; curl -sS &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -o &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$TMP_RESPONSE&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -w &lt;span class="s2"&gt;&amp;#34;%{http_code}&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;Authorization: Bearer &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ACCESS_TOKEN&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;OpenAI-Beta: codex-1&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;originator: Codex Desktop&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --max-time &lt;span class="m"&gt;30&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$API_URL&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HTTP_CODE&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; !&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;200&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ERROR: API 呼び出しに失敗しました。HTTP status: &lt;/span&gt;&lt;span class="nv"&gt;$HTTP_CODE&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;レスポンス:&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cat &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$TMP_RESPONSE&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;jq -r &lt;span class="s1"&gt;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; def fmt_time:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; if . == null or . == &amp;#34;&amp;#34; then
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;不明&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; else
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; # jq の fromdateiso8601 は小数秒つき ISO8601 で失敗することがあるため除去する
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; sub(&amp;#34;\\.[0-9]+Z$&amp;#34;; &amp;#34;Z&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; | fromdateiso8601
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; | localtime
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; | strftime(&amp;#34;%Y-%m-%d %H:%M:%S %Z&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; end;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;利用可能なリセット権: \(.available_count // 0) 個&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;状態\t付与日時\t有効期限&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; (.credits // [])
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; | map([
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; (.status // &amp;#34;不明&amp;#34;),
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; (.granted_at | fmt_time),
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; (.expires_at | fmt_time)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; ])
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; | .[]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; | @tsv
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$TMP_RESPONSE&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; column -t -s &lt;span class="s1"&gt;$&amp;#39;\t&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="実行手順"&gt;&lt;a href="#%e5%ae%9f%e8%a1%8c%e6%89%8b%e9%a0%86" class="header-anchor"&gt;&lt;/a&gt;実行手順
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install -y curl jq
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod +x check_codex_reset_credits.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./check_codex_reset_credits.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="注意"&gt;&lt;a href="#%e6%b3%a8%e6%84%8f" class="header-anchor"&gt;&lt;/a&gt;注意
&lt;/h2&gt;&lt;p&gt;このスクリプトは、参照記事の PowerShell 版と同じく、&lt;code&gt;~/.codex/auth.json&lt;/code&gt; から &lt;code&gt;access_token&lt;/code&gt; と &lt;code&gt;account_id&lt;/code&gt; を読み取り、&lt;code&gt;https://chatgpt.com/backend-api/wham/rate-limit-reset-credits&lt;/code&gt; に GET します。&lt;/p&gt;
&lt;p&gt;注意点として、この方法は公式に公開された安定 API ではなく、参照記事でも「内部APIを使った非公式な確認方法」と説明されています。&lt;br&gt;
Codex 側の仕様変更で動かなくなる可能性があります。&lt;/p&gt;</description></item><item><title>OCI の Ubuntu インスタンスの初期設定</title><link>https://blog.ponkotools.com/posts/2026/05/29/oci-ubuntu/</link><pubDate>Fri, 29 May 2026 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2026/05/29/oci-ubuntu/</guid><description>&lt;h2 id="swap-の設定"&gt;&lt;a href="#swap-%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;swap の設定
&lt;/h2&gt;&lt;p&gt;以下のように、Ubuntu のイメージにはスワップがありません。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ free -m
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; total used free shared buff/cache available
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Mem: &lt;span class="m"&gt;954&lt;/span&gt; &lt;span class="m"&gt;343&lt;/span&gt; &lt;span class="m"&gt;225&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt; &lt;span class="m"&gt;538&lt;/span&gt; &lt;span class="m"&gt;610&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Swap: &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2GB のスワップファイル（Swap）を追加します。&lt;br&gt;
すべてのコマンドは、管理者権限（&lt;code&gt;sudo&lt;/code&gt;）を付けてターミナルで実行します。&lt;/p&gt;
&lt;h3 id="1-スワップファイルの作成"&gt;&lt;a href="#1-%e3%82%b9%e3%83%af%e3%83%83%e3%83%97%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;1. スワップファイルの作成
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;dd&lt;/code&gt; または &lt;code&gt;fallocate&lt;/code&gt; コマンドで 2GB のファイルを作成します。ここでは確実かつ高速な &lt;code&gt;fallocate&lt;/code&gt; を使用します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo fallocate -l 2G /swapfile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="alert alert-warning"&gt;
 &lt;div class="alert-header"&gt;
 &lt;span class="alert-icon"&gt;⚠️&lt;/span&gt;
 &lt;span class="alert-title"&gt;警告&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="alert-body"&gt;
 &lt;p&gt;もし「fallocate failed: Operation not supported」のようなエラーが出た場合は、以下の &lt;code&gt;dd&lt;/code&gt; コマンドを代わりに試してください。&lt;br&gt;
&lt;code&gt;sudo dd if=/dev/zero of=/swapfile bs=1M count=2048&lt;/code&gt;&lt;/p&gt;
 &lt;/div&gt;
 &lt;/blockquote&gt;
&lt;h3 id="2-適切な権限の設定"&gt;&lt;a href="#2-%e9%81%a9%e5%88%87%e3%81%aa%e6%a8%a9%e9%99%90%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;2. 適切な権限の設定
&lt;/h3&gt;&lt;p&gt;セキュリティのため、スワップファイルは root ユーザーのみが読み書きできるように権限を &lt;code&gt;600&lt;/code&gt; に制限します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chmod &lt;span class="m"&gt;600&lt;/span&gt; /swapfile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-スワップ領域の初期化"&gt;&lt;a href="#3-%e3%82%b9%e3%83%af%e3%83%83%e3%83%97%e9%a0%98%e5%9f%9f%e3%81%ae%e5%88%9d%e6%9c%9f%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;3. スワップ領域の初期化
&lt;/h3&gt;&lt;p&gt;作成したファイルをスワップ領域としてフォーマットします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mkswap /swapfile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="4-スワップの有効化"&gt;&lt;a href="#4-%e3%82%b9%e3%83%af%e3%83%83%e3%83%97%e3%81%ae%e6%9c%89%e5%8a%b9%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;4. スワップの有効化
&lt;/h3&gt;&lt;p&gt;システムにスワップファイルを認識させ、有効化します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo swapon /swapfile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="5-設定の確認"&gt;&lt;a href="#5-%e8%a8%ad%e5%ae%9a%e3%81%ae%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;5. 設定の確認
&lt;/h3&gt;&lt;p&gt;スワップが正しく有効化されたか確認します。2GB（約 2.0GiB）のスワップが表示されていれば成功です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo swapon --show
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# または&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;free -h
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="6-再起動後も自動で有効化する設定"&gt;&lt;a href="#6-%e5%86%8d%e8%b5%b7%e5%8b%95%e5%be%8c%e3%82%82%e8%87%aa%e5%8b%95%e3%81%a7%e6%9c%89%e5%8a%b9%e5%8c%96%e3%81%99%e3%82%8b%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;6. 再起動後も自動で有効化する設定
&lt;/h3&gt;&lt;p&gt;上記の設定だけでは、インスタンスを再起動するとスワップが解除されてしまいます。再起動後も自動的に有効化されるよう、&lt;code&gt;/etc/fstab&lt;/code&gt; に追記します。&lt;/p&gt;
&lt;h4 id="6-1-fstab-のバックアップ推奨"&gt;&lt;a href="#6-1-fstab-%e3%81%ae%e3%83%90%e3%83%83%e3%82%af%e3%82%a2%e3%83%83%e3%83%97%e6%8e%a8%e5%a5%a8" class="header-anchor"&gt;&lt;/a&gt;6-1. fstab のバックアップ（推奨）
&lt;/h4&gt;&lt;p&gt;念のため、設定ファイルをバックアップしておきます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo cp /etc/fstab /etc/fstab.bak
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="6-2-設定の追記"&gt;&lt;a href="#6-2-%e8%a8%ad%e5%ae%9a%e3%81%ae%e8%bf%bd%e8%a8%98" class="header-anchor"&gt;&lt;/a&gt;6-2. 設定の追記
&lt;/h4&gt;&lt;p&gt;以下のコマンドを実行して、&lt;code&gt;/etc/fstab&lt;/code&gt; の末尾に設定を追記します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/swapfile none swap sw 0 0&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee -a /etc/fstab
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="おまけカーネルパラメータの最適化推奨"&gt;&lt;a href="#%e3%81%8a%e3%81%be%e3%81%91%e3%82%ab%e3%83%bc%e3%83%8d%e3%83%ab%e3%83%91%e3%83%a9%e3%83%a1%e3%83%bc%e3%82%bf%e3%81%ae%e6%9c%80%e9%81%a9%e5%8c%96%e6%8e%a8%e5%a5%a8" class="header-anchor"&gt;&lt;/a&gt;【おまけ】カーネルパラメータの最適化（推奨）
&lt;/h3&gt;&lt;p&gt;Linux には、メモリがどれくらい減ったらスワップを開始するかを決める &lt;code&gt;swappiness&lt;/code&gt; という値があります。&lt;br&gt;
初期値は &lt;code&gt;60&lt;/code&gt; であることが多いですが、クラウド環境（特に SSD ストレージ）では **&lt;code&gt;10&lt;/code&gt;〜&lt;code&gt;20**&lt;/code&gt; 程度に下げて、できるだけ物理メモリを優先して使うように設定するのが一般的です。&lt;/p&gt;
&lt;h4 id="1-現在の-swappiness-を確認"&gt;&lt;a href="#1-%e7%8f%be%e5%9c%a8%e3%81%ae-swappiness-%e3%82%92%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;1. 現在の swappiness を確認
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat /proc/sys/vm/swappiness
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="2-一時的に-10-に変更"&gt;&lt;a href="#2-%e4%b8%80%e6%99%82%e7%9a%84%e3%81%ab-10-%e3%81%ab%e5%a4%89%e6%9b%b4" class="header-anchor"&gt;&lt;/a&gt;2. 一時的に &lt;code&gt;10&lt;/code&gt; に変更
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo sysctl vm.swappiness&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="3-永続的に反映"&gt;&lt;a href="#3-%e6%b0%b8%e7%b6%9a%e7%9a%84%e3%81%ab%e5%8f%8d%e6%98%a0" class="header-anchor"&gt;&lt;/a&gt;3. 永続的に反映
&lt;/h4&gt;&lt;p&gt;再起動後もこの設定を維持するため、&lt;code&gt;/etc/sysctl.conf&lt;/code&gt; の末尾に追記します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;vm.swappiness=10&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee -a /etc/sysctl.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;これで 2GB のスワップ設定はすべて完了です！&lt;/p&gt;
&lt;h2 id="タイムゾーンの変更"&gt;&lt;a href="#%e3%82%bf%e3%82%a4%e3%83%a0%e3%82%be%e3%83%bc%e3%83%b3%e3%81%ae%e5%a4%89%e6%9b%b4" class="header-anchor"&gt;&lt;/a&gt;タイムゾーンの変更
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 現在のタイムゾーンを確認&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;timedatectl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# JST に変更&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo timedatectl set-timezone Asia/Tokyo
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 変更されたことを確認&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;timedatectl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="nano-のインストール"&gt;&lt;a href="#nano-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;nano のインストール
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install -y nano
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="git-のインストール"&gt;&lt;a href="#git-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;git のインストール
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install -y git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="glab-のインストールと認証"&gt;&lt;a href="#glab-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%a8%e8%aa%8d%e8%a8%bc" class="header-anchor"&gt;&lt;/a&gt;glab のインストールと認証
&lt;/h2&gt;&lt;p&gt;諸事情で GitHub ではなく GitLab を使っているので、glab をインストールします。&lt;/p&gt;
&lt;h3 id="1-ダウンロード"&gt;&lt;a href="#1-%e3%83%80%e3%82%a6%e3%83%b3%e3%83%ad%e3%83%bc%e3%83%89" class="header-anchor"&gt;&lt;/a&gt;1. ダウンロード
&lt;/h3&gt;&lt;p&gt;apt でインストールできるバージョンは古いので、公式リリースからダウンロードしてインストールします。&lt;/p&gt;
&lt;p&gt;詳細は以下を参照してください。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://blog.ponkotools.com/posts/2026/05/10/glab/" target="_blank" rel="noopener"
 &gt;https://blog.ponkotools.com/posts/2026/05/10/glab/&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="2-gitlab-でのアクセストークンpatの発行"&gt;&lt;a href="#2-gitlab-%e3%81%a7%e3%81%ae%e3%82%a2%e3%82%af%e3%82%bb%e3%82%b9%e3%83%88%e3%83%bc%e3%82%af%e3%83%b3pat%e3%81%ae%e7%99%ba%e8%a1%8c" class="header-anchor"&gt;&lt;/a&gt;2. GitLab でのアクセストークン（PAT）の発行
&lt;/h3&gt;&lt;p&gt;CLI から GitLab にアクセスするために、事前にブラウザ側（GitLab のウェブ画面）で Personal Access Token（個人用アクセストークン） を発行しておく必要があります。&lt;br&gt;
WSL を使っているからか、web での認証ではうまくいきませんでした。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;GitLab にログインします（SaaS 版の gitlab.com または社内などのオンプレミス版）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;面左上の自分のアイコン ＞ Preferences（設定） ＞ 左メニューの Access Tokens の順に開きます。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add new token をクリックし、以下のように入力します：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Token name: 任意の名前（例: oci-ubuntu-cli）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Expiration date: 空欄（無期限）または任意の有効期限&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Scopes（権限）: CLI をフル活用するために、&lt;code&gt;api&lt;/code&gt; と &lt;code&gt;write_repository&lt;/code&gt;以下にチェックを入れます。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Create personal access token をクリックします。&lt;/p&gt;
&lt;p&gt;画面に一度だけトークン（glpat-xxxx&amp;hellip;）が表示されるので、必ずコピーして手元に控えておきます。（画面を閉じると二度と見られなくなります）&lt;/p&gt;
&lt;h3 id="3-cli-の認証設定ログイン"&gt;&lt;a href="#3-cli-%e3%81%ae%e8%aa%8d%e8%a8%bc%e8%a8%ad%e5%ae%9a%e3%83%ad%e3%82%b0%e3%82%a4%e3%83%b3" class="header-anchor"&gt;&lt;/a&gt;3. CLI の認証設定（ログイン）
&lt;/h3&gt;&lt;p&gt;OCI の Ubuntu ターミナルに戻り、以下のコマンドを実行して対話型セットアップを開始します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;glab auth login
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行すると、いくつか質問されるので以下のように回答していきます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ What GitLab instance &lt;span class="k"&gt;do&lt;/span&gt; you want to sign in to?
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ &amp;gt; gitlab.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ GitLab Self-Managed or GitLab Dedicated instance
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;gitLab.com（本家）を使っている場合は、そのまま gitLab.com を選択して Enter。&lt;br&gt;
自社サーバーなどの場合は GitLab Self-Managed or GitLab Dedicated instance を選択し、その後 URL（例: &lt;a class="link" href="https://gitlab.example.com" target="_blank" rel="noopener"
 &gt;https://gitlab.example.com&lt;/a&gt;）を入力します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- Signing into gitlab.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ How would you like to sign in?
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ &amp;gt; Token
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ Web
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Token を選択します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- Signing into gitlab.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ What domains does this host use &lt;span class="k"&gt;for&lt;/span&gt; the container registry and image dependency proxy?
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ &amp;gt; gitlab.com,gitlab.com:443,registry.gitlab.com 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;そのまま Enter を押します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;The minimum required scopes are &lt;span class="s1"&gt;&amp;#39;api&amp;#39;&lt;/span&gt; and &lt;span class="s1"&gt;&amp;#39;write_repository&amp;#39;&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Generate a personal access token at https://gitlab.com/-/user_settings/personal_access_tokens?scopes&lt;span class="o"&gt;=&lt;/span&gt;api,write_repository
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ Paste your authentication token:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ &amp;gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;先ほど GitLab 画面でコピーしたトークン（glpat-xxxx&amp;hellip;）を貼り付けて Enter を押します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ Choose default Git protocol:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ SSH
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ &amp;gt; HTTPS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ HTTP
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;HTTPS を選択します。&lt;/p&gt;
&lt;p&gt;セットアップが完了したら、以下のコマンドで無事にログインできているか確認します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;glab auth status
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ご自身のユーザー名や「Logged in to gitlab.com」といったステータスが表示されれば、GitLab CLI の設定はすべて完了です！&lt;/p&gt;
&lt;h2 id="tmux-のインストール"&gt;&lt;a href="#tmux-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;tmux のインストール
&lt;/h2&gt;&lt;p&gt;セッションが切れても実行中のプログラムが停止しないよう tmux を使うためにインストールします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install -y tmux
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="docker-のインストール"&gt;&lt;a href="#docker-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;docker のインストール
&lt;/h2&gt;&lt;h3 id="1-インストール"&gt;&lt;a href="#1-%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;1. インストール
&lt;/h3&gt;&lt;p&gt;公式ドキュメントの Install using the apt repository に従って最新版の docker をインストールします。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository" target="_blank" rel="noopener"
 &gt;https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="2-docker-の権限を設定-sudo-を不要にする"&gt;&lt;a href="#2-docker-%e3%81%ae%e6%a8%a9%e9%99%90%e3%82%92%e8%a8%ad%e5%ae%9a-sudo-%e3%82%92%e4%b8%8d%e8%a6%81%e3%81%ab%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;2. docker の権限を設定 (sudo を不要にする)
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo gpasswd -a &lt;span class="k"&gt;$(&lt;/span&gt;whoami&lt;span class="k"&gt;)&lt;/span&gt; docker
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chgrp docker /var/run/docker.sock
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="不要なサービスの停止"&gt;&lt;a href="#%e4%b8%8d%e8%a6%81%e3%81%aa%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e3%81%ae%e5%81%9c%e6%ad%a2" class="header-anchor"&gt;&lt;/a&gt;不要なサービスの停止
&lt;/h2&gt;&lt;p&gt;参考: &lt;a class="link" href="https://qiita.com/ynott/items/4312cb34611d2e462779" target="_blank" rel="noopener"
 &gt;https://qiita.com/ynott/items/4312cb34611d2e462779&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;systemctl | grep running&lt;/code&gt; で稼働中のサービス一覧を出力し、そのうち不要なものを AI に尋ねた結果が以下です。&lt;/p&gt;
&lt;h3 id="確実に停止無効化して良いサービス"&gt;&lt;a href="#%e7%a2%ba%e5%ae%9f%e3%81%ab%e5%81%9c%e6%ad%a2%e7%84%a1%e5%8a%b9%e5%8c%96%e3%81%97%e3%81%a6%e8%89%af%e3%81%84%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9" class="header-anchor"&gt;&lt;/a&gt;確実に停止・無効化して良いサービス
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&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;&lt;code&gt;ModemManager.service&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;3G/4G/5G などのモバイルモデムを管理するサービス。クラウドのサーバーでモデムを使うことはないため、完全に不要です。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;fwupd.service&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;マザーボードやデバイスのファームウェアをアップデートするデーモン。仮想マシン（VM）のファームウェアは OCI 側が管理するため不要です。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;rpcbind.servicerpcbind.socket&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;NFSv3（ネットワークファイルシステム）などで使われる古いポートマップサービス。NFS でストレージをマウントする予定がなければ不要です。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;iscsid.serviceiscsid.socket&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;iSCSI ストレージに接続するためのクアドラント。OCI のブロック・ボリュームを iSCSI 経由で直接マウント（手動アタッチなど）していない限り、標準の準仮想化（Paravirtualized）アタッチであれば不要です。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;udisks2.service&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;主にデスクトップ環境で USB メモリなどのディスクを自動認識・マウントするためのサービス。サーバー用途では不要です。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;停止・無効化のコマンド例&lt;/strong&gt;&lt;br&gt;
単に stop するだけだと再起動時にまた動いてしまうので、disable &amp;ndash;now で自動起動の解除と停止を同時に行います。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl disable --now ModemManager fwupd rpcbind rpcbind.socket iscsid iscsid.socket udisks2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="条件付きで停止削除できるサービス効果大"&gt;&lt;a href="#%e6%9d%a1%e4%bb%b6%e4%bb%98%e3%81%8d%e3%81%a7%e5%81%9c%e6%ad%a2%e5%89%8a%e9%99%a4%e3%81%a7%e3%81%8d%e3%82%8b%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e5%8a%b9%e6%9e%9c%e5%a4%a7" class="header-anchor"&gt;&lt;/a&gt;条件付きで停止・削除できるサービス（効果大）
&lt;/h3&gt;&lt;p&gt;環境によっては不要、あるいは別の手段に切り替えることで大幅に軽量化できる重要ポイントです。&lt;/p&gt;
&lt;h4 id="snapdservice--snaporacle-cloud-agent-メモリ節約効果大"&gt;&lt;a href="#snapdservice--snaporacle-cloud-agent-%e3%83%a1%e3%83%a2%e3%83%aa%e7%af%80%e7%b4%84%e5%8a%b9%e6%9e%9c%e5%a4%a7" class="header-anchor"&gt;&lt;/a&gt;&lt;code&gt;snapd.service&lt;/code&gt; / &lt;code&gt;snap.oracle-cloud-agent...&lt;/code&gt; （メモリ節約効果：大）
&lt;/h4&gt;&lt;p&gt;Ubuntu のパッケージ管理システム「Snap」と、OCI の管理エージェントです。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;判断基準&lt;/strong&gt;&lt;br&gt;
OCI のダッシュボードからインスタンスのメトリック（CPU使用率のグラフなど）を見たり、OS の診断機能を使ったりしない、かつ自分で snap コマンドを使ったアプリ（Nextcloud などの Snap版）を動かす予定がない場合。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解説&lt;/strong&gt;&lt;br&gt;
oracle-cloud-agent は便利ですが、メモリが 1GB 以下の環境ではかなりの重荷になります。これらを Snap ごと削除すると、数十MB〜100MB 以上のメモリが浮きます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;完全に削除する場合のコマンド&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo snap remove oracle-cloud-agent
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt purge snapd -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="メモリ使用量の変化"&gt;&lt;a href="#%e3%83%a1%e3%83%a2%e3%83%aa%e4%bd%bf%e7%94%a8%e9%87%8f%e3%81%ae%e5%a4%89%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;メモリ使用量の変化
&lt;/h3&gt;&lt;p&gt;上記のサービスをすべて停止した場合の比較です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;サービス停止前&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ free -h
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; total used free shared buff/cache available
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Mem: 954Mi 360Mi 72Mi 4.9Mi 677Mi 594Mi
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Swap: 2.0Gi 21Mi 2.0Gi
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;サービス停止後&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ free -h
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; total used free shared buff/cache available
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Mem: 954Mi 299Mi 313Mi 4.9Mi 483Mi 655Mi
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Swap: 2.0Gi 10Mi 2.0Gi
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>OCI Bastion 経由でプライベート・サブネット内の Ubuntu インスタンスに SSH で接続</title><link>https://blog.ponkotools.com/posts/2026/05/27/oci-bastion-ubuntu/</link><pubDate>Wed, 27 May 2026 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2026/05/27/oci-bastion-ubuntu/</guid><description>&lt;p&gt;前回、Oracle Linux インスタンスへ OCI Bastion 経由で SSH 接続する手順を書きました。&lt;/p&gt;
&lt;p&gt;今回は、前回記事で触れた基本的な構成を前提に、Ubuntu インスタンスを対象とした OCI Bastion 経由の SSH 接続手順だけをまとめます。&lt;br&gt;
Oracle Linux と共通する VCN / Bastion の作成や一般的なネットワーク設定は省略し、Ubuntu 固有の注意点に絞って解説します。&lt;/p&gt;
&lt;h2 id="前提"&gt;&lt;a href="#%e5%89%8d%e6%8f%90" class="header-anchor"&gt;&lt;/a&gt;前提
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;ターゲット OCI インスタンスには Ubuntu のイメージを使う&lt;/li&gt;
&lt;li&gt;インスタンスは &lt;strong&gt;プライベートサブネット&lt;/strong&gt; に配置し、&lt;strong&gt;パブリックIPなし&lt;/strong&gt; で作成する&lt;/li&gt;
&lt;li&gt;Bastion サービスは事前に作成済みで、プライベートサブネットをターゲットにしている&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ubuntu-でのインスタンス作成時のポイント"&gt;&lt;a href="#ubuntu-%e3%81%a7%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%82%bf%e3%83%b3%e3%82%b9%e4%bd%9c%e6%88%90%e6%99%82%e3%81%ae%e3%83%9d%e3%82%a4%e3%83%b3%e3%83%88" class="header-anchor"&gt;&lt;/a&gt;Ubuntu でのインスタンス作成時のポイント
&lt;/h2&gt;&lt;h3 id="1-イメージに-ubuntu-を選択する"&gt;&lt;a href="#1-%e3%82%a4%e3%83%a1%e3%83%bc%e3%82%b8%e3%81%ab-ubuntu-%e3%82%92%e9%81%b8%e6%8a%9e%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;1. イメージに Ubuntu を選択する
&lt;/h3&gt;&lt;p&gt;インスタンス作成画面のイメージ選択で、&lt;strong&gt;Ubuntu&lt;/strong&gt; を選びます。&lt;br&gt;
OCI の無料枠対象であれば &lt;code&gt;Always Free 適格&lt;/code&gt; のマークを確認してください。&lt;br&gt;
私は今回 &lt;strong&gt;Ubuntu 24.04 Minimal&lt;/strong&gt; を選択しました。&lt;/p&gt;
&lt;h3 id="2-ネットワーキング設定"&gt;&lt;a href="#2-%e3%83%8d%e3%83%83%e3%83%88%e3%83%af%e3%83%bc%e3%82%ad%e3%83%b3%e3%82%b0%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;2. ネットワーキング設定
&lt;/h3&gt;&lt;p&gt;ここは Oracle Linux のときと同じく以下のように設定します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;プライベートサブネットを選択する&lt;/li&gt;
&lt;li&gt;パブリックIP の割当ては &lt;strong&gt;なし&lt;/strong&gt; にする&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SSH キーについても同様です。&lt;/p&gt;
&lt;h2 id="ubuntu-での-bastion-セッション作成"&gt;&lt;a href="#ubuntu-%e3%81%a7%e3%81%ae-bastion-%e3%82%bb%e3%83%83%e3%82%b7%e3%83%a7%e3%83%b3%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;Ubuntu での Bastion セッション作成
&lt;/h2&gt;&lt;p&gt;Bastion 自体は、Oracle Linux のときに作成済みなのでそれを使います。&lt;br&gt;
ただ、セッションの作成方法が異なり、Ubuntu の場合は &lt;strong&gt;管理対象 SSH セッションではなく、SSHポート転送セッションを使う&lt;/strong&gt; のが一般的です。&lt;/p&gt;
&lt;h3 id="bastion-セッションの設定"&gt;&lt;a href="#bastion-%e3%82%bb%e3%83%83%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;Bastion セッションの設定
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;OCI コンソールで「アイデンティティとセキュリティ」 &amp;gt; 「要塞（Bastion）」に移動する&lt;/li&gt;
&lt;li&gt;作成した Bastion を選択し、「セッションの作成」をクリックする&lt;/li&gt;
&lt;li&gt;以下のように設定する&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&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;セッション・タイプ&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;SSHポート転送セッション&lt;/strong&gt; を選択します。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ターゲット・ホスト&lt;/td&gt;
 &lt;td&gt;Ubuntu インスタンスをIPアドレスまたはインスタンス名で指定します。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SSH キー&lt;/td&gt;
 &lt;td&gt;ご自身のPCにある SSH 公開鍵をアップロード or ペーストするか、新規に生成します。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="330px" data-flex-grow="137" height="621" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/27/oci-bastion-ubuntu/01.webp" srcset="https://blog.ponkotools.com/posts/2026/05/27/oci-bastion-ubuntu/01_hu_4bf74bb699c3bcbb.webp 800w, https://blog.ponkotools.com/posts/2026/05/27/oci-bastion-ubuntu/01.webp 854w" width="854"&gt;&lt;/p&gt;
&lt;ol start="4"&gt;
&lt;li&gt;「セッションの作成」を実行し、状態が &lt;code&gt;アクティブ&lt;/code&gt; になるまで待つ&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="鍵のパーミッション"&gt;&lt;a href="#%e9%8d%b5%e3%81%ae%e3%83%91%e3%83%bc%e3%83%9f%e3%83%83%e3%82%b7%e3%83%a7%e3%83%b3" class="header-anchor"&gt;&lt;/a&gt;鍵のパーミッション
&lt;/h3&gt;&lt;p&gt;Linux の SSH では秘密鍵の権限が緩いと接続が拒否されます。
以下のように &lt;code&gt;chmod 600&lt;/code&gt; で制限しておきます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 例&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod &lt;span class="m"&gt;600&lt;/span&gt; ~/.ssh/&amp;lt;Ubuntuの秘密鍵&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod &lt;span class="m"&gt;600&lt;/span&gt; ~/.ssh/&amp;lt;セッションの秘密鍵&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ssh-での接続方法"&gt;&lt;a href="#ssh-%e3%81%a7%e3%81%ae%e6%8e%a5%e7%b6%9a%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;SSH での接続方法
&lt;/h2&gt;&lt;h3 id="方法１"&gt;&lt;a href="#%e6%96%b9%e6%b3%95%ef%bc%91" class="header-anchor"&gt;&lt;/a&gt;方法１
&lt;/h3&gt;&lt;p&gt;Bastion セッションがアクティブになったら、右側のメニューから「SSH コマンドのコピー」を使います。
以下のようなコマンドがコピーされます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -i &amp;lt;privateKey&amp;gt; -N -L &amp;lt;localPort&amp;gt;:10.0.1.203:22 -p &lt;span class="m"&gt;22&lt;/span&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&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;&lt;code&gt;&amp;lt;privateKey&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;セッション作成時の秘密鍵のパスを設定します。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;&amp;lt;localPort&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;基本的には 「（1024番〜65535番の間であれば）あなたのPCで現在使われていない任意のポート番号」なら何番でも自由 です。&lt;br&gt;よく使われるのは、覚えやすい 12345 や 2222、50022 などだそうです。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;上記を踏まえたうえで、まずは以下のようにコマンドを時刻します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 例&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -i ~/.ssh/bastion_id_rsa -N -L 12345:10.0.1.143:22 -p &lt;span class="m"&gt;22&lt;/span&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;すると画面が止まった（待機状態）になります。&lt;br&gt;
これでトンネルが維持されている状態ですので、このターミナル画面は閉じずにそのまま放置してください。&lt;/p&gt;
&lt;p&gt;この状態で新しく別のターミナル画面を開き、以下のコマンドを実行して Ubuntu インスタンスにログインします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -i ~/.ssh/Ubuntu作成時の秘密鍵 -p &lt;span class="m"&gt;12345&lt;/span&gt; ubuntu@localhost
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="alert alert-note"&gt;
 &lt;div class="alert-header"&gt;
 &lt;span class="alert-icon"&gt;📝&lt;/span&gt;
 &lt;span class="alert-title"&gt;注記&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="alert-body"&gt;
 &lt;p&gt;あなたのPCの 12345 番ポート（localhost:12345）に接続することが、そのままトンネルを通じて向こう側のUbuntuに繋がるため、接続先は localhost となります。&lt;br&gt;
OCI の Ubuntu インスタンスのユーザー名は &lt;code&gt;ubuntu&lt;/code&gt; なので、それを指定します。&lt;/p&gt;
 &lt;/div&gt;
 &lt;/blockquote&gt;
&lt;h3 id="方法２"&gt;&lt;a href="#%e6%96%b9%e6%b3%95%ef%bc%92" class="header-anchor"&gt;&lt;/a&gt;方法２
&lt;/h3&gt;&lt;p&gt;前述の方法だとターミナルを２つを使わないといけません。&lt;br&gt;
これをコマンド一発でやる場合、以下のように打ちます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -i &amp;lt;Ubuntuの秘密鍵&amp;gt; -o &lt;span class="nv"&gt;ProxyCommand&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ssh -i &amp;lt;セッションの秘密鍵&amp;gt; -W %h:%p -p 22 ... ubuntu@10.0.1.143
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="方法３"&gt;&lt;a href="#%e6%96%b9%e6%b3%95%ef%bc%93" class="header-anchor"&gt;&lt;/a&gt;方法３
&lt;/h3&gt;&lt;p&gt;上記のコマンドも結局めちゃくちゃ長いので、自分のPCの &lt;code&gt;~/.ssh/config&lt;/code&gt; に設定を書いてしまうのが最もスマートです。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;~/.ssh/config&lt;/code&gt; をテキストエディタで開き、以下のように追記します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 1. Bastion（要塞）自体の設定
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Host oci-bastion
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; HostName host.bastion.....oci.oraclecloud.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Port 22
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # ★セッションを作成するたびに、以下のUser（ocid...の部分）だけ書き換える
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; User ocid1.bastionsession.oc1.....amaaaaaa...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; IdentityFile ~/.ssh/セッション作成時の秘密鍵
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 2. ターゲットとなるUbuntuの設定
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Host oci-ubuntu
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; HostName 10.0.1.143
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; User ubuntu
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; IdentityFile ~/.ssh/Ubuntu作成時の秘密鍵
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ProxyCommand ssh oci-bastion -W %h:%p
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;設定した後は以下のコマンドだけで接続できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh oci-ubuntu
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;また、3時間ごとにセッションを作り直した際も、上の User の部分（ocid1.bastionsession&amp;hellip;）だけを書き換えるだけで済みます。&lt;/p&gt;
&lt;p&gt;VS Code の Remote SSH もこれで使えるようになります。&lt;/p&gt;
&lt;h2 id="ubuntu-へのログイン後に確認すること"&gt;&lt;a href="#ubuntu-%e3%81%b8%e3%81%ae%e3%83%ad%e3%82%b0%e3%82%a4%e3%83%b3%e5%be%8c%e3%81%ab%e7%a2%ba%e8%aa%8d%e3%81%99%e3%82%8b%e3%81%93%e3%81%a8" class="header-anchor"&gt;&lt;/a&gt;Ubuntu へのログイン後に確認すること
&lt;/h2&gt;&lt;p&gt;接続に成功すると、プロンプトが次のようになります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ubuntu@&amp;lt;hostname&amp;gt;:~$
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考"&gt;&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor"&gt;&lt;/a&gt;参考
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://documentation.ubuntu.com/oracle/oracle-how-to/use-bastion-to-access-VM/" target="_blank" rel="noopener"
 &gt;https://documentation.ubuntu.com/oracle/oracle-how-to/use-bastion-to-access-VM/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.oracle.com/en-us/iaas/Content/Bastion/Tasks/bastionmanaging.htm" target="_blank" rel="noopener"
 &gt;https://docs.oracle.com/en-us/iaas/Content/Bastion/Tasks/bastionmanaging.htm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://oci-tech.jp/connect-private-compute-via-oci-bastion/" target="_blank" rel="noopener"
 &gt;https://oci-tech.jp/connect-private-compute-via-oci-bastion/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>OCI (Oracle Cloud Infrastructure) で VM インスタンスを作成する</title><link>https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/</link><pubDate>Thu, 21 May 2026 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/</guid><description>&lt;h2 id="oci-oracle-cloud-infrastructure"&gt;&lt;a href="#oci-oracle-cloud-infrastructure" class="header-anchor"&gt;&lt;/a&gt;OCI (Oracle Cloud Infrastructure)
&lt;/h2&gt;&lt;p&gt;OCI には &lt;strong&gt;Always Free（永久無料枠）&lt;/strong&gt; という非常に強力な特典があり、&lt;strong&gt;4 OCPU / 24 GB メモリ&lt;/strong&gt; という、他社クラウドであれば有料級のハイスペックな Arm サーバー（Ampere A1）を無料で 24時間365日動かすことができます。&lt;/p&gt;
&lt;h3 id="oci-のコンピュート環境vm-とコンテナインスタンスの違い"&gt;&lt;a href="#oci-%e3%81%ae%e3%82%b3%e3%83%b3%e3%83%94%e3%83%a5%e3%83%bc%e3%83%88%e7%92%b0%e5%a2%83vm-%e3%81%a8%e3%82%b3%e3%83%b3%e3%83%86%e3%83%8a%e3%82%a4%e3%83%b3%e3%82%b9%e3%82%bf%e3%83%b3%e3%82%b9%e3%81%ae%e9%81%95%e3%81%84" class="header-anchor"&gt;&lt;/a&gt;OCI のコンピュート環境：VM とコンテナインスタンスの違い
&lt;/h3&gt;&lt;p&gt;OCI でアプリケーションを動かすアプローチとして、主に &lt;strong&gt;「VM Compute（仮想マシン）」&lt;/strong&gt; と &lt;strong&gt;「コンテナインスタンス（Container Instances）」&lt;/strong&gt; の 2つがあります。&lt;/p&gt;
&lt;p&gt;どちらも Docker コンテナを動かせますが、その管理レイヤーと仕様には明確な違いがあります。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;比較項目&lt;/th&gt;
 &lt;th style="text-align: left"&gt;VM Compute (仮想マシン)&lt;/th&gt;
 &lt;th style="text-align: left"&gt;コンテナインスタンス&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;管理の単位&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;OS（Linux / Windows）&lt;/td&gt;
 &lt;td style="text-align: left"&gt;コンテナ（Dockerイメージなど）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;インフラ管理&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;必要&lt;/strong&gt;（OSアップデート、SSH管理）&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;不要&lt;/strong&gt;（サーバーレス。オラクルが基盤を管理）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;起動スピード&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;数分（OSのブート時間必要）&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;数秒&lt;/strong&gt;（コンテナの起動のみ）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;永続ストレージ&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;ブロック・ボリュームを自由に追加・マウント可能&lt;/td&gt;
 &lt;td style="text-align: left"&gt;エフェメラル（一時的。再起動でデータ消滅）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;永久無料枠&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;あり（4 OCPU / 24 GBメモリまで無料）&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;なし（秒単位の従量課金）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="どちらを選ぶべきか"&gt;&lt;a href="#%e3%81%a9%e3%81%a1%e3%82%89%e3%82%92%e9%81%b8%e3%81%b6%e3%81%b9%e3%81%8d%e3%81%8b" class="header-anchor"&gt;&lt;/a&gt;どちらを選ぶべきか？
&lt;/h3&gt;&lt;p&gt;コンテナインスタンスはサーバーレスで運用が手軽ですが、永久無料枠（Always Free）の対象外となります。また、コンテナの再起動によって内部のデータが消去される特性を持ちます。&lt;/p&gt;
&lt;p&gt;そのため、&lt;strong&gt;「24時間いつでも無料で動かし続けたい」「生成されるログやデータをローカルディスクに安全に保持（永続化）したい」という場合は、VM Compute を選択するのが最適&lt;/strong&gt;です。&lt;/p&gt;
&lt;h2 id="oci-への登録"&gt;&lt;a href="#oci-%e3%81%b8%e3%81%ae%e7%99%bb%e9%8c%b2" class="header-anchor"&gt;&lt;/a&gt;OCI への登録
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://www.oracle.com/jp/cloud/free/" target="_blank" rel="noopener"
 &gt;https://www.oracle.com/jp/cloud/free/&lt;/a&gt; にアクセスして「無料で始める」をクリックして各種情報を入力します。&lt;br&gt;
ちょっとした注意事項として、住所は英語で入力する必要があります。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;参考&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://tzang.net/ja/oci-apply/" target="_blank" rel="noopener"
 &gt;https://tzang.net/ja/oci-apply/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://techblog.ap-com.co.jp/entry/2024/09/06/093000" target="_blank" rel="noopener"
 &gt;https://techblog.ap-com.co.jp/entry/2024/09/06/093000&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/kamimachi06/items/c72ac35600c0597d4524" target="_blank" rel="noopener"
 &gt;https://qiita.com/kamimachi06/items/c72ac35600c0597d4524&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="インスタンスの作成"&gt;&lt;a href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%82%bf%e3%83%b3%e3%82%b9%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;インスタンスの作成
&lt;/h2&gt;&lt;p&gt;ホームより &lt;strong&gt;インスタンス&lt;/strong&gt; を選択します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="607px" data-flex-grow="253" height="472" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/01.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/01_hu_e693b17eecf5f133.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/01.webp 1195w" width="1195"&gt;&lt;/p&gt;
&lt;p&gt;ホームにない場合は、左上のメニューから &lt;strong&gt;コンピュート &amp;gt; インスタンス&lt;/strong&gt; でも OK です。&lt;/p&gt;
&lt;p&gt;続いて &lt;strong&gt;インスタンスの作成&lt;/strong&gt; を選択します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="402px" data-flex-grow="167" height="599" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/02.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/02_hu_2a5b52be3f71e459.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/02.webp 1005w" width="1005"&gt;&lt;/p&gt;
&lt;h3 id="基本情報"&gt;&lt;a href="#%e5%9f%ba%e6%9c%ac%e6%83%85%e5%a0%b1" class="header-anchor"&gt;&lt;/a&gt;基本情報
&lt;/h3&gt;&lt;h4 id="イメージ"&gt;&lt;a href="#%e3%82%a4%e3%83%a1%e3%83%bc%e3%82%b8" class="header-anchor"&gt;&lt;/a&gt;イメージ
&lt;/h4&gt;&lt;p&gt;デフォルトでは Oracle linux になっています。&lt;br&gt;
Oracle Linux は Red Hat Enterprise Linux（RHEL）をベースにした OS だそうです。&lt;/p&gt;
&lt;p&gt;セキュリティの「保護インスタンス」は、仮想マシン（VM）の乗っ取りや、悪意のあるプログラムによるOS改ざんを防ぐための「セキュリティ強化機能が有効になっている状態」を指すそうですので、保護インスタンスになっているものを選択しておいたほうが良さそうです。&lt;/p&gt;
&lt;h4 id="シェイプ"&gt;&lt;a href="#%e3%82%b7%e3%82%a7%e3%82%a4%e3%83%97" class="header-anchor"&gt;&lt;/a&gt;シェイプ
&lt;/h4&gt;&lt;p&gt;Always Free 対象のものとして以下の２つがあります。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;項目&lt;/th&gt;
 &lt;th&gt;Ampere (A1.Flex)&lt;/th&gt;
 &lt;th&gt;AMD (E2.1.Micro)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;最大リソース&lt;/td&gt;
 &lt;td&gt;4 OCPU / 24 GB（分配可能）&lt;/td&gt;
 &lt;td&gt;1 OCPU / 1 GB × 2台&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;アーキテクチャ&lt;/td&gt;
 &lt;td&gt;Arm (aarch64)&lt;/td&gt;
 &lt;td&gt;x86_64&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;主な用途&lt;/td&gt;
 &lt;td&gt;開発環境、Docker、高負荷な処理、Webサーバー&lt;/td&gt;
 &lt;td&gt;軽量なスクリプト実行、VPNサーバー、検証用&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;VM.Standard.A1.Flex&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;現在OCIで提供されている中で最もハイスペックかつ使い勝手の良い無料枠インスタンスです。&lt;br&gt;
&lt;strong&gt;Ampere&lt;/strong&gt; を選択し、&lt;strong&gt;VM.Standard.A1.Flex&lt;/strong&gt; をチェックします。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="467px" data-flex-grow="194" height="666" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/03-1.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/03-1_hu_f43726e3dff82e49.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/03-1.webp 1296w" width="1296"&gt;&lt;/p&gt;
&lt;p&gt;シェイプ名横の ▼ を押すと CPU と RAM の設定ができます。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="455px" data-flex-grow="189" height="570" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/03-3.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/03-3_hu_cb161b4a08e3cb5b.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/03-3.webp 1082w" width="1082"&gt;&lt;/p&gt;
&lt;p&gt;「4 OCPU / 24 GB」までは無料で使えるらしいです。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;VM.Standard.E2.1.Micro&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ampere A1 は人気のため、空きがなくて作成できないことが多いです。&lt;br&gt;
また、システムが Arm（Aarch64）アーキテクチャに対応しておらず、どうしても従来の x86_64 環境が必要な場合もあったりします。&lt;br&gt;
そのような場合はこちらを選びます。&lt;br&gt;
ただし、スペックは Ampere A1 に比べて大幅に低くなります。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;専門と前世代&lt;/strong&gt; を選択し、&lt;strong&gt;VM.Standard.E2.1.Micro&lt;/strong&gt; をチェックします。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="411px" data-flex-grow="171" height="762" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/03-2.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/03-2_hu_948bb4cca6084069.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/03-2.webp 1306w" width="1306"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;上記のうち好きな方を選び、次へを押します。&lt;/p&gt;
&lt;h3 id="セキュリティ"&gt;&lt;a href="#%e3%82%bb%e3%82%ad%e3%83%a5%e3%83%aa%e3%83%86%e3%82%a3" class="header-anchor"&gt;&lt;/a&gt;セキュリティ
&lt;/h3&gt;&lt;p&gt;保護インスタンスの設定ができますが、予期せぬエラーや「動かない」トラブルの原因になりやすいそうなので、今回は OFF のままとしました。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="506px" data-flex-grow="211" height="548" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/05.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/05_hu_5e0e0a49f3828ea0.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/05.webp 1157w" width="1157"&gt;&lt;/p&gt;
&lt;h3 id="ネットワーキング"&gt;&lt;a href="#%e3%83%8d%e3%83%83%e3%83%88%e3%83%af%e3%83%bc%e3%82%ad%e3%83%b3%e3%82%b0" class="header-anchor"&gt;&lt;/a&gt;ネットワーキング
&lt;/h3&gt;&lt;h4 id="プライマリvnic"&gt;&lt;a href="#%e3%83%97%e3%83%a9%e3%82%a4%e3%83%9e%e3%83%aavnic" class="header-anchor"&gt;&lt;/a&gt;プライマリVNIC
&lt;/h4&gt;&lt;p&gt;初めて OCI を使うので、まだ「既存のネットワーク」が存在しないため、新しく &lt;strong&gt;新規仮想クラウド・ネットワーク&lt;/strong&gt; を選択します。
サブネットも自動的に &lt;strong&gt;新規パブリック・サブネットの作成&lt;/strong&gt; に切り替わり、名前などが自動入力されます。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="392px" data-flex-grow="163" height="708" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/06-1.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/06-1_hu_8ff9b9a5a1b5b81a.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/06-1.webp 1158w" width="1158"&gt;&lt;/p&gt;
&lt;p&gt;２回目は既存のネットワークを選択すれば OK です。&lt;/p&gt;
&lt;h4 id="パブリックipv4アドレス割当て"&gt;&lt;a href="#%e3%83%91%e3%83%96%e3%83%aa%e3%83%83%e3%82%afipv4%e3%82%a2%e3%83%89%e3%83%ac%e3%82%b9%e5%89%b2%e5%bd%93%e3%81%a6" class="header-anchor"&gt;&lt;/a&gt;パブリックIPv4アドレス割当て
&lt;/h4&gt;&lt;p&gt;今回は外部からの通信（インバウンド）を受ける必要はないため、 &lt;strong&gt;パブリックIPv4アドレスの割当て&lt;/strong&gt; は &lt;strong&gt;OFF&lt;/strong&gt; にしておきました。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="317px" data-flex-grow="132" height="879" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/06-2.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/06-2_hu_2a95284a5cafcb5f.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/06-2.webp 1162w" width="1162"&gt;&lt;/p&gt;
&lt;h4 id="sshキーの追加"&gt;&lt;a href="#ssh%e3%82%ad%e3%83%bc%e3%81%ae%e8%bf%bd%e5%8a%a0" class="header-anchor"&gt;&lt;/a&gt;SSHキーの追加
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;キー・ペアを自動で生成&lt;/strong&gt; を選択し、&lt;strong&gt;秘密キーのダウンロード&lt;/strong&gt; を押して秘密鍵をダウンロードしておきます。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="714px" data-flex-grow="297" height="330" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/06-3.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/06-3_hu_65217d3dc1d492e2.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/06-3.webp 982w" width="982"&gt;&lt;/p&gt;
&lt;blockquote class="alert alert-note"&gt;
 &lt;div class="alert-header"&gt;
 &lt;span class="alert-icon"&gt;📝&lt;/span&gt;
 &lt;span class="alert-title"&gt;注記&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="alert-body"&gt;
 &lt;p&gt;SSH キーなしを選択すると、後述するように Cloud Shell からもインスタンスにアクセスできませんでした。
外部から SSH でアクセスする予定がなくても SSH キーは作成しておかないといけないようです。&lt;/p&gt;
 &lt;/div&gt;
 &lt;/blockquote&gt;
&lt;h3 id="ストレージ"&gt;&lt;a href="#%e3%82%b9%e3%83%88%e3%83%ac%e3%83%bc%e3%82%b8" class="header-anchor"&gt;&lt;/a&gt;ストレージ
&lt;/h3&gt;&lt;p&gt;ここは全てデフォルトのままとしました。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="449px" data-flex-grow="187" height="631" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/07.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/07_hu_950aba20468a9cd0.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/07.webp 1182w" width="1182"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;「カスタム・ブート・ボリューム・サイズ&amp;hellip;」について&lt;/strong&gt;
チェックがOFF（デフォルト）の場合、標準サイズである 46.6 GB のディスクが自動で割り当てられます。&lt;br&gt;
OCIの無料枠では最大で合計200GBまでストレージが使え、ここにチェックを入れて数値を 100 や 200 に増やすことも可能です。&lt;br&gt;
ただ、後からでもディスクサイズは簡単に拡張できるため、最初はデフォルトのままで様子見するのが安全です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;「転送中暗号化の使用」について&lt;/strong&gt;
デフォルトでONになっていますが、これは「仮想マシンとストレージの間の通信を暗号化して盗聴を防ぐ」というインフラ側の高度な保護機能です。&lt;br&gt;
パフォーマンスへの影響も無視できるレベルですので、ON（今の状態）のままにしておきましょう。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;「自分が管理するキーでこのボリュームを暗号化」について&lt;/strong&gt;
チェックがOFF（デフォルト）の場合、Oracleが管理する標準の暗号鍵で自動的にディスクが暗号化されます。&lt;br&gt;
個人開発で自前の鍵管理（Vault/KMSなど）を入れると管理コストが増えて複雑になるため、OFFのままで問題ありません。&lt;/p&gt;
&lt;h3 id="作成"&gt;&lt;a href="#%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;作成
&lt;/h3&gt;&lt;p&gt;次へ進み、&lt;strong&gt;「作成」&lt;/strong&gt; を押すとインスタンスが作成されます。&lt;br&gt;
しばらく待つとインスタンスが作成されます（ステータス表示が &lt;strong&gt;実行中&lt;/strong&gt; に変わります）。&lt;/p&gt;
&lt;h3 id="api-エラーが発生した場合"&gt;&lt;a href="#api-%e3%82%a8%e3%83%a9%e3%83%bc%e3%81%8c%e7%99%ba%e7%94%9f%e3%81%97%e3%81%9f%e5%a0%b4%e5%90%88" class="header-anchor"&gt;&lt;/a&gt;API エラーが発生した場合
&lt;/h3&gt;&lt;p&gt;これは設定の間違いではなく、「現在、Oracleのデータセンター側で、無料枠用のArmサーバー（Ampere）の在庫が一時的に切れている」 という、OCIの無料枠で最も頻繁に発生する有名な現象です。&lt;br&gt;
世界中で無料枠のAmpereは非常に人気があるため、椅子取りゲームのようになっています。&lt;/p&gt;
&lt;p&gt;解決策は以下です。&lt;/p&gt;
&lt;h4 id="1x86のamd枠に切り替えて即時作成する確実おすすめ"&gt;&lt;a href="#1x86%e3%81%aeamd%e6%9e%a0%e3%81%ab%e5%88%87%e3%82%8a%e6%9b%bf%e3%81%88%e3%81%a6%e5%8d%b3%e6%99%82%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b%e7%a2%ba%e5%ae%9f%e3%81%8a%e3%81%99%e3%81%99%e3%82%81" class="header-anchor"&gt;&lt;/a&gt;1：x86の「AMD枠」に切り替えて即時作成する（確実・おすすめ）
&lt;/h4&gt;&lt;p&gt;Arm（Ampere）の在庫がなくても、もう1つの無料枠であるAMD（VM.Standard.E2.1.Micro）であれば、在庫に余裕がありすんなり作成できるケースが非常に多いです。&lt;/p&gt;
&lt;h4 id="2フォルトドメインを変更して再トライする"&gt;&lt;a href="#2%e3%83%95%e3%82%a9%e3%83%ab%e3%83%88%e3%83%89%e3%83%a1%e3%82%a4%e3%83%b3%e3%82%92%e5%a4%89%e6%9b%b4%e3%81%97%e3%81%a6%e5%86%8d%e3%83%88%e3%83%a9%e3%82%a4%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;2：「フォルト・ドメイン」を変更して再トライする
&lt;/h4&gt;&lt;p&gt;同じAmpere（Arm）のまま、サーバーが置かれる物理的な区画（フォルト・ドメイン）を変更することで、運よく在庫が引っかかることがあります。&lt;/p&gt;
&lt;h4 id="3数日数週間時間を変えてクリックし続ける"&gt;&lt;a href="#3%e6%95%b0%e6%97%a5%e6%95%b0%e9%80%b1%e9%96%93%e6%99%82%e9%96%93%e3%82%92%e5%a4%89%e3%81%88%e3%81%a6%e3%82%af%e3%83%aa%e3%83%83%e3%82%af%e3%81%97%e7%b6%9a%e3%81%91%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;3：数日〜数週間、時間を変えてクリックし続ける
&lt;/h4&gt;&lt;p&gt;どうしても強力な「Arm（4 OCPU / 24 GBを狙いたいなど）」が良い場合、誰かがインスタンスを削除して在庫が空くのを待つことになります。&lt;/p&gt;
&lt;h2 id="インスタンスの起動"&gt;&lt;a href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%82%bf%e3%83%b3%e3%82%b9%e3%81%ae%e8%b5%b7%e5%8b%95" class="header-anchor"&gt;&lt;/a&gt;インスタンスの起動
&lt;/h2&gt;&lt;p&gt;コンピュートの画面から &lt;strong&gt;インスタンス&lt;/strong&gt; を選択し、該当のインスタンスをクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="591px" data-flex-grow="246" height="438" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/08-1.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/08-1_hu_4c5916a94a5f5af9.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/08-1.webp 1080w" width="1080"&gt;&lt;/p&gt;
&lt;p&gt;右上から起動を押します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="593px" data-flex-grow="247" height="327" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/08-2.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/08-2_hu_341b4d1921dff504.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/08-2.webp 808w" width="808"&gt;&lt;/p&gt;
&lt;p&gt;これでしばらく待つとインスタンスが起動します。&lt;/p&gt;
&lt;h2 id="インスタンスへ接続cloud-shell-で接続"&gt;&lt;a href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%82%bf%e3%83%b3%e3%82%b9%e3%81%b8%e6%8e%a5%e7%b6%9acloud-shell-%e3%81%a7%e6%8e%a5%e7%b6%9a" class="header-anchor"&gt;&lt;/a&gt;インスタンスへ接続（Cloud Shell で接続）
&lt;/h2&gt;&lt;p&gt;OCI 上から Cloud Shell でインスタンスに接続してみます。&lt;/p&gt;
&lt;h3 id="cloud-shell-の起動"&gt;&lt;a href="#cloud-shell-%e3%81%ae%e8%b5%b7%e5%8b%95" class="header-anchor"&gt;&lt;/a&gt;Cloud Shell の起動
&lt;/h3&gt;&lt;p&gt;画面右上の &lt;strong&gt;開発者ツール&lt;/strong&gt; をクリックし、&lt;strong&gt;Cloud Shell&lt;/strong&gt; を選択します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="483px" data-flex-grow="201" height="141" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/10-1.webp" width="284"&gt;&lt;/p&gt;
&lt;p&gt;画面下に端末が表示されますが、まだインスタンスの中には入っていません。&lt;br&gt;
Cloud Shell が単体で起動しただけです。&lt;/p&gt;
&lt;h3 id="ネットワークの変更"&gt;&lt;a href="#%e3%83%8d%e3%83%83%e3%83%88%e3%83%af%e3%83%bc%e3%82%af%e3%81%ae%e5%a4%89%e6%9b%b4" class="header-anchor"&gt;&lt;/a&gt;ネットワークの変更
&lt;/h3&gt;&lt;p&gt;端末上部の「ネットワーク：パブリック」と表示されたプルダウンから「エフェメラル・プライベートネット・・・」を選択します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="402px" data-flex-grow="167" height="192" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/10-2.webp" width="322"&gt;&lt;/p&gt;
&lt;p&gt;インスタンス作成時に作成した VCN とサブネットを選択し、&lt;strong&gt;アクティブなネットワークとして使用&lt;/strong&gt; を押します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="273px" data-flex-grow="114" height="538" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/10-3.webp" width="614"&gt;&lt;/p&gt;
&lt;h3 id="秘密鍵ファイルのアップロード"&gt;&lt;a href="#%e7%a7%98%e5%af%86%e9%8d%b5%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e3%82%a2%e3%83%83%e3%83%97%e3%83%ad%e3%83%bc%e3%83%89" class="header-anchor"&gt;&lt;/a&gt;秘密鍵ファイルのアップロード
&lt;/h3&gt;&lt;p&gt;先程ダウンロードした秘密鍵ファイルを端末上にドラッグ＆ドロップしてアップロードします。&lt;/p&gt;
&lt;p&gt;Linux のルールとして、秘密鍵の権限が緩いままだとSSH接続が拒否されてしまうため、以下のコマンドでパーミッションを変更します。
（※ファイル名はご自身のものに書き換えてください）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod 600 ssh-key-xxxx.key
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="ssh-コマンドでログインする"&gt;&lt;a href="#ssh-%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89%e3%81%a7%e3%83%ad%e3%82%b0%e3%82%a4%e3%83%b3%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;SSH コマンドでログインする
&lt;/h3&gt;&lt;p&gt;以上で準備は完了です。&lt;br&gt;
以下のコマンドで Cloud Shell インスタンスへと接続します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -i ssh-key-xxxx.key &amp;lt;username&amp;gt;@&amp;lt;private_ip_address&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;&amp;lt;username&amp;gt;&lt;/code&gt; は、インスタンスのデフォルトのユーザー名です。&lt;br&gt;
Oracle Linux および Redhat Enterprise Linux 互換イメージの場合、デフォルトのユーザー名は &lt;code&gt;opc&lt;/code&gt;、Ubuntu イメージの場合、デフォルトのユーザー名は &lt;code&gt;ubuntu&lt;/code&gt; だそうです。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;private_ip_address&amp;gt;&lt;/code&gt; は接続先インスタンスのプライベートIPアドレスです。&lt;br&gt;
&lt;strong&gt;コンピュート &amp;gt; インスタンス&lt;/strong&gt; で確認できます。&lt;code&gt;10.0.x.x&lt;/code&gt; のような数字を入れてください。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px"&gt;&lt;/p&gt;
&lt;p&gt;コマンド入力後、&lt;code&gt;Are you sure you want to continue connecting (yes/no)?&lt;/code&gt; と聞かれたら、 &lt;code&gt;yes&lt;/code&gt; と入力してEnterを押します。&lt;/p&gt;
&lt;p&gt;無事にプロンプトが &lt;code&gt;&amp;lt;username&amp;gt;@instance-xxxx:~$&lt;/code&gt; に切り替われば、インスタンスに接続できています。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;とりあえずはここまで。&lt;/p&gt;
&lt;h2 id="参考"&gt;&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor"&gt;&lt;/a&gt;参考
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.clinks.jp/column/oci/1983/" target="_blank" rel="noopener"
 &gt;https://www.clinks.jp/column/oci/1983/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://oracle-japan.github.io/ocitutorials/beginners/creating-compute-instance/" target="_blank" rel="noopener"
 &gt;https://oracle-japan.github.io/ocitutorials/beginners/creating-compute-instance/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.reqtc.com/blog/oci-ssh.html" target="_blank" rel="noopener"
 &gt;https://www.reqtc.com/blog/oci-ssh.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>GitHub CLI (gh) のインストールと基本的な使い方</title><link>https://blog.ponkotools.com/posts/2026/05/09/github-cli/</link><pubDate>Sat, 09 May 2026 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2026/05/09/github-cli/</guid><description>&lt;p&gt;GitHub CLI (&lt;code&gt;gh&lt;/code&gt;) は、GitHub が公式に提供しているコマンドラインツールです。&lt;/p&gt;
&lt;p&gt;ブラウザを開かなくても、リポジトリの clone、Issue の確認、Pull Request の作成、GitHub Actions の実行状況確認などをターミナルから操作できます。Git と組み合わせて使うと、日常の GitHub 作業をかなり短い導線にできます。&lt;/p&gt;
&lt;p&gt;この記事では、Windows と Ubuntu で &lt;code&gt;gh&lt;/code&gt; をインストールし、最初に覚えておくと便利な基本コマンドをまとめます。&lt;/p&gt;
&lt;h2 id="gh-でできること"&gt;&lt;a href="#gh-%e3%81%a7%e3%81%a7%e3%81%8d%e3%82%8b%e3%81%93%e3%81%a8" class="header-anchor"&gt;&lt;/a&gt;gh でできること
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;gh&lt;/code&gt; を使うと、たとえば以下のような作業をターミナルから実行できます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GitHub へのログイン&lt;/li&gt;
&lt;li&gt;リポジトリの clone / 作成 / 表示&lt;/li&gt;
&lt;li&gt;Issue の一覧表示 / 作成 / 表示&lt;/li&gt;
&lt;li&gt;Pull Request の一覧表示 / 作成 / checkout / merge&lt;/li&gt;
&lt;li&gt;GitHub Actions の workflow / run の確認&lt;/li&gt;
&lt;li&gt;ブラウザで現在のリポジトリや PR を開く&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GitHub の画面を見に行く回数を減らせるので、コードを書いている流れを止めにくいのが大きなメリットです。&lt;/p&gt;
&lt;h2 id="インストール"&gt;&lt;a href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;インストール
&lt;/h2&gt;&lt;h3 id="windows-にインストールする"&gt;&lt;a href="#windows-%e3%81%ab%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;Windows にインストールする
&lt;/h3&gt;&lt;p&gt;Windows では、公式手順として WinGet を使う方法が一番簡単です。&lt;/p&gt;
&lt;p&gt;PowerShell または Windows Terminal を開いて、以下を実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;winget&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-id&lt;/span&gt; &lt;span class="n"&gt;GitHub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;cli
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;インストール後、ターミナルを開き直して確認します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;gh&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;バージョン情報が表示されればインストール完了です。&lt;/p&gt;
&lt;p&gt;アップデートする場合は以下です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;winget&lt;/span&gt; &lt;span class="n"&gt;upgrade&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-id&lt;/span&gt; &lt;span class="n"&gt;GitHub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;cli
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;もし WinGet を使わない場合は、GitHub CLI の Releases ページから MSI インストーラーをダウンロードして導入することもできます。&lt;/p&gt;
&lt;h3 id="ubuntu-にインストールする"&gt;&lt;a href="#ubuntu-%e3%81%ab%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;Ubuntu にインストールする
&lt;/h3&gt;&lt;p&gt;Ubuntu では、標準の apt リポジトリからそのままインストールできます。&lt;/p&gt;
&lt;p&gt;まずパッケージ情報を更新してから、&lt;code&gt;gh&lt;/code&gt; をインストールします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install gh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;確認します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh --version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;アップデートする場合は、通常の apt パッケージと同じです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install gh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;もし apt で見つからない場合や、GitHub CLI の最新版を追いたい場合は、GitHub CLI 公式リポジトリを追加する方法もあります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;type&lt;/span&gt; -p wget &amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;sudo apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt install wget -y&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mkdir -p -m &lt;span class="m"&gt;755&lt;/span&gt; /etc/apt/keyrings
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget -nv -O /tmp/githubcli-archive-keyring.gpg https://cli.github.com/packages/githubcli-archive-keyring.gpg
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo cp /tmp/githubcli-archive-keyring.gpg /etc/apt/keyrings/githubcli-archive-keyring.gpg
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mkdir -p -m &lt;span class="m"&gt;755&lt;/span&gt; /etc/apt/sources.list.d
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;deb [arch=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/apt/sources.list.d/github-cli.list &amp;gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install gh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;通常利用なら、まずは &lt;code&gt;sudo apt install gh&lt;/code&gt; で十分です。&lt;/p&gt;
&lt;h2 id="初期設定-github-にログインする"&gt;&lt;a href="#%e5%88%9d%e6%9c%9f%e8%a8%ad%e5%ae%9a-github-%e3%81%ab%e3%83%ad%e3%82%b0%e3%82%a4%e3%83%b3%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;初期設定: GitHub にログインする
&lt;/h2&gt;&lt;p&gt;インストールできたら、GitHub アカウントでログインします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh auth login
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;対話形式でいくつか質問されます。個人利用で GitHub.com を使うなら、だいたい以下の選択で問題ありません。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;? Where do you use GitHub? GitHub.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;? What is your preferred protocol for Git operations? HTTPS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;? Authenticate Git with your GitHub credentials? Yes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;? How would you like to authenticate GitHub CLI? Login with a web browser
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ポイントは、&lt;code&gt;Authenticate Git with your GitHub credentials?&lt;/code&gt; で &lt;code&gt;Yes&lt;/code&gt; を選ぶことです。これにより、&lt;code&gt;gh&lt;/code&gt; だけでなく通常の &lt;code&gt;git push&lt;/code&gt; や &lt;code&gt;git fetch&lt;/code&gt; の HTTPS 認証も &lt;code&gt;gh&lt;/code&gt; に任せられます。&lt;/p&gt;
&lt;p&gt;ブラウザが開いたら GitHub にログインして認証します。WSL やサーバー上などブラウザを開きにくい環境では、表示されたワンタイムコードを手元のブラウザで入力して認証します。&lt;/p&gt;
&lt;p&gt;ログイン状態は以下で確認できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh auth status
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="普通の-git-コマンドでも-gh-の認証情報は使われる"&gt;&lt;a href="#%e6%99%ae%e9%80%9a%e3%81%ae-git-%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89%e3%81%a7%e3%82%82-gh-%e3%81%ae%e8%aa%8d%e8%a8%bc%e6%83%85%e5%a0%b1%e3%81%af%e4%bd%bf%e3%82%8f%e3%82%8c%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;普通の git コマンドでも gh の認証情報は使われる？
&lt;/h2&gt;&lt;p&gt;使われます。ただし、&lt;code&gt;gh auth login&lt;/code&gt; の途中で以下を選んでいることが前提です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;? Authenticate Git with your GitHub credentials? Yes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この設定を有効にすると、&lt;code&gt;gh&lt;/code&gt; が Git の credential helper として設定されます。そのため、以下のような普通の Git コマンドでも、&lt;code&gt;gh&lt;/code&gt; でログインした認証情報が利用されます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git fetch origin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git pull
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git push origin main
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;確認するには、Git の credential helper 設定を見ます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global --get credential.helper
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;環境によって表示は少し違いますが、&lt;code&gt;gh auth git-credential&lt;/code&gt; を使う設定になっていれば OK です。&lt;/p&gt;
&lt;p&gt;注意点として、この仕組みが使われるのは基本的に HTTPS の remote URL です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git remote -v
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;remote URL が以下のようになっていれば、HTTPS 経由です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;origin https://github.com/OWNER/REPO.git (fetch)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;origin https://github.com/OWNER/REPO.git (push)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一方で、&lt;code&gt;git@github.com:OWNER/REPO.git&lt;/code&gt; のような SSH の remote URL を使っている場合は、Git の認証は SSH key 側で行われます。この場合でも &lt;code&gt;gh&lt;/code&gt; コマンド自体の GitHub API 操作には、&lt;code&gt;gh auth login&lt;/code&gt; の認証情報が使われます。&lt;/p&gt;
&lt;h2 id="よく使う基本コマンド"&gt;&lt;a href="#%e3%82%88%e3%81%8f%e4%bd%bf%e3%81%86%e5%9f%ba%e6%9c%ac%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89" class="header-anchor"&gt;&lt;/a&gt;よく使う基本コマンド
&lt;/h2&gt;&lt;p&gt;ここからは、最初に覚えておくと便利なコマンドです。&lt;/p&gt;
&lt;h3 id="リポジトリ操作"&gt;&lt;a href="#%e3%83%aa%e3%83%9d%e3%82%b8%e3%83%88%e3%83%aa%e6%93%8d%e4%bd%9c" class="header-anchor"&gt;&lt;/a&gt;リポジトリ操作
&lt;/h3&gt;&lt;p&gt;リポジトリを clone します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh repo clone OWNER/REPO
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;たとえば GitHub CLI 本体のリポジトリなら以下です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh repo clone cli/cli
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;現在のリポジトリをブラウザで開きます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh repo view --web
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;新しいリポジトリを作成します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh repo create
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;対話形式で公開範囲やローカルディレクトリの扱いを選べます。スクリプト化したい場合は、&lt;code&gt;--public&lt;/code&gt; や &lt;code&gt;--private&lt;/code&gt; などのオプションを付けて実行できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh repo create my-app --private --source&lt;span class="o"&gt;=&lt;/span&gt;. --remote&lt;span class="o"&gt;=&lt;/span&gt;origin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="issue-操作"&gt;&lt;a href="#issue-%e6%93%8d%e4%bd%9c" class="header-anchor"&gt;&lt;/a&gt;Issue 操作
&lt;/h3&gt;&lt;p&gt;Issue の一覧を表示します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh issue list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Issue の詳細を表示します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh issue view &lt;span class="m"&gt;123&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Issue を作成します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh issue create --title &lt;span class="s2"&gt;&amp;#34;ログイン画面の文言を修正する&amp;#34;&lt;/span&gt; --body &lt;span class="s2"&gt;&amp;#34;ボタンの表記を変更する&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ブラウザで Issue を開きたい場合は &lt;code&gt;--web&lt;/code&gt; を付けます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh issue view &lt;span class="m"&gt;123&lt;/span&gt; --web
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="pull-request-操作"&gt;&lt;a href="#pull-request-%e6%93%8d%e4%bd%9c" class="header-anchor"&gt;&lt;/a&gt;Pull Request 操作
&lt;/h3&gt;&lt;p&gt;Pull Request の一覧を表示します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh pr list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;現在のブランチから Pull Request を作成します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh pr create
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;コミットメッセージやブランチ情報からタイトル・本文を自動入力したい場合は &lt;code&gt;--fill&lt;/code&gt; が便利です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh pr create --fill
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pull Request の詳細を表示します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh pr view &lt;span class="m"&gt;123&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pull Request のブランチをローカルに checkout します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh pr checkout &lt;span class="m"&gt;123&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;レビューや CI の状態を確認します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh pr checks &lt;span class="m"&gt;123&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;マージします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh pr merge &lt;span class="m"&gt;123&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="github-actions-操作"&gt;&lt;a href="#github-actions-%e6%93%8d%e4%bd%9c" class="header-anchor"&gt;&lt;/a&gt;GitHub Actions 操作
&lt;/h3&gt;&lt;p&gt;workflow の一覧を表示します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh workflow list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行履歴を表示します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh run list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最新の workflow run を確認します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh run view
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行中の workflow を待ちます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh run watch
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;失敗したジョブのログを確認する場合は、まず &lt;code&gt;gh run list&lt;/code&gt; で run ID を確認してから以下を実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh run view RUN_ID --log-failed
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="便利な使い方"&gt;&lt;a href="#%e4%be%bf%e5%88%a9%e3%81%aa%e4%bd%bf%e3%81%84%e6%96%b9" class="header-anchor"&gt;&lt;/a&gt;便利な使い方
&lt;/h2&gt;&lt;h3 id="現在のページをブラウザで開く"&gt;&lt;a href="#%e7%8f%be%e5%9c%a8%e3%81%ae%e3%83%9a%e3%83%bc%e3%82%b8%e3%82%92%e3%83%96%e3%83%a9%e3%82%a6%e3%82%b6%e3%81%a7%e9%96%8b%e3%81%8f" class="header-anchor"&gt;&lt;/a&gt;現在のページをブラウザで開く
&lt;/h3&gt;&lt;p&gt;現在のリポジトリを GitHub 上で開きます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh browse
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Issue や PR の URL を組み立てる必要がないので、地味に便利です。&lt;/p&gt;
&lt;h3 id="自分に関係する状況をまとめて見る"&gt;&lt;a href="#%e8%87%aa%e5%88%86%e3%81%ab%e9%96%a2%e4%bf%82%e3%81%99%e3%82%8b%e7%8a%b6%e6%b3%81%e3%82%92%e3%81%be%e3%81%a8%e3%82%81%e3%81%a6%e8%a6%8b%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;自分に関係する状況をまとめて見る
&lt;/h3&gt;&lt;p&gt;自分に関連する Issue、PR、レビュー依頼などを確認できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh status
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;朝の作業開始時に一度実行すると、見るべきものをざっと把握できます。&lt;/p&gt;
&lt;h3 id="エイリアスを作る"&gt;&lt;a href="#%e3%82%a8%e3%82%a4%e3%83%aa%e3%82%a2%e3%82%b9%e3%82%92%e4%bd%9c%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;エイリアスを作る
&lt;/h3&gt;&lt;p&gt;よく使うコマンドは短い別名を付けられます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh &lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; prs &lt;span class="s1"&gt;&amp;#39;pr list --author @me&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh prs
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この例では、自分が作成した Pull Request 一覧を &lt;code&gt;gh prs&lt;/code&gt; で表示できます。&lt;/p&gt;
&lt;h2 id="windows-と-ubuntu-で共通して気をつけること"&gt;&lt;a href="#windows-%e3%81%a8-ubuntu-%e3%81%a7%e5%85%b1%e9%80%9a%e3%81%97%e3%81%a6%e6%b0%97%e3%82%92%e3%81%a4%e3%81%91%e3%82%8b%e3%81%93%e3%81%a8" class="header-anchor"&gt;&lt;/a&gt;Windows と Ubuntu で共通して気をつけること
&lt;/h2&gt;&lt;h3 id="ターミナルを開き直す"&gt;&lt;a href="#%e3%82%bf%e3%83%bc%e3%83%9f%e3%83%8a%e3%83%ab%e3%82%92%e9%96%8b%e3%81%8d%e7%9b%b4%e3%81%99" class="header-anchor"&gt;&lt;/a&gt;ターミナルを開き直す
&lt;/h3&gt;&lt;p&gt;Windows ではインストーラーが PATH を更新します。&lt;code&gt;gh&lt;/code&gt; が見つからない場合は、Windows Terminal や PowerShell を開き直してください。&lt;/p&gt;
&lt;p&gt;Ubuntu でも、インストール後にシェルがコマンドの場所をキャッシュしている場合があります。うまく認識されないときは、ターミナルを開き直すか &lt;code&gt;hash -r&lt;/code&gt; を実行します。&lt;/p&gt;
&lt;h3 id="git-の認証方式をそろえる"&gt;&lt;a href="#git-%e3%81%ae%e8%aa%8d%e8%a8%bc%e6%96%b9%e5%bc%8f%e3%82%92%e3%81%9d%e3%82%8d%e3%81%88%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;Git の認証方式をそろえる
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;gh auth login&lt;/code&gt; で HTTPS を選び、Git の認証にも &lt;code&gt;gh&lt;/code&gt; を使う設定にした場合、リモート URL も HTTPS にしておくと扱いやすいです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git remote -v
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git remote set-url origin https://github.com/OWNER/REPO.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;SSH を使いたい場合は、&lt;code&gt;gh auth login&lt;/code&gt; の対話で SSH を選び、SSH key の登録も &lt;code&gt;gh&lt;/code&gt; に任せることができます。HTTPS と SSH のどちらでも使えますが、チームや自分の環境で片方に寄せておくとトラブルシュートが楽です。&lt;/p&gt;
&lt;h3 id="github-enterprise-server-を使う場合"&gt;&lt;a href="#github-enterprise-server-%e3%82%92%e4%bd%bf%e3%81%86%e5%a0%b4%e5%90%88" class="header-anchor"&gt;&lt;/a&gt;GitHub Enterprise Server を使う場合
&lt;/h3&gt;&lt;p&gt;会社などで GitHub Enterprise Server を使っている場合は、ホスト名を指定してログインします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh auth login --hostname github.example.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;通常の GitHub.com とは認証先が別になるため、&lt;code&gt;gh auth status&lt;/code&gt; でどのホストにログインしているか確認しておくと安心です。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;&lt;a href="#%e3%81%be%e3%81%a8%e3%82%81" class="header-anchor"&gt;&lt;/a&gt;まとめ
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;gh&lt;/code&gt; を入れておくと、GitHub 上の操作をターミナルから自然に扱えるようになります。&lt;/p&gt;
&lt;p&gt;まずは以下の流れだけ覚えておけば十分です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh auth login
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh repo clone OWNER/REPO
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh issue list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh pr list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh pr create --fill
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh run list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;慣れてきたら &lt;code&gt;gh pr checkout&lt;/code&gt;、&lt;code&gt;gh pr checks&lt;/code&gt;、&lt;code&gt;gh run watch&lt;/code&gt; あたりを使うと、Pull Request と CI の確認がかなり楽になります。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://cli.github.com/" target="_blank" rel="noopener"
 &gt;GitHub CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://cli.github.com/manual/" target="_blank" rel="noopener"
 &gt;GitHub CLI Manual&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/cli/cli/blob/trunk/docs/install_windows.md" target="_blank" rel="noopener"
 &gt;Installing gh on Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/cli/cli/blob/trunk/docs/install_linux.md" target="_blank" rel="noopener"
 &gt;Installing gh on Linux and BSD&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ubuntu のユーザー名を変更する</title><link>https://blog.ponkotools.com/posts/2024/04/02/ubuntu/</link><pubDate>Tue, 02 Apr 2024 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2024/04/02/ubuntu/</guid><description>&lt;p&gt;Ubuntu 20.04 で確認しました。&lt;/p&gt;
&lt;h2 id="新しいユーザーを作成する"&gt;&lt;a href="#%e6%96%b0%e3%81%97%e3%81%84%e3%83%a6%e3%83%bc%e3%82%b6%e3%83%bc%e3%82%92%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;新しいユーザーを作成する
&lt;/h2&gt;&lt;p&gt;ログインユーザー自身のユーザー名は変更できないので、一時的に管理者権限を持ったユーザーを作成します。&lt;/p&gt;
&lt;p&gt;Ubuntu の場合は以下のように GUI で簡単に追加できます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;設定 &amp;gt; ユーザー &amp;gt; ユーザーを追加&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ユーザー名とグループ名の変更"&gt;&lt;a href="#%e3%83%a6%e3%83%bc%e3%82%b6%e3%83%bc%e5%90%8d%e3%81%a8%e3%82%b0%e3%83%ab%e3%83%bc%e3%83%97%e5%90%8d%e3%81%ae%e5%a4%89%e6%9b%b4" class="header-anchor"&gt;&lt;/a&gt;ユーザー名とグループ名の変更
&lt;/h2&gt;&lt;p&gt;作成した新しいユーザーでログインして行います。&lt;/p&gt;
&lt;h3 id="ユーザー名の変更"&gt;&lt;a href="#%e3%83%a6%e3%83%bc%e3%82%b6%e3%83%bc%e5%90%8d%e3%81%ae%e5%a4%89%e6%9b%b4" class="header-anchor"&gt;&lt;/a&gt;ユーザー名の変更
&lt;/h3&gt;&lt;p&gt;以下のコマンドを実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo usermod -l new_username -d /home/new_username -m old_username
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;尚、&lt;code&gt;usermod&lt;/code&gt; コマンドの &lt;code&gt;-g&lt;/code&gt; オプションでグループ名も一緒に変更できるような記述も見つけましたが、私の場合、&lt;code&gt;usermod: グループ 'new_username' は存在しません&lt;/code&gt; のエラーが表示されてできなかったため、ユーザー名とグループ名の変更を分けて行いました。&lt;/p&gt;
&lt;h3 id="グループ名の変更"&gt;&lt;a href="#%e3%82%b0%e3%83%ab%e3%83%bc%e3%83%97%e5%90%8d%e3%81%ae%e5%a4%89%e6%9b%b4" class="header-anchor"&gt;&lt;/a&gt;グループ名の変更
&lt;/h3&gt;&lt;p&gt;以下のコマンドを実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo groupmod -n new_username old_username
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以上で、変更後のユーザーでログインして問題なく使えることを確認しました。&lt;br&gt;
ただ、唯一、ユーザーのアイコン画像だけがクリアされていました。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://zenn.dev/creationup2u/articles/1d863f40fec16a" target="_blank" rel="noopener"
 &gt;https://zenn.dev/creationup2u/articles/1d863f40fec16a&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://minory.org/linux-usermod.html" target="_blank" rel="noopener"
 &gt;https://minory.org/linux-usermod.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Windows と Ubuntu でマウスとキーボードを共有する</title><link>https://blog.ponkotools.com/posts/2024/01/26/barrier/</link><pubDate>Fri, 26 Jan 2024 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2024/01/26/barrier/</guid><description>&lt;p&gt;Barrier というソフトを使って、マウスとキーボードを共有します。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Windows 10
&lt;ul&gt;
&lt;li&gt;barrier 2.4.0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Ubuntu 20.04
&lt;ul&gt;
&lt;li&gt;barrier 2.3.2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Barrier を使う場合、どちらかをサーバーとして設定する必要がありますが、今回は Windows をサーバーとしました。&lt;/p&gt;
&lt;h2 id="windows-側"&gt;&lt;a href="#windows-%e5%81%b4" class="header-anchor"&gt;&lt;/a&gt;Windows 側
&lt;/h2&gt;&lt;h3 id="インストール"&gt;&lt;a href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;インストール
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://github.com/debauchee/barrier/releases" target="_blank" rel="noopener"
 &gt;GitHub の Releases&lt;/a&gt; から最新の exe をダウンロードしてインストールします。&lt;br&gt;
Bonjourというソフトをインストールするかどうか聞かれますが、インストールしませんでした。&lt;/p&gt;
&lt;h3 id="設定"&gt;&lt;a href="#%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;設定
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;「サーバー」にチェックを入れる&lt;/li&gt;
&lt;li&gt;「サーバーの構成設定」を選択し、「モニタの結びつき」で任意のマスをクリックして、クライアント側のモニターを追加する
&lt;ul&gt;
&lt;li&gt;モニター名を後述のクライアント側の名前に合わせて入力する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;メニューバーから、「Barrier &amp;gt; 設定の変更」を選択し、「SSL を使用」のチェックを外す。&lt;/li&gt;
&lt;li&gt;開始を押す&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ubuntu-側"&gt;&lt;a href="#ubuntu-%e5%81%b4" class="header-anchor"&gt;&lt;/a&gt;Ubuntu 側
&lt;/h2&gt;&lt;h3 id="インストール-1"&gt;&lt;a href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab-1" class="header-anchor"&gt;&lt;/a&gt;インストール
&lt;/h3&gt;&lt;p&gt;以下のコマンドを実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt install barrier
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="設定-1"&gt;&lt;a href="#%e8%a8%ad%e5%ae%9a-1" class="header-anchor"&gt;&lt;/a&gt;設定
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;「クライアント」にチェックを入れる&lt;/li&gt;
&lt;li&gt;「サーバーIP」にIPアドレスを入力する&lt;/li&gt;
&lt;li&gt;メニューバーから、「Barrier &amp;gt; Change Settings」を選択し、「Enable SSL」のチェックを外す。&lt;/li&gt;
&lt;li&gt;開始を押す&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="追加の設定"&gt;&lt;a href="#%e8%bf%bd%e5%8a%a0%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;追加の設定
&lt;/h2&gt;&lt;p&gt;ログイン画面（ロック画面）になるとマウスとキーボードが効かなくなるので、以下の設定も行いました。&lt;/p&gt;
&lt;h3 id="windows-サーバー-側"&gt;&lt;a href="#windows-%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc-%e5%81%b4" class="header-anchor"&gt;&lt;/a&gt;Windows (サーバー) 側
&lt;/h3&gt;&lt;p&gt;Barrier の設定で、権限昇格を「常に」に変更しました。&lt;br&gt;
恐らくセキュリティ的によろしくないので、やるなら自己責任でお願いします。&lt;/p&gt;
&lt;h3 id="ubuntu-クライアント-側"&gt;&lt;a href="#ubuntu-%e3%82%af%e3%83%a9%e3%82%a4%e3%82%a2%e3%83%b3%e3%83%88-%e5%81%b4" class="header-anchor"&gt;&lt;/a&gt;Ubuntu (クライアント) 側
&lt;/h3&gt;&lt;p&gt;Ubuntu 20.04 を使用している場合、GNOME デスクトップ環境がデフォルトで採用されているため、GDM (GNOME Display Manager) の設定を変更しました。&lt;/p&gt;
&lt;p&gt;まず、GDMの設定ファイルを開きます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo nano /etc/gdm3/custom.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;[daemon] セクションに以下を追加します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;daemon&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Greeter-setup-script&lt;span class="o"&gt;=&lt;/span&gt;/usr/bin/numlockx on
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;変更を有効にするためにGDMを再起動します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo service gdm restart
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ただし、セキュリティ的にはよろしくないので、やるなら自己責任でお願いします。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://nanjib.com/archives/1587" target="_blank" rel="noopener"
 &gt;https://nanjib.com/archives/1587&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://ossyaritoori.hatenablog.com/entry/2019/09/26/Barrier%E3%82%92%E7%94%A8%E3%81%84%E3%81%A6%E8%A4%87%E6%95%B0%E3%81%AEPC%E9%96%93%E3%81%A7%E3%83%9E%E3%82%A6%E3%82%B9%E3%83%BB%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E5%85%B1%E6%9C%89" target="_blank" rel="noopener"
 &gt;https://ossyaritoori.hatenablog.com/entry/2019/09/26/Barrier%E3%82%92%E7%94%A8%E3%81%84%E3%81%A6%E8%A4%87%E6%95%B0%E3%81%AEPC%E9%96%93%E3%81%A7%E3%83%9E%E3%82%A6%E3%82%B9%E3%83%BB%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E5%85%B1%E6%9C%89&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ubuntu の Emergency Mode で日本語配列のキーボードを使う</title><link>https://blog.ponkotools.com/posts/2022/12/02/ubuntu/</link><pubDate>Fri, 02 Dec 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/12/02/ubuntu/</guid><description>&lt;p&gt;Ubuntu 18.04 が emergency mode で起動した時に、キーボードの配列が日本語配列になっていなくて困ったのでメモです。&lt;/p&gt;
&lt;p&gt;以下を実行すれば日本語配列のキーボードが使えるようになりました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;loadkeys&lt;/span&gt; &lt;span class="n"&gt;jp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;尚、上記のコマンドを入力するために、私の環境では以下のようにキーを押す必要がありました。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: center"&gt;入力したい文字&lt;/th&gt;
 &lt;th style="text-align: center"&gt;実際に押したキー&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;l&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;k&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;o&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;o&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;a&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;左下の ctrl&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;d&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;s&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;k&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;j&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;e&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;e&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;y&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;y&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;s&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;a&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;スペース&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;.&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;j&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;h&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;p&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;code&gt;p&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;これが何の配列になっていたのかはわかりませんでした。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kledgeb.blogspot.com/2016/05/ubuntu-1604-60.html" target="_blank" rel="noopener"
 &gt;https://kledgeb.blogspot.com/2016/05/ubuntu-1604-60.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>overlayroot の有効無効をシェルスクリプト化</title><link>https://blog.ponkotools.com/posts/2022/10/18/overlayroot/</link><pubDate>Tue, 18 Oct 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/10/18/overlayroot/</guid><description>&lt;p&gt;overlayroot を使ってファイルシステムを読み取り専用にしましたが、現在読み取り専用になっているのかどうかのチェックと、有効無効を簡単に切り替えられるようなスクリプトを作成してみました。&lt;/p&gt;
&lt;p&gt;overlayroot のインストールや設定方法については以下の記事を参照してください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/04/overlayroot-ubuntu.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2022/04/overlayroot-ubuntu.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="overlayroot-が有効か無効かをチェック"&gt;&lt;a href="#overlayroot-%e3%81%8c%e6%9c%89%e5%8a%b9%e3%81%8b%e7%84%a1%e5%8a%b9%e3%81%8b%e3%82%92%e3%83%81%e3%82%a7%e3%83%83%e3%82%af" class="header-anchor"&gt;&lt;/a&gt;overlayroot が有効か無効かをチェック
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s1"&gt;&amp;#39;overlayroot on / type overlay&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&amp;gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;overlayroot enabled&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;overlayroot disabled&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;&amp;amp;&amp;gt; /dev/null&lt;/code&gt; は標準出力と標準エラー出力の破棄です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/ritukiii/items/b3d91e97b71ecd41d4ea" target="_blank" rel="noopener"
 &gt;https://qiita.com/ritukiii/items/b3d91e97b71ecd41d4ea&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;$?&lt;/code&gt; は直前に実行したコマンドの終了値です（0は成功、1は失敗）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337" target="_blank" rel="noopener"
 &gt;https://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="overlayroot-を無効にする"&gt;&lt;a href="#overlayroot-%e3%82%92%e7%84%a1%e5%8a%b9%e3%81%ab%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;overlayroot を無効にする
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo overlayroot-chroot rm /etc/overlayroot.local.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;overlayroot-chroot&lt;/code&gt; で一時的に書き込み可能状態にして &lt;code&gt;/etc/overlayroot.local.conf&lt;/code&gt; を削除しているだけです。&lt;/p&gt;
&lt;h2 id="overlayroot-を有効にする"&gt;&lt;a href="#overlayroot-%e3%82%92%e6%9c%89%e5%8a%b9%e3%81%ab%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;overlayroot を有効にする
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;overlayroot=&amp;#34;tmpfs:recurse=0&amp;#34;&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/overlayroot.local.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;/etc/overlayroot.local.conf&lt;/code&gt; を作成して &lt;code&gt;overlayroot=&amp;quot;tmpfs:recurse=0&amp;quot;&lt;/code&gt; を記述しているだけです。&lt;/p&gt;
&lt;h2 id="サンプル"&gt;&lt;a href="#%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;サンプル
&lt;/h2&gt;&lt;p&gt;以上を踏まえて作成してみたのが以下のスクリプトです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ex: ./overlayroot.sh disable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ex: ./overlayroot.sh enable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ex: ./overlayroot.sh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 現在の overlayroot の状態を取得&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s1"&gt;&amp;#39;overlayroot on / type overlay&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&amp;gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;overlay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;overlayroot enabled&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;overlay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;overlayroot disabled&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; disable &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# overlayroot を無効にする&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$overlay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;disable overlayroot...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sudo overlayroot-chroot rm /etc/overlayroot.local.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;#34;\nReboot after &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;timeout&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; seconds&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sleep &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;timeout&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sudo reboot
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;overlayroot already disabled&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# overlayroot を有効にする&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$overlay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;overlayroot already enabled&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;enable overlayroot...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;overlayroot=&amp;#34;tmpfs:recurse=0&amp;#34;&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/overlayroot.local.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;#34;\nReboot after &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;timeout&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; seconds&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sleep &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;timeout&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sudo reboot
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;#34;\nCloses after &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;timeout&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; seconds&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sleep &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;timeout&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/copergit/automations/blob/a258017fd4c25a1704ba711e5921aa8c1bbc7c62/scripts/overlay/overlayroot" target="_blank" rel="noopener"
 &gt;https://github.com/copergit/automations/blob/a258017fd4c25a1704ba711e5921aa8c1bbc7c62/scripts/overlay/overlayroot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/ritukiii/items/b3d91e97b71ecd41d4ea" target="_blank" rel="noopener"
 &gt;https://qiita.com/ritukiii/items/b3d91e97b71ecd41d4ea&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337" target="_blank" rel="noopener"
 &gt;https://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Telegraf で CPU の温度を取得する</title><link>https://blog.ponkotools.com/posts/2022/08/24/telegraf/</link><pubDate>Wed, 24 Aug 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/08/24/telegraf/</guid><description>&lt;p&gt;タイトルの通りです。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Ubuntu 20.04&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="cpu-の温度観測プローブを調べる"&gt;&lt;a href="#cpu-%e3%81%ae%e6%b8%a9%e5%ba%a6%e8%a6%b3%e6%b8%ac%e3%83%97%e3%83%ad%e3%83%bc%e3%83%96%e3%82%92%e8%aa%bf%e3%81%b9%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;CPU の温度観測プローブを調べる
&lt;/h2&gt;&lt;p&gt;以下の記事が参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/koara-local/items/1fac13704123717f5cc8" target="_blank" rel="noopener"
 &gt;https://qiita.com/koara-local/items/1fac13704123717f5cc8&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;/sys/class/thermal&lt;/code&gt; に &lt;code&gt;thermal_zone0&lt;/code&gt; 〜 &lt;code&gt;thermal_zone3&lt;/code&gt; の４つのディレクトリがあり、このうちのどれかが CPU の温度観測用のファイルのようです。&lt;br&gt;
これらの中にある &lt;code&gt;type&lt;/code&gt; ファイルを見ることで、何の温度を表しているかが分かるようです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat /sys/class/thermal/thermal_zone0/type
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;acpitz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat /sys/class/thermal/thermal_zone1/type
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;acpitz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat /sys/class/thermal/thermal_zone2/type
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pch_skylake
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat /sys/class/thermal/thermal_zone3/type
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_pkg_temp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;どうやら私の環境では &lt;code&gt;thermal_zone3&lt;/code&gt; が CPU の温度のようです。&lt;br&gt;
なので、&lt;code&gt;/sys/class/thermal/thermal_zone3/temp&lt;/code&gt; を見ることで CPU の温度が取得できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat /sys/class/thermal/thermal_zone3/temp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;35000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;1000 倍された値が表示されるので、上記の場合 35℃ です。&lt;/p&gt;
&lt;h2 id="telegraf-の設定"&gt;&lt;a href="#telegraf-%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;Telegraf の設定
&lt;/h2&gt;&lt;p&gt;上記のファイルを監視するように、&lt;code&gt;telegraf.conf&lt;/code&gt; に以下を記述するだけです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[[&lt;/span&gt;inputs.file&lt;span class="o"&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;files&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/sys/class/thermal/thermal_zone3/temp&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;name_override&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;cpu_temperature&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;data_format&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;value&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;data_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;integer&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/koara-local/items/1fac13704123717f5cc8" target="_blank" rel="noopener"
 &gt;https://qiita.com/koara-local/items/1fac13704123717f5cc8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://goozenlab.github.io/blog/2019/08/telegraf-pi-install/" target="_blank" rel="noopener"
 &gt;https://goozenlab.github.io/blog/2019/08/telegraf-pi-install/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.htkyama.org/telegraf_influxdb_grafana" target="_blank" rel="noopener"
 &gt;https://blog.htkyama.org/telegraf_influxdb_grafana&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>シェルスクリプトをダブルクリックで端末内で実行する</title><link>https://blog.ponkotools.com/posts/2022/08/23/shell/</link><pubDate>Tue, 23 Aug 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/08/23/shell/</guid><description>&lt;p&gt;Ubuntu 20.04 にて、デスクトップに置いたシェルスクリプトファイルをダブルクリックで実行し、かつ端末内で実行する方法です。&lt;br&gt;
結構はまったのでメモしておきます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gnome-terminal -- bash -c &lt;span class="s2"&gt;&amp;#34;echo sample;sleep 5&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;端末がすぐ閉じるのを防ぐために &lt;code&gt;sleep 5&lt;/code&gt; を入れています。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gnome-terminal -- bash -c &lt;span class="s2"&gt;&amp;#34;/home/username/sample.sh;sleep 5&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://askubuntu.com/questions/1259265/make-gnome-terminal-request-user-confirmation-before-close" target="_blank" rel="noopener"
 &gt;https://askubuntu.com/questions/1259265/make-gnome-terminal-request-user-confirmation-before-close&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>overlayroot 環境内で docker を使う方法</title><link>https://blog.ponkotools.com/posts/2022/08/19/overlayroot/</link><pubDate>Fri, 19 Aug 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/08/19/overlayroot/</guid><description>&lt;p&gt;overlayroot でルートファイルシステムを読み取り専用にしたところ、docker が使えなくなりました。&lt;/p&gt;
&lt;p&gt;OS は Ubuntu 20.04 です。&lt;br&gt;
overlayroot を有効にする方法などについては以前の記事を参考にしてください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/04/overlayroot-ubuntu.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2022/04/overlayroot-ubuntu.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="問題点"&gt;&lt;a href="#%e5%95%8f%e9%a1%8c%e7%82%b9" class="header-anchor"&gt;&lt;/a&gt;問題点
&lt;/h2&gt;&lt;p&gt;Docker がインストールされている環境で、overlayroot でルートファイルシステムを読み取り専用にした場合、docker コマンドを実行すると以下のようなエラーが発生します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;いろいろ調べてみた結果、基本的に overlayroot が有効な状態では docker は使えないようです。&lt;br&gt;
一応以下にあるやり方で docker コンテナを立ち上げるところまではできました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://superuser.com/questions/1526682/docker-in-overlayroot-environment-invalid-cross-device-link" target="_blank" rel="noopener"
 &gt;https://superuser.com/questions/1526682/docker-in-overlayroot-environment-invalid-cross-device-link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/docker/for-linux/issues/775" target="_blank" rel="noopener"
 &gt;https://github.com/docker/for-linux/issues/775&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;しかし、そもそも Docker ボリュームには DB のデータなどを逐次格納していっているので、tmpfs 上（＝メモリ上）だとメモリがすぐ枯渇してしまいそうです。&lt;br&gt;
また、Docker コンテナ・イメージをアップデートしたい場合にも困ります。&lt;/p&gt;
&lt;p&gt;というわけで、少なくとも &lt;code&gt;/var/lib/docker&lt;/code&gt; の領域はパーティションを分けるしかないじゃないかというところに行き着きました。&lt;br&gt;
以下のページでも書き込み可能としたい場合はパーティションを分ける方法が紹介されています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://armadillo.atmark-techno.com/index.php/blog/10899/8648" target="_blank" rel="noopener"
 &gt;https://armadillo.atmark-techno.com/index.php/blog/10899/8648&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;また、Docker に関するベストプラクティスでも、コンテナ用にパーティションを分けるとあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.creationline.com/lab/aquasecurity/43087" target="_blank" rel="noopener"
 &gt;https://www.creationline.com/lab/aquasecurity/43087&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;その上で、Docker コンテナも read-only で起動すれば、ルートファイルシステムだけでなく Docker コンテナも保護できそうです。&lt;/p&gt;
&lt;h2 id="対処方法"&gt;&lt;a href="#%e5%af%be%e5%87%a6%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;対処方法
&lt;/h2&gt;&lt;p&gt;とりあえず以下のようにパーティションを分けることで overlayroot と docker の共存ができました。&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;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;/dev/sda1&lt;/td&gt;
 &lt;td&gt;EFI システムパーティション&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;/dev/sda2&lt;/td&gt;
 &lt;td&gt;/&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;/dev/sda3&lt;/td&gt;
 &lt;td&gt;/var&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;この状態で overlayroot をインストールし、&lt;code&gt;/etc/overlayroot.local.conf&lt;/code&gt; に &lt;code&gt;overlayroot=&amp;quot;tmpfs:recurse=0&amp;quot;&lt;/code&gt; を記載します。
コマンド一発でやる場合は以下です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;overlayroot=&amp;#34;tmpfs:recurse=0&amp;#34;&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee -a /etc/overlayroot.local.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;overlayroot のインストールや設定については以前の記事を参考にしてください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/04/overlayroot-ubuntu.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2022/04/overlayroot-ubuntu.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回はルートファイルシステムのみを読み取り専用にするので、&lt;code&gt;tmpfs:recurse=0&lt;/code&gt; を指定するらしいです。&lt;br&gt;
以下が参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568" target="_blank" rel="noopener"
 &gt;https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これで再起動すれば、ルートファイルシステムのみが読み取り専用となり、&lt;code&gt;/var&lt;/code&gt; は読み書き可能な状態となります。&lt;br&gt;
docker も普通に使えました。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://superuser.com/questions/1526682/docker-in-overlayroot-environment-invalid-cross-device-link" target="_blank" rel="noopener"
 &gt;https://superuser.com/questions/1526682/docker-in-overlayroot-environment-invalid-cross-device-link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/docker/for-linux/issues/775" target="_blank" rel="noopener"
 &gt;https://github.com/docker/for-linux/issues/775&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://armadillo.atmark-techno.com/index.php/blog/10899/8648" target="_blank" rel="noopener"
 &gt;https://armadillo.atmark-techno.com/index.php/blog/10899/8648&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://armadillo.atmark-techno.com/forum/armadillo/7894" target="_blank" rel="noopener"
 &gt;https://armadillo.atmark-techno.com/forum/armadillo/7894&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://spin.atomicobject.com/2015/03/10/protecting-ubuntu-root-filesystem/" target="_blank" rel="noopener"
 &gt;https://spin.atomicobject.com/2015/03/10/protecting-ubuntu-root-filesystem/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://kurosute.com/raspberrypi-overlayroot/" target="_blank" rel="noopener"
 &gt;https://kurosute.com/raspberrypi-overlayroot/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/kakkie/items/c4a9a2f2a9e4e802ca0b" target="_blank" rel="noopener"
 &gt;https://qiita.com/kakkie/items/c4a9a2f2a9e4e802ca0b&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568" target="_blank" rel="noopener"
 &gt;https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ubuntu に nginx を入れてリバースプロキシとして使用する</title><link>https://blog.ponkotools.com/posts/2022/08/05/ubuntu-nginx/</link><pubDate>Fri, 05 Aug 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/08/05/ubuntu-nginx/</guid><description>&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Ubuntu 20.04&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="インストール"&gt;&lt;a href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;インストール
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt install nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;http://localhost にアクセスして nginx が起動していることを確認します。&lt;/p&gt;
&lt;h2 id="設定"&gt;&lt;a href="#%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;設定
&lt;/h2&gt;&lt;p&gt;nginx の設定ファイルは &lt;code&gt;/etc/nginx/nginx.conf&lt;/code&gt; ですが、この中を見ると、http ディレクティブの中に以下の記述があります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;##
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Virtual Host Configs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;##
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;include /etc/nginx/conf.d/*.conf;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;include /etc/nginx/sites-enabled/*;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;conf.d&lt;/code&gt; と &lt;code&gt;sites-enabled&lt;/code&gt; の中に置いた設定ファイルが読み込まれるようになっています。&lt;br&gt;
２つの使い分けについては以下のページが参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/tomokon/items/e782636c1e5ec6b5dfdc" target="_blank" rel="noopener"
 &gt;https://qiita.com/tomokon/items/e782636c1e5ec6b5dfdc&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;というわけで、&lt;code&gt;sites-available&lt;/code&gt; に設定ファイルを作成して、&lt;code&gt;sites-enabled&lt;/code&gt; にシンボリックリンクを作成します。&lt;/p&gt;
&lt;h3 id="conf-ファイルの追加"&gt;&lt;a href="#conf-%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e8%bf%bd%e5%8a%a0" class="header-anchor"&gt;&lt;/a&gt;conf ファイルの追加
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo nano /etc/nginx/sites-available/sample.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下を追記します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;server {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; listen 80 default_server;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; server_name _;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location / {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_pass http://localhost:5000;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_http_version 1.1;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header Upgrade $http_upgrade;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header Connection keep-alive;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header Host $host;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_cache_bypass $http_upgrade;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header X-Forwarded-Proto $scheme;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;server_name&lt;/code&gt; の &lt;code&gt;_;&lt;/code&gt; は catch-all の意味らしく、任意の URL に対して有効になります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="http://nginx.org/en/docs/http/server_names.html" target="_blank" rel="noopener"
 &gt;http://nginx.org/en/docs/http/server_names.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;proxy_pass&lt;/code&gt; が遷移先の URL です。&lt;br&gt;
その他の設定については以下を参考にさせてもらいました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://lh182051.hateblo.jp/entry/2019/11/22/010641" target="_blank" rel="noopener"
 &gt;https://lh182051.hateblo.jp/entry/2019/11/22/010641&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="デフォルトの設定の削除"&gt;&lt;a href="#%e3%83%87%e3%83%95%e3%82%a9%e3%83%ab%e3%83%88%e3%81%ae%e8%a8%ad%e5%ae%9a%e3%81%ae%e5%89%8a%e9%99%a4" class="header-anchor"&gt;&lt;/a&gt;デフォルトの設定の削除
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;sites-enabled&lt;/code&gt; の中には最初から &lt;code&gt;default&lt;/code&gt; という設定へのシンボリックリンクがあります。&lt;br&gt;
設定内容次第ではこの default の設定が邪魔になることもあるので、そのような場合は削除しておきます。&lt;/p&gt;
&lt;p&gt;今回の場合は &lt;code&gt;default_server&lt;/code&gt; と &lt;code&gt;server_name _;&lt;/code&gt; が重複しているので、削除しておかないと上手くルーティングできません。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo rm /etc/nginx/sites-enabled/default
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="シンボリックリンクの作成"&gt;&lt;a href="#%e3%82%b7%e3%83%b3%e3%83%9c%e3%83%aa%e3%83%83%e3%82%af%e3%83%aa%e3%83%b3%e3%82%af%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;シンボリックリンクの作成
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo ln -s /etc/nginx/sites-available/sample.conf /etc/nginx/sites-enabled/sample
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;nginx を再起動します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo systemctl restart nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以上で完了です。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/ja-jp/troubleshoot/developer/webapps/aspnetcore/practice-troubleshoot-linux/2-2-install-nginx-configure-it-reverse-proxy" target="_blank" rel="noopener"
 &gt;https://docs.microsoft.com/ja-jp/troubleshoot/developer/webapps/aspnetcore/practice-troubleshoot-linux/2-2-install-nginx-configure-it-reverse-proxy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://gist.github.com/kenjiskywalker/4698573" target="_blank" rel="noopener"
 &gt;https://gist.github.com/kenjiskywalker/4698573&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>WSL2 上の Docker コンテナに外部からアクセスする</title><link>https://blog.ponkotools.com/posts/2022/07/29/wsl-docker/</link><pubDate>Fri, 29 Jul 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/07/29/wsl-docker/</guid><description>&lt;p&gt;Ubuntu で Docker を使っている場合はホストとコンテナのポートマッピングさえ行えば外部からアクセスできました。&lt;br&gt;
しかし、WSL2 を使っている場合は Windows と WSL2(Ubuntu) のポートフォワーディングの設定を行わないと外部からはアクセスできません。&lt;/p&gt;
&lt;p&gt;尚、タイトルには「Docker コンテナに外部からアクセス」と書きましたが、Windows と WSL2 の話なので、Docker は関係ありません。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;ホスト: Windows 10&lt;/li&gt;
&lt;li&gt;WSL2: Ubuntu 20.04&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="設定方法"&gt;&lt;a href="#%e8%a8%ad%e5%ae%9a%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;設定方法
&lt;/h2&gt;&lt;h3 id="wsl2-の-ip-アドレスを調べる"&gt;&lt;a href="#wsl2-%e3%81%ae-ip-%e3%82%a2%e3%83%89%e3%83%ac%e3%82%b9%e3%82%92%e8%aa%bf%e3%81%b9%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;WSL2 の IP アドレスを調べる
&lt;/h3&gt;&lt;p&gt;まずは WSL2 上で以下のコマンドを実行し、eth0 の IP アドレスを調べます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ip addr show dev eth0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;または &lt;code&gt;hostname -I&lt;/code&gt; でも調べられます。&lt;/p&gt;
&lt;h3 id="windows-と-wsl2-のポートフォワーディング設定"&gt;&lt;a href="#windows-%e3%81%a8-wsl2-%e3%81%ae%e3%83%9d%e3%83%bc%e3%83%88%e3%83%95%e3%82%a9%e3%83%af%e3%83%bc%e3%83%87%e3%82%a3%e3%83%b3%e3%82%b0%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;Windows と WSL2 のポートフォワーディング設定
&lt;/h3&gt;&lt;p&gt;コマンドプロンプトまたは PowerShell で以下のコマンドを実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; netsh interface portproxy add v4tov4 &lt;span class="nv"&gt;listenport&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;ポート&amp;gt; &lt;span class="nv"&gt;connectaddress&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;WSL2のIPアドレス&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで外部からアクセス可能になります。&lt;br&gt;
設定ができているか確認したい場合は以下のコマンドを実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; netsh interface portproxy show v4tov4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ipv4 をリッスンする: ipv4 に接続する:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Address Port Address Port
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--------------- ---------- --------------- ----------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;* &lt;span class="m"&gt;5001&lt;/span&gt; 172.20.93.38 &lt;span class="m"&gt;5001&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;設定を削除したい場合は以下のコマンドを実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; netsh interface portproxy delete v4tov4 &lt;span class="nv"&gt;listenport&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;ポート&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="設定の自動化"&gt;&lt;a href="#%e8%a8%ad%e5%ae%9a%e3%81%ae%e8%87%aa%e5%8b%95%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;設定の自動化
&lt;/h2&gt;&lt;p&gt;WSL2 の IP アドレスは起動の度に変わるので、Windows 起動時に自動で設定するようにします。&lt;/p&gt;
&lt;h3 id="windows-上で-wsl2-の-ip-アドレスを取得"&gt;&lt;a href="#windows-%e4%b8%8a%e3%81%a7-wsl2-%e3%81%ae-ip-%e3%82%a2%e3%83%89%e3%83%ac%e3%82%b9%e3%82%92%e5%8f%96%e5%be%97" class="header-anchor"&gt;&lt;/a&gt;Windows 上で WSL2 の IP アドレスを取得
&lt;/h3&gt;&lt;p&gt;PowerShell で以下を実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; &lt;span class="nv"&gt;$IP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; wsl -d Ubuntu-20.04 &lt;span class="nb"&gt;exec&lt;/span&gt; hostname -I
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;しかし、私の環境では複数の IP アドレスが表示されてしまいました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; &lt;span class="nv"&gt;$IP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;172.20.93.38 172.17.0.1 172.18.0.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;なので、以下のようにスペースで区切って最初の IP アドレスだけを取得できるようにしました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; &lt;span class="nv"&gt;$IP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;wsl -d Ubuntu-20.04 &lt;span class="nb"&gt;exec&lt;/span&gt; hostname -I&lt;span class="o"&gt;)&lt;/span&gt;.split&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34; &amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)[&lt;/span&gt;0&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="スクリプトファイルの作成と実行"&gt;&lt;a href="#%e3%82%b9%e3%82%af%e3%83%aa%e3%83%97%e3%83%88%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e4%bd%9c%e6%88%90%e3%81%a8%e5%ae%9f%e8%a1%8c" class="header-anchor"&gt;&lt;/a&gt;スクリプトファイルの作成と実行
&lt;/h3&gt;&lt;p&gt;以上を踏まえ、以下のようなスクリプトファイルを作成します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$IP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;wsl -d Ubuntu-20.04 &lt;span class="nb"&gt;exec&lt;/span&gt; hostname -I&lt;span class="o"&gt;)&lt;/span&gt;.split&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34; &amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)[&lt;/span&gt;0&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;netsh interface portproxy delete v4tov4 &lt;span class="nv"&gt;listenport&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;ポート&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;netsh interface portproxy add v4tov4 &lt;span class="nv"&gt;listenport&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;ポート&amp;gt; &lt;span class="nv"&gt;connectaddress&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$IP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;あとはこれをタスクスケジューラーでログオン時に実行するようにすれば OK です。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/yabeenico/items/15532c703974dc40a7f5" target="_blank" rel="noopener"
 &gt;https://qiita.com/yabeenico/items/15532c703974dc40a7f5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://gunmagisgeek.com/blog/other/7171" target="_blank" rel="noopener"
 &gt;https://gunmagisgeek.com/blog/other/7171&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://scratchpad.jp/ubuntu-on-windows11-13/" target="_blank" rel="noopener"
 &gt;https://scratchpad.jp/ubuntu-on-windows11-13/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ImageMagick で画像を一括で変換</title><link>https://blog.ponkotools.com/posts/2022/07/27/imagemagick/</link><pubDate>Wed, 27 Jul 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/07/27/imagemagick/</guid><description>&lt;p&gt;Ubuntu で大量の画像ファイルを一括で変換したいときは、ImageMagick のコマンドを使うと便利です。&lt;/p&gt;
&lt;h2 id="インストール"&gt;&lt;a href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;インストール
&lt;/h2&gt;&lt;p&gt;私の環境では最初からインストールされていましたが、ない場合は以下でインストールできます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt install imagemagick
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="画像の変換"&gt;&lt;a href="#%e7%94%bb%e5%83%8f%e3%81%ae%e5%a4%89%e6%8f%9b" class="header-anchor"&gt;&lt;/a&gt;画像の変換
&lt;/h2&gt;&lt;p&gt;例えば、全ての png 画像を jpg に変更したい場合は以下のようにしします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mogrify -format jpg *.png
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;元のファイルは残ったままです。&lt;/p&gt;
&lt;h2 id="リサイズ"&gt;&lt;a href="#%e3%83%aa%e3%82%b5%e3%82%a4%e3%82%ba" class="header-anchor"&gt;&lt;/a&gt;リサイズ
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;jpg&lt;/code&gt; ファイルを全てリサイズしたい場合、以下のようにします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mogrify -resize 100x100 *.jpg
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ただし、この場合アスペクト比は維持されます。
なので、例えば、640x360 の画像を上記のコマンドでリサイズすると、100x56 のサイズになります。&lt;/p&gt;
&lt;p&gt;アスペクト比を無視して強制的にリサイズしたい場合は &lt;code&gt;!&lt;/code&gt; をつけます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mogrify -resize 100x100! *.jpg
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;また、割合で指定したい場合は以下のようにします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mogrify -resize 50% *.jpg
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://analyzegear.co.jp/blog/1561" target="_blank" rel="noopener"
 &gt;https://analyzegear.co.jp/blog/1561&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://liginc.co.jp/394506" target="_blank" rel="noopener"
 &gt;https://liginc.co.jp/394506&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://minoru.okinawa/archives/2995" target="_blank" rel="noopener"
 &gt;https://minoru.okinawa/archives/2995&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ubuntu にインストールした Rocket.Chat のクライアントソフトが起動しなくなった</title><link>https://blog.ponkotools.com/posts/2022/07/12/ubuntu-rocketchat/</link><pubDate>Tue, 12 Jul 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/07/12/ubuntu-rocketchat/</guid><description>&lt;p&gt;Ubuntu にインストールした Rocket.Chat のデスクトップクライアントアプリが、ある時から急にアプリを起動しても何もウィンドウが表示されなくなってしまいました。&lt;/p&gt;
&lt;p&gt;試しにコマンドラインから起動してみたところ、以下のようなエラーが表示されていました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ rocketchat-desktop 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;(&lt;/span&gt;node:8749&lt;span class="o"&gt;)&lt;/span&gt; UnhandledPromiseRejectionWarning: SyntaxError: Unexpected end of JSON input
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at JSON.parse &lt;span class="o"&gt;(&lt;/span&gt;&amp;lt;anonymous&amp;gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at ElectronStore.Conf._deserialize &lt;span class="o"&gt;(&lt;/span&gt;/opt/Rocket.Chat/resources/app.asar/node_modules/conf/dist/source/index.js:67:43&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at ElectronStore.get store &lt;span class="o"&gt;[&lt;/span&gt;as store&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;/opt/Rocket.Chat/resources/app.asar/node_modules/conf/dist/source/index.js:278:43&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at new Conf &lt;span class="o"&gt;(&lt;/span&gt;/opt/Rocket.Chat/resources/app.asar/node_modules/conf/dist/source/index.js:131:32&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at new ElectronStore &lt;span class="o"&gt;(&lt;/span&gt;/opt/Rocket.Chat/resources/app.asar/node_modules/electron-store/index.js:69:3&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at getElectronStore &lt;span class="o"&gt;(&lt;/span&gt;/opt/Rocket.Chat/resources/app.asar/app/main.js:1311:25&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at getPersistedValues &lt;span class="o"&gt;(&lt;/span&gt;/opt/Rocket.Chat/resources/app.asar/app/main.js:1324:34&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at /opt/Rocket.Chat/resources/app.asar/app/main.js:1363:33
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Generator.next &lt;span class="o"&gt;(&lt;/span&gt;&amp;lt;anonymous&amp;gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at /opt/Rocket.Chat/resources/app.asar/node_modules/tslib/tslib.js:117:75
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;(&lt;/span&gt;Use &lt;span class="sb"&gt;`&lt;/span&gt;rocketchat-desktop --trace-warnings ...&lt;span class="sb"&gt;`&lt;/span&gt; to show where the warning was created&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;(&lt;/span&gt;node:8749&lt;span class="o"&gt;)&lt;/span&gt; UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async &lt;span class="k"&gt;function&lt;/span&gt; without a catch block, or by rejecting a promise which was not handled with .catch&lt;span class="o"&gt;()&lt;/span&gt;. To terminate the node process on unhandled promise rejection, use the CLI flag &lt;span class="sb"&gt;`&lt;/span&gt;--unhandled-rejections&lt;span class="o"&gt;=&lt;/span&gt;strict&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode&lt;span class="o"&gt;)&lt;/span&gt;. &lt;span class="o"&gt;(&lt;/span&gt;rejection id: 2&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;原因はよくわかりませんが、設定ファイルを全削除することで起動するようになりました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ rm -rf ~/.config/Rocket.Chat
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/RocketChat/Rocket.Chat.Electron/issues/1746" target="_blank" rel="noopener"
 &gt;https://github.com/RocketChat/Rocket.Chat.Electron/issues/1746&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ubuntu の IP アドレスを固定化する</title><link>https://blog.ponkotools.com/posts/2022/05/20/ubuntu/</link><pubDate>Fri, 20 May 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/05/20/ubuntu/</guid><description>&lt;p&gt;いつもは GUI で設定するのですが、あるとき IP アドレスを変更しても再起動後に元に戻ってしまうという現象が発生して悩んでいました。&lt;br&gt;
調べたら他の人が IP アドレスを固定化してたのが原因だとわかったので、ついでにそのやり方をメモしておきます。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Ubuntu 20.04&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="設定方法"&gt;&lt;a href="#%e8%a8%ad%e5%ae%9a%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;設定方法
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;/etc/netplan/&lt;/code&gt; に yaml ファイルを作成します。&lt;/p&gt;
&lt;p&gt;ここに作成したファイルが名前順に読み込まれ、後に読み込まれた内容のほうが優先されるようです。&lt;/p&gt;
&lt;p&gt;Ubuntu Desktop の場合、デフォルトで &lt;code&gt;01-network-manager-all.yaml&lt;/code&gt; があり、ネットワークマネージャーでの設定が反映されるようになっています。&lt;/p&gt;
&lt;p&gt;IP アドレスを固定化したい場合は、&lt;code&gt;/etc/netplan/99_config.yaml&lt;/code&gt; など、後に読み込まれるようなファイル名でファイルを作成し、設定を上書きしてやるそうです。&lt;br&gt;
yaml ファイルの書き方なども含め、公式ドキュメントは以下になります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://ubuntu.com/server/docs/network-configuration" target="_blank" rel="noopener"
 &gt;https://ubuntu.com/server/docs/network-configuration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例えば以下のような感じです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ethernets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;eth0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;addresses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;192.168.1.10&lt;/span&gt;&lt;span class="l"&gt;/24&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;gateway4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;192.168.1.1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;optional&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://ubuntu.com/server/docs/network-configuration" target="_blank" rel="noopener"
 &gt;https://ubuntu.com/server/docs/network-configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tarufu.info/how_to_assign_static_ip_address_on_ubuntu/" target="_blank" rel="noopener"
 &gt;https://tarufu.info/how_to_assign_static_ip_address_on_ubuntu/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://www2.yukawa.kyoto-u.ac.jp/~koudai.sugimoto/dokuwiki/doku.php?id=%E8%87%AA%E4%BD%9C%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E8%A8%88%E7%AE%97%E6%A9%9F:%E5%9B%BA%E5%AE%9Aip%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%AE%E8%A8%AD%E5%AE%9A" target="_blank" rel="noopener"
 &gt;http://www2.yukawa.kyoto-u.ac.jp/~koudai.sugimoto/dokuwiki/doku.php?id=%E8%87%AA%E4%BD%9C%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E8%A8%88%E7%AE%97%E6%A9%9F:%E5%9B%BA%E5%AE%9Aip%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%AE%E8%A8%AD%E5%AE%9A&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ubuntu のファイルシステムを overlayroot で読み込み専用にする</title><link>https://blog.ponkotools.com/posts/2022/04/25/overlayroot/</link><pubDate>Mon, 25 Apr 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/04/25/overlayroot/</guid><description>&lt;p&gt;電源ブチ切り対策の一環として、overlayroot で Ubuntu の rootfs を read only にしてみました。&lt;/p&gt;
&lt;p&gt;やり方はいろいろググってみましたが、以下のサイトがとても参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568" target="_blank" rel="noopener"
 &gt;https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://zenn.dev/tunefs/articles/288d3a069f0cb3" target="_blank" rel="noopener"
 &gt;https://zenn.dev/tunefs/articles/288d3a069f0cb3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Ubuntu 20.04 (デスクトップ版)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="現在の状態を確認"&gt;&lt;a href="#%e7%8f%be%e5%9c%a8%e3%81%ae%e7%8a%b6%e6%85%8b%e3%82%92%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;現在の状態を確認
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;mount&lt;/code&gt; コマンドで確認してみます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mount
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;抜粋ですが、以下の状態が確認できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/dev/sda2 on / &lt;span class="nb"&gt;type&lt;/span&gt; ext4 &lt;span class="o"&gt;(&lt;/span&gt;rw,relatime,errors&lt;span class="o"&gt;=&lt;/span&gt;remount-ro&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="overlayroot-のインストール"&gt;&lt;a href="#overlayroot-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;overlayroot のインストール
&lt;/h2&gt;&lt;p&gt;サーバー版には最初からインストールされているそうですが、デスクトップ版にはインストールされていないので、apt でインストールします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt install overlayroot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="overlayroot-の有効化"&gt;&lt;a href="#overlayroot-%e3%81%ae%e6%9c%89%e5%8a%b9%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;overlayroot の有効化
&lt;/h2&gt;&lt;p&gt;overlayroot を有効化するには、以下のいずれかの対応が必要だそうです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;カーネルパラメーターに &lt;code&gt;overlayroot=XXX&lt;/code&gt; を指定する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/overlayroot.local.conf&lt;/code&gt; に &lt;code&gt;overlayroot=&amp;quot;XXX&amp;quot;&lt;/code&gt; を指定する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/overlayroot.conf&lt;/code&gt; に &lt;code&gt;overlayroot=&amp;quot;XXX&amp;quot;&lt;/code&gt; を指定する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;設定内容は上位のほうが優先されるそうです。&lt;br&gt;
今回は &lt;code&gt;/etc/overlayroot.local.conf&lt;/code&gt; に設定を追加します。&lt;br&gt;
まずはエディタで開きます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo gedit /etc/overlayroot.local.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下を追記します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;overlayroot&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;tmpfs&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;コマンド一発でやるなら以下です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;overlayroot=&amp;#34;tmpfs&amp;#34;&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee -a /etc/overlayroot.local.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;tmpfs はメモリ上に作成ファイルシステムで、一時的にデータを格納するために使われます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://linuc.org/study/knowledge/441/" target="_blank" rel="noopener"
 &gt;https://linuc.org/study/knowledge/441/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Linux ではマウントするファイルシステムの情報が &lt;code&gt;/etc/fstab&lt;/code&gt; に書かれていますが、ここが overlayroot における下位レイヤーとなり、読み込み専用レイヤーとなります。&lt;br&gt;
そして、先ほど追記した &lt;code&gt;tempfs&lt;/code&gt; が上位レイヤーとなり、書き込み可能レイヤーとなります。&lt;br&gt;
ここらへんは後述するように &lt;code&gt;mount&lt;/code&gt; コマンドで確認可能です。&lt;/p&gt;
&lt;p&gt;ただし、tmpfs はメモリ上に作成されたファイルシステムなので、再起動時にはデータは消えます。&lt;/p&gt;
&lt;h3 id="ルートファイルシステムのみを読み取り専用にする"&gt;&lt;a href="#%e3%83%ab%e3%83%bc%e3%83%88%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%b7%e3%82%b9%e3%83%86%e3%83%a0%e3%81%ae%e3%81%bf%e3%82%92%e8%aa%ad%e3%81%bf%e5%8f%96%e3%82%8a%e5%b0%82%e7%94%a8%e3%81%ab%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;ルートファイルシステムのみを読み取り専用にする
&lt;/h3&gt;&lt;p&gt;パーティションを分けている場合などで、ルートファイルシステムのみを読み取り専用にするためには、&lt;code&gt;/etc/overlayroot.local.conf&lt;/code&gt; に &lt;code&gt;tmpfs:recurse=0&lt;/code&gt; を指定するらしいです。&lt;br&gt;
コマンド一発でやる場合は以下。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568" target="_blank" rel="noopener"
 &gt;https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;echo &amp;#39;overlayroot=&amp;#34;tmpfs:recurse=0&amp;#34;&amp;#39; | sudo tee -a /etc/overlayroot.local.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで再起動すれば、ルートファイルシステムのみが読み取り専用となり、他のパーティションは読み書き可能な状態となります。&lt;/p&gt;
&lt;h2 id="確認"&gt;&lt;a href="#%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;確認
&lt;/h2&gt;&lt;p&gt;先ほどと同じように &lt;code&gt;mount&lt;/code&gt; コマンドで確認してみます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mount
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;抜粋ですが、以下の状態が確認できました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/dev/sda2 on /media/root-ro &lt;span class="nb"&gt;type&lt;/span&gt; ext4 &lt;span class="o"&gt;(&lt;/span&gt;ro,relatime&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tmpfs-root on /media/root-rw &lt;span class="nb"&gt;type&lt;/span&gt; tmpfs &lt;span class="o"&gt;(&lt;/span&gt;rw,relatime,inode64&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;overlayroot on / &lt;span class="nb"&gt;type&lt;/span&gt; overlay &lt;span class="o"&gt;(&lt;/span&gt;rw,relatime,lowerdir&lt;span class="o"&gt;=&lt;/span&gt;/media/root-ro,upperdir&lt;span class="o"&gt;=&lt;/span&gt;/media/root-rw/overlay,workdir&lt;span class="o"&gt;=&lt;/span&gt;/media/root-rw/overlay-workdir/_&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ルートファイルシステムが &lt;code&gt;/media/root-ro&lt;/code&gt; に読み込み専用(ro)の下位レイヤー(lowerdir) として設定され、tmpfs が &lt;code&gt;/media/root-rw/overlay&lt;/code&gt; に書き込み可能(rw)な上位レイヤー(upperdir) して設定されているのが確認できます。&lt;/p&gt;
&lt;h3 id="ファイルが消えることを確認"&gt;&lt;a href="#%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%8c%e6%b6%88%e3%81%88%e3%82%8b%e3%81%93%e3%81%a8%e3%82%92%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;ファイルが消えることを確認
&lt;/h3&gt;&lt;p&gt;ついでに、ホームディレクトリに適当にファイルを作成し、再起動時にファイルが消えていることを確認します。&lt;/p&gt;
&lt;h2 id="overlayroot-の無効化"&gt;&lt;a href="#overlayroot-%e3%81%ae%e7%84%a1%e5%8a%b9%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;overlayroot の無効化
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;/etc/overlayroot.local.conf&lt;/code&gt; を削除するか、&lt;code&gt;/etc/overlayroot.local.conf&lt;/code&gt; を編集して中身を &lt;code&gt;overlayroot=&amp;quot;&amp;quot;&lt;/code&gt; に変更すれば、overlayroot の無効化されます。&lt;/p&gt;
&lt;p&gt;しかし、現在は overlayroot が有効化になっている状況なので、このまま変更しても再起動後にはまた元に戻ってしまいます。&lt;br&gt;
そのため、この変更は一時的に書き込みを許可した状態で行う必要があります。&lt;br&gt;
一時的に書き込み可能な状態にするには以下のコマンドを実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo overlayroot-chroot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;そして、&lt;code&gt;/etc/overlayroot.local.conf&lt;/code&gt; を削除するか、&lt;code&gt;/etc/overlayroot.local.conf&lt;/code&gt; を編集して中身を &lt;code&gt;overlayroot=&amp;quot;&amp;quot;&lt;/code&gt; に変更します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# rm /etc/overlayroot.local.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;exit&lt;/code&gt; でシェルから抜ければ書き込み可能状態は終了します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# exit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;再起動後、overlayroot が無効状態になっています。&lt;/p&gt;
&lt;h2 id="grub-メニューで時間がかかることの対策"&gt;&lt;a href="#grub-%e3%83%a1%e3%83%8b%e3%83%a5%e3%83%bc%e3%81%a7%e6%99%82%e9%96%93%e3%81%8c%e3%81%8b%e3%81%8b%e3%82%8b%e3%81%93%e3%81%a8%e3%81%ae%e5%af%be%e7%ad%96" class="header-anchor"&gt;&lt;/a&gt;GRUB メニューで時間がかかることの対策
&lt;/h2&gt;&lt;p&gt;overlayroot を有効にした状態で再起動すると、GRUB メニューが表示され、30秒ほど待たされるようになります。&lt;br&gt;
詳細は以下をご参照ください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568" target="_blank" rel="noopener"
 &gt;https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;起動が30秒も遅くなるのは困るので、以下を参考にして GRUB の設定を変更しました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://askubuntu.com/questions/754974/grub-defaulting-to-30-second-timeout" target="_blank" rel="noopener"
 &gt;https://askubuntu.com/questions/754974/grub-defaulting-to-30-second-timeout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://plaza.rakuten.co.jp/ftechworks/diary/202005130001/" target="_blank" rel="noopener"
 &gt;https://plaza.rakuten.co.jp/ftechworks/diary/202005130001/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.hiroom2.com/2018/04/30/ubuntu-1804-serial-console-ja/" target="_blank" rel="noopener"
 &gt;https://www.hiroom2.com/2018/04/30/ubuntu-1804-serial-console-ja/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;※以下は overlayroot を無効にした状態で行う必要があります！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/etc/default/grub&lt;/code&gt; をエディタで開きます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo nano /etc/default/grub
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下を追記します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GRUB_RECORDFAIL_TIMEOUT=$GRUB_TIMEOUT
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;設定を反映するために以下のコマンドを実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo grub-mkconfig -o /boot/grub/grub.cfg
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで overlayroot を有効にしても起動時間は変わらなくなりました。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568" target="_blank" rel="noopener"
 &gt;https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://askubuntu.com/questions/754974/grub-defaulting-to-30-second-timeout" target="_blank" rel="noopener"
 &gt;https://askubuntu.com/questions/754974/grub-defaulting-to-30-second-timeout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://plaza.rakuten.co.jp/ftechworks/diary/202005130001/" target="_blank" rel="noopener"
 &gt;https://plaza.rakuten.co.jp/ftechworks/diary/202005130001/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.hiroom2.com/2018/04/30/ubuntu-1804-serial-console-ja/" target="_blank" rel="noopener"
 &gt;https://www.hiroom2.com/2018/04/30/ubuntu-1804-serial-console-ja/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ubuntu に SSD をマウント</title><link>https://blog.ponkotools.com/posts/2022/04/09/ubuntu/</link><pubDate>Sat, 09 Apr 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/04/09/ubuntu/</guid><description>&lt;p&gt;Ubuntu 20.04 のマシンに 2.5インチの SSD を追加し、起動時に自動でマウントするようにしました。&lt;/p&gt;
&lt;p&gt;以下のページが参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/suisuina/items/7b55a640fdd6b299aa46" target="_blank" rel="noopener"
 &gt;https://qiita.com/suisuina/items/7b55a640fdd6b299aa46&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="手順"&gt;&lt;a href="#%e6%89%8b%e9%a0%86" class="header-anchor"&gt;&lt;/a&gt;手順
&lt;/h2&gt;&lt;h2 id="uuid-の確認"&gt;&lt;a href="#uuid-%e3%81%ae%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;UUID の確認
&lt;/h2&gt;&lt;h3 id="gui-で確認"&gt;&lt;a href="#gui-%e3%81%a7%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;GUI で確認
&lt;/h3&gt;&lt;p&gt;Ubuntu の場合、メニューから &lt;code&gt;disks&lt;/code&gt; を起動すれば、GUI で確認可能です。&lt;/p&gt;
&lt;h3 id="コマンドで確認"&gt;&lt;a href="#%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89%e3%81%a7%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;コマンドで確認
&lt;/h3&gt;&lt;p&gt;まずは以下のコマンドでウントしたい SSD のパスを探します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo fdisk -l
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Device Boot Start End Sectors Size Id Type
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/dev/sda1 &lt;span class="m"&gt;2048&lt;/span&gt; &lt;span class="m"&gt;312580095&lt;/span&gt; &lt;span class="m"&gt;312578048&lt;/span&gt; 149.1G &lt;span class="m"&gt;83&lt;/span&gt; Linux
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;今回は &lt;code&gt;/dev/sda1&lt;/code&gt; でした。&lt;br&gt;
次に以下のコマンドで UUID を確認します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo blkid /dev/sda1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/dev/sda1: &lt;span class="nv"&gt;LABEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ssd&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;UUID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;74172d4c-526a-42ac-9215-b6ea2dd93d9e&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;TYPE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ext4&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;PARTUUID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;cb5573bc-01&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="起動時にマウントするように設定"&gt;&lt;a href="#%e8%b5%b7%e5%8b%95%e6%99%82%e3%81%ab%e3%83%9e%e3%82%a6%e3%83%b3%e3%83%88%e3%81%99%e3%82%8b%e3%82%88%e3%81%86%e3%81%ab%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;起動時にマウントするように設定
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;/etc/fstab&lt;/code&gt; を編集します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo nano /etc/fstab
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下を追記します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;UUID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;XXXXX /mnt/ssd auto defaults &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;今回マウント先は &lt;code&gt;/mnt/ssd&lt;/code&gt; としました。&lt;/p&gt;
&lt;p&gt;再起動して確認します。&lt;/p&gt;</description></item><item><title>Ubuntu 20.04 に古い NVIDIA Driver と CUDA をインストール</title><link>https://blog.ponkotools.com/posts/2022/03/30/ubuntu-nvidia/</link><pubDate>Wed, 30 Mar 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/03/30/ubuntu-nvidia/</guid><description>&lt;p&gt;古いグラフィックボードが手に入ったので、それに対応した NVIDIA Driver および CUDA をインストールしたときのメモです。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Ubuntu 20.04&lt;/li&gt;
&lt;li&gt;GPU：NVIDIA Quadro 2000&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="nvidia-driver-のインストール"&gt;&lt;a href="#nvidia-driver-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;NVIDIA Driver のインストール
&lt;/h2&gt;&lt;p&gt;以下のコマンドでインストールするドライバーのバージョンがわかります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ubuntu-drivers devices
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;または、以下のページで必要なドライバーのバージョンを調べることもできます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.nvidia.com/Download/index.aspx" target="_blank" rel="noopener"
 &gt;https://www.nvidia.com/Download/index.aspx&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以上より必要なドライバーは 390 だとわかりました。&lt;br&gt;
ドライバーは上記のページからダウンロードできますが、Ubuntu の場合は apt でインストールしたほうが楽です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt -y install nvidia-driver-390
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一度再起動し、&lt;code&gt;nvidia-smi&lt;/code&gt; でドライバーが正しくインストールされたか確認します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ nvidia-smi
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Tue Mar &lt;span class="m"&gt;15&lt;/span&gt; 13:51:47 &lt;span class="m"&gt;2022&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-----------------------------------------------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; NVIDIA-SMI 390.144 Driver Version: 390.144 &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt;-------------------------------+----------------------+----------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; GPU Name Persistence-M&lt;span class="p"&gt;|&lt;/span&gt; Bus-Id Disp.A &lt;span class="p"&gt;|&lt;/span&gt; Volatile Uncorr. ECC &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; Fan Temp Perf Pwr:Usage/Cap&lt;span class="p"&gt;|&lt;/span&gt; Memory-Usage &lt;span class="p"&gt;|&lt;/span&gt; GPU-Util Compute M. &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="o"&gt;===============================&lt;/span&gt;+&lt;span class="o"&gt;======================&lt;/span&gt;+&lt;span class="o"&gt;======================&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; Quadro &lt;span class="m"&gt;2000&lt;/span&gt; Off &lt;span class="p"&gt;|&lt;/span&gt; 00000000:01:00.0 On &lt;span class="p"&gt;|&lt;/span&gt; N/A &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; 30% 48C P12 N/A / N/A &lt;span class="p"&gt;|&lt;/span&gt; 577MiB / 964MiB &lt;span class="p"&gt;|&lt;/span&gt; 0% Default &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-------------------------------+----------------------+----------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-----------------------------------------------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; Processes: GPU Memory &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; GPU PID Type Process name Usage &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="o"&gt;=============================================================================&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;1193&lt;/span&gt; G /usr/lib/xorg/Xorg 141MiB &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;2102&lt;/span&gt; G /usr/lib/xorg/Xorg 220MiB &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;2276&lt;/span&gt; G /usr/bin/gnome-shell 206MiB &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-----------------------------------------------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="cuda-のインストール"&gt;&lt;a href="#cuda-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;CUDA のインストール
&lt;/h2&gt;&lt;p&gt;NVIDIA Driver と CUDA のバージョンの関係は以下で確認できます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html" target="_blank" rel="noopener"
 &gt;https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回インストールした NVIDIA Driver は 390.144 なので、CUDA は 9.1 インストールします。&lt;/p&gt;
&lt;p&gt;CUDA のインストール方法ですが、以下でプラットフォームに応じた方法を調べることができます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://developer.nvidia.com/cuda-downloads" target="_blank" rel="noopener"
 &gt;https://developer.nvidia.com/cuda-downloads&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ubuntu 20.04 では以下が表示されました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/7fa2af80.pub
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo add-apt-repository &lt;span class="s2"&gt;&amp;#34;deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get -y install cuda
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;しかし、このコマンドでは CUDA のバージョンが指定されていないため、実行してしまうと最新の CUDA がインストールされてしまいます。&lt;br&gt;
なので、次に示すように、バージョン 9.1 を指定してインストールしてやります。&lt;/p&gt;
&lt;h2 id="cuda-91-のインストール"&gt;&lt;a href="#cuda-91-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;CUDA 9.1 のインストール
&lt;/h2&gt;&lt;p&gt;CUDA 9.1 をインストールしたいところですが、apt でインストールできる CUDA の一覧を見てみても 9.1 はありません。&lt;br&gt;
なので、以下を参考に Ubuntu 16.04 用のパッケージをインストールしました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/yukoba/items/3692f1cb677b2383c983" target="_blank" rel="noopener"
 &gt;https://qiita.com/yukoba/items/3692f1cb677b2383c983&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/sabaku20XX/items/7f559dd46357cc5adf1e" target="_blank" rel="noopener"
 &gt;https://qiita.com/sabaku20XX/items/7f559dd46357cc5adf1e&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl -sL http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub &lt;span class="p"&gt;|&lt;/span&gt; sudo apt-key add
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_9.1.85-1_amd64.deb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo dpkg -i cuda-repo-ubuntu1604_9.1.85-1_amd64.deb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt --fix-broken install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt install cuda-toolkit-9-1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo reboot
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ rm cuda-repo-ubuntu1604_9.1.85-1_amd64.deb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注意点として、apt で &lt;code&gt;cuda-9-1&lt;/code&gt; をインストールすると NVIDIA Driver も最新に更新されてしまうので、&lt;code&gt;cuda-toolkit-9-1&lt;/code&gt; をインストールする必要があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://zenn.dev/takeshita/articles/a02402e59d72a7" target="_blank" rel="noopener"
 &gt;https://zenn.dev/takeshita/articles/a02402e59d72a7&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;インストールが完了したら、&lt;code&gt;~/.bashrc&lt;/code&gt; の末尾に以下を追記します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/usr/local/cuda/bin:&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/usr/local/cuda/lib64:&lt;/span&gt;&lt;span class="nv"&gt;$LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここで再起動します。&lt;/p&gt;
&lt;h3 id="cuda-バージョンの確認"&gt;&lt;a href="#cuda-%e3%83%90%e3%83%bc%e3%82%b8%e3%83%a7%e3%83%b3%e3%81%ae%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;CUDA バージョンの確認
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;nvidia-smi&lt;/code&gt; で確認できるはずなのですが、私の環境では何も表示されました。&lt;br&gt;
ただ、&lt;code&gt;nvcc&lt;/code&gt; では確認できたので、インストールはされているんじゃないかと。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ nvcc -V
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nvcc: NVIDIA &lt;span class="o"&gt;(&lt;/span&gt;R&lt;span class="o"&gt;)&lt;/span&gt; Cuda compiler driver
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;c&lt;span class="o"&gt;)&lt;/span&gt; 2005-2017 NVIDIA Corporation
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Built on Fri_Nov__3_21:07:56_CDT_2017
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Cuda compilation tools, release 9.1, V9.1.85
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;また、以下でも確認できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat /usr/local/cuda/version.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CUDA Version 9.1.85
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="cuda-のインストール後に-nvidia-driver-がおかしくなってしまった場合"&gt;&lt;a href="#cuda-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e5%be%8c%e3%81%ab-nvidia-driver-%e3%81%8c%e3%81%8a%e3%81%8b%e3%81%97%e3%81%8f%e3%81%aa%e3%81%a3%e3%81%a6%e3%81%97%e3%81%be%e3%81%a3%e3%81%9f%e5%a0%b4%e5%90%88" class="header-anchor"&gt;&lt;/a&gt;CUDA のインストール後に NVIDIA Driver がおかしくなってしまった場合
&lt;/h3&gt;&lt;p&gt;前述したように、NVIDIA Driver と CUDA のバージョンが合っていなければ動作がおかしくなります。&lt;/p&gt;
&lt;p&gt;以下を参考に NVIDIA Driver と CUDA を削除してからインストールをやり直す必要があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/not_charge/items/dce7512544a7ead04bca" target="_blank" rel="noopener"
 &gt;https://qiita.com/not_charge/items/dce7512544a7ead04bca&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get --purge remove nvidia-*
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get --purge remove cuda-*
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="docker-コンテナ内で-gpu-が使えるか確認しようとして諦めた"&gt;&lt;a href="#docker-%e3%82%b3%e3%83%b3%e3%83%86%e3%83%8a%e5%86%85%e3%81%a7-gpu-%e3%81%8c%e4%bd%bf%e3%81%88%e3%82%8b%e3%81%8b%e7%a2%ba%e8%aa%8d%e3%81%97%e3%82%88%e3%81%86%e3%81%a8%e3%81%97%e3%81%a6%e8%ab%a6%e3%82%81%e3%81%9f" class="header-anchor"&gt;&lt;/a&gt;docker コンテナ内で GPU が使えるか確認しようとして諦めた
&lt;/h2&gt;&lt;p&gt;せっかく CUDA がインストールできたので、機械学習で GPU が使えそうか確認します。&lt;br&gt;
まず pytorch を使い、ホスト上で以下のコードで確認してみました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;torch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cuda&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_available&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;すると、以下のようにエラーが表示されました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;UserWarning: CUDA initialization: The NVIDIA driver on your system is too old &lt;span class="o"&gt;(&lt;/span&gt;found version 9010&lt;span class="o"&gt;)&lt;/span&gt;. Please update your GPU driver by downloading and installing a new version from the URL: http://www.nvidia.com/Download/index.aspx Alternatively, go to: https://pytorch.org to install a PyTorch version that has been compiled with your version of the CUDA driver. &lt;span class="o"&gt;(&lt;/span&gt;Triggered internally at /pytorch/c10/cuda/CUDAFunctions.cpp:115.&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; torch._C._cuda_getDeviceCount&lt;span class="o"&gt;()&lt;/span&gt; &amp;gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;PyTorch のバージョンも CUDA に合わせる必要があるようです。&lt;br&gt;
以下のページを参考に pytorch のバージョンを指定してインストールしてみます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://varhowto.com/install-pytorch-cuda-9-1/" target="_blank" rel="noopener"
 &gt;https://varhowto.com/install-pytorch-cuda-9-1/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;すると以下のエラーが表示されました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pip3 install &lt;span class="nv"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;1.1.0 &lt;span class="nv"&gt;torchvision&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;0.3.0 -f https://download.pytorch.org/whl/cu90/torch_stable.html
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Looking in links: https://download.pytorch.org/whl/cu90/torch_stable.html
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/usr/share/python-wheels/urllib3-1.25.8-py2.py3-none-any.whl/urllib3/connectionpool.py:999: InsecureRequestWarning: Unverified HTTPS request is being made to host &lt;span class="s1"&gt;&amp;#39;172.20.16.253&amp;#39;&lt;/span&gt;. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ERROR: Could not find a version that satisfies the requirement &lt;span class="nv"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;1.1.0 &lt;span class="o"&gt;(&lt;/span&gt;from versions: 1.4.0, 1.5.0, 1.5.1, 1.6.0, 1.7.0, 1.7.1, 1.8.0, 1.8.1, 1.9.0, 1.9.1, 1.10.0, 1.10.1, 1.10.2, 1.11.0&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ERROR: No matching distribution found &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nv"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;1.1.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここらへんから面倒になり、先に docker コンテナを作ることにしました。&lt;br&gt;
まずは NVIDIA Container Toolkit をインストールしようと以下のページを見ると、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html" target="_blank" rel="noopener"
 &gt;https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;動作要件が以下のようになっていました。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;GNU/Linux x86_64 with kernel version &amp;gt; 3.10&lt;/li&gt;
&lt;li&gt;Docker &amp;gt;= 19.03 (recommended, but some distributions may include older versions of Docker. The minimum supported version is 1.12)&lt;/li&gt;
&lt;li&gt;NVIDIA GPU with Architecture &amp;gt;= Kepler (or compute capability 3.0)&lt;/li&gt;
&lt;li&gt;NVIDIA Linux drivers &amp;gt;= 418.81.07 (Note that older driver releases or branches are unsupported.)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;というわけでここで諦めました。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.nvidia.com/Download/index.aspx" target="_blank" rel="noopener"
 &gt;https://www.nvidia.com/Download/index.aspx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/sabaku20XX/items/7f559dd46357cc5adf1e" target="_blank" rel="noopener"
 &gt;https://qiita.com/sabaku20XX/items/7f559dd46357cc5adf1e&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/porizou1/items/74d8264d6381ee2941bd" target="_blank" rel="noopener"
 &gt;https://qiita.com/porizou1/items/74d8264d6381ee2941bd&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/abetomo/items/a114a3c423f110460549" target="_blank" rel="noopener"
 &gt;https://qiita.com/abetomo/items/a114a3c423f110460549&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://shiba6v.hatenablog.com/entry/2018/10/18/021749" target="_blank" rel="noopener"
 &gt;https://shiba6v.hatenablog.com/entry/2018/10/18/021749&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://www-home.htwg-konstanz.de/~MFERTIG/files/tools/NVIDIA_CUDA_Toolkit_9_1_Ubuntu_20_04_2021.txt" target="_blank" rel="noopener"
 &gt;http://www-home.htwg-konstanz.de/~MFERTIG/files/tools/NVIDIA_CUDA_Toolkit_9_1_Ubuntu_20_04_2021.txt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ubuntu にリモートデスクトップ接続する</title><link>https://blog.ponkotools.com/posts/2022/03/13/ubuntu/</link><pubDate>Sun, 13 Mar 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/03/13/ubuntu/</guid><description>&lt;p&gt;Windows から Ubuntu にリモートデスクトップで接続する方法です。&lt;/p&gt;
&lt;h2 id="ubuntu-側"&gt;&lt;a href="#ubuntu-%e5%81%b4" class="header-anchor"&gt;&lt;/a&gt;Ubuntu 側
&lt;/h2&gt;&lt;p&gt;Xrdp サーバーをインストールします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt -y install xrdp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="windows-側"&gt;&lt;a href="#windows-%e5%81%b4" class="header-anchor"&gt;&lt;/a&gt;Windows 側
&lt;/h2&gt;&lt;p&gt;リモートデスクトップで Ubuntu の IP アドレスを入力して接続します。&lt;/p&gt;
&lt;h3 id="画面が真っ暗な場合"&gt;&lt;a href="#%e7%94%bb%e9%9d%a2%e3%81%8c%e7%9c%9f%e3%81%a3%e6%9a%97%e3%81%aa%e5%a0%b4%e5%90%88" class="header-anchor"&gt;&lt;/a&gt;画面が真っ暗な場合
&lt;/h3&gt;&lt;p&gt;同じユーザーで既に Ubuntu にログイン済みの場合、真っ暗な画面が表示されます。&lt;/p&gt;
&lt;p&gt;Ubuntu 側で一度ログアウトするか、別途 SSH などで Ubuntu に接続し、以下のコマンドで gnome-session を終了させます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pkill gnome-session
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.server-world.info/query?os=Ubuntu_20.04&amp;amp;p=desktop&amp;amp;f=6" target="_blank" rel="noopener"
 &gt;https://www.server-world.info/query?os=Ubuntu_20.04&amp;p=desktop&amp;f=6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://bracket.hatenablog.com/entry/2020/10/05/031057" target="_blank" rel="noopener"
 &gt;https://bracket.hatenablog.com/entry/2020/10/05/031057&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[Python] datetime の strftime で Invalid format string になる</title><link>https://blog.ponkotools.com/posts/2022/02/16/python/</link><pubDate>Wed, 16 Feb 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/02/16/python/</guid><description>&lt;p&gt;&lt;code&gt;strftime&lt;/code&gt; で datetime から文字列に変換する際、Ubuntu では上手く動くのに、Windows だと &lt;code&gt;ValueError: Invalid format string&lt;/code&gt; のエラーが発生しました。&lt;/p&gt;
&lt;p&gt;どうやら Ubuntu と Windows で一部書式が異なるようです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://teratail.com/questions/361511" target="_blank" rel="noopener"
 &gt;https://teratail.com/questions/361511&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例えば、ゼロパディングをなくしたい場合は、以下のようになります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Linux の場合&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;today&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;%-m&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Windows の場合&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;today&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;%#m&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Python の範囲内であればクロスプラットフォームで動作すると思っていたのにこんな罠があるとは。&lt;/p&gt;
&lt;p&gt;上記の例であれば以下のようにすればいいだけですが、&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;today&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;strftime&lt;/code&gt; を使い場合、大抵もっと複雑な書式で指定すると思うので、どう対応すればいいんでしょうね。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://teratail.com/questions/361511" target="_blank" rel="noopener"
 &gt;https://teratail.com/questions/361511&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ubuntuでデスクトップにアプリのショートカットを作る（デスクトップエントリ）</title><link>https://blog.ponkotools.com/posts/2022/02/12/ubuntu/</link><pubDate>Sat, 12 Feb 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/02/12/ubuntu/</guid><description>&lt;p&gt;今までやったことなかったのでメモ。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Ubuntu 20.04&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="desktop-ファイルの作成"&gt;&lt;a href="#desktop-%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;.desktop ファイルの作成
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;.desktop&lt;/code&gt; という拡張子でファイルを作成し、デスクトップに配置します。&lt;br&gt;
内容は以下のように記述します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env xdg-open
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;Desktop Entry&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Application
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Terminal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Exec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/home/user/run.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Application Name
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Comment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Test Application
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Icon&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/home/user/Pictures/icon.png
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;内容については省略します。&lt;/p&gt;
&lt;h2 id="実行権限の付与"&gt;&lt;a href="#%e5%ae%9f%e8%a1%8c%e6%a8%a9%e9%99%90%e3%81%ae%e4%bb%98%e4%b8%8e" class="header-anchor"&gt;&lt;/a&gt;実行権限の付与
&lt;/h2&gt;&lt;p&gt;このファイルに実行権限を与えます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ chmod &lt;span class="m"&gt;755&lt;/span&gt; test.desktop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;デスクトップでこのファイルをダブルクリックすると、「起動を許可」というメニューがあるので、それを選択します。&lt;br&gt;
すると、アイコンが変わり、ダブルクリックでアプリケーションが起動するようになります。&lt;/p&gt;
&lt;h2 id="起動の許可が表示されないテキストエディタが起動する場合"&gt;&lt;a href="#%e8%b5%b7%e5%8b%95%e3%81%ae%e8%a8%b1%e5%8f%af%e3%81%8c%e8%a1%a8%e7%a4%ba%e3%81%95%e3%82%8c%e3%81%aa%e3%81%84%e3%83%86%e3%82%ad%e3%82%b9%e3%83%88%e3%82%a8%e3%83%87%e3%82%a3%e3%82%bf%e3%81%8c%e8%b5%b7%e5%8b%95%e3%81%99%e3%82%8b%e5%a0%b4%e5%90%88" class="header-anchor"&gt;&lt;/a&gt;起動の許可が表示されない、テキストエディタが起動する場合
&lt;/h2&gt;&lt;p&gt;私の場合の例ですが、&lt;code&gt;.desktop&lt;/code&gt; ファイルの &lt;code&gt;Exec&lt;/code&gt; の項目でシェルスクリプトファイルを指定していた場合に、この状況が発生しました。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Exce&lt;/code&gt; で指定しているシェルスクリプトファイルにも実行権限を与えてやると解決しました。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="http://appcel.sblo.jp/article/187826978.html" target="_blank" rel="noopener"
 &gt;http://appcel.sblo.jp/article/187826978.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>WSL2 の Ubuntu で Docker を動かす</title><link>https://blog.ponkotools.com/posts/2022/01/20/wsl-ubuntu-docker/</link><pubDate>Thu, 20 Jan 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/01/20/wsl-ubuntu-docker/</guid><description>&lt;p&gt;DockerDesktop が有償になったので、WSL2 の Ubuntu に Docker をインストールして動かすようにしてみました、&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Windows 10&lt;/li&gt;
&lt;li&gt;Ubuntu 20.04&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;WSL2 および Ubuntu はインストール済みの前提です。&lt;br&gt;
以下のページに書いてあるので、まだの場合は参考にしてください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/01/wsl2.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2022/01/wsl2.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="プロキシ設定"&gt;&lt;a href="#%e3%83%97%e3%83%ad%e3%82%ad%e3%82%b7%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;プロキシ設定
&lt;/h2&gt;&lt;p&gt;環境に応じてプロキシの設定を行っておきます。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.bashrc&lt;/code&gt; をエディタで開き、最後に以下を追記します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;http_proxy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://example.com:8080
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;https_proxy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://example.com:8080
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;no_proxy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;任意のIPアドレス
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="apt-のプロキシ設定"&gt;&lt;a href="#apt-%e3%81%ae%e3%83%97%e3%83%ad%e3%82%ad%e3%82%b7%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;apt のプロキシ設定
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;/etc/apt/apt.conf&lt;/code&gt; を作成して以下のように記述します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Acquire::http::proxy &lt;span class="s2"&gt;&amp;#34;http://example.com:8080/&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Acquire::https::proxy &lt;span class="s2"&gt;&amp;#34;https://example.com:8080/&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;再起動します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="docker-のインストール"&gt;&lt;a href="#docker-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;Docker のインストール
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://docs.docker.com/engine/install/ubuntu/" target="_blank" rel="noopener"
 &gt;公式ドキュメント&lt;/a&gt;に沿ってインストールします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get remove docker docker-engine docker.io containerd runc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg &lt;span class="p"&gt;|&lt;/span&gt; sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;deb [arch=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;lsb_release -cs&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; stable&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="ユーザーを-docker-グループに追加"&gt;&lt;a href="#%e3%83%a6%e3%83%bc%e3%82%b6%e3%83%bc%e3%82%92-docker-%e3%82%b0%e3%83%ab%e3%83%bc%e3%83%97%e3%81%ab%e8%bf%bd%e5%8a%a0" class="header-anchor"&gt;&lt;/a&gt;ユーザーを docker グループに追加
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo gpasswd -a &lt;span class="k"&gt;$(&lt;/span&gt;whoami&lt;span class="k"&gt;)&lt;/span&gt; docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで docker コマンド実行時に sudo が不要になります。&lt;/p&gt;
&lt;h3 id="docker-のプロキシ設定"&gt;&lt;a href="#docker-%e3%81%ae%e3%83%97%e3%83%ad%e3%82%ad%e3%82%b7%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;docker のプロキシ設定
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;/etc/default/docker&lt;/code&gt; をエディタで開いて以下を追加します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;http_proxy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://example.com:8080
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;https_proxy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://example.com:8080
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;また、&lt;code&gt;~/.docker/config.json&lt;/code&gt; に以下を記述します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;proxies&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;default&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;httpProxy&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;http://example.com:8080&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;httpsProxy&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;http://example.com:8080&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;再起動します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="docker-デーモンの起動"&gt;&lt;a href="#docker-%e3%83%87%e3%83%bc%e3%83%a2%e3%83%b3%e3%81%ae%e8%b5%b7%e5%8b%95" class="header-anchor"&gt;&lt;/a&gt;docker デーモンの起動
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo service docker start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="動作確認"&gt;&lt;a href="#%e5%8b%95%e4%bd%9c%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;動作確認
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker info
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run hello-world
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;すると、私の場合以下のエラーが表示されました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;docker デーモンが起動しているか確認します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo service docker status
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;* Docker is not running
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;原因がわからず悩んでいたところ、以下の記事を見つけました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/neight0903/items/ef0e2170b712b194c3fc" target="_blank" rel="noopener"
 &gt;https://qiita.com/neight0903/items/ef0e2170b712b194c3fc&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;私の場合、既に DockerDesktop はアンインストールしていました。&lt;br&gt;
もともとは DockerDesktop と WSL2 を使って動かしていたのですが、今回 DockerDesktop なしで動くようにしようとしているところで、
DockerDesktop だけでなく WSL2 も一度アンインストールして最初からやり直すと上手く行きました。&lt;/p&gt;
&lt;h2 id="docker-デーモンの自動起動"&gt;&lt;a href="#docker-%e3%83%87%e3%83%bc%e3%83%a2%e3%83%b3%e3%81%ae%e8%87%aa%e5%8b%95%e8%b5%b7%e5%8b%95" class="header-anchor"&gt;&lt;/a&gt;docker デーモンの自動起動
&lt;/h2&gt;&lt;p&gt;このままでは WSL を起動する度に docker デーモンを手動で起動する必要がありますが、以下のページに自動起動させる方法があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://zenn.dev/taiga533/articles/11f1b21ef4a5ff" target="_blank" rel="noopener"
 &gt;https://zenn.dev/taiga533/articles/11f1b21ef4a5ff&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/ko-zi/items/949d358163bbbad5a91e" target="_blank" rel="noopener"
 &gt;https://qiita.com/ko-zi/items/949d358163bbbad5a91e&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://zukucode.com/2021/11/wsl2-docker-startup.html" target="_blank" rel="noopener"
 &gt;https://zukucode.com/2021/11/wsl2-docker-startup.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;まずは &lt;code&gt;sudo service docker start&lt;/code&gt; をパスワードなしで実行できるように設定します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo visudo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下を追記します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ユーザー名 ALL=(ALL:ALL) NOPASSWD: /usr/sbin/service docker start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;あとは .bashrc に以下を追記します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ nano .bashrc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;if [ $(service docker status | awk &amp;#39;{print $4}&amp;#39;) = &amp;#34;not&amp;#34; ]; then
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sudo service docker start &amp;gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fi
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="windows-と-wsl2-のポートフォワーディングの設定"&gt;&lt;a href="#windows-%e3%81%a8-wsl2-%e3%81%ae%e3%83%9d%e3%83%bc%e3%83%88%e3%83%95%e3%82%a9%e3%83%af%e3%83%bc%e3%83%87%e3%82%a3%e3%83%b3%e3%82%b0%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;Windows と WSL2 のポートフォワーディングの設定
&lt;/h2&gt;&lt;p&gt;WSL2 上の Docker コンテナに外部からアクセスしたい場合、Windows と WSL2 のポートフォワーディングの設定が必要です。&lt;br&gt;
詳細は以下の記事を参照してください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/07/wsl2-docker.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2022/07/wsl2-docker.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://zenn.dev/taiga533/articles/11f1b21ef4a5ff" target="_blank" rel="noopener"
 &gt;https://zenn.dev/taiga533/articles/11f1b21ef4a5ff&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/neight0903/items/ef0e2170b712b194c3fc" target="_blank" rel="noopener"
 &gt;https://qiita.com/neight0903/items/ef0e2170b712b194c3fc&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Tesseract が動作する docker イメージを作成する</title><link>https://blog.ponkotools.com/posts/2021/06/28/tesseract/</link><pubDate>Mon, 28 Jun 2021 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2021/06/28/tesseract/</guid><description>&lt;p&gt;Tesseract を使って OCR を行うための環境を、Docker を使って構築しました。開発言語は Python を想定しています。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Ubuntu 20.04&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="dockerfile-の作成"&gt;&lt;a href="#dockerfile-%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;Dockerfile の作成
&lt;/h2&gt;&lt;p&gt;Dockerfile のサンプルです。&lt;/p&gt;
&lt;p&gt;USB カメラのキャプチャ画像に対して OCR を行いたかったので、OpenCV と GUI の表示に必要なパッケージもインストールしています。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;ubuntu&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;20.04&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Tesseract、訓練済みモジュール、その他必要なパッケージをインストール&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;RUN&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tesseract&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ocr&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tesseract&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ocr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;jpn&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;git&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;libgl1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mesa&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;libsm6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# python パッケージをインストール&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;RUN&lt;/span&gt; &lt;span class="n"&gt;pip3&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;pyocr&lt;/span&gt; &lt;span class="n"&gt;pytesseract&lt;/span&gt; &lt;span class="n"&gt;opencv&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# aptのクリア&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;RUN&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt; &lt;span class="n"&gt;clean&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;rm&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rf&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="o"&gt;/*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# bash起動&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;CMD&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/bin/bash&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これをビルドします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker build -t tesseract-dev .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="コンテナ起動"&gt;&lt;a href="#%e3%82%b3%e3%83%b3%e3%83%86%e3%83%8a%e8%b5%b7%e5%8b%95" class="header-anchor"&gt;&lt;/a&gt;コンテナ起動
&lt;/h2&gt;&lt;p&gt;以下のようにして起動します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -it --rm \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --name tesseract-dev \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -e DISPLAY=${DISPLAY} \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v /tmp/.X11-unix/:/tmp/.X11-unix/ \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --device /dev/video0:/dev/video0 \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; tesseract-dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="確認"&gt;&lt;a href="#%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;確認
&lt;/h3&gt;&lt;p&gt;Tesseract がインストールされていることを確認します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ tesseract 4.1.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; leptonica-1.79.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; libgif 5.1.4 : libjpeg 8d (libjpeg-turbo 2.0.3) : libpng 1.6.37 : libtiff 4.1.0 : zlib 1.2.11 : libwebp 0.6.1 : libopenjp2 2.3.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Found AVX2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Found AVX
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Found FMA
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Found SSE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Found libarchive 3.4.0 zlib/1.2.11 liblzma/5.2.4 bz2lib/1.0.8 liblz4/1.9.2 libzstd/1.4.4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ついでに Tesseract で OCR 出来ることを確認します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ tesseract test.jpg output -l jpn
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://crieit.net/posts/Tesseract-Ubuntu-Docker" target="_blank" rel="noopener"
 &gt;https://crieit.net/posts/Tesseract-Ubuntu-Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://a244.hateblo.jp/entry/2016/07/04/050000" target="_blank" rel="noopener"
 &gt;https://a244.hateblo.jp/entry/2016/07/04/050000&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://cocoinit23.com/docker-opencv-importerror-libgl-so-1-cannot-open-shared-object-file/" target="_blank" rel="noopener"
 &gt;https://cocoinit23.com/docker-opencv-importerror-libgl-so-1-cannot-open-shared-object-file/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://heppoco-cto.com/pip-install-opencv-python%E3%81%A7modulenotfounderror-no-module-named-skbuild%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC/456/" target="_blank" rel="noopener"
 &gt;https://heppoco-cto.com/pip-install-opencv-python%E3%81%A7modulenotfounderror-no-module-named-skbuild%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC/456/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/nishiys/items/3b8c1670891f745c5a81" target="_blank" rel="noopener"
 &gt;https://qiita.com/nishiys/items/3b8c1670891f745c5a81&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/fukasawah/items/99219e1ff7d08915952f" target="_blank" rel="noopener"
 &gt;https://qiita.com/fukasawah/items/99219e1ff7d08915952f&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>