<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>ネットワーク技術 on AIによる技術記事 備忘録</title><link>https://ai.hack-le.com/tags/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E6%8A%80%E8%A1%93/</link><description>Recent content in ネットワーク技術 on AIによる技術記事 備忘録</description><generator>Hugo -- gohugo.io</generator><language>ja</language><lastBuildDate>Mon, 02 Nov 2026 08:56:05 +0900</lastBuildDate><atom:link href="https://ai.hack-le.com/tags/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E6%8A%80%E8%A1%93/index.xml" rel="self" type="application/rss+xml"/><item><title>DeepSeek Harness入門：Clineとの違いからリモート実行環境の構築・トラブルシュートまで</title><link>https://ai.hack-le.com/deepseek-harness%E5%85%A5%E9%96%80%EF%BC%9Acline%E3%81%A8%E3%81%AE%E9%81%95%E3%81%84%E3%81%8B%E3%82%89%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E5%AE%9F%E8%A1%8C%E7%92%B0%E5%A2%83%E3%81%AE%E6%A7%8B/</link><pubDate>Wed, 28 Oct 2026 01:57:29 +0900</pubDate><guid>https://ai.hack-le.com/deepseek-harness%E5%85%A5%E9%96%80%EF%BC%9Acline%E3%81%A8%E3%81%AE%E9%81%95%E3%81%84%E3%81%8B%E3%82%89%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E5%AE%9F%E8%A1%8C%E7%92%B0%E5%A2%83%E3%81%AE%E6%A7%8B/</guid><description>&lt;p&gt;自律型AIエージェントの実行環境として登場した &lt;strong&gt;DeepSeek Harness&lt;/strong&gt;（CLI名：&lt;code&gt;dsh&lt;/code&gt;）は、これまでエディタ統合型ツールを利用してきた開発者にとって、運用の前提を大きく変える存在です。VSCodeと拡張機能の組み合わせ（Clineなど）による開発スタイルと何が異なるのか、その設計思想からローカルネットワーク越しの安全な運用環境の構築手順、初期導入時のトラブルシュートまでを論理的に解説します。&lt;/p&gt;&#10;&lt;h2 id="1-エージェントの実行台座ハーネスの概念とclineとの違い"&gt;1. エージェントの実行台座「ハーネス」の概念とClineとの違い&#10;&lt;/h2&gt;&lt;p&gt;工学において「ハーネス（Harness）」は本来、馬を御する馬具や電気配線を束ねるワイヤーハーネス、あるいはソフトウェアの &lt;strong&gt;テストハーネス&lt;/strong&gt;（テスト対象を包み込み、入力を与えて出力を観測する台座）を指す言葉です。&lt;/p&gt;&#10;&lt;p&gt;大規模言語モデル（LLM）は単体ではテキストの入出力を行う計算機構に過ぎず、ファイルを読み書きする権限もシェルを実行する手段も持ちません。エージェント工学におけるハーネスとは、モデルを作業環境（ファイルシステム、OS、シェル、ネットワーク）に接続し、その &lt;strong&gt;思考と実行の自律ループを制御・記録・検証するための外枠（実行・観測台座）&lt;/strong&gt; を意味します。&lt;/p&gt;&#10;&lt;p&gt;これまで広く使われてきた VSCode + Cline と DeepSeek Harness の決定的な違いは、その設計思想にあります。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;VSCode + Cline&lt;/strong&gt;：人間のエディタ操作に寄り添う「ペアプログラミング型」のアシスタントです。エディタ上で差分を目視確認しながら対話的にコードを修正する用途に適していますが、VSCodeのGUIセッションに強く依存し、履歴は一本道のチャットとして蓄積されます。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;DeepSeek Harness&lt;/strong&gt;：モデルの自律タスク実行と挙動検証を主眼に置いた「独立型テストベンチ」です。エディタから独立したプロセス（CLIおよびWeb UI）として動作し、エージェントの挙動を &lt;strong&gt;Trajectory（実行軌跡）&lt;/strong&gt; と呼ばれる構造化データとして記録します。過去の任意のステップに戻って別の指示を与える分岐実行（Fork）や、一連の実行ログをそのままトレースする完全再現（Replay）が可能です。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="2-macosでのセットアップと運用設計の思想"&gt;2. macOSでのセットアップと運用設計の思想&#10;&lt;/h2&gt;&lt;p&gt;macOS上で動作させる場合、Node.js 22.19以上（または24系）の環境を用意し、作業対象のディレクトリから起動します。&lt;/p&gt;&#10;&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;# 環境変数の設定（~/.zshrc 等）&lt;/span&gt;&#10;&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;DEEPSEEK_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;sk-xxxxxxxxxxxxxxxxxxxxxxxx&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ワークスペースディレクトリで起動&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /path/to/project&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx @deepseek-ai/dsh web&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Web UIを開くと、VSCodeのような人間向けの対話型ターミナルが存在しないことに気づきます。これは制限ではなく、&lt;strong&gt;状態の再現性を担保するための意図的な設計&lt;/strong&gt; です。人間が裏で自由にシェルコマンドを叩いてファイルや環境の状態を変更してしまうと、Harnessが記録しているTrajectoryと実際のファイルシステムとの整合性が崩れ、過去ステップへの巻き戻しや分岐の正確性が失われます。そのため、すべてのコマンド実行はエージェントのツール呼び出しとして扱われ、人間はそれを承認（Approve）するかどうかを判断する形を取ります。&lt;/p&gt;&#10;&lt;p&gt;また、Harnessを利用する際は &lt;strong&gt;トークン消費の累積構造&lt;/strong&gt; を意識する必要があります。自律エージェントのコンテキスト長 $C_t$ は、ステップ数 $t$ に対し、初期プロンプト $I$、各ステップの思考 $T_i$、ツール実行ログやコマンド出力 $O_i$ の総和として累積します。&lt;/p&gt;&#10;&lt;p&gt;$$C_t = I + \sum_{i=1}^{t} (T_i + O_i)$$&lt;/p&gt;&#10;&lt;p&gt;巨大なテストログの出力やファイル全体の読み込みが発生すると、1回のリクエストで送信される入力トークンが急増します。タスクごとにセッションを細かく切り替えることや、DeepSeek Platform側のダッシュボードで利用上限額（Hard Limit）を事前に設定しておく運用が推奨されます。&lt;/p&gt;&#10;&lt;h2 id="3-セキュリティ境界の設計専用マシンとリモート運用の可能性"&gt;3. セキュリティ境界の設計：専用マシンとリモート運用の可能性&#10;&lt;/h2&gt;&lt;p&gt;Harnessは外部アクセス機能を持たないローカルWebサーバーとして動作しますが、外出先から利用するために Cloudflare Tunnel と Cloudflare Access（Zero Trust）を組み合わせる構成は非常に合理的です。ルーターのポート開放を行うことなく、Cloudflareのエッジで強固なゼロトラスト認証（Google認証やメールPIN）を通過した通信のみをローカルの &lt;code&gt;127.0.0.1:3080&lt;/code&gt; へ安全に転送できます。&lt;/p&gt;&#10;&lt;p&gt;しかし、エージェント環境のリモート常時稼働には固有のリスクが存在します。エージェントは「任意のシェルコマンド実行権限」を持つため、設定不備や不測の脆弱性が生じた際の影響範囲（Blast Radius）が、個人データや各種秘密鍵を保管しているメインの作業マシン全体に波及しかねません。&lt;/p&gt;&#10;&lt;p&gt;このリスクを根本的に排除するためには、使わなくなったPCやミニPC、隔離された仮想マシン（VM）を &lt;strong&gt;DeepSeek Harness専用マシン&lt;/strong&gt; として切り出し、メインの開発端末と物理的・論理的に分離するアプローチが極めて有効です。専用マシン上には必要最小限のリポジトリとAPIキーのみを配置し、万が一のインシデント時にもメインの環境を安全に保つ構成が取られます。&lt;/p&gt;&#10;&lt;h2 id="4-lan内別マシンwindowsからのアクセスと認証トークンの解決"&gt;4. LAN内別マシン（Windows）からのアクセスと認証トークンの解決&#10;&lt;/h2&gt;&lt;p&gt;家庭内やオフィス内のLANにおいて、Mac上で動くHarnessのWeb UIに対して別のWindowsマシンからアクセスしたい場合、SSHポートフォワーディングを利用するのが最も簡潔で安全です。&lt;/p&gt;&#10;&lt;p&gt;Windows 10/11には標準で OpenSSH クライアントが統合されているため、WSL2を起動する必要はありません。WSL2内部でSSHトンネルを張ると、仮想マシンのNATやlocalhostフォワーディングの不整合によってブラウザから通信が届かないトラブルの原因になりやすいため、&lt;strong&gt;WindowsネイティブのPowerShell&lt;/strong&gt; から直接コマンドを実行します。&lt;/p&gt;&#10;&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;# WindowsのPowerShellで実行&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -N -L 3080:127.0.0.1:3080 &amp;lt;Macのユーザー名&amp;gt;@&amp;lt;MacのローカルIP&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このコマンドを維持した状態でWindowsのブラウザから &lt;code&gt;[http://127.0.0.1:3080](http://127.0.0.1:3080)&lt;/code&gt; にアクセスすると、次のようなエラーが表示されることがあります。&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;code&gt;dsh web authentication required; reopen the URL printed by dsh web.&lt;/code&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;これは不具合ではなく、同一LAN内の他者やローカルの別プロセスによる不正操作（CSRF等）を防ぐための &lt;strong&gt;ワンタイム認証トークン仕様&lt;/strong&gt; によるものです。&lt;/p&gt;&#10;&lt;h3 id="解決手順"&gt;解決手順&#10;&lt;/h3&gt;&lt;p&gt;Mac側で &lt;code&gt;dsh web&lt;/code&gt; を起動した際、ターミナルの出力ログの末尾にクエリパラメータが付与されたURLが表示されています。&lt;/p&gt;&#10;&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;http://127.0.0.1:3080/?token&lt;span class="o"&gt;=&lt;/span&gt;abcdef1234567890...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Windows側ブラウザのアドレスバーに、単なる &lt;code&gt;[http://127.0.0.1:3080](http://127.0.0.1:3080)&lt;/code&gt; ではなく、この &lt;strong&gt;&lt;code&gt;?token=...&lt;/code&gt; を含めた完全なURL&lt;/strong&gt; を入力して開くことで認証が完了し、以降は別マシンのブラウザからMac上のHarnessを安定して操作できるようになります。&lt;/p&gt;&#10;</description></item><item><title>Mac miniをホストにしてAntigravityの作業環境を複数マシンでシームレスに引き継ぐ方法</title><link>https://ai.hack-le.com/mac-mini%E3%82%92%E3%83%9B%E3%82%B9%E3%83%88%E3%81%AB%E3%81%97%E3%81%A6antigravity%E3%81%AE%E4%BD%9C%E6%A5%AD%E7%92%B0%E5%A2%83%E3%82%92%E8%A4%87%E6%95%B0%E3%83%9E%E3%82%B7%E3%83%B3%E3%81%A7%E3%82%B7/</link><pubDate>Mon, 24 Aug 2026 07:41:46 +0900</pubDate><guid>https://ai.hack-le.com/mac-mini%E3%82%92%E3%83%9B%E3%82%B9%E3%83%88%E3%81%AB%E3%81%97%E3%81%A6antigravity%E3%81%AE%E4%BD%9C%E6%A5%AD%E7%92%B0%E5%A2%83%E3%82%92%E8%A4%87%E6%95%B0%E3%83%9E%E3%82%B7%E3%83%B3%E3%81%A7%E3%82%B7/</guid><description>&lt;p&gt;Google AntigravityでAIコーディングを行う際、課題となるのが「チャットセッションや作業状態が単一マシン内に閉じてしまう」という点です。メインのデスクトップMacで進めていた作業を、手元のWindowsノートPCや別端末からそのまま継続しようとすると、文脈の引き継ぎが難しくなります。&lt;/p&gt;&#10;&lt;p&gt;この問題を解決するため、常時稼働させている&lt;strong&gt;デスクトップMac（Mac mini）を開発ホストとして集約&lt;/strong&gt;し、ノートPC等の別端末からはSSH経由でAntigravity CLI（&lt;code&gt;agy&lt;/code&gt;）&lt;strong&gt;と&lt;/strong&gt;&lt;code&gt;tmux&lt;/code&gt;を組み合わせて操作する構成を採用することにしました。本記事では、この構成を選定した理由と、環境構築にあたって遭遇したトラブルの回避手順を備忘録としてまとめます。&lt;/p&gt;&#10;&lt;h2 id="なぜmacホストantigravity-cliの構成を選んだのか"&gt;なぜMacホスト＋Antigravity CLIの構成を選んだのか&#10;&lt;/h2&gt;&lt;p&gt;最初に検討したのは、GUI版Antigravity（VS Codeフォーク）の内蔵Remote-SSH拡張機能を使ってMacに接続する方法でした。しかし、実際に接続を試みると内部スクリプトがLinux環境を前提としたコマンド（&lt;code&gt;flock&lt;/code&gt; 等）に依存しており、現時点ではmacOSをSSHホストとしてGUI接続することはできません。&lt;/p&gt;&#10;&lt;p&gt;また、自前の低スペックLinuxサーバーをホストにする案もありましたが、重いビルド処理やコンテナの運用を考慮すると、CPU性能やメモリに余裕があるMac miniを活用するほうが快適です。&lt;/p&gt;&#10;&lt;p&gt;そこで、GUIのリモート接続に拘るのではなく、CUI環境で完結する公式CLIツール&lt;code&gt;agy&lt;/code&gt;&lt;strong&gt;を採用し、ターミナルマルチプレクサである&lt;/strong&gt;&lt;code&gt;tmux&lt;/code&gt;上で稼働させるアプローチに落ち着きました。この構成であれば、OSの互換性問題を完全に回避しつつ、どの端末からでも同一のセッションに再接続してAIとの対話を再開できます。&lt;/p&gt;&#10;&lt;h2 id="鍵認証とセッション分離の注意点"&gt;鍵認証とセッション分離の注意点&#10;&lt;/h2&gt;&lt;p&gt;構築時にまず直面したのが、SSH接続時の認証エラーでした。サーバー上でGiteaなどをホストしている場合、Git操作用に登録された公開鍵でログインを試みるとシェルアクセスが拒否されます。そのため、通常のシェルログイン専用となる新しいSSH鍵ペアを作成し、接続設定で明示的に指定する必要があります。&lt;/p&gt;&#10;&lt;p&gt;クライアント端末（Windows等）で開発用の鍵を生成し、ホスト側の &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt; に登録します。&lt;/p&gt;&#10;&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;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh-keygen -t ed25519 -f ~/.ssh/id_dev_server -C &lt;span class="s2"&gt;&amp;#34;dev-login&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;クライアント側の &lt;code&gt;~/.ssh/config&lt;/code&gt; には、他の鍵が自動送信されないよう &lt;code&gt;IdentitiesOnly yes&lt;/code&gt; を含めて設定を記述します。&lt;/p&gt;&#10;&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;Host dev-server&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; HostName 192.168.0.xxx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; User your_user&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; IdentityFile ~/.ssh/id_dev_server&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; IdentitiesOnly yes&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Windows環境から接続する場合は、PowerShellネイティブのコンソールよりも&lt;strong&gt;WSL2（Linux環境）経由で接続したほうが、文字コード（UTF-8）や端末制御（PTY）の互換性が高く、表示崩れや文字化けを起こさず安定&lt;/strong&gt;します。&lt;/p&gt;&#10;&lt;h2 id="tmuxとagyによるセッション永続化と運用"&gt;tmuxとagyによるセッション永続化と運用&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;agy&lt;/code&gt; 単体で起動するとSSH切断時にセッションが切れてしまうため、ホスト側のMac上で &lt;code&gt;tmux&lt;/code&gt; を起動し、その中で対話セッションを実行します。&lt;/p&gt;&#10;&lt;p&gt;ホストのMac側では、マウススクロールの有効化と文字コードの安定化のため、あらかじめ &lt;code&gt;~/.tmux.conf&lt;/code&gt; に設定を追加しておきます。&lt;/p&gt;&#10;&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;set&lt;/span&gt; -g mouse on&#10;&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; -g default-terminal &lt;span class="s2"&gt;&amp;#34;screen-256color&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;日常的な運用で必要な操作はシンプルです。作業を開始する際は、既存セッションへの再接続（存在しない場合は新規作成）をまとめて行うワンライナーで接続します。&lt;/p&gt;&#10;&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 dev &lt;span class="o"&gt;||&lt;/span&gt; tmux new -s dev&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;セッション内で &lt;code&gt;agy&lt;/code&gt; を起動すれば、直前までのプロジェクト構造を読み取った状態でAIコーディングを開始できます。過去の会話セッションを再開したい場合は、起動時に &lt;code&gt;--resume&lt;/code&gt; フラグを付与するか、対話画面で &lt;code&gt;/resume&lt;/code&gt; コマンドを実行して履歴を選択します。&lt;/p&gt;&#10;&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;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;agy --resume&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;作業を中断したい時は、キーボードで &lt;code&gt;Ctrl + b&lt;/code&gt; を押した後に &lt;code&gt;d&lt;/code&gt; を押してデタッチします。これによりMac側でプロセスが保持され、後から別のノートPCを開いて再び &lt;code&gt;tmux attach -t dev&lt;/code&gt; を実行するだけで、&lt;strong&gt;全く同じ画面・対話状態へと即座に復帰&lt;/strong&gt;できます。&lt;/p&gt;&#10;</description></item><item><title>SSH鍵方式の変遷とEd25519への移行メモ</title><link>https://ai.hack-le.com/ssh%E9%8D%B5%E6%96%B9%E5%BC%8F%E3%81%AE%E5%A4%89%E9%81%B7%E3%81%A8ed25519%E3%81%B8%E3%81%AE%E7%A7%BB%E8%A1%8C%E3%83%A1%E3%83%A2/</link><pubDate>Mon, 27 Oct 2025 18:58:20 +0900</pubDate><guid>https://ai.hack-le.com/ssh%E9%8D%B5%E6%96%B9%E5%BC%8F%E3%81%AE%E5%A4%89%E9%81%B7%E3%81%A8ed25519%E3%81%B8%E3%81%AE%E7%A7%BB%E8%A1%8C%E3%83%A1%E3%83%A2/</guid><description>&lt;p&gt;長年SSH鍵を生成する際には &lt;code&gt;ssh-keygen -t rsa&lt;/code&gt; が定番であった。しかし近年、セキュリティ界隈では「Ed25519」方式が推奨されるようになっている。本記事ではRSAからEd25519への変遷を整理し、その背景と注意点を備忘録としてまとめる。&lt;/p&gt;&#10;&lt;h2 id="rsaの現状と課題"&gt;RSAの現状と課題&#10;&lt;/h2&gt;&lt;p&gt;RSAは公開鍵暗号の古典的方式であり、長年にわたって安定して使われてきた。現在でも2048bitまたは4096bitの鍵長を採用すれば、現実的な攻撃に対して十分な強度を持つ。しかしRSAには次のような課題がある。&lt;/p&gt;&#10;&lt;p&gt;第一に、鍵生成・署名・検証の計算コストが大きい。特に組み込み機器や仮想環境ではパフォーマンス低下が無視できない。第二に、十分な安全性を確保するには鍵長を増やす必要があり、その結果として鍵サイズや通信オーバーヘッドが増加する。第三に、量子計算の実用化が進めばRSAも楕円曲線暗号も同様に破られる可能性があるため、将来的な耐性は限定的である。&lt;/p&gt;&#10;&lt;p&gt;このようにRSAは依然として安全ではあるが、効率面で時代遅れとなりつつある。&lt;/p&gt;&#10;&lt;h2 id="ed25519とは何か"&gt;Ed25519とは何か&#10;&lt;/h2&gt;&lt;p&gt;Ed25519は楕円曲線暗号の一種であり、正式には「Edwards curve over the prime field 2²⁵⁵−19」を指す。この“25519”という数字は、基礎となる素数体の法 &lt;code&gt;2^255 - 19&lt;/code&gt; に由来する。Daniel J. Bernsteinによって設計され、高速性・安全性・実装の簡潔さを兼ね備えている点が特徴である。&lt;/p&gt;&#10;&lt;p&gt;Ed25519の主な利点は次の通りである。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;鍵と署名のサイズが小さい（64バイト程度）&lt;/li&gt;&#10;&lt;li&gt;署名と検証が高速&lt;/li&gt;&#10;&lt;li&gt;タイミング攻撃などの実装依存の脆弱性に強い&lt;/li&gt;&#10;&lt;li&gt;鍵長の指定が不要で、常に固定長で安全な設計になっている&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;このため、OpenSSH 6.5以降ではデフォルト推奨方式としてEd25519が採用されている。&lt;/p&gt;&#10;&lt;h2 id="注意すべき点とトレードオフ"&gt;注意すべき点とトレードオフ&#10;&lt;/h2&gt;&lt;p&gt;Ed25519は優れた方式であるが、RSAの完全上位互換ではない。まず、古いシステムではEd25519鍵に対応していないことがある。特にレガシーなネットワーク機器や古いクラウド環境では、接続できない可能性がある。次に、Ed25519は鍵長を調整できないため、「より長い鍵を使いたい」という要求には応えられない。また、Ed25519の署名方式（EdDSA）はRSAのようにX.509やPGP証明書体系と互換性がない。&lt;/p&gt;&#10;&lt;p&gt;したがって現実的には、&lt;strong&gt;新規環境ではEd25519を採用し、古い環境との互換性を保つためにRSAも併用する&lt;/strong&gt;のが妥当である。&lt;/p&gt;&#10;&lt;h2 id="ed25519鍵の作成方法"&gt;Ed25519鍵の作成方法&#10;&lt;/h2&gt;&lt;p&gt;Ed25519鍵を生成する手順はRSAとほとんど同じである。違いは&lt;code&gt;-t&lt;/code&gt;オプションだけである。&lt;/p&gt;&#10;&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;ssh-keygen -t ed25519 -C &lt;span class="s2"&gt;&amp;#34;your_email@example.com&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記コマンドを実行すると、&lt;code&gt;~/.ssh/id_ed25519&lt;/code&gt;（秘密鍵）と &lt;code&gt;~/.ssh/id_ed25519.pub&lt;/code&gt;（公開鍵）が生成される。公開鍵を接続先サーバーの &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt; に追記すれば、すぐに利用可能になる。RSA鍵を残しておきたい場合も問題なく共存でき、SSHクライアントは自動的に適切な鍵を選択する。&lt;/p&gt;&#10;&lt;p&gt;接続先ごとに鍵を明示的に切り替えたい場合は、&lt;code&gt;~/.ssh/config&lt;/code&gt; に以下を記述する。&lt;/p&gt;&#10;&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;Host myserver&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; HostName example.com&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; User username&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; IdentityFile ~/.ssh/id_ed25519&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;どの鍵が使用されているか確認するには、次のように実行する。&lt;/p&gt;&#10;&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;ssh -v myserver&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ログに &lt;code&gt;Offering public key: /home/you/.ssh/id_ed25519&lt;/code&gt; と表示されれば、Ed25519鍵が使われている。&lt;/p&gt;&#10;&lt;h2 id="まとめ"&gt;まとめ&#10;&lt;/h2&gt;&lt;p&gt;Ed25519は、RSAと比較して速度・安全性・実装の簡潔さの点で優れている。とはいえ、RSAも現状では十分な安全性を維持しており、量子計算機が登場するまではどちらも有効である。結局のところ、SSHで困らない範囲ではどちらを選んでもよいが、&lt;strong&gt;これから新しく鍵を作るならEd25519が自然な選択&lt;/strong&gt;である。&lt;/p&gt;&#10;</description></item><item><title>ARPを使ってネットワーク内の特定機器のIPアドレスを効率的に見つける方法</title><link>https://ai.hack-le.com/arp%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E5%86%85%E3%81%AE%E7%89%B9%E5%AE%9A%E6%A9%9F%E5%99%A8%E3%81%AEip%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9/</link><pubDate>Sun, 21 Sep 2025 21:11:22 +0900</pubDate><guid>https://ai.hack-le.com/arp%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E5%86%85%E3%81%AE%E7%89%B9%E5%AE%9A%E6%A9%9F%E5%99%A8%E3%81%AEip%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9/</guid><description>&lt;p&gt;ネットワーク管理において、特定の機器のIPアドレスを素早く特定する必要がある場面は多い。特にMACアドレスは分かっているが、DHCPによって動的にIPアドレスが割り当てられている環境では、従来のIPアドレス総当たり方式では非効率である。このような状況でARP（Address Resolution Protocol）テーブルを活用することで、効率的に目的の機器を発見できる。&lt;/p&gt;&#10;&lt;p&gt;ARPは、同一ネットワークセグメント内でIPアドレスとMACアドレスの対応関係を管理するプロトコルである。ネットワーク通信が発生する際、OSは自動的にARPテーブルを更新し、最近通信した機器の情報を保持している。この仕組みを利用することで、ネットワーク全体をスキャンした後、ARPテーブルから目的のMACアドレスを持つ機器のIPアドレスを直接抽出できる。&lt;/p&gt;&#10;&lt;h2 id="実行環境と前提条件"&gt;実行環境と前提条件&#10;&lt;/h2&gt;&lt;p&gt;本記事の手順はmacOS、Linux、Windowsの各環境で実行可能である。ただし、一部のコマンドには管理者権限が必要となる。また、対象機器は同一ネットワークセグメント内に存在し、ファイアウォール等でICMPパケット（ping）をブロックしていないことが前提となる。&lt;/p&gt;&#10;&lt;h2 id="基本的なarp発見手順"&gt;基本的なARP発見手順&#10;&lt;/h2&gt;&lt;p&gt;最も基本的な手順は、まずネットワーク全体に対してping応答を送信し、その結果生成されるARPテーブルから目的の機器を抽出する方法である。&lt;/p&gt;&#10;&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;# ネットワーク全体の生存確認&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nmap -sn 192.168.1.0/24&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# ARPテーブルから特定MACアドレスを検索&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arp -a | grep &amp;#34;b8:27:eb&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記の例では、&lt;code&gt;192.168.1.0/24&lt;/code&gt;のネットワークレンジに対してping応答確認を実行し、その後ARPテーブルから&lt;code&gt;b8:27:eb&lt;/code&gt;で始まるMACアドレスを検索している。&lt;code&gt;nmap -sn&lt;/code&gt;オプションは、ポートスキャンを実行せずにホストの生存確認のみを行うため、処理が高速である。&lt;/p&gt;&#10;&lt;p&gt;nmapが利用できない環境では、標準的なpingコマンドを使用したスクリプトでも代替可能である：&lt;/p&gt;&#10;&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;for i in {1..254}; do&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ping -c 1 -W 1 192.168.1.$i &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;done&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wait&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arp -a | grep &amp;#34;b8:27:eb&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このスクリプトでは、IPアドレスの範囲を並行処理でpingし、完了後にARPテーブルを確認している。ただし、処理時間の観点からnmapの使用が推奨される。&lt;/p&gt;&#10;&lt;h2 id="arp-scanツールを使用した高速検出"&gt;arp-scanツールを使用した高速検出&#10;&lt;/h2&gt;&lt;p&gt;より確実で高速な検出を実現するには、専用ツールであるarp-scanの使用が効果的である。arp-scanは、ARPリクエストを直接送信するため、pingに応答しない機器でもMACアドレスベースでの検出が可能である。&lt;/p&gt;&#10;&lt;p&gt;macOSでのインストール：&lt;/p&gt;&#10;&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;brew install arp-scan&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Linux（Ubuntu/Debian）でのインストール：&lt;/p&gt;&#10;&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;sudo apt install arp-scan&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;基本的な使用方法：&lt;/p&gt;&#10;&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;# ローカルネットワーク全体をスキャン&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo arp-scan --local | grep &amp;#34;b8:27:eb&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 特定のネットワークレンジを指定&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo arp-scan 192.168.1.0/24 | grep &amp;#34;b8:27:eb&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;arp-scanの利点は、ICMPパケット（ping）がブロックされている環境でも動作することである。ARPは同一セグメント内での通信に必須のプロトコルであるため、通常のファイアウォール設定でブロックされることは稀である。また、arp-scanは結果を構造化された形式で出力するため、スクリプト処理にも適している。&lt;/p&gt;&#10;&lt;h2 id="raspberry-pi機器の特定における実践的応用"&gt;Raspberry Pi機器の特定における実践的応用&#10;&lt;/h2&gt;&lt;p&gt;Raspberry Piを例とした具体的な応用例を示す。Raspberry Piは、製造時期やモデルによって異なるMACアドレスプリフィックスを使用している。&lt;/p&gt;&#10;&lt;p&gt;主要なRaspberry PiのMACアドレスプリフィックス：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;b8:27:eb&lt;/code&gt; - 初期のRaspberry Pi（Pi 1, 2, 3の初期モデル）&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;dc:a6:32&lt;/code&gt; - 新しいRaspberry Pi（Pi 3後期モデル以降、Pi 4、Pi Zero 2W等）&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;e4:5f:01&lt;/code&gt; - 一部のPi 4モデル&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;d8:3a:dd&lt;/code&gt; - 最新の一部モデル&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;複数のプリフィックスを同時に検索する場合：&lt;/p&gt;&#10;&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;sudo arp-scan --local | grep -E &amp;#34;(b8:27:eb|dc:a6:32|e4:5f:01|d8:3a:dd)&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実際の出力例：&lt;/p&gt;&#10;&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;192.168.1.105 b8:27:eb:12:34:56 Raspberry Pi Trading Ltd&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;192.168.1.108 dc:a6:32:78:9a:bc Raspberry Pi Trading Ltd&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この結果から、&lt;code&gt;192.168.1.105&lt;/code&gt;と&lt;code&gt;192.168.1.108&lt;/code&gt;にRaspberry Pi機器が存在することが確認できる。さらに詳細な情報が必要な場合は、検出されたIPアドレスに対してSSH接続やWebブラウザでのアクセスを試行することで、具体的なサービス内容を確認できる。&lt;/p&gt;&#10;&lt;h2 id="トラブルシューティングとパフォーマンス最適化"&gt;トラブルシューティングとパフォーマンス最適化&#10;&lt;/h2&gt;&lt;p&gt;ARPテーブルベースの検出で問題が発生する場合の対処法について説明する。最も一般的な問題は、ARPテーブルエントリの有効期限切れである。多くのOSでは、ARPエントリは数分から数十分で自動的に削除される。そのため、スキャン実行から時間が経過した後にARPテーブルを確認しても、目的の機器が見つからない場合がある。&lt;/p&gt;&#10;&lt;p&gt;この問題を回避するには、スキャンとARPテーブル確認を連続して実行する必要がある：&lt;/p&gt;&#10;&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;nmap -sn 192.168.1.0/24 &amp;amp;&amp;amp; arp -a | grep &amp;#34;target_mac_prefix&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;また、一部の機器はICMPパケットをブロックしている場合がある。このような環境では、arp-scanの使用が必須となる。arp-scanでも検出できない場合は、対象機器のネットワーク設定やファイアウォール設定を確認する必要がある。&lt;/p&gt;&#10;&lt;p&gt;パフォーマンスを向上させるには、nmapの並行処理オプションを調整できる：&lt;/p&gt;&#10;&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;nmap -sn -T5 --min-parallelism 100 192.168.1.0/24&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ただし、過度な並行処理は、ネットワーク機器に負荷をかける可能性があるため、環境に応じて適切な値を設定することが重要である。&lt;/p&gt;&#10;&lt;h2 id="セキュリティ考慮事項と運用上の注意点"&gt;セキュリティ考慮事項と運用上の注意点&#10;&lt;/h2&gt;&lt;p&gt;ARPスキャンは、ネットワーク上のすべての機器に対してパケットを送信するため、ネットワーク管理者の許可なく実行すべきではない。企業環境や公共のネットワークでは、事前に適切な許可を取得することが必要である。&lt;/p&gt;&#10;&lt;p&gt;また、頻繁なARPスキャンは、ネットワーク監視システムによって異常なトラフィックとして検出される可能性がある。定期的な機器発見が必要な場合は、スキャン間隔を適切に調整し、ネットワーク負荷を最小限に抑える運用を心がけることが重要である。&lt;/p&gt;&#10;&lt;p&gt;検出された機器への不正アクセスは法的な問題を引き起こす可能性があるため、発見した機器に対するアクセスは、適切な権限を持つ範囲内でのみ実行するべきである。特にSSHやWebサービスへのアクセス試行は、正当な理由と適切な権限なしに実行してはならない。&lt;/p&gt;&#10;</description></item><item><title>ghqでLAN内のプライベートGiteaサーバーのリポジトリを/etc/hostsで定義したドメインで管理する設定方法</title><link>https://ai.hack-le.com/ghq%E3%81%A7%E3%83%97%E3%83%A9%E3%82%A4%E3%83%99%E3%83%BC%E3%83%88gitea%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%82%92%E7%AE%A1%E7%90%86%E3%81%99/</link><pubDate>Tue, 16 Sep 2025 02:15:07 +0900</pubDate><guid>https://ai.hack-le.com/ghq%E3%81%A7%E3%83%97%E3%83%A9%E3%82%A4%E3%83%99%E3%83%BC%E3%83%88gitea%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%82%92%E7%AE%A1%E7%90%86%E3%81%99/</guid><description>&lt;p&gt;プライベートGiteaサーバーとghqを連携させることで、自宅のリポジトリ管理を効率化できる。この記事では、ローカルネットワーク上のGiteaサーバーをghqで管理するための設定手順を記録する。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;検証環境&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;macOS（ghq導入済み）&lt;/li&gt;&#10;&lt;li&gt;Giteaサーバー：192.168.0.100（HTTPSなし、SSH接続可能）&lt;/li&gt;&#10;&lt;li&gt;対象リポジトリ：user@192.168.0.100:org/repository.git&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="hostsファイルによるエイリアス設定"&gt;hostsファイルによるエイリアス設定&#10;&lt;/h2&gt;&lt;p&gt;プライベートサーバーにわかりやすい名前を付けるため、&lt;code&gt;/etc/hosts&lt;/code&gt;でエイリアスを設定する。これにより、IPアドレスではなく意味のあるドメイン名でリポジトリにアクセスできるようになる。&lt;/p&gt;&#10;&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;sudo vi /etc/hosts&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下の行を追加する：&lt;/p&gt;&#10;&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;192.168.0.100 code.example.com&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この設定により、&lt;code&gt;192.168.0.100&lt;/code&gt;への接続が&lt;code&gt;code.example.com&lt;/code&gt;として扱われる。ドメイン名を使うことで、後からサーバーのIPアドレスが変更されても設定変更が容易になるメリットがある。&lt;/p&gt;&#10;&lt;h2 id="ghqでのhttps接続エラーとその対処"&gt;ghqでのHTTPS接続エラーとその対処&#10;&lt;/h2&gt;&lt;p&gt;初回のghq実行では、HTTPSでの接続エラーが発生する場合がある。これは、プライベートGiteaサーバーでHTTPS証明書が設定されていないことが原因である。&lt;/p&gt;&#10;&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;$ ghq get code.example.com/org/repository.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;error failed to get &amp;#34;code.example.com/org/repository.git&amp;#34;: unsupported VCS, url=https://code.example.com/org/repository.git: Get &amp;#34;https://code.example.com/org/repository.git?go-get=1&amp;#34;: dial tcp 192.168.0.8:443: connect: connection refused&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このエラーメッセージから、ghqがデフォルトでHTTPS（ポート443）での接続を試行していることがわかる。プライベートサーバーではHTTPS設定を行わないことが多いため、SSHまたはHTTPでの接続に切り替える必要がある。&lt;/p&gt;&#10;&lt;h2 id="gitconfigによるプロトコル変換設定"&gt;gitconfigによるプロトコル変換設定&#10;&lt;/h2&gt;&lt;p&gt;最も効率的な解決方法は、Gitの設定でプロトコル変換を行うことである。&lt;code&gt;~/.gitconfig&lt;/code&gt;に以下の設定を追加することで、HTTPSのURLが自動的にSSHに変換される。&lt;/p&gt;&#10;&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;[ghq]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; vcs = git&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[url &amp;#34;ssh://code.example.com/&amp;#34;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; insteadOf = https://code.example.com/&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この設定の&lt;code&gt;url.insteadOf&lt;/code&gt;は、Gitが特定のURLパターンを別のURLに自動変換する機能である。&lt;code&gt;https://code.example.com/&lt;/code&gt;で始まるURLが&lt;code&gt;ssh://code.example.com/&lt;/code&gt;に置き換えられるため、HTTPSでアクセスしようとしても実際にはSSH接続が行われる。&lt;/p&gt;&#10;&lt;p&gt;設定後は、HTTPSのURLを指定してもSSHで接続されるようになる：&lt;/p&gt;&#10;&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;$ ghq get code.example.com/org/repository.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; clone ssh://code.example.com/org/repository.git -&amp;gt; /Users/username/ghq/code.example.com/org/repository&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="リポジトリの配置とアクセス"&gt;リポジトリの配置とアクセス&#10;&lt;/h2&gt;&lt;p&gt;ghqによってクローンされたリポジトリは、以下のパスに配置される：&lt;/p&gt;&#10;&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;~/ghq/code.example.com/org/repository/&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この階層構造により、複数のGitサーバーやオーガニゼーションのリポジトリを整理して管理できる。ghqは常に&lt;code&gt;ホスト名/ユーザー名またはオーガニゼーション名/リポジトリ名&lt;/code&gt;の形式でディレクトリを作成するため、リポジトリの所在が明確になる。&lt;/p&gt;&#10;&lt;p&gt;日常的な操作では、以下のコマンドが有用である：&lt;/p&gt;&#10;&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;# 管理しているリポジトリ一覧の表示&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ghq list&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# リポジトリの完全パス表示&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ghq list --full-path&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 特定リポジトリへの移動&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cd $(ghq root)/code.example.com/org/repository&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="まとめ"&gt;まとめ&#10;&lt;/h2&gt;&lt;p&gt;プライベートGiteaサーバーとghqの連携において、&lt;code&gt;/etc/hosts&lt;/code&gt;によるエイリアス設定と&lt;code&gt;.gitconfig&lt;/code&gt;でのプロトコル変換設定を組み合わせることで、効率的なリポジトリ管理環境を構築できる。特に&lt;code&gt;.gitconfig&lt;/code&gt;の&lt;code&gt;url.insteadOf&lt;/code&gt;設定により、HTTPSとSSHの違いを意識することなく、統一されたURLでリポジトリにアクセスできるようになることが重要である。この設定により、プライベート開発環境でのリポジトリ管理が大幅に改善される。&lt;/p&gt;&#10;</description></item><item><title>VSCodeでリモートサーバーのコードをSSH経由で編集する方法</title><link>https://ai.hack-le.com/vscode-remote-ssh/</link><pubDate>Wed, 20 Nov 2024 16:36:45 +0900</pubDate><guid>https://ai.hack-le.com/vscode-remote-ssh/</guid><description>&lt;p&gt;リモートサーバー上のコードをVSCodeで直接編集したいとき、「Remote - SSH」拡張機能を使えば簡単に設定できます。この記事では、その手順を初心者向けにわかりやすく解説します。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="-前提条件"&gt;📌 前提条件&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;VSCode&lt;/strong&gt;がインストールされていること。&lt;/li&gt;&#10;&lt;li&gt;SSHでリモートサーバーにアクセスできること（公開鍵認証またはパスワード認証）。&lt;/li&gt;&#10;&lt;li&gt;インターネット接続があること。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="-手順"&gt;📖 手順&#10;&lt;/h2&gt;&lt;h3 id="1-remote---ssh拡張機能をインストール"&gt;1. 「Remote - SSH」拡張機能をインストール&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;VSCodeを起動します。&lt;/li&gt;&#10;&lt;li&gt;左側の「拡張機能」アイコン（四角が飛び出すマーク）をクリックします。&lt;/li&gt;&#10;&lt;li&gt;検索バーに「Remote - SSH」と入力。&lt;/li&gt;&#10;&lt;li&gt;Microsoft製の「Remote - SSH」拡張機能をインストールします。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;hr&gt;&#10;&lt;h3 id="2-ssh設定ファイルの準備"&gt;2. SSH設定ファイルの準備&#10;&lt;/h3&gt;&lt;p&gt;SSH接続には、&lt;code&gt;~/.ssh/config&lt;/code&gt;ファイルを使用します。この設定ファイルでリモートサーバーへの接続を定義します。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;ターミナルを開き、以下のコマンドを実行して設定ファイルを作成または編集します:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&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;nano ~/.ssh/config&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;&#10;&lt;li&gt;以下のように、リモートサーバーの情報を記述します:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&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;Host my-remote-server&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; HostName 192.168.1.100 &lt;span class="c1"&gt;# サーバーのIPまたはホスト名&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; User my-username &lt;span class="c1"&gt;# リモートサーバーのユーザー名&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; IdentityFile ~/.ssh/id_rsa &lt;span class="c1"&gt;# SSH鍵のパス（鍵認証を使用する場合）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;&#10;&lt;li&gt;ファイルを保存して閉じます。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;💡 &lt;strong&gt;ヒント&lt;/strong&gt;: &lt;code&gt;Host&lt;/code&gt;の値（例: &lt;code&gt;my-remote-server&lt;/code&gt;）は任意の名前でOK。後で接続時にこの名前を使用します。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h3 id="3-リモートサーバーに接続"&gt;3. リモートサーバーに接続&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;VSCode左下の緑色の「リモートアイコン」をクリック。&lt;/li&gt;&#10;&lt;li&gt;「Connect to Host」を選択。&lt;/li&gt;&#10;&lt;li&gt;先ほど設定したエイリアス名（例: &lt;code&gt;my-remote-server&lt;/code&gt;）を選択。&lt;/li&gt;&#10;&lt;li&gt;初回接続時に「このホストのSSHキーを信頼するか」と聞かれるので「Yes」を選択。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;リモートサーバーに接続されると、VSCodeのウィンドウが再起動し、リモート環境として動作します。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h3 id="4-リモートフォルダを開く"&gt;4. リモートフォルダを開く&#10;&lt;/h3&gt;&lt;p&gt;接続後、リモートサーバー上の作業ディレクトリを開きます。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;左側のエクスプローラーで「Open Folder」をクリック。&lt;/li&gt;&#10;&lt;li&gt;リモートサーバー上のディレクトリ（例: &lt;code&gt;/home/my-username/project&lt;/code&gt;）を選択。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;これで、リモートサーバー上のコードがVSCodeで編集可能になります！&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h3 id="5-リモート環境での開発"&gt;5. リモート環境での開発&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;リモート環境に必要な拡張機能（例: Python、Node.js関連）をインストールする際は、「Install in SSH: [Host名]」を選択してください。&lt;/li&gt;&#10;&lt;li&gt;ターミナルを開くには、&lt;code&gt;Ctrl +&lt;/code&gt;（バッククォート） ``を押します。リモートサーバーのターミナルが利用できます。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="-トラブルシューティング"&gt;🛠 トラブルシューティング&#10;&lt;/h2&gt;&lt;h3 id="q1-ssh接続エラーが発生する"&gt;Q1. SSH接続エラーが発生する&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;SSH設定ファイル（&lt;code&gt;~/.ssh/config&lt;/code&gt;）の記述を再確認。&lt;/li&gt;&#10;&lt;li&gt;ターミナルで以下を実行してSSH接続が可能か確認:&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&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;ssh my-remote-server&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="q2-拡張機能がインストールされない"&gt;Q2. 拡張機能がインストールされない&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;拡張機能画面で「Install in SSH」を選択しているか確認。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="q3-権限エラーが発生"&gt;Q3. 権限エラーが発生&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;リモートサーバー上のファイル・フォルダの権限設定を確認します:&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&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;chmod -R u+w /path/to/directory&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;これで、リモートサーバーでの開発作業が快適になるはずです！&lt;br&gt;&#10;VSCodeと「Remote - SSH」を使って、効率的なリモート開発を楽しんでください。&lt;/p&gt;&#10;</description></item><item><title>ディレクトリベースで複数のGitHubアカウントを管理する方法</title><link>https://ai.hack-le.com/directory-github/</link><pubDate>Thu, 04 Jul 2024 18:56:23 +0900</pubDate><guid>https://ai.hack-le.com/directory-github/</guid><description>&lt;p&gt;この記事では、個人用と仕事用のGitHubアカウントを、プロジェクトディレクトリごとに自動的に切り替えて使用する方法を詳しく解説します。具体的には、&lt;code&gt;~/projects/personal&lt;/code&gt; ディレクトリ下のプロジェクトでは個人のGitHubアカウントを使用し、&lt;code&gt;~/projects/work&lt;/code&gt; ディレクトリ下では仕事用のアカウントを使用する状況を想定します。コマンドラインでのGit操作だけでなく、VSCodeなどのIDEでも適用されるようにします。&lt;/p&gt;&#10;&lt;h2 id="前提条件"&gt;前提条件&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;Gitの基本的な知識があること。&lt;/li&gt;&#10;&lt;li&gt;アカウントごとにSSHキーを生成しており、それぞれのGitHubアカウントに登録していること。&lt;/li&gt;&#10;&lt;li&gt;基本的なGit操作に慣れていること。&lt;/li&gt;&#10;&lt;li&gt;Git 2.13以降であること。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="git設定の基本"&gt;Git設定の基本&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;.gitconfig&lt;/code&gt;ファイルはGitの設定を管理するための中心的なファイルで、ユーザ名やメールアドレス、エイリアス、スクリプトの実行設定などを含みます。全体的なユーザー設定（グローバル設定）は通常、ユーザのホームディレクトリに位置する&lt;code&gt;.gitconfig&lt;/code&gt;ファイルに記述されます。&lt;/p&gt;&#10;&lt;h3 id="ディレクトリごとのgit設定"&gt;ディレクトリごとのGit設定&#10;&lt;/h3&gt;&lt;p&gt;Git 2.13以上では、&lt;code&gt;includeIf&lt;/code&gt;ディレクティブを使用して、特定のディレクトリに基づいてGit設定を動的に適用することができます。これを利用して、異なるプロジェクトディレクトリで異なるGitHubアカウントを使い分ける設定を行います。&lt;/p&gt;&#10;&lt;h4 id="基本的なgitconfig設定"&gt;基本的な&lt;code&gt;.gitconfig&lt;/code&gt;設定&#10;&lt;/h4&gt;&lt;p&gt;ホームディレクトリの&lt;code&gt;.gitconfig&lt;/code&gt;に以下の設定を追加します。&lt;/p&gt;&#10;&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;[user]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name = default_name&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; email = default_email@example.com&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[includeIf &amp;#34;gitdir:~/projects/personal/&amp;#34;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; path = ~/.gitconfig-personal&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[includeIf &amp;#34;gitdir:~/projects/work/&amp;#34;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; path = ~/.gitconfig-work&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="各ディレクトリ用のgitconfigファイル"&gt;各ディレクトリ用の&lt;code&gt;.gitconfig&lt;/code&gt;ファイル&#10;&lt;/h4&gt;&lt;p&gt;&lt;code&gt;~/.gitconfig-personal&lt;/code&gt;ファイルには次のように記述します：&lt;/p&gt;&#10;&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;[user]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name = personal_username&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; email = personal_email@example.com&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[core]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sshCommand = &amp;#34;ssh -i ~/.ssh/id_rsa_personal -F /dev/null&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;~/.gitconfig-work&lt;/code&gt;ファイルには次のように記述します：&lt;/p&gt;&#10;&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;[user]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name = work_username&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; email = work_email@example.com&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[core]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sshCommand = &amp;#34;ssh -i ~/.ssh/id_rsa_work -F /dev/null&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="まとめ"&gt;まとめ&#10;&lt;/h2&gt;&lt;p&gt;ディレクトリベースでGitHubアカウントを管理することで、複数のアカウントを効率的かつ安全に運用することが可能です。設定は初めに少し時間がかかりますが、一度設定してしまえば、その後は自動で適切なアカウントが使用されるため、非常に便利です。&lt;/p&gt;&#10;</description></item></channel></rss>