<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>開発環境 on ポンコツ地方エンジニアの技術ブログ</title><link>https://blog.ponkotools.com/categories/%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83/</link><description>Recent content in 開発環境 on ポンコツ地方エンジニアの技術ブログ</description><generator>Hugo -- gohugo.io</generator><language>ja-jp</language><lastBuildDate>Mon, 13 Jul 2026 00:00:00 +0900</lastBuildDate><atom:link href="https://blog.ponkotools.com/categories/%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83/index.xml" rel="self" type="application/rss+xml"/><item><title>VS Code での Git Worktree の使い方</title><link>https://blog.ponkotools.com/posts/2026/07/13/git-worktree/</link><pubDate>Mon, 13 Jul 2026 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2026/07/13/git-worktree/</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 22.04&lt;/li&gt;
&lt;li&gt;Visual Studio Code 1.128.0&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="事前準備"&gt;&lt;a href="#%e4%ba%8b%e5%89%8d%e6%ba%96%e5%82%99" class="header-anchor"&gt;&lt;/a&gt;事前準備
&lt;/h2&gt;&lt;p&gt;VS Code の設定で、&lt;code&gt;git.detectWorktrees&lt;/code&gt; を ON にします。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="415px" data-flex-grow="173" height="409" 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/07/13/git-worktree/01.webp" width="708"&gt;&lt;/p&gt;
&lt;p&gt;ワークツリーの作成だけなら OFF の状態でもできましたが、ワークツリーを切り替えたり削除したりするには ON にする必要がありました。&lt;/p&gt;
&lt;h2 id="ワークツリーの作成"&gt;&lt;a href="#%e3%83%af%e3%83%bc%e3%82%af%e3%83%84%e3%83%aa%e3%83%bc%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;ワークツリーの作成
&lt;/h2&gt;&lt;p&gt;ソース管理タブのリポジトリ横のメニューから作成できます。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="335px" data-flex-grow="139" height="512" 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/07/13/git-worktree/02.webp" width="716"&gt;&lt;/p&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-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;リポジトリ名.worktrees
&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;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="266px" data-flex-grow="110" height="420" 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/07/13/git-worktree/03.webp" width="466"&gt;&lt;/p&gt;
&lt;h2 id="ワークツリーを作業ツリーで開く"&gt;&lt;a href="#%e3%83%af%e3%83%bc%e3%82%af%e3%83%84%e3%83%aa%e3%83%bc%e3%82%92%e4%bd%9c%e6%a5%ad%e3%83%84%e3%83%aa%e3%83%bc%e3%81%a7%e9%96%8b%e3%81%8f" class="header-anchor"&gt;&lt;/a&gt;ワークツリーを作業ツリーで開く
&lt;/h2&gt;&lt;p&gt;作成したワークツリー横のメニューから「現在のウィンドウで作業ツリーを開く」または「新しいウィンドウで作業ツリーを開く」を選択します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="345px" data-flex-grow="144" height="545" 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/07/13/git-worktree/04.webp" width="785"&gt;&lt;/p&gt;
&lt;p&gt;あとはいつも通り変更してコミットなどを行います。&lt;/p&gt;
&lt;h2 id="ワークツリーの削除"&gt;&lt;a href="#%e3%83%af%e3%83%bc%e3%82%af%e3%83%84%e3%83%aa%e3%83%bc%e3%81%ae%e5%89%8a%e9%99%a4" class="header-anchor"&gt;&lt;/a&gt;ワークツリーの削除
&lt;/h2&gt;&lt;p&gt;ソース管理タブのリポジトリにて、ワークツリー横のメニューから作成できます。&lt;br&gt;
（右クリックからでもいけます）&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="345px" data-flex-grow="144" height="545" 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/07/13/git-worktree/05.webp" width="785"&gt;&lt;/p&gt;
&lt;p&gt;該当のワークツリーを作業ツリーで開いている場合は削除できませんので、その場合はメインリポジトリに切り替えてから削除する必要があります。&lt;/p&gt;</description></item><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 や AWS EC2 でセッション切断後も処理を止めないよう tmux を使う</title><link>https://blog.ponkotools.com/posts/2026/05/30/tmux/</link><pubDate>Sat, 30 May 2026 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2026/05/30/tmux/</guid><description>&lt;p&gt;OCI や AWS EC2 で作業していると、SSH セッションを閉じたタイミングで実行中のプログラムが止まってしまうことがあります。&lt;/p&gt;
&lt;p&gt;この問題は、tmux の「セッションを切り離す（detach）」を使うだけでほぼ解決できます。&lt;br&gt;
私は今回初めて tmux を使ったため、必要な操作に限定してメモしておきます。&lt;/p&gt;
&lt;h2 id="先にまとめ"&gt;&lt;a href="#%e5%85%88%e3%81%ab%e3%81%be%e3%81%a8%e3%82%81" class="header-anchor"&gt;&lt;/a&gt;先にまとめ
&lt;/h2&gt;&lt;p&gt;「SSH を閉じても処理を動かし続ける」目的なら、tmux は以下だけで運用できます。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;SSH ログイン後に tmux セッションを作る&lt;/li&gt;
&lt;li&gt;tmux 内でプログラムを起動する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Ctrl+b&lt;/code&gt; → &lt;code&gt;d&lt;/code&gt; で切り離す&lt;/li&gt;
&lt;li&gt;SSH を切断しても処理は継続する&lt;/li&gt;
&lt;li&gt;再ログイン後に tmux へ再接続する&lt;/li&gt;
&lt;/ol&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;&lt;span class="c1"&gt;# セッション作成&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tmux new -s app
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# （tmux 内で）プログラム実行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python main.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&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;# 切り離し: Ctrl+b, d&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# いまあるセッション確認&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tmux ls
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 再接続&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tmux attach -t app
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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;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;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;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;tmux -V
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="まずは-1-回動かしてみる"&gt;&lt;a href="#%e3%81%be%e3%81%9a%e3%81%af-1-%e5%9b%9e%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e3%81%bf%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;まずは 1 回動かしてみる
&lt;/h2&gt;&lt;h3 id="1-セッションを作る"&gt;&lt;a href="#1-%e3%82%bb%e3%83%83%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%92%e4%bd%9c%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;1. セッションを作る
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tmux new -s app
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;app&lt;/code&gt; はセッション名です。&lt;br&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;tmux だけ打った場合、もし tmux サーバーがまだ動いていなければ、新しいセッションを作って接続します（デフォルト名で作成）。&lt;br&gt;
すでに tmux が動いていて接続済みでない場合は、最近使われたセッションにアタッチします（新しいセッションは作成されません）。
上記のコマンドは明示的に新規の名前付きセッションを作るコマンドになります。&lt;/p&gt;
 &lt;/div&gt;
 &lt;/blockquote&gt;
&lt;h3 id="2-プログラムを起動する"&gt;&lt;a href="#2-%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%a0%e3%82%92%e8%b5%b7%e5%8b%95%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;2. プログラムを起動する
&lt;/h3&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;python main.py
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;たとえば API サーバーなら、以下のように常駐するコマンドでも同じです。&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;uvicorn app:app --host 0.0.0.0 --port &lt;span class="m"&gt;8000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-セッションを切り離すdetach"&gt;&lt;a href="#3-%e3%82%bb%e3%83%83%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%92%e5%88%87%e3%82%8a%e9%9b%a2%e3%81%99detach" class="header-anchor"&gt;&lt;/a&gt;3. セッションを切り離す（detach）
&lt;/h3&gt;&lt;p&gt;以下の順でキーを押します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Ctrl+b&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;d&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これで tmux の外に戻ります。&lt;br&gt;
プログラムは tmux セッション内でそのまま動き続けますので、SSH 自体を切断して問題ありません。&lt;br&gt;
再ログイン後に tmux へ戻れます。&lt;/p&gt;
&lt;h3 id="4-再接続するattach"&gt;&lt;a href="#4-%e5%86%8d%e6%8e%a5%e7%b6%9a%e3%81%99%e3%82%8battach" class="header-anchor"&gt;&lt;/a&gt;4. 再接続する（attach）
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;tmux ls&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;tmux ls
&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;tmux attach -t app
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="セッションを終了して抜けるプロセスを停止してセッションを閉じる"&gt;&lt;a href="#%e3%82%bb%e3%83%83%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%92%e7%b5%82%e4%ba%86%e3%81%97%e3%81%a6%e6%8a%9c%e3%81%91%e3%82%8b%e3%83%97%e3%83%ad%e3%82%bb%e3%82%b9%e3%82%92%e5%81%9c%e6%ad%a2%e3%81%97%e3%81%a6%e3%82%bb%e3%83%83%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%92%e9%96%89%e3%81%98%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;セッションを終了して抜ける（プロセスを停止してセッションを閉じる）
&lt;/h2&gt;&lt;p&gt;tmux をデタッチせずにそのままセッションを終了して抜けたい場合は、主に次の方法があります。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;セッション内から終了する（推奨 — プロセスを安全に停止）&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;tmux attach -t &amp;lt;セッション名&amp;gt;&lt;/code&gt; でセッションに戻る&lt;/li&gt;
&lt;li&gt;実行中のプロセスを &lt;code&gt;Ctrl+C&lt;/code&gt; などで停止する&lt;/li&gt;
&lt;li&gt;シェルで &lt;code&gt;exit&lt;/code&gt; または &lt;code&gt;Ctrl+D&lt;/code&gt; を押すとウィンドウが閉じ、最後のウィンドウが閉じるとセッションは終了します&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;外からセッションを強制的に終了する（注意: プロセスが強制終了される）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tmux kill-session -t &amp;lt;セッション名&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;全てのセッションを終了する場合は &lt;code&gt;tmux kill-server&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意: セッションを閉じると、そのセッション内で動いていたプロセスは終了します。処理を継続させたい場合はデタッチしてください。&lt;/p&gt;
&lt;h2 id="今回の用途で最低限覚えるコマンド"&gt;&lt;a href="#%e4%bb%8a%e5%9b%9e%e3%81%ae%e7%94%a8%e9%80%94%e3%81%a7%e6%9c%80%e4%bd%8e%e9%99%90%e8%a6%9a%e3%81%88%e3%82%8b%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89" class="header-anchor"&gt;&lt;/a&gt;今回の用途で最低限覚えるコマンド
&lt;/h2&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;code&gt;tmux new -s app&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;セッション一覧&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;tmux ls&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;セッション再接続&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;tmux attach -t app&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;セッション削除（停止）&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;tmux kill-session -t app&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote class="alert alert-tip"&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;セッション内で動いているプロセスを止めたいときは、まず tmux に再接続して &lt;code&gt;Ctrl+c&lt;/code&gt; で停止するのが安全です。&lt;/p&gt;
 &lt;/div&gt;
 &lt;/blockquote&gt;
&lt;h2 id="キー操作の最小セット"&gt;&lt;a href="#%e3%82%ad%e3%83%bc%e6%93%8d%e4%bd%9c%e3%81%ae%e6%9c%80%e5%b0%8f%e3%82%bb%e3%83%83%e3%83%88" class="header-anchor"&gt;&lt;/a&gt;キー操作の最小セット
&lt;/h2&gt;&lt;p&gt;tmux は &lt;code&gt;Ctrl+b&lt;/code&gt; を押したあとに次のキーを押す操作が基本です（prefix キー）。&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;&lt;code&gt;Ctrl+b&lt;/code&gt; → &lt;code&gt;d&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;セッション切り離し&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Ctrl+b&lt;/code&gt; → &lt;code&gt;c&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;新しいウィンドウ作成&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Ctrl+b&lt;/code&gt; → &lt;code&gt;n&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;次のウィンドウへ移動&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Ctrl+b&lt;/code&gt; → &lt;code&gt;p&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;前のウィンドウへ移動&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Ctrl+b&lt;/code&gt; → &lt;code&gt;,&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;ウィンドウ名を変更&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;最初は &lt;code&gt;Ctrl+b&lt;/code&gt; → &lt;code&gt;d&lt;/code&gt; だけ覚えれば十分です。&lt;/p&gt;
&lt;h2 id="よくあるハマりどころ"&gt;&lt;a href="#%e3%82%88%e3%81%8f%e3%81%82%e3%82%8b%e3%83%8f%e3%83%9e%e3%82%8a%e3%81%a9%e3%81%93%e3%82%8d" class="header-anchor"&gt;&lt;/a&gt;よくあるハマりどころ
&lt;/h2&gt;&lt;h3 id="ssh-を切ったら止まった"&gt;&lt;a href="#ssh-%e3%82%92%e5%88%87%e3%81%a3%e3%81%9f%e3%82%89%e6%ad%a2%e3%81%be%e3%81%a3%e3%81%9f" class="header-anchor"&gt;&lt;/a&gt;SSH を切ったら止まった
&lt;/h3&gt;&lt;p&gt;tmux の中で起動せず、通常シェルで起動している可能性があります。&lt;br&gt;
&lt;code&gt;tmux attach -t app&lt;/code&gt; で戻って、そこで起動し直してください。&lt;/p&gt;
&lt;h3 id="tmux-attach-でno-sessionsになる"&gt;&lt;a href="#tmux-attach-%e3%81%a7no-sessions%e3%81%ab%e3%81%aa%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;&lt;code&gt;tmux attach&lt;/code&gt; で「no sessions」になる
&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;tmux new -s app
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="セッション名を忘れる"&gt;&lt;a href="#%e3%82%bb%e3%83%83%e3%82%b7%e3%83%a7%e3%83%b3%e5%90%8d%e3%82%92%e5%bf%98%e3%82%8c%e3%82%8b" 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-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tmux ls
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一覧を出して、その名前で attach すれば戻れます。&lt;/p&gt;</description></item><item><title>Claude Code の認証情報とチャット履歴を devcontainer とホストで共有する</title><link>https://blog.ponkotools.com/posts/2026/05/13/claude-devcontainer-share/</link><pubDate>Wed, 13 May 2026 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2026/05/13/claude-devcontainer-share/</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;li&gt;VSCode 1.119.0&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="きっかけ"&gt;&lt;a href="#%e3%81%8d%e3%81%a3%e3%81%8b%e3%81%91" class="header-anchor"&gt;&lt;/a&gt;きっかけ
&lt;/h2&gt;&lt;p&gt;devcontainer をリビルドするたびに Claude Code に再ログインするのが地味にストレスでした。さらに、ホスト側で進めていた会話の続きが devcontainer 側からは見えず、「あの修正の文脈どこに残してたっけ」となりがちでした。&lt;/p&gt;
&lt;h2 id="ゴール構成"&gt;&lt;a href="#%e3%82%b4%e3%83%bc%e3%83%ab%e6%a7%8b%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;ゴール構成
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;ホスト・devcontainer のどちらで起動しても &lt;strong&gt;同じ認証情報&lt;/strong&gt; を使える&lt;/li&gt;
&lt;li&gt;ホストで途中まで進めた会話を devcontainer 側でも &lt;strong&gt;そのまま継続&lt;/strong&gt; できる&lt;/li&gt;
&lt;li&gt;リビルドしても再ログイン不要&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="claude-code-が何を見ているかを把握する"&gt;&lt;a href="#claude-code-%e3%81%8c%e4%bd%95%e3%82%92%e8%a6%8b%e3%81%a6%e3%81%84%e3%82%8b%e3%81%8b%e3%82%92%e6%8a%8a%e6%8f%a1%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;Claude Code が何を見ているかを把握する
&lt;/h2&gt;&lt;p&gt;設定の前に、Claude Code が以下の 2 つを参照していることを押さえておきます。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;種類&lt;/th&gt;
 &lt;th&gt;場所&lt;/th&gt;
 &lt;th&gt;役割&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;認証情報・設定&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;~/.claude.json&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;API キーなど&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;セッション履歴&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;~/.claude/projects/&amp;lt;エンコードしたパス&amp;gt;/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;プロジェクトごとの会話履歴&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;ポイントは、セッション履歴の格納先が &lt;strong&gt;プロジェクトの絶対パスをスラッシュ → ハイフンに変換した名前&lt;/strong&gt; になっていることです。&lt;/p&gt;
&lt;p&gt;例えばホスト側で &lt;code&gt;/home/&amp;lt;username&amp;gt;/&amp;lt;project_name&amp;gt;&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;~/.claude/projects/-home-&amp;lt;username&amp;gt;-&amp;lt;project_name&amp;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;strong&gt;ホストとコンテナで「ワークスペースの絶対パス」を一致させる必要がある&lt;/strong&gt; ということです。&lt;code&gt;~/.claude&lt;/code&gt; だけ bind mount しても、コンテナ側のワークスペースパスがホストと違えば別フォルダ扱いになり、履歴は共有されません。&lt;/p&gt;
&lt;h2 id="設定する-2-つのマウント"&gt;&lt;a href="#%e8%a8%ad%e5%ae%9a%e3%81%99%e3%82%8b-2-%e3%81%a4%e3%81%ae%e3%83%9e%e3%82%a6%e3%83%b3%e3%83%88" class="header-anchor"&gt;&lt;/a&gt;設定する 2 つのマウント
&lt;/h2&gt;&lt;p&gt;必要なマウントは性質の違う 2 種類になります。&lt;/p&gt;
&lt;h3 id="1-claude--claudejson-のマウント--コンテナ側ユーザーの-home-に合わせる"&gt;&lt;a href="#1-claude--claudejson-%e3%81%ae%e3%83%9e%e3%82%a6%e3%83%b3%e3%83%88--%e3%82%b3%e3%83%b3%e3%83%86%e3%83%8a%e5%81%b4%e3%83%a6%e3%83%bc%e3%82%b6%e3%83%bc%e3%81%ae-home-%e3%81%ab%e5%90%88%e3%82%8f%e3%81%9b%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;1. &lt;code&gt;.claude&lt;/code&gt; / &lt;code&gt;.claude.json&lt;/code&gt; のマウント (= コンテナ側ユーザーの home に合わせる)
&lt;/h3&gt;&lt;p&gt;Claude Code は &lt;strong&gt;そのプロセスの &lt;code&gt;$HOME/.claude&lt;/code&gt;&lt;/strong&gt; を読みに行きます。devcontainer のデフォルトユーザーは &lt;code&gt;vscode&lt;/code&gt; なので、&lt;code&gt;~&lt;/code&gt; は &lt;code&gt;/home/vscode&lt;/code&gt; です。したがってターゲットも &lt;code&gt;/home/vscode/.claude&lt;/code&gt; にします。&lt;/p&gt;
&lt;h3 id="2-ワークスペースのマウント--ホスト側の絶対パスに合わせる"&gt;&lt;a href="#2-%e3%83%af%e3%83%bc%e3%82%af%e3%82%b9%e3%83%9a%e3%83%bc%e3%82%b9%e3%81%ae%e3%83%9e%e3%82%a6%e3%83%b3%e3%83%88--%e3%83%9b%e3%82%b9%e3%83%88%e5%81%b4%e3%81%ae%e7%b5%b6%e5%af%be%e3%83%91%e3%82%b9%e3%81%ab%e5%90%88%e3%82%8f%e3%81%9b%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;2. ワークスペースのマウント (= ホスト側の絶対パスに合わせる)
&lt;/h3&gt;&lt;p&gt;こちらはセッション履歴のキーになる「プロジェクトの絶対パス」を一致させるのが目的なので、ターゲットを &lt;strong&gt;ホスト側と同じパス&lt;/strong&gt; にします。ホストの &lt;code&gt;~/&amp;lt;project_name&amp;gt;&lt;/code&gt; を開いているなら、コンテナ内でも &lt;code&gt;/home/&amp;lt;username&amp;gt;/&amp;lt;project_name&amp;gt;&lt;/code&gt; にマウントするということです。&lt;/p&gt;
&lt;p&gt;ターゲットの基準が違う (ユーザー基準 vs ホスト基準) のがややこしい部分なので、表にしておきます。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;マウント&lt;/th&gt;
 &lt;th&gt;ターゲット&lt;/th&gt;
 &lt;th&gt;基準&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;~/.claude&lt;/code&gt; &lt;code&gt;~/.claude.json&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;/home/vscode/.claude&lt;/code&gt; &lt;code&gt;/home/vscode/.claude.json&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;コンテナ内ユーザー&lt;/strong&gt; の home&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ワークスペース&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;/home/&amp;lt;username&amp;gt;/&amp;lt;project_name&amp;gt;&lt;/code&gt; 等&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;ホスト側&lt;/strong&gt; の絶対パス&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="devcontainerjson-の例"&gt;&lt;a href="#devcontainerjson-%e3%81%ae%e4%be%8b" class="header-anchor"&gt;&lt;/a&gt;devcontainer.json の例
&lt;/h2&gt;&lt;p&gt;上記を踏まえた &lt;code&gt;.devcontainer/devcontainer.json&lt;/code&gt; の抜粋です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-jsonc" data-lang="jsonc"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;my-devcontainer&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;build&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;dockerfile&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Dockerfile&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;args&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// ホストの $HOME を build arg として Dockerfile に渡す
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// (workspace の親ディレクトリを事前に作るために使う。後述)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;WORKSPACE_PARENT&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${localEnv:HOME}&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// ワークスペースのマウント先をホスト側の絶対パスと一致させる。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// フォルダ名は localWorkspaceFolderBasename で動的解決するので、
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// ホスト側を rename しても devcontainer.json の編集は不要。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;workspaceMount&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;source=${localWorkspaceFolder},target=${localEnv:HOME}/${localWorkspaceFolderBasename},type=bind,consistency=cached&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;workspaceFolder&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${localEnv:HOME}/${localWorkspaceFolderBasename}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;mounts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// .claude / .claude.json はコンテナ内ユーザー (vscode) の home にマウント
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;source=${localEnv:HOME}/.claude,target=/home/vscode/.claude,type=bind,consistency=cached&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;source=${localEnv:HOME}/.claude.json,target=/home/vscode/.claude.json,type=bind,consistency=cached&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;remoteUser&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;vscode&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;${localEnv:HOME}&lt;/code&gt; は &lt;strong&gt;ホスト側&lt;/strong&gt; の &lt;code&gt;$HOME&lt;/code&gt; (例: &lt;code&gt;/home/&amp;lt;username&amp;gt;&lt;/code&gt;)、&lt;code&gt;${localWorkspaceFolderBasename}&lt;/code&gt; は VSCode が開いているフォルダ名 (例: &lt;code&gt;&amp;lt;project_name&amp;gt;&lt;/code&gt;) に展開されます。両者を組み合わせることで、ホストで開いているパスと完全に同じ絶対パスをコンテナ内に作れます。&lt;/p&gt;
&lt;h2 id="dockerfile-側で親ディレクトリを用意しておく"&gt;&lt;a href="#dockerfile-%e5%81%b4%e3%81%a7%e8%a6%aa%e3%83%87%e3%82%a3%e3%83%ac%e3%82%af%e3%83%88%e3%83%aa%e3%82%92%e7%94%a8%e6%84%8f%e3%81%97%e3%81%a6%e3%81%8a%e3%81%8f" class="header-anchor"&gt;&lt;/a&gt;Dockerfile 側で親ディレクトリを用意しておく
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;workspaceFolder&lt;/code&gt; に指定したパスの &lt;strong&gt;親ディレクトリ&lt;/strong&gt; がコンテナ内に存在しないと、Dev Containers の起動チェックで「ワークスペースが存在しません」とエラーになります。bind mount はマウント時にターゲットを作ってくれますが、Dev Containers のチェックがそれより先に走るためです。&lt;/p&gt;
&lt;p&gt;そこで Dockerfile 側で親ディレクトリだけ先に作っておきます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;mcr.microsoft.com/devcontainers/base:bookworm&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# devcontainer.json の workspaceFolder (= ホストの $HOME/&amp;lt;フォルダ名&amp;gt;) と&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 同じ絶対パスをコンテナ内に用意しておく。&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ARG&lt;/span&gt; &lt;span class="nv"&gt;WORKSPACE_PARENT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/home/vscode&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; mkdir -p &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKSPACE_PARENT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ARG のデフォルト値を &lt;code&gt;/home/vscode&lt;/code&gt; にしておけば、build arg を渡し忘れても既存ユーザーのホームが使われるだけで build が壊れることはありません。&lt;/p&gt;
&lt;h2 id="ユーザーは-vscode-のままでよい"&gt;&lt;a href="#%e3%83%a6%e3%83%bc%e3%82%b6%e3%83%bc%e3%81%af-vscode-%e3%81%ae%e3%81%be%e3%81%be%e3%81%a7%e3%82%88%e3%81%84" class="header-anchor"&gt;&lt;/a&gt;ユーザーは vscode のままでよい
&lt;/h2&gt;&lt;p&gt;「ワークスペースが &lt;code&gt;/home/&amp;lt;username&amp;gt;/&amp;lt;project_name&amp;gt;&lt;/code&gt; なのに &lt;code&gt;whoami&lt;/code&gt; すると &lt;code&gt;vscode&lt;/code&gt; になっている」というアンバランスさが気になるかもしれませんが、機能上は問題ありません。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;devcontainers/base の &lt;code&gt;vscode&lt;/code&gt; ユーザーは UID 1000&lt;/li&gt;
&lt;li&gt;ホスト側の Linux ユーザーも通常 UID 1000&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;UID が一致していれば bind mount したファイルにそのまま読み書きできるためです。&lt;code&gt;vscode&lt;/code&gt; ユーザーが自分の home (&lt;code&gt;/home/vscode/&lt;/code&gt;) 以外の場所で作業すること自体は何も問題を起こしません。&lt;/p&gt;
&lt;p&gt;ユーザー名まで揃えようとすると base image の改造が必要になり、devcontainer features が前提にしている &lt;code&gt;vscode&lt;/code&gt; ユーザーが消えて壊れがちです。&lt;strong&gt;ホストと揃えるのは「絶対パス」だけで十分&lt;/strong&gt; と割り切るのが楽です。&lt;/p&gt;
&lt;h2 id="注意点"&gt;&lt;a href="#%e6%b3%a8%e6%84%8f%e7%82%b9" class="header-anchor"&gt;&lt;/a&gt;注意点
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ホスト側に &lt;code&gt;~/.claude&lt;/code&gt; と &lt;code&gt;~/.claude.json&lt;/code&gt; が存在している必要があります&lt;/strong&gt;。なければ bind mount に失敗します。ホスト側でも一度 Claude Code を起動して認証を済ませておくのが手っ取り早いです。&lt;/li&gt;
&lt;li&gt;セッション履歴を &lt;strong&gt;ホストと同時に書き込まない&lt;/strong&gt; よう注意してください。両方から同じプロジェクトを同時に触ると、ファイルロック等の衝突で履歴が壊れることがあります。基本「どちらか一方で作業する」運用が安全です。&lt;/li&gt;
&lt;li&gt;設定変更後は VSCode の &lt;strong&gt;Dev Containers: Rebuild Container&lt;/strong&gt; でリビルドしないと反映されません。&lt;/li&gt;
&lt;/ul&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;ul&gt;
&lt;li&gt;Claude Code のセッション履歴は &lt;strong&gt;プロジェクトの絶対パスをキー&lt;/strong&gt; にして格納される。&lt;/li&gt;
&lt;li&gt;なので「ホストとセッション共有したい」ならコンテナ内のワークスペースパスをホスト側と完全一致させる必要がある。&lt;/li&gt;
&lt;li&gt;マウント先は 2 系統で基準が違う:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.claude&lt;/code&gt; / &lt;code&gt;.claude.json&lt;/code&gt; は &lt;strong&gt;コンテナ内ユーザーの home&lt;/strong&gt; に合わせる&lt;/li&gt;
&lt;li&gt;ワークスペースは &lt;strong&gt;ホスト側の絶対パス&lt;/strong&gt; に合わせる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ワークスペースの親ディレクトリは Dockerfile 側で &lt;code&gt;mkdir -p&lt;/code&gt; しておく必要がある。&lt;/li&gt;
&lt;li&gt;フォルダ名は &lt;code&gt;${localWorkspaceFolderBasename}&lt;/code&gt; で動的解決すれば、rename にも追従する。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>GitHub CLI (gh auth login) で Git の HTTPS 認証を安全にする</title><link>https://blog.ponkotools.com/posts/2026/05/11/github-cli-auth/</link><pubDate>Mon, 11 May 2026 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2026/05/11/github-cli-auth/</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%81%8d%e3%81%a3%e3%81%8b%e3%81%91" class="header-anchor"&gt;&lt;/a&gt;きっかけ
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;git remote -v&lt;/code&gt; を眺めていたら、Personal Access Token (PAT) が remote URL に丸ごと埋め込まれている状態になっていました。&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;origin https://ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxx@github.com/USER/REPO.git (fetch)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;origin https://ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxx@github.com/USER/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/config&lt;/code&gt; はリポジトリに含まれないため「push しても外には出ない」ものの、ローカルで露出する経路は意外と多くあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;シェル履歴 (&lt;code&gt;~/.bash_history&lt;/code&gt; &lt;code&gt;~/.zsh_history&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;エディタや CI のログ、画面共有・スクリーンショット&lt;/li&gt;
&lt;li&gt;うっかり配布した dotfiles リポジトリ&lt;/li&gt;
&lt;li&gt;マルウェアやリモートアクセスで &lt;code&gt;.git/config&lt;/code&gt; が読まれる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;しかも classic PAT はスコープが粗く、&lt;code&gt;repo&lt;/code&gt; 権限があれば private リポジトリ全体の閲覧・書き換え、強制 push による履歴破壊、GitHub Actions secrets の窃取まで可能になります。攻撃者は奪った瞬間には何もせず静かに watch することもできるため、「使われた形跡がない」では安心できません。&lt;/p&gt;
&lt;p&gt;これを機に、PAT を URL に埋めず GitHub CLI (&lt;code&gt;gh&lt;/code&gt;) の credential helper に任せる構成に切り替えました。&lt;/p&gt;
&lt;h2 id="ゴール構成"&gt;&lt;a href="#%e3%82%b4%e3%83%bc%e3%83%ab%e6%a7%8b%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;ゴール構成
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;remote URL は素の &lt;code&gt;https://github.com/USER/REPO.git&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;認証は &lt;code&gt;gh&lt;/code&gt; が credential helper として処理 (トークンは OS のセキュアストア管理)&lt;/li&gt;
&lt;li&gt;devcontainer を作り直しても再ログイン不要&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;h3 id="1-露出したトークンを-revoke-最優先"&gt;&lt;a href="#1-%e9%9c%b2%e5%87%ba%e3%81%97%e3%81%9f%e3%83%88%e3%83%bc%e3%82%af%e3%83%b3%e3%82%92-revoke-%e6%9c%80%e5%84%aa%e5%85%88" class="header-anchor"&gt;&lt;/a&gt;1. 露出したトークンを revoke (最優先)
&lt;/h3&gt;&lt;p&gt;remote URL を書き換える前に、まず GitHub 側でトークンを無効化します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;classic PAT: &lt;a class="link" href="https://github.com/settings/tokens" target="_blank" rel="noopener"
 &gt;https://github.com/settings/tokens&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;fine-grained PAT: &lt;a class="link" href="https://github.com/settings/personal-access-tokens" target="_blank" rel="noopener"
 &gt;https://github.com/settings/personal-access-tokens&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;該当トークンを Delete した瞬間に無効になります。順序として &lt;strong&gt;これを先にやる&lt;/strong&gt; ことが大切です。後の手順を待っている間に古いトークンが他経路で使われるリスクを断ちます。&lt;/p&gt;
&lt;h3 id="2-gh-をインストール"&gt;&lt;a href="#2-gh-%e3%82%92%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;2. &lt;code&gt;gh&lt;/code&gt; をインストール
&lt;/h3&gt;&lt;p&gt;devcontainer 環境なら &lt;code&gt;ghcr.io/devcontainers/features/github-cli&lt;/code&gt; feature で &lt;code&gt;gh&lt;/code&gt; がすでに入っています。&lt;/p&gt;
&lt;p&gt;ホスト (Ubuntu 24.04) に入れる場合は、以下の記事を参考にしてください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.ponkotools.com/posts/2026/05/09/github-cli/" &gt;GitHub CLI (gh) のインストールと基本的な使い方&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-gh-auth-login-で認証"&gt;&lt;a href="#3-gh-auth-login-%e3%81%a7%e8%aa%8d%e8%a8%bc" class="header-anchor"&gt;&lt;/a&gt;3. &lt;code&gt;gh auth login&lt;/code&gt; で認証
&lt;/h3&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;対話で以下のように選びます。&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;? 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? → Yes&lt;/code&gt; が肝で、これが &lt;code&gt;git config --global credential.helper&lt;/code&gt; を &lt;code&gt;gh&lt;/code&gt; 経由に書き換えてくれます。以後 &lt;code&gt;git push&lt;/code&gt; のたびに &lt;code&gt;gh&lt;/code&gt; が裏でトークンを取り出して認証してくれます。&lt;/p&gt;
&lt;p&gt;devcontainer のようなヘッドレス環境ではブラウザは自動で開きません。表示される 8 桁のワンタイムコードをコピーし、ホスト側のブラウザで &lt;a class="link" href="https://github.com/login/device" target="_blank" rel="noopener"
 &gt;https://github.com/login/device&lt;/a&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;✓ Authentication complete.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✓ Logged in as USER
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="4-remote-url-からトークンを除去"&gt;&lt;a href="#4-remote-url-%e3%81%8b%e3%82%89%e3%83%88%e3%83%bc%e3%82%af%e3%83%b3%e3%82%92%e9%99%a4%e5%8e%bb" class="header-anchor"&gt;&lt;/a&gt;4. remote URL からトークンを除去
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git remote set-url origin https://github.com/USER/REPO.git
&lt;/span&gt;&lt;/span&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;トークン部分が消えていれば OK です。&lt;code&gt;git fetch origin&lt;/code&gt; がパスワードを聞かれずに通れば認証は機能しています。&lt;/p&gt;
&lt;h3 id="5-シェル履歴の残骸を確認"&gt;&lt;a href="#5-%e3%82%b7%e3%82%a7%e3%83%ab%e5%b1%a5%e6%ad%b4%e3%81%ae%e6%ae%8b%e9%aa%b8%e3%82%92%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;5. シェル履歴の残骸を確認
&lt;/h3&gt;&lt;p&gt;revoke 済みでも、ローカル履歴に残ったトークン文字列は気持ちが悪いものです。&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;grep -rn &lt;span class="s1"&gt;&amp;#39;ghp_&amp;#39;&lt;/span&gt; ~/.bash_history ~/.zsh_history 2&amp;gt;/dev/null
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ヒットしたら該当行を削除します (&lt;code&gt;history -d &amp;lt;行番号&amp;gt;&lt;/code&gt; でメモリ上を消した後、ファイルも編集しておきます)。&lt;/p&gt;
&lt;h2 id="devcontainer-での認証共有"&gt;&lt;a href="#devcontainer-%e3%81%a7%e3%81%ae%e8%aa%8d%e8%a8%bc%e5%85%b1%e6%9c%89" class="header-anchor"&gt;&lt;/a&gt;devcontainer での認証共有
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;gh&lt;/code&gt; の認証情報は &lt;code&gt;~/.config/gh/hosts.yml&lt;/code&gt; (と OS のセキュアストア) に保存されます。devcontainer をリビルドすると &lt;code&gt;~/.config/gh&lt;/code&gt; が消えて再ログインが必要になるため、ホストの設定を bind mount で共有します。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.devcontainer/devcontainer.json&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-jsonc" data-lang="jsonc"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;mounts&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;source=${localEnv:HOME}/.claude,target=/home/vscode/.claude,type=bind,consistency=cached&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;source=${localEnv:HOME}/.claude.json,target=/home/vscode/.claude.json,type=bind,consistency=cached&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;source=${localEnv:HOME}/.config/gh,target=/home/vscode/.config/gh,type=bind,consistency=cached&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;前提として &lt;strong&gt;ホスト側に &lt;code&gt;~/.config/gh&lt;/code&gt; ディレクトリが存在している必要があります&lt;/strong&gt; (なければ bind mount に失敗します)。ホストにも &lt;code&gt;gh&lt;/code&gt; を入れて &lt;code&gt;gh auth login&lt;/code&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;mkdir -p ~/.config/gh &lt;span class="c1"&gt;# ホスト側で実行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;設定変更後は VSCode の &lt;strong&gt;Dev Containers: Rebuild Container&lt;/strong&gt; でリビルドすると反映されます。&lt;/p&gt;
&lt;h2 id="補足-ssh-鍵にしないのか"&gt;&lt;a href="#%e8%a3%9c%e8%b6%b3-ssh-%e9%8d%b5%e3%81%ab%e3%81%97%e3%81%aa%e3%81%84%e3%81%ae%e3%81%8b" class="header-anchor"&gt;&lt;/a&gt;補足: SSH 鍵にしないのか
&lt;/h2&gt;&lt;p&gt;SSH 鍵認証もアリですが、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;鍵ファイル自体の管理 (&lt;code&gt;~/.ssh&lt;/code&gt; のパーミッション、複数マシン間の同期) が発生します&lt;/li&gt;
&lt;li&gt;GitHub Actions など他用途で &lt;code&gt;gh&lt;/code&gt; をどのみち使うことが多いです&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;そのため、個人開発の HTTPS なら &lt;code&gt;gh auth login&lt;/code&gt; ひとつに寄せた方がメンテが楽だと感じています。複数アカウントの切替も &lt;code&gt;gh auth switch&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;ul&gt;
&lt;li&gt;PAT を URL に埋めるのは「公開リポジトリに含まれない」だけでローカル経路の露出リスクは大きいです。露出に気付いた時点で revoke が最優先となります。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gh auth login&lt;/code&gt; で credential helper を任せれば URL からトークンを排除でき、トークンは OS のセキュアストアに隔離されます。&lt;/li&gt;
&lt;li&gt;devcontainer ではホストの &lt;code&gt;~/.config/gh&lt;/code&gt; を bind mount しておくと、リビルドのたびに再ログインしなくて済みます。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ターミナルから GitLab を操る：公式 CLI「glab」導入・活用ガイド</title><link>https://blog.ponkotools.com/posts/2026/05/10/glab/</link><pubDate>Sun, 10 May 2026 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2026/05/10/glab/</guid><description>&lt;p&gt;ブラウザを開かずに Issue を確認したり、MR（マージリクエスト）を作成したり、CI/CD パイプラインの状況を監視したりできるため、エンジニアの生産性を大きく向上させてくれます。&lt;/p&gt;
&lt;h2 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%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;1. インストール方法
&lt;/h2&gt;&lt;p&gt;devcontainer を使っていない場合は、ホスト側に &lt;code&gt;glab&lt;/code&gt; をインストールして使います。devcontainer を使う場合は、コンテナイメージに &lt;code&gt;glab&lt;/code&gt; をインストールしておくか、devcontainer の &lt;code&gt;Dockerfile&lt;/code&gt; / &lt;code&gt;devcontainer.json&lt;/code&gt; で導入しておきます。&lt;/p&gt;
&lt;p&gt;一般的な手順としては、&lt;code&gt;Dockerfile&lt;/code&gt; に &lt;code&gt;curl&lt;/code&gt; で &lt;code&gt;glab&lt;/code&gt; の公式パッケージを取得して &lt;code&gt;apt install&lt;/code&gt; するか、&lt;code&gt;apt&lt;/code&gt; リポジトリからインストールする形です。コンテナ内で &lt;code&gt;glab --version&lt;/code&gt; を実行して、インストールが正しくできていることを確認してください。&lt;/p&gt;
&lt;p&gt;OS ごとの主要なインストールコマンドは以下の通りです。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;OS&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;strong&gt;macOS&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;brew install glab&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Windows (winget)&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;winget install glab&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Windows (scoop)&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;scoop install glab&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Linux (Ubuntu/Debian)&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;sudo apt install glab&lt;/code&gt;（※公式リポジトリ推奨）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;インストール後、&lt;code&gt;glab --version&lt;/code&gt; で正常にインストールされたか確認しましょう。&lt;/p&gt;
&lt;p&gt;バージョンが古かったり、上記でインストールできない場合は、公式リリースからダウンロードしてインストールします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://gitlab.com/gitlab-org/cli/-/releases" target="_blank" rel="noopener"
 &gt;https://gitlab.com/gitlab-org/cli/-/releases&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-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /tmp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://gitlab.com/gitlab-org/cli/-/releases/v1.97.0/downloads/glab_1.97.0_linux_amd64.deb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo dpkg -i glab_1.97.0_linux_amd64.deb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="2-初期設定認証"&gt;&lt;a href="#2-%e5%88%9d%e6%9c%9f%e8%a8%ad%e5%ae%9a%e8%aa%8d%e8%a8%bc" class="header-anchor"&gt;&lt;/a&gt;2. 初期設定（認証）
&lt;/h2&gt;&lt;p&gt;インストールが完了したら、GitLab アカウントと連携させます。&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;ol&gt;
&lt;li&gt;&lt;strong&gt;GitLab インスタンスの種類&lt;/strong&gt;: GitLab.com か 自前運用のサーバー（Self-Managed）かを選択。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;認証方法&lt;/strong&gt;: &lt;code&gt;Web&lt;/code&gt; を選択するとブラウザが開いて簡単に認証できます。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;プロトコル&lt;/strong&gt;: &lt;code&gt;SSH&lt;/code&gt; または &lt;code&gt;HTTPS&lt;/code&gt; を選択。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;設定が完了すると、&lt;code&gt;~/.config/glab-cli/config.yml&lt;/code&gt; に設定が保存されます。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="3-devcontainer-での認証情報共有"&gt;&lt;a href="#3-devcontainer-%e3%81%a7%e3%81%ae%e8%aa%8d%e8%a8%bc%e6%83%85%e5%a0%b1%e5%85%b1%e6%9c%89" class="header-anchor"&gt;&lt;/a&gt;3. devcontainer での認証情報共有
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;glab&lt;/code&gt; の認証情報は &lt;code&gt;~/.config/glab-cli/config.yml&lt;/code&gt; に保存されます。devcontainer をリビルドするとコンテナ内の &lt;code&gt;~/.config/glab-cli&lt;/code&gt; が消えて再ログインが必要になるため、ホスト側の設定を bind mount で共有しておくと便利です。&lt;/p&gt;
&lt;p&gt;一般的には、&lt;code&gt;.devcontainer/devcontainer.json&lt;/code&gt; の &lt;code&gt;mounts&lt;/code&gt; にホストの &lt;code&gt;~/.config/glab-cli&lt;/code&gt; を追加します。例:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-jsonc" data-lang="jsonc"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;mounts&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;source=${localEnv:HOME}/.config/glab-cli,target=/home/vscode/.config/glab-cli,type=bind,consistency=cached&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;もし &lt;code&gt;gh&lt;/code&gt; など別の CLI も devcontainer 内で使うなら、同じように &lt;code&gt;~/.config/gh&lt;/code&gt; を共有することもできます。&lt;/p&gt;
&lt;p&gt;ホスト側に &lt;code&gt;~/.config/glab-cli&lt;/code&gt; が存在していれば、ホストで一度 &lt;code&gt;glab auth login&lt;/code&gt; しておけばコンテナ側でも同じ認証を使えます。ホストにディレクトリがない場合は、&lt;code&gt;mkdir -p ~/.config/glab-cli&lt;/code&gt; で空ディレクトリを作成しておけばマウントが通ります。&lt;/p&gt;
&lt;p&gt;このようにしておけば、&lt;code&gt;glab&lt;/code&gt; の認証設定をホストと devcontainer で共通化し、コンテナ再構築後も再ログイン不要で作業を続けやすくなります。&lt;/p&gt;
&lt;h2 id="4-よく使う基本コマンド集"&gt;&lt;a href="#4-%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%e9%9b%86" class="header-anchor"&gt;&lt;/a&gt;4. よく使う基本コマンド集
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;glab&lt;/code&gt; のコマンド体系は &lt;code&gt;glab &amp;lt;リソース名&amp;gt; &amp;lt;アクション&amp;gt;&lt;/code&gt; という形式で、&lt;code&gt;gh&lt;/code&gt; と非常に似ています。&lt;/p&gt;
&lt;h3 id="-merge-request-mr-を操作する"&gt;&lt;a href="#-merge-request-mr-%e3%82%92%e6%93%8d%e4%bd%9c%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;■ Merge Request (MR) を操作する
&lt;/h3&gt;&lt;p&gt;開発のメイン作業となる MR 操作です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MR の一覧表示&lt;/strong&gt;: &lt;code&gt;glab mr list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MR の作成&lt;/strong&gt;: &lt;code&gt;glab mr create --fill&lt;/code&gt;（現在のブランチから自動入力で作成）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MR の詳細表示&lt;/strong&gt;: &lt;code&gt;glab mr view &amp;lt;id&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MR を承認&lt;/strong&gt;: &lt;code&gt;glab mr approve &amp;lt;id&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MR をマージ&lt;/strong&gt;: &lt;code&gt;glab mr merge &amp;lt;id&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-issue-課題-を管理する"&gt;&lt;a href="#-issue-%e8%aa%b2%e9%a1%8c-%e3%82%92%e7%ae%a1%e7%90%86%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;■ Issue (課題) を管理する
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Issue 一覧&lt;/strong&gt;: &lt;code&gt;glab issue list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Issue 作成&lt;/strong&gt;: &lt;code&gt;glab issue create -t &amp;quot;タイトル&amp;quot; -description &amp;quot;内容&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-cicd-パイプラインを確認する"&gt;&lt;a href="#-cicd-%e3%83%91%e3%82%a4%e3%83%97%e3%83%a9%e3%82%a4%e3%83%b3%e3%82%92%e7%a2%ba%e8%aa%8d%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;■ CI/CD パイプラインを確認する
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;glab&lt;/code&gt; 独自の強力な機能の一つが、CI パイプラインのリアルタイム監視です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;パイプラインの状態表示&lt;/strong&gt;: &lt;code&gt;glab pipeline status&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;実行中のログをリアルタイム表示&lt;/strong&gt;: &lt;code&gt;glab pipeline ci view&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;失敗したジョブの再実行&lt;/strong&gt;: &lt;code&gt;glab ci retry&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="4-gh-と-glab-の主な対応表"&gt;&lt;a href="#4-gh-%e3%81%a8-glab-%e3%81%ae%e4%b8%bb%e3%81%aa%e5%af%be%e5%bf%9c%e8%a1%a8" class="header-anchor"&gt;&lt;/a&gt;4. &lt;code&gt;gh&lt;/code&gt; と &lt;code&gt;glab&lt;/code&gt; の主な対応表
&lt;/h2&gt;&lt;p&gt;GitHub CLI に慣れている方向けのクイック比較です。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;機能&lt;/th&gt;
 &lt;th&gt;GitHub (&lt;code&gt;gh&lt;/code&gt;)&lt;/th&gt;
 &lt;th&gt;GitLab (&lt;code&gt;glab&lt;/code&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;code&gt;gh auth login&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;glab auth login&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;PR / MR 作成&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;gh pr create&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;&lt;code&gt;glab mr create&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;PR / MR チェックアウト&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;gh pr checkout &amp;lt;id&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;&lt;code&gt;glab mr checkout &amp;lt;id&amp;gt;&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;リポジトリ作成&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;gh repo create&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;&lt;code&gt;glab project create&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;CI 監視&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;gh run watch&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;&lt;code&gt;glab pipeline ci view&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="5-自社運用の-gitlab-self-managed-で使うコツ"&gt;&lt;a href="#5-%e8%87%aa%e7%a4%be%e9%81%8b%e7%94%a8%e3%81%ae-gitlab-self-managed-%e3%81%a7%e4%bd%bf%e3%81%86%e3%82%b3%e3%83%84" class="header-anchor"&gt;&lt;/a&gt;5. 自社運用の GitLab (Self-Managed) で使うコツ
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;glab&lt;/code&gt; は GitLab.com だけでなく、会社などで独自に立てている GitLab サーバーでも使えます。その場合、環境変数でホストを指定しておくと便利です。&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;GITLAB_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;gitlab.example.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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;glab&lt;/code&gt; を導入することで、「コードを書く → プッシュする → ブラウザで MR を作る → CI の完了を待つ」という一連の流れをターミナルから一歩も出ずに行えるようになります。&lt;/p&gt;
&lt;p&gt;まずは &lt;code&gt;glab mr list&lt;/code&gt; から始めて、快適な GitLab ライフを送りましょう！&lt;/p&gt;
&lt;hr&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://docs.gitlab.com/ee/editor_extensions/gitlab_cli/" target="_blank" rel="noopener"
 &gt;GitLab CLI 公式ドキュメント&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://gitlab.com/gitlab-org/cli" target="_blank" rel="noopener"
 &gt;GitHub リポジトリ (gitlab-org/cli)&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>WSL でディストリビューションを削除して再インストール後に起動エラーになる</title><link>https://blog.ponkotools.com/posts/2023/07/14/wsl/</link><pubDate>Fri, 14 Jul 2023 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2023/07/14/wsl/</guid><description>&lt;p&gt;スタートメニューから Ubuntu 20.04 をアンインストールして、再度 MS ストアからインストールして起動しようとしたら以下のエラーが表示されました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ps" data-lang="ps"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;Error&lt;/span&gt; &lt;span class="nf"&gt;code:&lt;/span&gt; &lt;span class="nf"&gt;Wsl&lt;/span&gt;&lt;span class="nv"&gt;/Service/CreateInstance/MountVhd/ERROR_FILE_NOT_FOUND&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-ps" data-lang="ps"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;wsl&lt;/span&gt; &lt;span class="nf"&gt;-l&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;Linux&lt;/span&gt; &lt;span class="nf"&gt;用&lt;/span&gt; &lt;span class="nf"&gt;Windows&lt;/span&gt; &lt;span class="nf"&gt;サブシステム&lt;/span&gt; &lt;span class="nf"&gt;ディストリビューション:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;Ubuntu-20.04&lt;/span&gt; &lt;span class="s"&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-ps" data-lang="ps"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;wsl&lt;/span&gt; &lt;span class="nf"&gt;--unregister&lt;/span&gt; &lt;span class="nf"&gt;Ubuntu-20.04&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://www.techgaku.com/fix-ubuntu-boot-error-on-wsl-after-reinstall/" target="_blank" rel="noopener"
 &gt;https://www.techgaku.com/fix-ubuntu-boot-error-on-wsl-after-reinstall/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Microsoft ストア版の WSL をインストールする</title><link>https://blog.ponkotools.com/posts/2023/07/06/wsl/</link><pubDate>Thu, 06 Jul 2023 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2023/07/06/wsl/</guid><description>&lt;p&gt;WSL について、Windows のコンポーネント（組み込み）として提供されているものと、Microsoft Store で提供されているものがあるのを知りました。&lt;/p&gt;
&lt;p&gt;きっかけは、WSL2 上の Ubuntu で systemd を使おうとしたら使えなかったことで、調べていくと WSL 自体のバージョンが 0.67.6 以降だと systemd が使えることがわかりました。&lt;/p&gt;
&lt;p&gt;WSL 自体のバージョンは以下のコマンドで確認できるらしいのですが、&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ps" data-lang="ps"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;wsl&lt;/span&gt; &lt;span class="nf"&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;これは、どうやら WSL のバージョンが古いのが原因らしく、最新版は Microsoft Store からインストールできるらしいと。&lt;br&gt;
ここで、2022年11月に正式版としてリリースされたストア版の WSL を知り、自分が使っていたのは「Windows の機能の有効化または無効化」からインストールしたコンポーネント版で、古いプレビュー版の WSL だということを知りました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/omu_kato/items/f9a6b5a02e25f5f2a487" target="_blank" rel="noopener"
 &gt;https://qiita.com/omu_kato/items/f9a6b5a02e25f5f2a487&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ストア版の WSL は普通に Microsoft Store で検索すれば見つかるので、そこでインストールするだけです。&lt;/p&gt;
&lt;p&gt;尚、既にコンポーネント版を使っていてもストア版をインストールして使えるようですが、私の環境では Ubuntu 22.04 を起動しようとすると &lt;code&gt;Error code: Wsl/Service/CreateInstance/MountVhd/ERROR_FILE_NOT_FOUND&lt;/code&gt; のエラーが出てしまいました。&lt;/p&gt;
&lt;p&gt;これについては、以下を参考に WSL から Ubuntu 22.04 の登録を解除すれば直りました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.techgaku.com/fix-ubuntu-boot-error-on-wsl-after-reinstall/" target="_blank" rel="noopener"
 &gt;https://www.techgaku.com/fix-ubuntu-boot-error-on-wsl-after-reinstall/&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://qiita.com/omu_kato/items/f9a6b5a02e25f5f2a487" target="_blank" rel="noopener"
 &gt;https://qiita.com/omu_kato/items/f9a6b5a02e25f5f2a487&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/hiromasa-masuda/items/355fe0c882a1a0abe1e1" target="_blank" rel="noopener"
 &gt;https://qiita.com/hiromasa-masuda/items/355fe0c882a1a0abe1e1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.techgaku.com/fix-ubuntu-boot-error-on-wsl-after-reinstall/" target="_blank" rel="noopener"
 &gt;https://www.techgaku.com/fix-ubuntu-boot-error-on-wsl-after-reinstall/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>VSCode で現在アクティブなタブの背景色を変更する</title><link>https://blog.ponkotools.com/posts/2023/06/12/vscode/</link><pubDate>Mon, 12 Jun 2023 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2023/06/12/vscode/</guid><description>&lt;p&gt;Visual Studio Code のエディタで現在アクティブなタブの背景色が、デフォルトだと他のタブとあまり変わらなくて分かりづらいので、設定で変更しました。&lt;/p&gt;
&lt;p&gt;メニューより、ファイル &amp;gt; ユーザー設定 &amp;gt; 設定 を選択します。&lt;/p&gt;
&lt;p&gt;設定の検索より &lt;code&gt;workbench.colorCustomizations&lt;/code&gt; と入力し、「settings.json で編集」をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="485px" data-flex-grow="202" height="282" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2023/06/12/vscode/vscode.png" width="570"&gt;&lt;/p&gt;
&lt;p&gt;そして、以下のように &lt;code&gt;tab.activeBackground&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;&amp;#34;workbench.colorCustomizations&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;tab.activeBackground&amp;#34;: &amp;#34;#1b77cf&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/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://tekunabe.hatenablog.jp/entry/2021/05/23/134458" target="_blank" rel="noopener"
 &gt;https://tekunabe.hatenablog.jp/entry/2021/05/23/134458&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>GitLab CI/CD で Uploading artifacts to coordinator... too large archive のエラーが表示された</title><link>https://blog.ponkotools.com/posts/2022/07/08/gitlab/</link><pubDate>Fri, 08 Jul 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/07/08/gitlab/</guid><description>&lt;p&gt;GitLab CI/CD で成果物をアップロードする際に、サイズが大きすぎるとのエラーが表示されました。&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;ERROR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Uploading&lt;/span&gt; &lt;span class="n"&gt;artifacts&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;coordinator&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;too&lt;/span&gt; &lt;span class="n"&gt;large&lt;/span&gt; &lt;span class="n"&gt;archive&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;XXXX&lt;/span&gt; &lt;span class="n"&gt;responseStatus&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;413&lt;/span&gt; &lt;span class="n"&gt;Request&lt;/span&gt; &lt;span class="n"&gt;Entity&lt;/span&gt; &lt;span class="n"&gt;Too&lt;/span&gt; &lt;span class="n"&gt;Large&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;413&lt;/span&gt; &lt;span class="n"&gt;Request&lt;/span&gt; &lt;span class="n"&gt;Entity&lt;/span&gt; &lt;span class="n"&gt;Too&lt;/span&gt; &lt;span class="n"&gt;Large&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;XXXXX&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;FATAL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;too&lt;/span&gt; &lt;span class="n"&gt;large&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ERROR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Job&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;exit&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="gitlab-の設定"&gt;&lt;a href="#gitlab-%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;GitLab の設定
&lt;/h2&gt;&lt;p&gt;まずは GitLab の以下の設定を確認します。&lt;/p&gt;
&lt;p&gt;「Settings &amp;gt; Continuous Integration and Deployment &amp;gt; Maximum artifacts size (MB) 」&lt;/p&gt;
&lt;p&gt;デフォルトでは 100MB に設定されているので、必要ならここを変更します。&lt;/p&gt;
&lt;p&gt;しかし、今回は 7MB 程度のファイルだったので、これが原因ではありませんでした。&lt;/p&gt;
&lt;h2 id="リバースプロキシの設定"&gt;&lt;a href="#%e3%83%aa%e3%83%90%e3%83%bc%e3%82%b9%e3%83%97%e3%83%ad%e3%82%ad%e3%82%b7%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;リバースプロキシの設定
&lt;/h2&gt;&lt;p&gt;今回 nginx でリバースプロキシの設定を行っていたのですが、&lt;code&gt;client_max_body_size&lt;/code&gt; の設定を行っていなかったのが原因でした。&lt;br&gt;
&lt;code&gt;client_max_body_size&lt;/code&gt; のデフォルト値は 1MB だそうです。&lt;br&gt;
とりあえず以下のように &lt;code&gt;0&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;server {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; listen 80;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; server_name example.com;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; client_max_body_size 0;
&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="参考-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://pauledenburg.com/gitlab-ci-upload-artifact-fails-large/" target="_blank" rel="noopener"
 &gt;https://pauledenburg.com/gitlab-ci-upload-artifact-fails-large/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Redmine のチケットを一括で他のプロジェクトに移動させる</title><link>https://blog.ponkotools.com/posts/2022/05/17/redmine/</link><pubDate>Tue, 17 May 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/05/17/redmine/</guid><description>&lt;p&gt;ちょっとだけ迷ったのでメモです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;チケットの一覧で、チケットを複数選択&lt;/li&gt;
&lt;li&gt;右クリックして「編集」を選択&lt;/li&gt;
&lt;li&gt;プロジェクトを変更する&lt;/li&gt;
&lt;/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://linkerdesign.github.io/journal/2013/01/redmine.html" target="_blank" rel="noopener"
 &gt;https://linkerdesign.github.io/journal/2013/01/redmine.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Redmine に Git のリポジトリを追加したら internal error が表示される</title><link>https://blog.ponkotools.com/posts/2022/05/13/redmine/</link><pubDate>Fri, 13 May 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/05/13/redmine/</guid><description>&lt;p&gt;私の場合ですが、タグ名に日本語を使っていたのが原因のようでした。&lt;/p&gt;
&lt;p&gt;環境は以下です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Redmine 3.4.2&lt;/li&gt;
&lt;li&gt;Git 1.8.3.1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ちょっと古いバージョンなので最新バージョンではわかりませんが、この環境下では、ブランチやタグの名前に日本語を使っていると internal error となるようです。&lt;br&gt;
Redmine のログを見ていてタグの表示でエラーになっているっぽかったので気が付きました。&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://plugins.co.jp/2015/05/git%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%AB%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%90%8D%E3%82%92%E3%81%A4%E3%81%91%E3%82%8B%E3%81%A8redmine%E3%81%AE%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA/" target="_blank" rel="noopener"
 &gt;https://plugins.co.jp/2015/05/git%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%AB%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%90%8D%E3%82%92%E3%81%A4%E3%81%91%E3%82%8B%E3%81%A8redmine%E3%81%AE%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Redmine に Git のリポジトリを追加したら 404 エラーが表示される</title><link>https://blog.ponkotools.com/posts/2022/05/12/redmine/</link><pubDate>Thu, 12 May 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/05/12/redmine/</guid><description>&lt;p&gt;まずはファイルパスが正しいかを疑うべきですが、それが正しい場合はアクセス権が原因の可能性があります。&lt;/p&gt;
&lt;p&gt;例えば、私の場合、&lt;code&gt;/home/username/xxxx.git&lt;/code&gt; という場所にベアリポジトリを作成していたのですが、&lt;code&gt;xxxx.git&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;$ sudo chmod o+rx xxxx.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;しかし、その一つ上の &lt;code&gt;/home/username&lt;/code&gt; にアクセス権が設定されていなかったため、Redmine からは見ることができなかったようです。&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;$ sudo chmod o+rx /home/username
&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.pistolfly.com/weblog/2010/11/redminegit.html" target="_blank" rel="noopener"
 &gt;https://www.pistolfly.com/weblog/2010/11/redminegit.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>GitLab でプライベートリポジトリの分も草を生やす</title><link>https://blog.ponkotools.com/posts/2022/05/02/gitlab/</link><pubDate>Mon, 02 May 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/05/02/gitlab/</guid><description>&lt;p&gt;GitLab のプロフィールに表示されるコミットグラフですが、デフォルトでは自分以外の人からは Public なリポジトリの分しか見えません。&lt;/p&gt;
&lt;p&gt;Private なリポジトリのコミット分も見えるようにするには、以下の設定を変更します。&lt;/p&gt;
&lt;p&gt;Preferences &amp;gt; Profile &amp;gt; Private contributions&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.igorkromin.net/index.php/2018/09/13/gitlab-finally-shows-private-project-contributions-in-the-profile-commit-graph/" target="_blank" rel="noopener"
 &gt;https://www.igorkromin.net/index.php/2018/09/13/gitlab-finally-shows-private-project-contributions-in-the-profile-commit-graph/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>TortoiseGit で過去のコミットの作者（コミッター）を修正する</title><link>https://blog.ponkotools.com/posts/2022/04/13/tortoisegit/</link><pubDate>Wed, 13 Apr 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/04/13/tortoisegit/</guid><description>&lt;p&gt;間違ったアカウント（メールアドレス）でコミットしてしまった場合に、後から TortoiseGit で修正する方法です。&lt;/p&gt;
&lt;p&gt;TortoiseGit で過去のコミットメッセージを変更する方法を以下の記事にまとめていますが、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2017/10/tortoisegit.html" target="_blank" rel="noopener"
 &gt;TortoiseGit でコミットメッセージを変更する&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;コミットメッセージではなく、コミッターの情報を変更したい場合、ここにもう少し手順が必要です。&lt;/p&gt;
&lt;h2 id="まずはコミットメッセージを修正する画面を表示する"&gt;&lt;a href="#%e3%81%be%e3%81%9a%e3%81%af%e3%82%b3%e3%83%9f%e3%83%83%e3%83%88%e3%83%a1%e3%83%83%e3%82%bb%e3%83%bc%e3%82%b8%e3%82%92%e4%bf%ae%e6%ad%a3%e3%81%99%e3%82%8b%e7%94%bb%e9%9d%a2%e3%82%92%e8%a1%a8%e7%a4%ba%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;そしたら、「コミットを編集/分割する」にチェックを入れて「Amend」をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="481px" data-flex-grow="200" height="375" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2022/04/13/tortoisegit/01.webp" width="752"&gt;&lt;/p&gt;
&lt;p&gt;すると、通常コミット時と同じ画面が表示されるので、「作者を設定」にチェックを入れ、右の欄にユーザー名とメールアドレスを入力してコミットします。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="669px" data-flex-grow="278" height="259" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2022/04/13/tortoisegit/02.webp" width="722"&gt;&lt;/p&gt;
&lt;p&gt;「他のコミットを追加しますか？」という画面が表示されますが、コミッターの修正だけであれば「いいえ」を選択します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="337px" data-flex-grow="140" height="152" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2022/04/13/tortoisegit/03.webp" width="214"&gt;&lt;/p&gt;
&lt;p&gt;他のコミットも編集する場合は同様に修正していきます。&lt;br&gt;
以上です。&lt;/p&gt;</description></item><item><title>git で clone する場合に 503 エラーが表示される</title><link>https://blog.ponkotools.com/posts/2022/04/12/git/</link><pubDate>Tue, 12 Apr 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/04/12/git/</guid><description>&lt;p&gt;ローカルネットワークにある GitLab からクローンをしようとした際、503 エラーが表示されました。&lt;/p&gt;
&lt;p&gt;ググってみるとプロキシ設定が原因という記事が出てきますが、一応プロキシ設定はしているつもりでした。&lt;/p&gt;
&lt;p&gt;しかし、どうやら Git は ワイルドカードを使ったプロキシ設定を認識してくれないようです。&lt;/p&gt;
&lt;p&gt;今回、環境変数 &lt;code&gt;no_proxy&lt;/code&gt; に &lt;code&gt;192.168.1.*&lt;/code&gt; のように設定していたのですが、これを &lt;code&gt;192.168.1.2&lt;/code&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>WSL2 で GUI を表示する</title><link>https://blog.ponkotools.com/posts/2022/01/16/wsl/</link><pubDate>Sun, 16 Jan 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/01/16/wsl/</guid><description>&lt;p&gt;Windows に Xサーバーをインストールし、WSL2 上で実行した GUI アプリを表示できるようにする方法です。&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="xサーバーのインストール"&gt;&lt;a href="#x%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;Xサーバーのインストール
&lt;/h2&gt;&lt;p&gt;Windows にXサーバーをインストールします。
私は以下のページを参考に &lt;code&gt;VcXsrv&lt;/code&gt; を入れました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://rin-ka.net/windows-x-server/" target="_blank" rel="noopener"
 &gt;https://rin-ka.net/windows-x-server/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;他には &lt;code&gt;MobaXterm&lt;/code&gt; も良さそうですね。&lt;/p&gt;
&lt;p&gt;あとは、ファイアウォールの設定も許可する必要があります。&lt;br&gt;
設定完了後、&lt;code&gt;VcXsrv&lt;/code&gt; 起動時に許可を求める画面が表示されるので、そこで全て許可しました。&lt;/p&gt;
&lt;h2 id="wsl2-側の設定"&gt;&lt;a href="#wsl2-%e5%81%b4%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;WSL2 側の設定
&lt;/h2&gt;&lt;p&gt;Linux ではおなじみの &lt;code&gt;export DISPLAY=:0&lt;/code&gt; では駄目なようで、IPアドレスを指定する必要があるみたいです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://odaryo.hatenablog.com/entry/2020/01/08/114846" target="_blank" rel="noopener"
 &gt;https://odaryo.hatenablog.com/entry/2020/01/08/114846&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以下のようにすれば IP アドレスを読み込んで環境変数をセットしてくれるようです。&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="k"&gt;export&lt;/span&gt; &lt;span class="n"&gt;DISPLAY&lt;/span&gt;&lt;span class="o"&gt;=$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;resolv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;grep&lt;/span&gt; &lt;span class="n"&gt;nameserver&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="mi"&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;.bashrc&lt;/code&gt; に書いておけば、WSL2 起動時に自動でセットされるようです。&lt;/p&gt;
&lt;h2 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;/h2&gt;&lt;p&gt;&lt;code&gt;VcXsrv&lt;/code&gt; を、&lt;code&gt;Disable access control&lt;/code&gt; にチェックを入れて起動し、WSL2 上で以下のコマンドを実行して確認します。&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;$ xeyes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="vscode--remote-containers-を使う場合"&gt;&lt;a href="#vscode--remote-containers-%e3%82%92%e4%bd%bf%e3%81%86%e5%a0%b4%e5%90%88" class="header-anchor"&gt;&lt;/a&gt;VSCode + Remote-Containers を使う場合
&lt;/h2&gt;&lt;p&gt;WSL2 上で VSCode を実行して Remote-Containers を使う場合、WSL2 の &lt;code&gt;DISPLAY&lt;/code&gt; の値を Retemo-Containers 側にも引き継げば、Retemo-Containers でも GUI の表示が可能です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/y-na-biz/items/af0137532e6e22802f25#%E5%8F%82%E8%80%83devcontainerjson%E8%A8%AD%E5%AE%9A%E4%B8%80%E8%A6%A7" target="_blank" rel="noopener"
 &gt;https://qiita.com/y-na-biz/items/af0137532e6e22802f25#%E5%8F%82%E8%80%83devcontainerjson%E8%A8%AD%E5%AE%9A%E4%B8%80%E8%A6%A7&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;{
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&amp;#34;runArgs&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&amp;#34;-e&amp;#34;, &amp;#34;DISPLAY=${env:DISPLAY}&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	],
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&amp;#34;mounts&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&amp;#34;source=/tmp/.X11-unix/,target=/tmp/.X11-unix/,type=bind&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	],
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;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://rin-ka.net/windows-x-server/" target="_blank" rel="noopener"
 &gt;https://rin-ka.net/windows-x-server/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://islandcnt.exblog.jp/240399231/" target="_blank" rel="noopener"
 &gt;https://islandcnt.exblog.jp/240399231/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://odaryo.hatenablog.com/entry/2020/01/08/114846" target="_blank" rel="noopener"
 &gt;https://odaryo.hatenablog.com/entry/2020/01/08/114846&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/y-na-biz/items/af0137532e6e22802f25#%E5%8F%82%E8%80%83devcontainerjson%E8%A8%AD%E5%AE%9A%E4%B8%80%E8%A6%A7" target="_blank" rel="noopener"
 &gt;https://qiita.com/y-na-biz/items/af0137532e6e22802f25#%E5%8F%82%E8%80%83devcontainerjson%E8%A8%AD%E5%AE%9A%E4%B8%80%E8%A6%A7&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>WSL2 のインストール</title><link>https://blog.ponkotools.com/posts/2022/01/15/wsl/</link><pubDate>Sat, 15 Jan 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/01/15/wsl/</guid><description>&lt;p&gt;WSL2 をインストールし、WSL2 上で Ubuntu を動かす方法です。&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 Pro OSビルド 19042.1466&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="wsl2-のインストール"&gt;&lt;a href="#wsl2-%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;WSL2 のインストール
&lt;/h2&gt;&lt;p&gt;公式ドキュメントは以下です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/ja-jp/windows/wsl/install" target="_blank" rel="noopener"
 &gt;https://docs.microsoft.com/ja-jp/windows/wsl/install&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/ja-jp/windows/wsl/install-manual" target="_blank" rel="noopener"
 &gt;https://docs.microsoft.com/ja-jp/windows/wsl/install-manual&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="wsl-のインストール"&gt;&lt;a href="#wsl-%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;WSL のインストール
&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-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; wsl --install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="wsl2-にアップデート"&gt;&lt;a href="#wsl2-%e3%81%ab%e3%82%a2%e3%83%83%e3%83%97%e3%83%87%e3%83%bc%e3%83%88" class="header-anchor"&gt;&lt;/a&gt;WSL2 にアップデート
&lt;/h3&gt;&lt;p&gt;以下にアクセスし、wsl_update_x64.msiをダウンロードしてインストールします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://aka.ms/wsl2kernel" target="_blank" rel="noopener"
 &gt;https://aka.ms/wsl2kernel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="wsl2-をデフォルトにする"&gt;&lt;a href="#wsl2-%e3%82%92%e3%83%87%e3%83%95%e3%82%a9%e3%83%ab%e3%83%88%e3%81%ab%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;WSL2 をデフォルトにする
&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;&amp;gt; wsl --set-default-version 2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ubuntu-のインストール"&gt;&lt;a href="#ubuntu-%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;Ubuntu のインストール
&lt;/h2&gt;&lt;p&gt;MS Store から Ubuntu で検索してインストールするだけです。&lt;/p&gt;
&lt;h3 id="wsl2-で動作しているか確認"&gt;&lt;a href="#wsl2-%e3%81%a7%e5%8b%95%e4%bd%9c%e3%81%97%e3%81%a6%e3%81%84%e3%82%8b%e3%81%8b%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;WSL2 で動作しているか確認
&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;&amp;gt; wsl --list --verbose
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; NAME STATE VERSION
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;* Ubuntu Running 2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;*&lt;/code&gt; が付いているのがデフォルトのディストリビューションです。
VERSION が 2 になっているので、WSL2 で動作しています。&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-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; wsl --set-default Ubuntu
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;WSL のバージョンが2でない場合、以下のようにして設定します。&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;&amp;gt; wsl --set-version Ubuntu 2
&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://docs.microsoft.com/ja-jp/windows/wsl/install" target="_blank" rel="noopener"
 &gt;https://docs.microsoft.com/ja-jp/windows/wsl/install&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/ja-jp/windows/wsl/install-manual" target="_blank" rel="noopener"
 &gt;https://docs.microsoft.com/ja-jp/windows/wsl/install-manual&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.4peace.co.jp/tech/569/" target="_blank" rel="noopener"
 &gt;https://www.4peace.co.jp/tech/569/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>VSCode の Remote-Containers を起動したときに、マウントのパスに無効な文字が含まれているというエラーが表示された</title><link>https://blog.ponkotools.com/posts/2021/09/01/vscode/</link><pubDate>Wed, 01 Sep 2021 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2021/09/01/vscode/</guid><description>&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: Error response from daemon: create /home/user/workspace: &amp;#34;/home/user/workspace&amp;#34; includes invalid characters for a local volume name, only &amp;#34;[a-zA-Z0-9][a-zA-Z0-9_.-]&amp;#34; are allowed. If you intended to pass a host directory, use absolute path.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;devcontainer.json&lt;/code&gt; の &lt;code&gt;mounts&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="s2"&gt;&amp;#34;mounts&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="s2"&gt;&amp;#34;source=${localWorkspaceFolder}/workspace,target=/workspace&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;type&lt;/code&gt; を省略してしまっていたのですが、&lt;code&gt;type&lt;/code&gt; のデフォルトは &lt;code&gt;volume&lt;/code&gt; なので、ボリュームをマウントしようとしてエラーになっていたみたいです。&lt;br&gt;
以下のように &lt;code&gt;type=bind&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="s2"&gt;&amp;#34;mounts&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="s2"&gt;&amp;#34;source=${localWorkspaceFolder}/workspace,target=/workspace,type=bind&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;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/microsoft/vscode-remote-release/issues/2573" target="_blank" rel="noopener"
 &gt;https://github.com/microsoft/vscode-remote-release/issues/2573&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://code.visualstudio.com/docs/remote/devcontainerjson-reference" target="_blank" rel="noopener"
 &gt;https://code.visualstudio.com/docs/remote/devcontainerjson-reference&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>git-svn の使い方</title><link>https://blog.ponkotools.com/posts/2021/07/03/git-svn/</link><pubDate>Sat, 03 Jul 2021 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2021/07/03/git-svn/</guid><description>&lt;p&gt;社内で未だに SVN で開発しているプロダクトがあるので、git-svn を使ってみました。&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;git 2.25.1&lt;/li&gt;
&lt;li&gt;svn 1.13.0&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="インストール"&gt;&lt;a href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" 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-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt install git-svn
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="クローン"&gt;&lt;a href="#%e3%82%af%e3%83%ad%e3%83%bc%e3%83%b3" class="header-anchor"&gt;&lt;/a&gt;クローン
&lt;/h2&gt;&lt;p&gt;SVN リポジトリを指定してクローンを行います。&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;$ git svn clone --prefix=svn/ &amp;lt;SVNリポジトリのURL&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;--prefix&lt;/code&gt; は SVN のブランチに接頭辞をつけるオプションで、一般的に付けたほうがよいとされています。&lt;/p&gt;
&lt;p&gt;SVN リポジトリが標準的な構成(trunk, branch, tag) になっている場合は &lt;code&gt;-s&lt;/code&gt; オプションを付けます。&lt;br&gt;
標準的な構成になっていない場合は &lt;code&gt;--trunk&lt;/code&gt; &lt;code&gt;branches&lt;/code&gt; &lt;code&gt;--tags&lt;/code&gt; を使用する。&lt;br&gt;
今回はルートが trunk になっており、ブランチも作成していなかったため、以下のように指定しました。&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;$ git svn clone --trunk=/ --prefix=svn/ &amp;lt;SVNリポジトリのURL&amp;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;$ git branch -a
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;* master
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; remotes/svn/trunk
&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%9f%e3%83%83%e3%83%88" class="header-anchor"&gt;&lt;/a&gt;コミット
&lt;/h2&gt;&lt;p&gt;コミットは普通に git を使ってやるのと同じです。&lt;/p&gt;
&lt;h2 id="svn-リポジトリにコミットを反映する"&gt;&lt;a href="#svn-%e3%83%aa%e3%83%9d%e3%82%b8%e3%83%88%e3%83%aa%e3%81%ab%e3%82%b3%e3%83%9f%e3%83%83%e3%83%88%e3%82%92%e5%8f%8d%e6%98%a0%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;SVN リポジトリにコミットを反映する
&lt;/h2&gt;&lt;p&gt;git でのプッシュに該当する操作として、SVNにコミットを行います。&lt;br&gt;
コミット前にリベースで git のコミットをまとめておいたほうがいいかもしれません。&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;$ git svn dcommit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="svn-リポジトリから最新のデータを取得"&gt;&lt;a href="#svn-%e3%83%aa%e3%83%9d%e3%82%b8%e3%83%88%e3%83%aa%e3%81%8b%e3%82%89%e6%9c%80%e6%96%b0%e3%81%ae%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92%e5%8f%96%e5%be%97" class="header-anchor"&gt;&lt;/a&gt;SVN リポジトリから最新のデータを取得
&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;$ git svn rebase
&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;/workspace/hoge: needs update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;update-index --refresh: command returned error: 1
&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://blog.freks.jp/start-git-svn/" target="_blank" rel="noopener"
 &gt;https://blog.freks.jp/start-git-svn/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.wantanblog.com/entry/2019/10/15/220051" target="_blank" rel="noopener"
 &gt;https://www.wantanblog.com/entry/2019/10/15/220051&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>git でコミットを一つにまとめる</title><link>https://blog.ponkotools.com/posts/2021/07/02/git/</link><pubDate>Fri, 02 Jul 2021 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2021/07/02/git/</guid><description>&lt;p&gt;Ｗindows 環境では TortoiseGit を使っているので GUI で出来るのですが、Ubuntu で使っている RabbitGit では出来なさそうだったので、コマンドでやりました。&lt;/p&gt;
&lt;p&gt;TortoiseGit でのやり方は以下です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2018/09/tortoisegit.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2018/09/tortoisegit.html&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="#%e3%81%be%e3%81%9a%e3%83%ad%e3%82%b0%e3%82%92%e7%a2%ba%e8%aa%8d" 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-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git log --oneline
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;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;5418fe (HEAD -&amp;gt; master) fuga
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;f3896f7 piyo
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;af6639b hoge
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;b1da633 initial commit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここで３つのコミット（hoge、piyo、fuga のメッセージのやつ）を一つにまとめてみます。&lt;/p&gt;
&lt;h2 id="リベースの開始"&gt;&lt;a href="#%e3%83%aa%e3%83%99%e3%83%bc%e3%82%b9%e3%81%ae%e9%96%8b%e5%a7%8b" 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;$ git rebase -i HEAD~3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;HEAD~3&lt;/code&gt; は &lt;code&gt;HEAD~~~&lt;/code&gt; やハッシュ値でも構いません。&lt;/p&gt;
&lt;p&gt;すると、テキストエディタで編集画面が表示されます。&lt;br&gt;
私の場合は nano で表示されました（vi じゃなくてよかった）。&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;pick af6639b hoge
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pick f3896f7 piyo
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pick c5418fe fuga
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Rebase b1da633..c5418fe onto b1da633 (3 commands)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Commands:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# p, pick &amp;lt;commit&amp;gt; = use commit
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# r, reword &amp;lt;commit&amp;gt; = use commit, but edit the commit message
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# e, edit &amp;lt;commit&amp;gt; = use commit, but stop for amending
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# s, squash &amp;lt;commit&amp;gt; = use commit, but meld into previous commit
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# f, fixup &amp;lt;commit&amp;gt; = like &amp;#34;squash&amp;#34;, but discard this commit&amp;#39;s log message
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# x, exec &amp;lt;command&amp;gt; = run command (the rest of the line) using shell
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# b, break = stop here (continue rebase later with &amp;#39;git rebase --continue&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# d, drop &amp;lt;commit&amp;gt; = remove commit
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# l, label &amp;lt;label&amp;gt; = label current HEAD with a name
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# t, reset &amp;lt;label&amp;gt; = reset HEAD to a label
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# m, merge [-C &amp;lt;commit&amp;gt; | -c &amp;lt;commit&amp;gt;] &amp;lt;label&amp;gt; [# &amp;lt;oneline&amp;gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# . create a merge commit using the original merge commit&amp;#39;s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# . message (or the oneline, if no original merge commit was
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# . specified). Use -c &amp;lt;commit&amp;gt; to reword the commit message.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# These lines can be re-ordered; they are executed from top to bottom.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# If you remove a line here THAT COMMIT WILL BE LOST.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# However, if you remove everything, the rebase will be aborted.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Note that empty commits are commented out
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;-i&lt;/code&gt; オプションを指定したので、この画面では Rebase を使って現在と過去の間に残ってるコミットをどう処理するかを聞かれています。&lt;/p&gt;
&lt;p&gt;最新以外の &lt;code&gt;pick&lt;/code&gt; の箇所を &lt;code&gt;s&lt;/code&gt; または &lt;code&gt;squash&lt;/code&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-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pick af6639b hoge
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pick f3896f7 piyo
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pick c5418fe fuga
&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-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pick af6639b hoge
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;s f3896f7 piyo
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;s c5418fe fuga
&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://qiita.com/takke/items/3400b55becfd72769214" target="_blank" rel="noopener"
 &gt;https://qiita.com/takke/items/3400b55becfd72769214&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://dev-yakuza.posstree.com/git/git-squash/" target="_blank" rel="noopener"
 &gt;https://dev-yakuza.posstree.com/git/git-squash/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>RabbitVCS のインストール</title><link>https://blog.ponkotools.com/posts/2021/07/01/rabbit-vcs/</link><pubDate>Thu, 01 Jul 2021 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2021/07/01/rabbit-vcs/</guid><description>&lt;p&gt;Windows では TortoiseSVN と TortoiseGit を使っていたので、Linux でも GUI で良いのがないかなと探していたら、RabbitVCS というのが Tortoise に似た感じだったので、インストールしてみました。&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="#%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;ul&gt;
&lt;li&gt;&lt;a class="link" href="http://wiki.rabbitvcs.org/wiki/install/ubuntu" target="_blank" rel="noopener"
 &gt;http://wiki.rabbitvcs.org/wiki/install/ubuntu&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-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt install rabbitvcs-nautilus
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これ一つで &lt;code&gt;RabbitVCS SVN&lt;/code&gt; &lt;code&gt;RabbitVCS Git&lt;/code&gt; &lt;code&gt;RabbitVCS Hg&lt;/code&gt; が使えるようになるっぽい。&lt;/p&gt;
&lt;p&gt;あとはファイル比較用の Meld とかいうツールも勝手に入ってました。&lt;/p&gt;
&lt;p&gt;再起動後には Tortoise と同じように、フォルダにアイコンが表示されるようになっていました。&lt;/p&gt;
&lt;h2 id="所感"&gt;&lt;a href="#%e6%89%80%e6%84%9f" class="header-anchor"&gt;&lt;/a&gt;所感
&lt;/h2&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="http://wiki.rabbitvcs.org/wiki/install/ubuntu" target="_blank" rel="noopener"
 &gt;http://wiki.rabbitvcs.org/wiki/install/ubuntu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://ameblo.jp/mizuhokuzuhara/entry-12581847170.html" target="_blank" rel="noopener"
 &gt;https://ameblo.jp/mizuhokuzuhara/entry-12581847170.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>VSCode + Remote-Containers で python の開発環境を作成する</title><link>https://blog.ponkotools.com/posts/2021/06/18/vscode/</link><pubDate>Fri, 18 Jun 2021 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2021/06/18/vscode/</guid><description>&lt;p&gt;VSCode の Remote-Containers を使い、python 開発用の 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;li&gt;Visual Studio Code 1.56.2&lt;/li&gt;
&lt;li&gt;Remote Development 0.21.0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらはインストールされている前提です。&lt;/p&gt;
&lt;h2 id="設定ファイルの作成"&gt;&lt;a href="#%e8%a8%ad%e5%ae%9a%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;設定ファイルの作成
&lt;/h2&gt;&lt;p&gt;コマンドパレットを開いて(&lt;code&gt;Shift + Ctrl + p&lt;/code&gt;)、&lt;code&gt;Remote-Container: Add Development Container Configuration Files&lt;/code&gt; を実行します。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Python3&lt;/code&gt; を選択し、続いて Python のバージョンを選択します。&lt;br&gt;
その後、Node.js をインストールするかどうか表示されますが、今回は必要ないのでチェックを外しました。&lt;/p&gt;
&lt;p&gt;OK を押すと、以下のファイルが作成されます。&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;.devcontainer
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── Dockerfile
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── devcontainer.json
&lt;/span&gt;&lt;/span&gt;&lt;/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;code&gt;Reopen in Container&lt;/code&gt; を選択するとコンテナが起動します。&lt;/p&gt;
&lt;div class="separator" style="clear: both;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioggZB1AZm4gmlWlTjfEs7wm9zOu3doCLKbA_2gRtv_QoJGqNZqRMNW0d_BopWrum1d_qJD1EMaTENBnVhoC2_jn-5MVrPm-N1wAfg61Z3is2FAOoRG0fVUnn2SgkV5df_ualWeD2dIB4/s0/5.png" style="display: block; padding: 1em 0; text-align: center; "&gt;&lt;img alt="" border="0" data-original-height="126" data-original-width="149" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioggZB1AZm4gmlWlTjfEs7wm9zOu3doCLKbA_2gRtv_QoJGqNZqRMNW0d_BopWrum1d_qJD1EMaTENBnVhoC2_jn-5MVrPm-N1wAfg61Z3is2FAOoRG0fVUnn2SgkV5df_ualWeD2dIB4/s0/5.png"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;h2 id="拡張機能のインストール"&gt;&lt;a href="#%e6%8b%a1%e5%bc%b5%e6%a9%9f%e8%83%bd%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;拡張機能のインストール
&lt;/h2&gt;&lt;p&gt;Remote-Containers を使う場合、VSCode の拡張機能もコンテナ用に別途インストールする必要があるみたいです。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;devcontainer.json&lt;/code&gt; の &lt;code&gt;extensions&lt;/code&gt; に記載しておけば、コンテナ作成時に自動的に拡張機能もインストールされるようです。&lt;br&gt;
今回は設定ファイル作成時に Python を選択したので、最初から下記の２つが記載されていました。&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; &amp;#34;extensions&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;ms-python.python&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;ms-python.vscode-pylance&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ],
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;従って、コンテナを起動した時点で &lt;code&gt;python&lt;/code&gt; と &lt;code&gt;pylance&lt;/code&gt; は最初から入っているはずなのですが、何故か私の環境ではインストールされていません。&lt;/p&gt;
&lt;div class="separator" style="clear: both;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjStQ_qPqostcKQAlkbdceNMbMO-BZNhP0tJreUP2ogN30FZOpjdzVCcu4e2vdAyi_oAjtjM4o7UvYC-sP6SLxwmy5rlr3j3WMBRzV5YDH1IP6ZtDtbNnLRqCA0s5Jb46IaHdyFF7m2_ZE/s448/6.png" style="display: block; padding: 1em 0; text-align: center; "&gt;&lt;img alt="" border="0" height="320" data-original-height="448" data-original-width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjStQ_qPqostcKQAlkbdceNMbMO-BZNhP0tJreUP2ogN30FZOpjdzVCcu4e2vdAyi_oAjtjM4o7UvYC-sP6SLxwmy5rlr3j3WMBRzV5YDH1IP6ZtDtbNnLRqCA0s5Jb46IaHdyFF7m2_ZE/s320/6.png"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;仕方がないので、手動でインストールしました。&lt;/p&gt;
&lt;h3 id="手動でのインストール"&gt;&lt;a href="#%e6%89%8b%e5%8b%95%e3%81%a7%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;手動でのインストール
&lt;/h3&gt;&lt;p&gt;まず、&lt;code&gt;DEV CONTAINER&lt;/code&gt; のところの雲のアイコンをクリックします。&lt;/p&gt;
&lt;div class="separator" style="clear: both;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPaSkx77AmbCpshhGicXrKyLZ9A_bq461WvDwsNco4naOEuPc_qGgZoyUQ7r-SDlfI37oHdyR3X5OqdfpCGxEoFP1kUfJ7N-8vWt0meJjGzdl9qWNeGiucc0utOiOgXxs3PH0M3a-7RJ8/s0/7.png" style="display: block; padding: 1em 0; text-align: center; "&gt;&lt;img alt="" border="0" data-original-height="78" data-original-width="314" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPaSkx77AmbCpshhGicXrKyLZ9A_bq461WvDwsNco4naOEuPc_qGgZoyUQ7r-SDlfI37oHdyR3X5OqdfpCGxEoFP1kUfJ7N-8vWt0meJjGzdl9qWNeGiucc0utOiOgXxs3PH0M3a-7RJ8/s0/7.png"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;ローカルにインストールされている拡張機能一覧が表示されるので、コンテナ内にインストールしたい拡張機能にチェックを入れます。&lt;/p&gt;
&lt;div class="separator" style="clear: both;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLy5xEDkJtQf2QhyphenhyphenrIcM24qYggb9utZZoxCAALJmIt932CzZfEKeDfVBahFzr2G_Dm42P5oad2cgrPqT-p7CYFwhYJB0Bs17ECzvAzTkHllag54Ey4oPh75VbYvYtjYaqtF4RcH2qM94o/s605/8.png" style="display: block; padding: 1em 0; text-align: center; "&gt;&lt;img alt="" border="0" width="320" data-original-height="458" data-original-width="605" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLy5xEDkJtQf2QhyphenhyphenrIcM24qYggb9utZZoxCAALJmIt932CzZfEKeDfVBahFzr2G_Dm42P5oad2cgrPqT-p7CYFwhYJB0Bs17ECzvAzTkHllag54Ey4oPh75VbYvYtjYaqtF4RcH2qM94o/s320/8.png"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;インストールが完了した後は一度 VSCode を再起動したほうがよいかと思います。&lt;/p&gt;
&lt;h2 id="デバッグを開始する"&gt;&lt;a href="#%e3%83%87%e3%83%90%e3%83%83%e3%82%b0%e3%82%92%e9%96%8b%e5%a7%8b%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;デバッグを開始する
&lt;/h2&gt;&lt;p&gt;あとはローカル環境で python のデバッグを行う場合と同じです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2020/01/vscode-python.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2020/01/vscode-python.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://qiita.com/sabure500/items/a117b8a1733193be455f" target="_blank" rel="noopener"
 &gt;https://qiita.com/sabure500/items/a117b8a1733193be455f&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/bigengelt/items/780440a146e6a3bdffd4" target="_blank" rel="noopener"
 &gt;https://qiita.com/bigengelt/items/780440a146e6a3bdffd4&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>git コマンドのメモ</title><link>https://blog.ponkotools.com/posts/2021/06/07/git/</link><pubDate>Mon, 07 Jun 2021 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2021/06/07/git/</guid><description>&lt;p&gt;普段は TortoiseGit を使っており、いざコマンドしか使えない環境のときに困るので、個人的によく使う基本的なコマンドについてメモしておきます。&lt;/p&gt;
&lt;p&gt;適宜更新していきます。&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;h3 id="現在の設定を確認"&gt;&lt;a href="#%e7%8f%be%e5%9c%a8%e3%81%ae%e8%a8%ad%e5%ae%9a%e3%82%92%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-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git config --list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;システム全体(&lt;code&gt;system&lt;/code&gt;)、ユーザー全体(&lt;code&gt;global&lt;/code&gt;)、対象リポジトリのみ(&lt;code&gt;local&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;$ git config --system --list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git config --global --list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git config --local --list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="ローカルのユーザーとメールアドレスを設定"&gt;&lt;a href="#%e3%83%ad%e3%83%bc%e3%82%ab%e3%83%ab%e3%81%ae%e3%83%a6%e3%83%bc%e3%82%b6%e3%83%bc%e3%81%a8%e3%83%a1%e3%83%bc%e3%83%ab%e3%82%a2%e3%83%89%e3%83%ac%e3%82%b9%e3%82%92%e8%a8%ad%e5%ae%9a" 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-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git config --local user.name &amp;#34;My Name&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git config --local user.email myname@example.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="リモートリポジトリの情報"&gt;&lt;a href="#%e3%83%aa%e3%83%a2%e3%83%bc%e3%83%88%e3%83%aa%e3%83%9d%e3%82%b8%e3%83%88%e3%83%aa%e3%81%ae%e6%83%85%e5%a0%b1" 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-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git remote
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;リモートリポジトリの名前と場所(URL）を表示する&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;$ git remote -v
&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;$ git remote show &amp;lt;リポジトリ名&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="リモートリポジトリの追加削除変更"&gt;&lt;a href="#%e3%83%aa%e3%83%a2%e3%83%bc%e3%83%88%e3%83%aa%e3%83%9d%e3%82%b8%e3%83%88%e3%83%aa%e3%81%ae%e8%bf%bd%e5%8a%a0%e5%89%8a%e9%99%a4%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-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git remote add &amp;lt;リポジトリ名&amp;gt; &amp;lt;URL&amp;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;$ git remote rm &amp;lt;リポジトリ名&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;URL の変更&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;$ git remote set-url &amp;lt;リポジトリ名&amp;gt; &amp;lt;変更先のURL&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="開発中に使うコマンド"&gt;&lt;a href="#%e9%96%8b%e7%99%ba%e4%b8%ad%e3%81%ab%e4%bd%bf%e3%81%86%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89" class="header-anchor"&gt;&lt;/a&gt;開発中に使うコマンド
&lt;/h2&gt;&lt;h3 id="クローン"&gt;&lt;a href="#%e3%82%af%e3%83%ad%e3%83%bc%e3%83%b3" 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-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git clone &amp;lt;URL&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="差分を表示"&gt;&lt;a href="#%e5%b7%ae%e5%88%86%e3%82%92%e8%a1%a8%e7%a4%ba" 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-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git status
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;-s&lt;/code&gt; を使えると簡略化して表示されます。&lt;/p&gt;
&lt;h3 id="コミットの流れ"&gt;&lt;a href="#%e3%82%b3%e3%83%9f%e3%83%83%e3%83%88%e3%81%ae%e6%b5%81%e3%82%8c" class="header-anchor"&gt;&lt;/a&gt;コミットの流れ
&lt;/h3&gt;&lt;h4 id="ステージング"&gt;&lt;a href="#%e3%82%b9%e3%83%86%e3%83%bc%e3%82%b8%e3%83%b3%e3%82%b0" class="header-anchor"&gt;&lt;/a&gt;ステージング
&lt;/h4&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;$ git add ファイル名
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="コミット"&gt;&lt;a href="#%e3%82%b3%e3%83%9f%e3%83%83%e3%83%88" class="header-anchor"&gt;&lt;/a&gt;コミット
&lt;/h4&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;$ git commit -m &amp;#34;コメント&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="プッシュ"&gt;&lt;a href="#%e3%83%97%e3%83%83%e3%82%b7%e3%83%a5" class="header-anchor"&gt;&lt;/a&gt;プッシュ
&lt;/h4&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;$ git push
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="最後のコミットのやり直し"&gt;&lt;a href="#%e6%9c%80%e5%be%8c%e3%81%ae%e3%82%b3%e3%83%9f%e3%83%83%e3%83%88%e3%81%ae%e3%82%84%e3%82%8a%e7%9b%b4%e3%81%97" 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-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git commit --amend -m &amp;#34;コミットメッセージ&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="変更の破棄"&gt;&lt;a href="#%e5%a4%89%e6%9b%b4%e3%81%ae%e7%a0%b4%e6%a3%84" 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-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git checkout &amp;lt;filename&amp;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;$ git checkout .
&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/shionit/items/fb4a1a30538f8d335b35" target="_blank" rel="noopener"
 &gt;https://qiita.com/shionit/items/fb4a1a30538f8d335b35&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/konweb/items/621722f67fdd8f86a017" target="_blank" rel="noopener"
 &gt;https://qiita.com/konweb/items/621722f67fdd8f86a017&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Git で HTTPS を使う場合のアカウント情報を記憶させる</title><link>https://blog.ponkotools.com/posts/2021/06/01/git/</link><pubDate>Tue, 01 Jun 2021 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2021/06/01/git/</guid><description>&lt;p&gt;毎回打つのが面倒なので。&lt;/p&gt;
&lt;h2 id="windows-の場合"&gt;&lt;a href="#windows-%e3%81%ae%e5%a0%b4%e5%90%88" class="header-anchor"&gt;&lt;/a&gt;Windows の場合
&lt;/h2&gt;&lt;p&gt;クローンするときにユーザー名とパスワードが聞かれますが、一度入力すると資格情報マネージャーに登録されるので、２回目以降はユーザー名とパスワードの入力が不要になります。&lt;br&gt;
もし入力間違いをしてしまった場合は、資格情報マネージャーで削除すれば OK です。&lt;/p&gt;
&lt;h2 id="linux-の場合"&gt;&lt;a href="#linux-%e3%81%ae%e5%a0%b4%e5%90%88" class="header-anchor"&gt;&lt;/a&gt;Linux の場合
&lt;/h2&gt;&lt;p&gt;Ubuntu 20.04 で確認しました。&lt;br&gt;
&lt;code&gt;libsecret&lt;/code&gt; をインストールして、&lt;code&gt;credential.helper&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 apt-get install libsecret-1-0 libsecret-1-dev
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cd /usr/share/doc/git/contrib/credential/libsecret
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo make
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global credential.helper /usr/share/doc/git/contrib/credential/libsecret/git-credential-libsecret
&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://blog.katsubemakito.net/git/git-config-1st" target="_blank" rel="noopener"
 &gt;https://blog.katsubemakito.net/git/git-config-1st&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/Tebasaki314/items/da230ccc9ac891f4ba25" target="_blank" rel="noopener"
 &gt;https://qiita.com/Tebasaki314/items/da230ccc9ac891f4ba25&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>