<?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%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB/</link><description>Recent content in ターミナル on AIによる技術記事 備忘録</description><generator>Hugo -- gohugo.io</generator><language>ja</language><lastBuildDate>Sat, 22 Aug 2026 10:30:12 +0900</lastBuildDate><atom:link href="https://ai.hack-le.com/tags/%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB/index.xml" rel="self" type="application/rss+xml"/><item><title>macOS 14.8.3におけるスクリーンショット保存先とファイル形式のJPG変更手順</title><link>https://ai.hack-le.com/macos-14-8-3%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%E4%BF%9D%E5%AD%98%E5%85%88%E3%81%A8%E3%83%95%E3%82%A1%E3%82%A4/</link><pubDate>Sat, 31 Jan 2026 16:55:41 +0900</pubDate><guid>https://ai.hack-le.com/macos-14-8-3%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%E4%BF%9D%E5%AD%98%E5%85%88%E3%81%A8%E3%83%95%E3%82%A1%E3%82%A4/</guid><description>&lt;p&gt;macOSの標準機能であるスクリーンショットは、初期設定において「デスクトップ」を保存先とし、ファイル形式には「PNG」が採用されている。本記事では、保存先の変更とファイル形式の変更について記述する。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;strong&gt;項目&lt;/strong&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;strong&gt;内容&lt;/strong&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;OSバージョン&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;macOS 14.8.3&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;使用ツール&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ターミナル (Terminal.app)、スクリーンショットアプリ&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;目的&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ファイルサイズの軽量化およびディレクトリ管理の整理&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="スクリーンショットアプリによる直感的な保存場所の変更"&gt;スクリーンショットアプリによる直感的な保存場所の変更&#10;&lt;/h2&gt;&lt;p&gt;macOSには標準でスクリーンショットを管理するための専用インターフェースが備わっており、GUI操作のみで保存場所の変更が可能である。&lt;/p&gt;&#10;&lt;p&gt;キーボードの &lt;code&gt;Command&lt;/code&gt; + &lt;code&gt;Shift&lt;/code&gt; + &lt;code&gt;5&lt;/code&gt; を同時に押下し、画面下部にスクリーンショットツールバーを表示させる。このツールバー内に存在する「オプション」メニューをクリックすることで、保存先の候補が表示される。&lt;/p&gt;&#10;&lt;h2 id="ターミナルを利用したファイル形式のjpg化と詳細設定"&gt;ターミナルを利用したファイル形式のJPG化と詳細設定&#10;&lt;/h2&gt;&lt;p&gt;ファイル形式をPNGからJPGへ変更し、さらに保存場所をコマンドラインから厳密に指定するには、ターミナルでの操作が最も確実である。まず、LaunchpadやSpotlightから「ターミナル」を起動する。ファイル形式をJPGに変更するには、以下のコマンドを入力し、実行する。&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;defaults write com.apple.screencapture &lt;span class="nb"&gt;type&lt;/span&gt; jpg&#10;&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;png&lt;/code&gt;、&lt;code&gt;pdf&lt;/code&gt;、&lt;code&gt;tiff&lt;/code&gt;、&lt;code&gt;gif&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;defaults write com.apple.screencapture location ~/Pictures/Screenshots&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここで使用している &lt;code&gt;~/Pictures/Screenshots&lt;/code&gt; は一例であり、ユーザの環境に合わせて任意のパスに変更することが可能である。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;defaults&lt;/code&gt; コマンドを使用して設定を書き換えただけでは、システムに即座に変更が反映されない場合がある。設定を有効化するためには、macOSのUI管理プロセスである &lt;code&gt;SystemUIServer&lt;/code&gt; を再起動させる必要がある。以下のコマンドを実行することで、Mac本体を再起動させることなく新しい設定を適用できる。&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;killall SystemUIServer&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;コマンドの実行後、実際に &lt;code&gt;Command&lt;/code&gt; + &lt;code&gt;Shift&lt;/code&gt; + &lt;code&gt;3&lt;/code&gt; （全画面撮影）や &lt;code&gt;Command&lt;/code&gt; + &lt;code&gt;Shift&lt;/code&gt; + &lt;code&gt;4&lt;/code&gt; （範囲指定撮影）を行い、動作を検証する。指定した保存先にファイルが出力されていること、およびファイルの拡張子が &lt;code&gt;.jpg&lt;/code&gt; になっていることを情報ウィンドウ（&lt;code&gt;Command&lt;/code&gt; + &lt;code&gt;I&lt;/code&gt;）で確認する。&lt;/p&gt;&#10;&lt;p&gt;もし設定を元に戻したい場合は、形式を &lt;code&gt;png&lt;/code&gt; に指定し、同様の手順で &lt;code&gt;killall&lt;/code&gt; コマンドを実行すればよい。&lt;/p&gt;&#10;</description></item><item><title>Webブラウザでシェルにアクセスする Shell In A Box のセットアップ備忘録</title><link>https://ai.hack-le.com/web%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%A7%E3%82%B7%E3%82%A7%E3%83%AB%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%99%E3%82%8B-shell-in-a-box-%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2/</link><pubDate>Mon, 15 Dec 2025 12:34:40 +0900</pubDate><guid>https://ai.hack-le.com/web%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%A7%E3%82%B7%E3%82%A7%E3%83%AB%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%99%E3%82%8B-shell-in-a-box-%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2/</guid><description>&lt;h2 id="目的と再現環境"&gt;目的と再現環境&#10;&lt;/h2&gt;&lt;p&gt;Webブラウザを経由してサーバーまたはローカルマシンにセキュアにアクセスできるターミナル環境を構築することは、リモートワークフローや簡易的なサーバー管理において利便性が高い。本記事は、WebベースのSSHクライアントである Shell In A Box (SIA) をmacOS上にセルフホストし、LAN内の他のPCからアクセス可能にするまでの具体的な手順を記録することを目的とする。&lt;/p&gt;&#10;&lt;h3 id="前提となる再現環境"&gt;前提となる再現環境&#10;&lt;/h3&gt;&lt;p&gt;本記事で解説する手順は、以下の環境を前提とし、Macをホストマシンとして使用する。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;ホストOS&lt;/strong&gt;: macOS (Homebrewがインストールされていること)&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;クライアント環境&lt;/strong&gt;: LAN内の任意のPCにインストールされたWebブラウザ&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;ツール&lt;/strong&gt;: Shell In A Box (SIA)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;この手順は、特別な外部サービスを必要とせず、Homebrewが利用できる環境であればすぐに再現できる。&lt;/p&gt;&#10;&lt;h2 id="shell-in-a-boxのインストールと基本的な起動"&gt;Shell In A Boxのインストールと基本的な起動&#10;&lt;/h2&gt;&lt;p&gt;Shell In A Box を使用可能にする最初のステップは、MacのパッケージマネージャーであるHomebrewを利用したツールのインストールである。HomebrewはmacOS上でUNIXツールやパッケージを簡単に管理するためのデファクトスタンダードであり、この手順を大幅に簡略化する。&lt;/p&gt;&#10;&lt;p&gt;Homebrewが導入されていることを確認した後、ターミナルで以下のコマンドを実行し、Shell In A Boxをインストールする。&lt;/p&gt;&#10;&lt;p&gt;Bash&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;brew install shellinabox&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;インストール完了後、Shell In A Box デーモン（&lt;code&gt;shellinaboxd&lt;/code&gt;）を起動する。LAN内での利用を想定する場合、アクセス制御とセキュリティのため、簡易テスト用の &lt;code&gt;-t&lt;/code&gt; オプションではなく、ログインプロンプトを表示するデフォルトモードで起動することが推奨される。&lt;/p&gt;&#10;&lt;p&gt;Bash&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;shellinaboxd&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このコマンドを実行すると、Shell In A BoxはデフォルトでTCPポート &lt;code&gt;4200&lt;/code&gt; を使用して接続待ちの状態となる。この際、ターミナルには特にメッセージが表示されないことが多い。この状態でMac上のWebブラウザ（例: Chrome, Safari）を開き、&lt;code&gt;http://localhost:4200/&lt;/code&gt; にアクセスすることで、ログインプロンプトが表示されることを確認できる。ログイン認証には、ホストマシン（Mac）の&lt;strong&gt;ユーザー名とパスワード&lt;/strong&gt;を使用する。これにより、ブラウザ内でMacのターミナルを操作する準備が整う。この基本的な起動により、ローカルマシンでの動作が確認でき、次のステップであるLAN内アクセスへの布石となる。&lt;/p&gt;&#10;&lt;h2 id="lan内アクセスを可能にする設定と手順"&gt;LAN内アクセスを可能にする設定と手順&#10;&lt;/h2&gt;&lt;p&gt;Shell In A Boxは、デフォルトでMacのすべてのネットワークインターフェースからの接続を待ち受ける設定になっている。そのため、LAN内の他のPCからアクセスを可能にするために必要なのは、ホストであるMacのローカルIPアドレスを確認することのみである。これにより、MacのWebブラウザだけでなく、ネットワークを介した任意のデバイスからシェルにアクセスすることが可能となる。&lt;/p&gt;&#10;&lt;p&gt;まず、Shell In A BoxにアクセスするためのホストとなるMacのプライベートIPアドレスを確認する。これは「システム設定」や「システム環境設定」の「ネットワーク」セクションから確認可能である。例えば、IPアドレスが &lt;code&gt;192.168.1.10&lt;/code&gt; であると仮定する。このIPアドレスは、LAN内でのみ有効なアドレスであり、外部インターネットからのアクセスには使用されない。&lt;/p&gt;&#10;&lt;p&gt;次に、LAN内の他のPCのWebブラウザを開き、以下の形式の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://&lt;span class="o"&gt;[&lt;/span&gt;MacのIPアドレス&lt;span class="o"&gt;]&lt;/span&gt;:4200/&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;具体例として、IPアドレスが &lt;code&gt;192.168.1.10&lt;/code&gt; の場合、アクセスURLは &lt;code&gt;http://192.168.1.10:4200/&lt;/code&gt; となる。このURLにアクセスすると、ブラウザにShell In A Boxのログイン画面が表示される。ここで、ホストMacのユーザー名とパスワードを入力することで、LAN内の任意のPCからMacのシェル環境を操作することが可能となる。この方法は、Webベースのサービスとしてシェルを提供するため、クライアント側に追加のSSHクライアントソフトウェアをインストールする必要がないという利点がある。このプロセス全体を通じて、セキュリティを確保するため、&lt;strong&gt;パスワード認証&lt;/strong&gt;が必須となることに留意すべきである。&lt;/p&gt;&#10;&lt;h2 id="pc起動時の自動起動設定"&gt;PC起動時の自動起動設定&#10;&lt;/h2&gt;&lt;p&gt;Shell In A Boxの利便性を最大化するには、ホストマシン（Mac）の起動時に自動的にサービスを開始させることが重要である。macOSでは、ユーザーログイン後にサービスを自動起動させるために、標準機能である &lt;code&gt;launchd&lt;/code&gt; とその設定ファイル（&lt;code&gt;.plist&lt;/code&gt; ファイル）を利用する。これにより、手動で毎回ターミナルで起動コマンドを実行する手間を省くことができる。&lt;/p&gt;&#10;&lt;p&gt;まず、以下の構造を持つプロパティリスト（&lt;code&gt;plist&lt;/code&gt;）ファイルをホームディレクトリ内の適切な場所に作成する。ファイル名は慣例に従い、&lt;code&gt;com.shellinabox.server.plist&lt;/code&gt; とする。保存場所はユーザーごとのサービス定義を格納するディレクトリである &lt;code&gt;~/Library/LaunchAgents/&lt;/code&gt; である。&lt;/p&gt;&#10;&lt;p&gt;XML&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;# ~/Library/LaunchAgents/com.shellinabox.server.plist&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;dict&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;key&amp;gt;Label&amp;lt;/key&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;string&amp;gt;com.shellinabox.server&amp;lt;/string&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;key&amp;gt;ProgramArguments&amp;lt;/key&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;array&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;string&amp;gt;/usr/local/bin/shellinaboxd&amp;lt;/string&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;/array&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;key&amp;gt;RunAtLoad&amp;lt;/key&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;true/&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;key&amp;gt;KeepAlive&amp;lt;/key&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;true/&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;key&amp;gt;UserName&amp;lt;/key&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;string&amp;gt;（Macのユーザー名）&amp;lt;/string&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;key&amp;gt;StandardErrorPath&amp;lt;/key&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;string&amp;gt;/tmp/shellinabox.err&amp;lt;/string&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;key&amp;gt;StandardOutPath&amp;lt;/key&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;string&amp;gt;/tmp/shellinabox.out&amp;lt;/string&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;/dict&amp;gt;&#10;&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;code&gt;&amp;lt;key&amp;gt;UserName&amp;lt;/key&amp;gt;&lt;/code&gt; の値には、実際にShell In A Boxを実行するMacのユーザー名を正確に記述する必要がある。&lt;/p&gt;&#10;&lt;p&gt;ファイルを作成した後、ターミナルに戻り、&lt;code&gt;launchctl&lt;/code&gt; コマンドを使用してサービスをシステムに登録し、ロード（起動）する。&lt;/p&gt;&#10;&lt;p&gt;Bash&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;launchctl load ~/Library/LaunchAgents/com.shellinabox.server.plist&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この操作により、Shell In A Boxのサービスが即座に起動し、かつ、次回以降のMacの再起動時やログイン時に自動的に実行されるようになる。この設定によって、Webブラウザを開くだけで、常にLAN内からMacのシェル環境にアクセスできる状態が維持され、特にWordPress管理CLIの実行などの用途において、シームレスな作業環境が提供されるのである。&lt;/p&gt;&#10;</description></item><item><title>bashでターミナル間の履歴を共有する方法</title><link>https://ai.hack-le.com/bash%E3%81%A7%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E9%96%93%E3%81%AE%E5%B1%A5%E6%AD%B4%E3%82%92%E5%85%B1%E6%9C%89%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/</link><pubDate>Thu, 27 Nov 2025 14:50:56 +0900</pubDate><guid>https://ai.hack-le.com/bash%E3%81%A7%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E9%96%93%E3%81%AE%E5%B1%A5%E6%AD%B4%E3%82%92%E5%85%B1%E6%9C%89%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/</guid><description>&lt;p&gt;bash の履歴は通常、各ターミナルが独立して管理しており、複数のウィンドウを開いて作業していると、過去に実行したコマンドが別のターミナルに反映されず不便である。この問題は、bash が履歴ファイル（一般に &lt;code&gt;~/.bash_history&lt;/code&gt;）を読み書きするタイミングが限られていることに起因する。&lt;/p&gt;&#10;&lt;p&gt;デフォルトでは、ターミナル終了時に履歴が書き込まれる仕様であり、そのためリアルタイムの共有は行われない。本稿では、この挙動を変更し、&lt;strong&gt;どのターミナルからも最新履歴を利用できる環境を構築する方法&lt;/strong&gt;について解説する。&lt;/p&gt;&#10;&lt;h2 id="履歴共有の仕組み"&gt;履歴共有の仕組み&#10;&lt;/h2&gt;&lt;p&gt;bash に対して「履歴をリアルタイムに書き込み、かつ常に読み込む」ことを明示的に指示する。bash には &lt;code&gt;PROMPT_COMMAND&lt;/code&gt; という特別な環境変数が存在し、これはプロンプトが表示される直前に bash が必ず実行するコマンド列を定義する。&lt;/p&gt;&#10;&lt;p&gt;履歴同期のためには、この仕組みを利用して、直前のコマンドを履歴ファイルに追記する &lt;code&gt;history -a&lt;/code&gt; を実行し、他ターミナルが書き込んだ履歴を読み込む &lt;code&gt;history -n&lt;/code&gt; を実行するという二段構えが必要になる。また、履歴ファイルの内容を上書きせず追記する &lt;code&gt;histappend&lt;/code&gt; を有効にすることで、複数ターミナルが同時に履歴を書いても衝突が起こらない。&lt;/p&gt;&#10;&lt;h2 id="実装方法"&gt;実装方法&#10;&lt;/h2&gt;&lt;p&gt;履歴共有の設定は &lt;code&gt;.bashrc&lt;/code&gt; に記述することで有効になる。&lt;code&gt;.bashrc&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;shopt&lt;/span&gt; -s histappend&#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;PROMPT_COMMAND&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;history -a; history -n&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;source ~/.bashrc&lt;/code&gt; を実行して反映させる。&lt;/p&gt;&#10;&lt;h2 id="強制同期が必要な場合オプション"&gt;強制同期が必要な場合（オプション）&#10;&lt;/h2&gt;&lt;p&gt;履歴の衝突や順序の乱れが気になるような環境では、より強制的な同期方法として &lt;code&gt;history -c&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;export&lt;/span&gt; &lt;span class="nv"&gt;PROMPT_COMMAND&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;history -a; history -c; history -n&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;</description></item><item><title>動画ダウンロードの定番──yt-dlpという万能ツール</title><link>https://ai.hack-le.com/%E5%8B%95%E7%94%BB%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%AE%E5%AE%9A%E7%95%AA%E2%94%80%E2%94%80yt-dlp%E3%81%A8%E3%81%84%E3%81%86%E4%B8%87%E8%83%BD%E3%83%84%E3%83%BC%E3%83%AB/</link><pubDate>Wed, 05 Nov 2025 08:11:15 +0900</pubDate><guid>https://ai.hack-le.com/%E5%8B%95%E7%94%BB%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%AE%E5%AE%9A%E7%95%AA%E2%94%80%E2%94%80yt-dlp%E3%81%A8%E3%81%84%E3%81%86%E4%B8%87%E8%83%BD%E3%83%84%E3%83%BC%E3%83%AB/</guid><description>&lt;p&gt;動画サイトの海を自由に泳ぎたい者にとって、&lt;code&gt;yt-dlp&lt;/code&gt;は最強の羅針盤である。YouTubeをはじめ、無数の配信サイトから動画や音声を自在に取得できるその力は、まるで多言語を理解する通訳のように万能だ。だが、いくら名ツールでも、その使い方を知らなければただの宝の持ち腐れである。本稿では、&lt;code&gt;yt-dlp&lt;/code&gt;の基本的な操作法を一通り押さえ、使いこなすための筋道を記す。&lt;/p&gt;&#10;&lt;h2 id="導入という第一歩"&gt;導入という第一歩&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;yt-dlp&lt;/code&gt;はPython製のツールであり、インストールも簡潔だ。ターミナルで次の一行を叩くだけで始まる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;pip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;U&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;yt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dlp&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この瞬間、あなたのマシンに強力なダウンローダーが宿る。macOSやLinuxを使っているなら、Homebrew経由での導入も選べる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;brew&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;yt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dlp&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&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-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;yt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dlp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;U&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;コマンドラインに抵抗を覚える者もいるが、一度慣れればGUIのような視覚的ツールよりもはるかに迅速で正確だ。&lt;/p&gt;&#10;&lt;h2 id="基本動作urlひとつで完結する魔法"&gt;基本動作──URLひとつで完結する魔法&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;yt-dlp&lt;/code&gt;の核心はシンプルな命令にある。対象となる動画URLを指定すれば、それだけでダウンロードが始まる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;yt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dlp&lt;/span&gt;&lt;span class="w"&gt; &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;www&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;youtube&lt;/span&gt;&lt;span class="p"&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;watch&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;XXXXXXXXXXX&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;特別なオプションを付けなくとも、自動で最高画質を選択して保存してくれる。まるでソムリエが最適なワインを差し出すように、ユーザーの手を煩わせない。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="音だけを抜き出すという美学"&gt;音だけを抜き出すという美学&#10;&lt;/h2&gt;&lt;p&gt;動画のすべてを欲する必要はない。ときに音声だけで十分なこともある。音楽、講演、ラジオ──それらを純粋な音として残したいなら、次のコマンドが適切だ。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;yt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dlp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;--audio-format mp3 https://www.youtube.com/watch?v=XXXXXXXXXXX&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;-x&lt;/code&gt;は音声抽出を意味し、&lt;code&gt;--audio-format&lt;/code&gt;で形式を指定できる。&lt;code&gt;mp3&lt;/code&gt;のほか、&lt;code&gt;m4a&lt;/code&gt;や&lt;code&gt;wav&lt;/code&gt;なども選択可能だ。映像を削ぎ落とし、声や音だけを抽出する行為には、ある種の潔さがある。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="整理整頓という技術"&gt;整理整頓という技術&#10;&lt;/h2&gt;&lt;p&gt;複数の動画を扱うとき、ファイル名の管理は混沌に陥りがちだ。そこで役立つのが出力指定オプションである。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;yt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dlp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;%(title)s.%(ext)s&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &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;www&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;youtube&lt;/span&gt;&lt;span class="p"&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;watch&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;XXXXXXXXXXX&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;%(title)s&lt;/code&gt;は動画タイトル、&lt;code&gt;%(ext)s&lt;/code&gt;は拡張子を示す。保存先フォルダを指定したければ、パスを追加することもできる。この設定ひとつで、ライブラリ全体が整然と並ぶ。細部へのこだわりが、長期的な快適さを生むのだ。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="フォーマットを選ぶ自由"&gt;フォーマットを選ぶ自由&#10;&lt;/h2&gt;&lt;p&gt;映像のフォーマットや画質を厳密に選びたい場面もある。そのときは、まず利用可能な形式を一覧で確認する。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;yt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dlp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="w"&gt; &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;www&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;youtube&lt;/span&gt;&lt;span class="p"&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;watch&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;XXXXXXXXXXX&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一覧には画質、コーデック、サイズなどの情報が並ぶ。そこから望むフォーマットIDを指定して実行すればよい。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;yt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dlp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="w"&gt; &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;www&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;youtube&lt;/span&gt;&lt;span class="p"&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;watch&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;XXXXXXXXXXX&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;コマンドひとつで、容量を抑えたい場合も、高画質を追求したい場合も自在に選べる。この自由度こそが&lt;code&gt;yt-dlp&lt;/code&gt;の真髄である。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="プレイリストを一括で手に入れる"&gt;プレイリストを一括で手に入れる&#10;&lt;/h2&gt;&lt;p&gt;YouTubeのプレイリストURLを指定すれば、連続した動画をまとめてダウンロードできる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;yt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dlp&lt;/span&gt;&lt;span class="w"&gt; &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;www&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;youtube&lt;/span&gt;&lt;span class="p"&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;playlist&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;XXXXXXXXXXX&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;講義シリーズやミュージックアルバムのような連番構成の動画には特に有効だ。時間を節約し、統一感ある保存が叶う。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="結語コマンドラインに宿る洗練"&gt;結語──コマンドラインに宿る洗練&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;yt-dlp&lt;/code&gt;の魅力は、単なる便利さを超えている。短い命令の中に、精密な制御と柔軟な設計が共存しているからだ。クリック操作では到達できないレベルの自由がここにある。コマンドラインは不器用な人のための道具ではなく、考える者のための筆記具である。&lt;/p&gt;&#10;&lt;p&gt;動画をダウンロードするという単純な行為の背後には、情報をどう扱い、どう保存するかという哲学が潜んでいる。その第一歩として、&lt;code&gt;yt-dlp&lt;/code&gt;を知ることは、デジタル時代のリテラシーの一端を手にすることに等しい。&lt;/p&gt;&#10;</description></item><item><title>Linux/WSLでghqをインストールする方法</title><link>https://ai.hack-le.com/wsl%E3%81%A7ghq%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/</link><pubDate>Mon, 27 Oct 2025 18:22:58 +0900</pubDate><guid>https://ai.hack-le.com/wsl%E3%81%A7ghq%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/</guid><description>&lt;p&gt;&lt;code&gt;ghq&lt;/code&gt;は、リポジトリを一元的に管理するためのCLIツールである。GitHubやGitLabのリポジトリを一貫したパスで管理し、開発環境を整理するのに非常に有効である。&lt;br&gt;&#10;WSL上ではLinux環境として動作するため、Go製のツールである&lt;code&gt;ghq&lt;/code&gt;を直接ビルド・配置するのが最も適している。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="前提条件"&gt;前提条件&#10;&lt;/h2&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;項目&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;内容&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;OS&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Windows 10 / 11&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;WSL バージョン&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Linux ディストリビューション&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Ubuntu 22.04 以降&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Go言語&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1.19 以上（&lt;code&gt;go install&lt;/code&gt;コマンド対応バージョン）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;Goが未インストールの場合は、先にGoのインストール手順（前記事参照）を実施する。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="推奨方法go-installで直接インストールする"&gt;推奨方法：&lt;code&gt;go install&lt;/code&gt;で直接インストールする&#10;&lt;/h2&gt;&lt;p&gt;最も標準的で再現性が高い方法は、Go公式ツールチェーンを用いたインストールである。&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;go install github.com/x-motemen/ghq@latest&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;インストール後、&lt;code&gt;~/go/bin&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;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;export PATH=$PATH:$(go env GOPATH)/bin&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; ~/.bashrc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc&#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;ghq --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで&lt;code&gt;ghq&lt;/code&gt;が利用可能となる。&lt;br&gt;&#10;Goのモジュール管理機能を用いるため、バージョン指定（例：&lt;code&gt;@v1.5.0&lt;/code&gt;）も柔軟に対応できる。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="代替方法apt経由非推奨"&gt;代替方法：APT経由（非推奨）&#10;&lt;/h2&gt;&lt;p&gt;Ubuntuリポジトリにも&lt;code&gt;ghq&lt;/code&gt;パッケージが存在するが、更新が遅くバージョンが古い。&lt;br&gt;&#10;そのため、最新版を利用したい場合には不向きである。&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;sudo apt update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install ghq&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この方法は環境構築を自動化したい場合（例：AnsibleやDockerfileなど）には有効だが、開発者自身の利用には推奨されない。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="ソースからのビルド特殊用途向け"&gt;ソースからのビルド（特殊用途向け）&#10;&lt;/h2&gt;&lt;p&gt;カスタマイズが必要な場合や、&lt;code&gt;ghq&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;git clone https://github.com/x-motemen/ghq.git&#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; ghq&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make install&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;デフォルトでは&lt;code&gt;$GOPATH/bin&lt;/code&gt;にバイナリが生成される。&lt;br&gt;&#10;この方法は、Go開発環境の内部構造を理解している場合にのみ選択すべきである。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="まとめ"&gt;まとめ&#10;&lt;/h2&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;方法&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;特徴&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;推奨度&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;go install github.com/x-motemen/ghq@latest&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;最新版を簡単に導入できる&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;★★★★★&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;apt install ghq&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;システム管理に統合されるが古い&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;★★☆☆☆&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ソースからビルド&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;開発・検証向け&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;★★★☆☆&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="補足環境変数設定の確認"&gt;補足：環境変数設定の確認&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;ghq&lt;/code&gt;は内部で&lt;code&gt;git&lt;/code&gt;コマンドを利用するため、&lt;code&gt;git&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;git --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;また、デフォルトのリポジトリ保存パスは &lt;code&gt;~/.ghq&lt;/code&gt; である。&lt;br&gt;&#10;変更したい場合は環境変数で指定する。&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;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;export GHQ_ROOT=~/dev/src&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; ~/.bashrc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;p&gt;この構成を採用すれば、WSL上でもLinux環境と同様に&lt;code&gt;ghq&lt;/code&gt;が安定動作し、GitHubリポジトリの管理を効率化できる。&lt;/p&gt;&#10;</description></item><item><title>macOS launchctl の bootstrap と bootout コマンドの使い方</title><link>https://ai.hack-le.com/macos-launchctl-%E3%81%AE-bootstrap-%E3%81%A8-bootout-%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/</link><pubDate>Wed, 08 Oct 2025 17:21:45 +0900</pubDate><guid>https://ai.hack-le.com/macos-launchctl-%E3%81%AE-bootstrap-%E3%81%A8-bootout-%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/</guid><description>&lt;p&gt;macOS では、バックグラウンドで動作するサービス（デーモンやエージェント）を管理するために &lt;code&gt;launchd&lt;/code&gt; という仕組みが用いられており、これを制御するコマンドが &lt;code&gt;launchctl&lt;/code&gt; である。従来は &lt;code&gt;load&lt;/code&gt; と &lt;code&gt;unload&lt;/code&gt; というサブコマンドが使われていたが、macOS 10.11 El Capitan 以降、これらは「レガシーサブコマンド」として扱われ、代わりに &lt;code&gt;bootstrap&lt;/code&gt; と &lt;code&gt;bootout&lt;/code&gt; が推奨されるようになった。ただし実際には、2025年現在も多くの記事やスクリプトで従来の &lt;code&gt;load&lt;/code&gt;/&lt;code&gt;unload&lt;/code&gt; が使われ続けているのが現状である。&lt;/p&gt;&#10;&lt;p&gt;本記事では、公式に推奨されている &lt;code&gt;bootstrap&lt;/code&gt; と &lt;code&gt;bootout&lt;/code&gt; の使い方について解説する。なお、この記事で扱う内容は macOS 10.11 以降を前提としている。&lt;/p&gt;&#10;&lt;h2 id="bootstrap-と-bootout-の基本"&gt;bootstrap と bootout の基本&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;bootstrap&lt;/code&gt; と &lt;code&gt;bootout&lt;/code&gt; は、それぞれ従来の &lt;code&gt;load&lt;/code&gt; と &lt;code&gt;unload&lt;/code&gt; に相当するコマンドである。最大の違いは、&lt;strong&gt;ドメインを明示的に指定する必要がある&lt;/strong&gt;という点だ。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;bootstrap&lt;/code&gt;: サービスをドメインに登録して起動する（&lt;code&gt;load&lt;/code&gt; の代替）&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;bootout&lt;/code&gt;: サービスを停止してドメインから削除する（&lt;code&gt;unload&lt;/code&gt; の代替）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;従来の方式では、plist ファイルのパスから暗黙的にドメインが判別されていたが、新しい方式では明示的に指定することで、より正確な制御が可能になるという設計思想である。&lt;/p&gt;&#10;&lt;h2 id="ドメインの種類と意味"&gt;ドメインの種類と意味&#10;&lt;/h2&gt;&lt;p&gt;launchd におけるドメインとは、サービスがどのレベル・どのユーザーのために動作するかを表す概念である。主なドメインは以下の3種類だ。&lt;/p&gt;&#10;&lt;h3 id="system-ドメイン"&gt;system ドメイン&#10;&lt;/h3&gt;&lt;p&gt;システム全体で動作するデーモンのためのドメインである。root 権限で実行され、すべてのユーザーに影響する。通常、&lt;code&gt;/Library/LaunchDaemons/&lt;/code&gt; に配置された plist ファイルがこのドメインで動作する。&lt;/p&gt;&#10;&lt;h3 id="guiuid-ドメイン"&gt;gui/UID ドメイン&#10;&lt;/h3&gt;&lt;p&gt;特定のユーザーがグラフィカルログイン（GUI セッション）している間だけ動作するエージェントのためのドメインである。UID はユーザー ID を表す数値で、macOS では最初に作成されたユーザーは通常 501 となる。自分の UID は &lt;code&gt;id -u&lt;/code&gt; コマンドで確認できる。&lt;code&gt;~/Library/LaunchAgents/&lt;/code&gt; や &lt;code&gt;/Library/LaunchAgents/&lt;/code&gt; に配置されたエージェントは、基本的にこのドメインで動作する。&lt;/p&gt;&#10;&lt;h3 id="useruid-ドメイン"&gt;user/UID ドメイン&#10;&lt;/h3&gt;&lt;p&gt;特定のユーザー権限で動作するが、ログインの有無に関わらず常駐するバックグラウンドサービスのためのドメインである。GUI は使用できないが、PC 起動中は常に動き続ける。このドメインは macOS 10.11 以降で追加された比較的新しい概念である。&lt;/p&gt;&#10;&lt;h2 id="基本的な使い方"&gt;基本的な使い方&#10;&lt;/h2&gt;&lt;h3 id="システムデーモンの登録と削除"&gt;システムデーモンの登録と削除&#10;&lt;/h3&gt;&lt;p&gt;システム全体で動作するデーモンを扱う場合、&lt;code&gt;system&lt;/code&gt; ドメインを指定する。root 権限が必要なため、&lt;code&gt;sudo&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;# 登録（起動）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo launchctl bootstrap system /Library/LaunchDaemons/com.example.daemon.plist&#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 launchctl bootout system /Library/LaunchDaemons/com.example.daemon.plist&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="ユーザーエージェントの登録と削除"&gt;ユーザーエージェントの登録と削除&#10;&lt;/h3&gt;&lt;p&gt;ログイン中のユーザーのために動作するエージェントを扱う場合、&lt;code&gt;gui/UID&lt;/code&gt; ドメインを指定する。まず自分の UID を確認してから、その値を使ってコマンドを実行する。&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;# UID を確認&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;id -u&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 例: 501 と表示される&#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;launchctl bootstrap gui/501 ~/Library/LaunchAgents/com.example.agent.plist&#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;launchctl bootout gui/501 ~/Library/LaunchAgents/com.example.agent.plist&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;スクリプト内で動的に UID を取得する場合は、以下のように記述できる。&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;#!/bin/bash&#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;# 現在ログイン中のユーザーの UID を取得&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;USER_ID=$(id -u)&#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;launchctl bootstrap gui/$USER_ID ~/Library/LaunchAgents/com.example.agent.plist&#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;launchctl bootout gui/$USER_ID ~/Library/LaunchAgents/com.example.agent.plist&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="サービスの状態確認"&gt;サービスの状態確認&#10;&lt;/h3&gt;&lt;p&gt;登録されているサービスの一覧を確認するには、&lt;code&gt;launchctl list&lt;/code&gt; コマンドを使う。特定のサービスを grep で絞り込むことも可能だ。&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;launchctl 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;launchctl list | grep com.example&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;より詳細な情報を得るには、&lt;code&gt;launchctl print&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;# システムドメインの情報を表示&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo launchctl print system&#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;launchctl print gui/501&#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;launchctl print gui/501/com.example.agent&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ただし、&lt;code&gt;print&lt;/code&gt; コマンドの出力形式は公式には構造化されておらず、バージョン間で変更される可能性があるため、スクリプトでのパース処理には依存しないことが推奨されている。&lt;/p&gt;&#10;&lt;h2 id="実行中のサービスの再起動"&gt;実行中のサービスの再起動&#10;&lt;/h2&gt;&lt;p&gt;既に動作しているサービスを再起動したい場合、&lt;code&gt;bootout&lt;/code&gt; してから &lt;code&gt;bootstrap&lt;/code&gt; し直す方法もあるが、より簡単な方法として &lt;code&gt;kickstart&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;# サービスを再起動（-k オプションで既存のインスタンスを終了してから起動）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;launchctl kickstart -k gui/501/com.example.agent&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;-k&lt;/code&gt; オプションを付けると、既に動作中のインスタンスを終了してから新しいインスタンスを起動する。オプションなしで実行すると、既に動作中の場合はエラーとなる。&lt;/p&gt;&#10;&lt;h2 id="enable-と-disable-の使い分け"&gt;enable と disable の使い分け&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;bootstrap&lt;/code&gt;/&lt;code&gt;bootout&lt;/code&gt; とは別に、&lt;code&gt;enable&lt;/code&gt; と &lt;code&gt;disable&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;# サービスを無効化（次回から自動起動しない）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo launchctl disable system/com.example.daemon&#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 launchctl enable system/com.example.daemon&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注意点として、&lt;code&gt;disable&lt;/code&gt; でサービスを無効化した後は、単に &lt;code&gt;bootstrap&lt;/code&gt; しようとしてもエラーになる。再度有効にするには、まず &lt;code&gt;enable&lt;/code&gt; を実行してから &lt;code&gt;bootstrap&lt;/code&gt; する必要がある。&lt;/p&gt;&#10;&lt;h2 id="従来の-loadunload-との対応関係"&gt;従来の load/unload との対応関係&#10;&lt;/h2&gt;&lt;p&gt;従来の方式と新しい方式の対応関係をまとめると、以下のようになる。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;従来の方式&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;新しい方式&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;launchctl load /Library/LaunchDaemons/service.plist&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;sudo launchctl bootstrap system /Library/LaunchDaemons/service.plist&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;launchctl unload /Library/LaunchDaemons/service.plist&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;sudo launchctl bootout system /Library/LaunchDaemons/service.plist&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;launchctl load ~/Library/LaunchAgents/agent.plist&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/agent.plist&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;launchctl unload ~/Library/LaunchAgents/agent.plist&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/agent.plist&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;従来の方式では plist ファイルのパスから自動的にドメインが判別されていたが、新しい方式ではドメインを明示的に指定する必要がある。この変更により、より正確な制御が可能になったとされているが、実際には記述量が増え、コマンドも覚えにくくなったという側面もある。&lt;/p&gt;&#10;&lt;h2 id="よくある問題とトラブルシューティング"&gt;よくある問題とトラブルシューティング&#10;&lt;/h2&gt;&lt;h3 id="permission-denied-エラー"&gt;Permission denied エラー&#10;&lt;/h3&gt;&lt;p&gt;システムドメインのサービスを操作する際に &lt;code&gt;sudo&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;# エラー例&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;launchctl bootstrap system /Library/LaunchDaemons/service.plist&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# → Permission denied&#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 launchctl bootstrap system /Library/LaunchDaemons/service.plist&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="operation-now-in-progress-エラー"&gt;Operation now in progress エラー&#10;&lt;/h3&gt;&lt;p&gt;サービスが既に登録されている状態で再度 &lt;code&gt;bootstrap&lt;/code&gt; を実行すると、このエラーが発生する。この場合は、まず &lt;code&gt;bootout&lt;/code&gt; で削除してから再度 &lt;code&gt;bootstrap&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;# 一度削除してから再登録&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo launchctl bootout system /Library/LaunchDaemons/service.plist&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo launchctl bootstrap system /Library/LaunchDaemons/service.plist&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;あるいは、前述の &lt;code&gt;kickstart -k&lt;/code&gt; コマンドを使うことで、より簡潔に再起動できる。&lt;/p&gt;&#10;&lt;h3 id="bootstrap-failed-5-inputoutput-error"&gt;Bootstrap failed: 5: Input/output error&#10;&lt;/h3&gt;&lt;p&gt;サービスを &lt;code&gt;disable&lt;/code&gt; した後に &lt;code&gt;bootstrap&lt;/code&gt; しようとすると、このエラーが発生することがある。この場合は、まず &lt;code&gt;enable&lt;/code&gt; で有効化してから &lt;code&gt;bootstrap&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;# 正しい手順&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo launchctl enable system/com.example.daemon&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo launchctl bootstrap system /Library/LaunchDaemons/com.example.daemon.plist&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="sip-によるエラー"&gt;SIP によるエラー&#10;&lt;/h3&gt;&lt;p&gt;System Integrity Protection（SIP）が有効な場合、システムが管理する一部の plist ファイルは変更できない。このような場合、以下のようなエラーメッセージが表示される。&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;Operation not permitted while System Integrity Protection is engaged&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この場合、基本的には操作を諦めるか、SIP を無効化する必要がある（ただし SIP の無効化はセキュリティリスクを伴うため推奨されない）。&lt;/p&gt;&#10;&lt;h2 id="まとめ"&gt;まとめ&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;bootstrap&lt;/code&gt; と &lt;code&gt;bootout&lt;/code&gt; は、macOS 10.11 以降で推奨されている launchd サービスの管理コマンドである。従来の &lt;code&gt;load&lt;/code&gt;/&lt;code&gt;unload&lt;/code&gt; と比べて、ドメインを明示的に指定する必要があるため、より正確な制御が可能になった反面、コマンドが冗長になり覚えにくくなったという側面もある。&lt;/p&gt;&#10;&lt;p&gt;実際には、2025年現在も多くの記事やスクリプトで従来の &lt;code&gt;load&lt;/code&gt;/&lt;code&gt;unload&lt;/code&gt; が使われ続けており、これらのコマンドも依然として動作する。ただし、公式には &lt;code&gt;bootstrap&lt;/code&gt;/&lt;code&gt;bootout&lt;/code&gt; の使用が推奨されているため、新しく書くスクリプトではこちらを使うのが望ましいとされている。&lt;/p&gt;&#10;&lt;p&gt;システムの根幹に関わる launchd の操作は慎重に行う必要がある。特に &lt;code&gt;/Library/LaunchDaemons/&lt;/code&gt; や &lt;code&gt;/System/Library/&lt;/code&gt; 以下のファイルを扱う際は、誤った操作がシステム全体に影響を及ぼす可能性があるため、十分に注意して作業を進めることが重要である。&lt;/p&gt;&#10;&lt;h2 id="出典"&gt;出典&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;Stack Overflow: &lt;a class="link" href="https://stackoverflow.com/questions/57412590/launchd-confusion-on-the-sematics-of-bootstrap-bootout-for-controlling-services" target="_blank" rel="noopener"&#10; &gt;launchd: Confusion on the sematics of bootstrap/bootout for controlling services on macOS&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Ask Different: &lt;a class="link" href="https://apple.stackexchange.com/questions/366281/launchd-confusion-on-semantics-of-bootstrap-and-bootout-etc-after-reading-manu" target="_blank" rel="noopener"&#10; &gt;launchd: Confusion on semantics of bootstrap and bootout etc. after reading manual pages&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Alan Siu&amp;rsquo;s Blog: &lt;a class="link" href="https://www.alansiu.net/2023/11/15/launchctl-new-subcommand-basics-for-macos/" target="_blank" rel="noopener"&#10; &gt;launchctl &amp;ldquo;new&amp;rdquo; subcommand basics for macOS&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;SS64.com: &lt;a class="link" href="https://ss64.com/mac/launchctl.html" target="_blank" rel="noopener"&#10; &gt;launchctl Man Page - macOS&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;The Terminal Blogger: &lt;a class="link" href="https://joelsenders.wordpress.com/2019/03/14/dear-launchctl-were-all-using-you-wrong/" target="_blank" rel="noopener"&#10; &gt;Dear Launchctl, We&amp;rsquo;re All Using You Wrong&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Babo D&amp;rsquo;s Corner: &lt;a class="link" href="https://babodee.wordpress.com/2016/04/09/launchctl-2-0-syntax/" target="_blank" rel="noopener"&#10; &gt;Launchctl 2.0 Syntax&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>ghqで高速リポジトリ移動を実現する最小設定</title><link>https://ai.hack-le.com/ghq%E3%81%A7%E9%AB%98%E9%80%9F%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E7%A7%BB%E5%8B%95%E3%82%92%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8B%E6%9C%80%E5%B0%8F%E8%A8%AD%E5%AE%9A/</link><pubDate>Tue, 16 Sep 2025 03:03:42 +0900</pubDate><guid>https://ai.hack-le.com/ghq%E3%81%A7%E9%AB%98%E9%80%9F%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E7%A7%BB%E5%8B%95%E3%82%92%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8B%E6%9C%80%E5%B0%8F%E8%A8%AD%E5%AE%9A/</guid><description>&lt;p&gt;ghqを使ってGitリポジトリを管理している際、複数のリポジトリ間を素早く移動したい場面は日常的に発生する。複雑な設定や多機能なツールの組み合わせではなく、最小限の設定で最大の効果を得る方法を紹介する。&lt;/p&gt;&#10;&lt;h2 id="前提環境"&gt;前提環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;ghqがインストールされていること&lt;/li&gt;&#10;&lt;li&gt;fzfがインストールされていること&lt;/li&gt;&#10;&lt;li&gt;Bash または Zsh を使用していること&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;fzfのインストールは以下のコマンドで実行できる：&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;# macOS (Homebrew)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install fzf&#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;# Ubuntu/Debian&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install fzf&#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;# CentOS/RHEL&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo yum install fzf&#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;シェルの設定ファイル（&lt;code&gt;.bashrc&lt;/code&gt; または &lt;code&gt;.zshrc&lt;/code&gt;）に以下の1行を追加するだけで、高速なリポジトリ移動が可能になる：&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;alias g=&amp;#39;cd $(ghq root)/$(ghq list | fzf)&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この設定により、&lt;code&gt;g&lt;/code&gt; コマンドを実行するとfzfの絞り込み画面が表示され、リポジトリ名を入力して絞り込み、Enterキーで該当するリポジトリのディレクトリに移動できる。&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;source ~/.zshrc # Zshの場合&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;source ~/.bashrc # Bashの場合&#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;例えば、以下のようなリポジトリ構成があるとする：&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/github.com/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── user/my-blog&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── user/api-server&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── user/frontend-app&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── company/internal-tool&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;g&lt;/code&gt; コマンドを実行すると、fzfの絞り込み画面が表示される。ここで「blog」と入力すると &lt;code&gt;user/my-blog&lt;/code&gt; が絞り込まれ、Enterキーを押すことで即座に該当ディレクトリに移動する。部分一致での検索が可能なため、「front」と入力すれば &lt;code&gt;user/frontend-app&lt;/code&gt; にマッチする。&lt;/p&gt;&#10;&lt;p&gt;このような直感的な操作により、従来の &lt;code&gt;cd&lt;/code&gt; コマンドで長いパスを入力する必要がなくなり、開発効率が大幅に向上する。&lt;/p&gt;&#10;&lt;h2 id="他の選択肢との比較"&gt;他の選択肢との比較&#10;&lt;/h2&gt;&lt;p&gt;リポジトリ移動を効率化する方法として、pecoを使用する選択肢もある。pecoは日本で人気のあるツールで、基本的な絞り込み機能を提供する。しかし、現在ではfzfの方が機能的に優れており、より活発に開発されている状況である。&lt;/p&gt;&#10;&lt;p&gt;fzfとpecoの主な違いは、fzfがプレビュー機能や複数選択機能を標準で備えている点にある。また、GitHubでのスター数を見ると、fzfが60,000以上のスターを獲得している一方で、pecoは7,000程度となっており、コミュニティの規模と活発度に大きな差がある。&lt;/p&gt;&#10;&lt;p&gt;将来的な拡張性を考慮した場合、fzfを選択しておくことで、プレビュー機能やその他の高度な機能を後から追加できる余地が残される。&lt;/p&gt;&#10;</description></item><item><title>macOSでtacコマンドを使えるようにする設定方法</title><link>https://ai.hack-le.com/macos%E3%81%A7tac%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E8%A8%AD%E5%AE%9A%E6%96%B9%E6%B3%95/</link><pubDate>Tue, 16 Sep 2025 02:23:36 +0900</pubDate><guid>https://ai.hack-le.com/macos%E3%81%A7tac%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E8%A8%AD%E5%AE%9A%E6%96%B9%E6%B3%95/</guid><description>&lt;p&gt;pecoなどのCLIツールを使用する際に、Linuxでは標準的な&lt;code&gt;tac&lt;/code&gt;コマンドがmacOSでは利用できずエラーが発生することがある。この記事では、macOSで&lt;code&gt;tac&lt;/code&gt;コマンドを使えるようにするための設定手順を記録する。&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&lt;/li&gt;&#10;&lt;li&gt;Homebrew導入済み&lt;/li&gt;&#10;&lt;li&gt;bash または zsh&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="tacコマンドとは"&gt;tacコマンドとは&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;tac&lt;/code&gt;コマンドは、ファイルの内容を行単位で逆順に出力するLinuxの標準コマンドである。&lt;code&gt;cat&lt;/code&gt;コマンドの逆の動作を行うため、&amp;ldquo;tac&amp;rdquo;（catの逆綴り）という名前が付けられている。主にログファイルの最新エントリから順に表示したい場合や、履歴検索ツールでの逆順処理に使用される。&lt;/p&gt;&#10;&lt;h2 id="macosでのtacコマンド不在問題"&gt;macOSでのtacコマンド不在問題&#10;&lt;/h2&gt;&lt;p&gt;macOSでpecoなどのツールを使用する際に、以下のようなエラーが発生する場合がある：&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;-bash: tac: command not found&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これは、macOSのBSD系ユーティリティにはGNU系の&lt;code&gt;tac&lt;/code&gt;コマンドが含まれていないことが原因である。多くのLinux環境で当然のように使用されているコマンドであるため、LinuxからmacOSに移行した際によく遭遇する問題となっている。&lt;/p&gt;&#10;&lt;h2 id="coreutilsパッケージによる解決"&gt;coreutilsパッケージによる解決&#10;&lt;/h2&gt;&lt;p&gt;最も確実で標準的な解決方法は、GNU coreutilsパッケージをHomebrewでインストールすることである。GNU coreutilsは、Linux環境で使用されている基本的なコマンド群を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 coreutils&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このインストールにより、GNU版の各種コマンドが&lt;code&gt;g&lt;/code&gt;プレフィックス付きで利用可能になる。&lt;code&gt;tac&lt;/code&gt;コマンドの場合は&lt;code&gt;gtac&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;echo -e &amp;#34;first\nsecond\nthird&amp;#34; | gtac&#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;# third&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# second&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# first&#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;&lt;code&gt;gtac&lt;/code&gt;コマンドが使用できるようになったが、既存のスクリプトや設定で&lt;code&gt;tac&lt;/code&gt;として呼び出される場合に対応するため、エイリアスを設定する必要がある。使用しているシェルの設定ファイルにエイリアスを追加することで、&lt;code&gt;tac&lt;/code&gt;コマンドを&lt;code&gt;gtac&lt;/code&gt;に自動的に変換できる。&lt;/p&gt;&#10;&lt;p&gt;bashを使用している場合は&lt;code&gt;~/.bashrc&lt;/code&gt;または&lt;code&gt;~/.bash_profile&lt;/code&gt;に、zshを使用している場合は&lt;code&gt;~/.zshrc&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;alias tac=&amp;#39;gtac&amp;#39;&#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;# bashの場合&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;source ~/.bashrc&#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;# zshの場合&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;source ~/.zshrc&#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;エイリアス設定後、&lt;code&gt;tac&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;# tacコマンドのテスト&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;echo -e &amp;#34;line1\nline2\nline3&amp;#34; | tac&#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;# line3&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# line2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# line1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;また、エイリアスが正しく設定されているかは&lt;code&gt;alias&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;alias | grep tac&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 出力: alias tac=&amp;#39;gtac&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="pecoでの履歴検索への適用"&gt;pecoでの履歴検索への適用&#10;&lt;/h2&gt;&lt;p&gt;この設定により、pecoを使用した履歴検索で&lt;code&gt;tac&lt;/code&gt;コマンドが正常に動作するようになる。一般的なpeco設定では、コマンド履歴を逆順で表示するために&lt;code&gt;tac&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;# 例：pecoを使った履歴検索の設定&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;function peco-select-history() {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; local tac&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if which tac &amp;gt; /dev/null; then&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; tac=&amp;#34;tac&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; elif which tail &amp;gt; /dev/null; then&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; tac=&amp;#34;tail -r&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; BUFFER=$(history -n 1 | eval $tac | peco --query &amp;#34;$LBUFFER&amp;#34;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; CURSOR=$#BUFFER&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; zle clear-screen&#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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="まとめ"&gt;まとめ&#10;&lt;/h2&gt;&lt;p&gt;macOSでのtacコマンド不在問題は、GNU coreutilsパッケージのインストールとエイリアス設定により解決できる。この設定により、Linux環境で作成されたスクリプトやツール設定をmacOSでもそのまま利用できるようになる。特にpecoやその他のCLIツールを使用する開発環境において、この設定は必須といえる。同様の手法は、GNU系の他のコマンド（&lt;code&gt;gls&lt;/code&gt;、&lt;code&gt;ggrep&lt;/code&gt;など）にも適用でき、Linux環境との互換性を高めることができる。&lt;/p&gt;&#10;</description></item><item><title>macOSでBash起動時のロケール警告を解決する方法</title><link>https://ai.hack-le.com/macos%E3%81%A7bash%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%AE%E3%83%AD%E3%82%B1%E3%83%BC%E3%83%AB%E8%AD%A6%E5%91%8A%E3%82%92%E8%A7%A3%E6%B1%BA%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/</link><pubDate>Tue, 16 Sep 2025 01:54:34 +0900</pubDate><guid>https://ai.hack-le.com/macos%E3%81%A7bash%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%AE%E3%83%AD%E3%82%B1%E3%83%BC%E3%83%AB%E8%AD%A6%E5%91%8A%E3%82%92%E8%A7%A3%E6%B1%BA%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/</guid><description>&lt;p&gt;macOSでシェルをfishからbashに変更した際、ターミナル起動時に以下のような警告が表示されることがある。&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;-bash: 警告: setlocale: LC_COLLATE: cannot change locale (): No such file or directory&#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;ul&gt;&#10;&lt;li&gt;macOS（Homebrewでbashをインストール済み）&lt;/li&gt;&#10;&lt;li&gt;シェルをfishからbashに変更後&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;/opt/homebrew/bin/bash&lt;/code&gt;を使用&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="問題の原因分析"&gt;問題の原因分析&#10;&lt;/h2&gt;&lt;h3 id="現在のロケール設定の確認"&gt;現在のロケール設定の確認&#10;&lt;/h3&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;locale&#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;LANG=&amp;#34;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LC_COLLATE=&amp;#34;C&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LC_CTYPE=&amp;#34;UTF-8&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LC_MESSAGES=&amp;#34;C&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LC_MONETARY=&amp;#34;C&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LC_NUMERIC=&amp;#34;C&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LC_TIME=&amp;#34;C&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LC_ALL=&#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;env | grep -E &amp;#34;(LANG|LC_)&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このコマンドで表示される内容と&lt;code&gt;locale&lt;/code&gt;コマンドの出力に不一致がある場合、設定の競合が発生している可能性が高い。&lt;/p&gt;&#10;&lt;h3 id="根本原因の推定"&gt;根本原因の推定&#10;&lt;/h3&gt;&lt;p&gt;警告メッセージの&lt;code&gt;cannot change locale ():&lt;/code&gt;の括弧内が空になっているのは、どこかでロケール関連の環境変数が空文字列に設定されているためである。これは以下のような要因で発生する可能性がある。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;以前使用していたシェル（fish等）の設定残骸&lt;/li&gt;&#10;&lt;li&gt;システムアップデート時の設定の不整合&lt;/li&gt;&#10;&lt;li&gt;複数のツールによる環境変数の競合&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="解決方法"&gt;解決方法&#10;&lt;/h2&gt;&lt;h3 id="基本的な対症療法"&gt;基本的な対症療法&#10;&lt;/h3&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;echo &amp;#39;export LANG=en_US.UTF-8&amp;#39; &amp;gt; ~/.bash_profile&#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;source ~/.bash_profile&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="設定内容の選択指針"&gt;設定内容の選択指針&#10;&lt;/h3&gt;&lt;p&gt;ロケール設定には以下の選択肢がある。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;英語環境での自然な並び順を優先する場合（推奨）&lt;/strong&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;export LANG=en_US.UTF-8&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この設定により、&lt;code&gt;ls&lt;/code&gt;コマンドやファイルソートで大文字小文字を考慮した辞書順になる。具体的には、&lt;code&gt;Apple&lt;/code&gt;、&lt;code&gt;apple&lt;/code&gt;、&lt;code&gt;Banana&lt;/code&gt;、&lt;code&gt;banana&lt;/code&gt;の順序で表示される。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;純粋なASCII順序を優先する場合&lt;/strong&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;export LANG=C&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この設定では、ASCII値順（数字→大文字→小文字）でソートされる。プログラマー向けの厳密な順序だが、一般的な用途では直感的でない順序になることがある。&lt;/p&gt;&#10;&lt;h3 id="設定の確認"&gt;設定の確認&#10;&lt;/h3&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;locale&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;すべての&lt;code&gt;LC_*&lt;/code&gt;項目が設定したロケール（例：&lt;code&gt;en_US.UTF-8&lt;/code&gt;）になっていれば成功である。また、警告メッセージが表示されなくなることを確認する。&lt;/p&gt;&#10;&lt;h2 id="追加の対処法"&gt;追加の対処法&#10;&lt;/h2&gt;&lt;h3 id="ターミナルアプリ固有の設定確認"&gt;ターミナルアプリ固有の設定確認&#10;&lt;/h3&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;cat &amp;#34;/etc/bashrc_$TERM_PROGRAM&amp;#34; 2&amp;gt;/dev/null || echo &amp;#34;Terminal-specific bashrc not found&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="利用可能なロケールの確認"&gt;利用可能なロケールの確認&#10;&lt;/h3&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;locale -a | grep -E &amp;#34;(en_US|ja_JP|C$)&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;この方法は対症療法であり、根本的な原因（どこで空文字列が設定されているか）を解決するものではない。しかし、実用上は十分な解決策となる。&lt;/p&gt;&#10;&lt;p&gt;長期間使用しているシステムでは、様々なツールのインストール・アンインストールにより設定の断片が残存することがある。完全な解決を求める場合は、クリーンインストールが最も確実な方法である。&lt;/p&gt;&#10;&lt;h2 id="参考資料"&gt;参考資料&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://www.gnu.org/software/bash/manual/" target="_blank" rel="noopener"&#10; &gt;Bashマニュアル - GNU&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPInternational/" target="_blank" rel="noopener"&#10; &gt;ロケール設定 - Apple Developer Documentation&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>WSL環境でMac風のpbcopy/pbpasteを実現する方法</title><link>https://ai.hack-le.com/wsl%E7%92%B0%E5%A2%83%E3%81%A7mac%E9%A2%A8%E3%81%AEpbcopy-pbpaste%E3%82%92%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/</link><pubDate>Sun, 17 Aug 2025 13:47:19 +0900</pubDate><guid>https://ai.hack-le.com/wsl%E7%92%B0%E5%A2%83%E3%81%A7mac%E9%A2%A8%E3%81%AEpbcopy-pbpaste%E3%82%92%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/</guid><description>&lt;h2 id="前提環境"&gt;前提環境&#10;&lt;/h2&gt;&lt;p&gt;この記事は以下の環境での動作を前提としている。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Windows 10/11&lt;/li&gt;&#10;&lt;li&gt;WSL2（Windows Subsystem for Linux 2）&lt;/li&gt;&#10;&lt;li&gt;Ubuntu 20.04以降（他のディストリビューションでも同様の手順で可能）&lt;/li&gt;&#10;&lt;li&gt;Bash または Zsh シェル&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="背景と課題"&gt;背景と課題&#10;&lt;/h2&gt;&lt;p&gt;Macユーザーであれば、コマンドラインからクリップボードを操作する際に&lt;code&gt;pbcopy&lt;/code&gt;と&lt;code&gt;pbpaste&lt;/code&gt;コマンドを使用することに慣れているだろう。これらのコマンドは非常に便利で、パイプを使ってテキストをクリップボードにコピーしたり、クリップボードの内容を取得したりできる。&lt;/p&gt;&#10;&lt;p&gt;一方、WSL環境では標準でこのような機能は提供されていない。Linux用のクリップボードツールである&lt;code&gt;xclip&lt;/code&gt;をインストールしても、これはX Window System内でのクリップボード操作に留まり、Windowsのシステムクリップボードとは連携しない。つまり、WSL内で&lt;code&gt;xclip&lt;/code&gt;を使ってコピーした内容を、Windows側のアプリケーションで貼り付けることはできないのである。&lt;/p&gt;&#10;&lt;h2 id="windowsのネイティブなクリップボードapi"&gt;WindowsのネイティブなクリップボードAPI&#10;&lt;/h2&gt;&lt;p&gt;実は、Windowsには&lt;code&gt;clip.exe&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;echo &amp;#34;Hello World&amp;#34; | clip.exe&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記のコマンドを実行すると、「Hello World」がWindowsのクリップボードにコピーされ、任意のWindowsアプリケーションで貼り付けることができる。&lt;/p&gt;&#10;&lt;p&gt;ただし、&lt;code&gt;clip.exe&lt;/code&gt;は書き込み専用であり、クリップボードの内容を読み取る機能は提供されていない。そのため、Macの&lt;code&gt;pbpaste&lt;/code&gt;に相当する機能を実現するには別の方法が必要となる。&lt;/p&gt;&#10;&lt;h2 id="powershellを活用したクリップボード読み取り"&gt;PowerShellを活用したクリップボード読み取り&#10;&lt;/h2&gt;&lt;p&gt;Windowsでクリップボードの内容を取得するには、PowerShellの&lt;code&gt;Get-Clipboard&lt;/code&gt;コマンドレットを使用する。WSL内からPowerShellを呼び出すことで、この機能を利用できる。&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;powershell.exe -command &amp;#34;Get-Clipboard&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このコマンドを実行すると、現在のクリップボードの内容がターミナルに出力される。なお、&lt;code&gt;-command&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;powershell.exe &amp;#34;Get-Clipboard&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;毎回長いコマンドを入力するのは非効率的であるため、エイリアスを設定してMacと同様の使い勝手を実現する。使用しているシェルの設定ファイル（Bashの場合は&lt;code&gt;~/.bashrc&lt;/code&gt;、Zshの場合は&lt;code&gt;~/.zshrc&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;alias pbcopy=&amp;#39;clip.exe&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;alias pbpaste=&amp;#39;powershell.exe -command &amp;#34;Get-Clipboard&amp;#34;&amp;#39;&#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;# Bashの場合&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;source ~/.bashrc&#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;# Zshの場合 &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;source ~/.zshrc&#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;エイリアスを設定した後は、Macと同様の感覚でクリップボード操作が可能になる。以下に実用的な使用例を示す。&lt;/p&gt;&#10;&lt;h3 id="基本的な使用方法"&gt;基本的な使用方法&#10;&lt;/h3&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;# テキストをクリップボードにコピー&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;echo &amp;#34;テスト文字列&amp;#34; | pbcopy&#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;pbpaste&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="ファイルの内容をクリップボードにコピー"&gt;ファイルの内容をクリップボードにコピー&#10;&lt;/h3&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;# SSH公開鍵をクリップボードにコピー（GitHubへの登録などに便利）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat ~/.ssh/id_rsa.pub | pbcopy&#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;cat ~/.vimrc | pbcopy&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="gitとの連携"&gt;Gitとの連携&#10;&lt;/h3&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;# 最新5件のコミット履歴をクリップボードにコピー&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git log --oneline -5 | pbcopy&#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;git branch --show-current | pbcopy&#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;# 現在のリモートURLをクリップボードにコピー&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git remote get-url origin | pbcopy&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="ディレクトリパスの活用"&gt;ディレクトリパスの活用&#10;&lt;/h3&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;# 現在のディレクトリパスをクリップボードにコピー&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pwd | pbcopy&#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;readlink -f example.txt | pbcopy&#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;このアプローチにはいくつかの注意点がある。まず、&lt;code&gt;powershell.exe&lt;/code&gt;の起動には若干の時間がかかるため、&lt;code&gt;pbpaste&lt;/code&gt;の実行速度は純粋なLinuxコマンドと比較して遅くなる。ただし、日常的な使用においては実用上問題となることは少ない。&lt;/p&gt;&#10;&lt;p&gt;また、非常に大きなテキストをクリップボードに格納する場合、PowerShellの制限によって一部のデータが切り取られる可能性がある。通常の開発作業で扱うテキストサイズであれば問題ないが、大容量のデータを扱う場合は注意が必要である。&lt;/p&gt;&#10;&lt;p&gt;さらに、この方法はWSLからWindowsの実行ファイルを呼び出すため、WSL2の場合はネットワークを介した通信が発生する。セキュリティ設定によっては、この通信が制限される可能性もある。&lt;/p&gt;&#10;&lt;h2 id="まとめ"&gt;まとめ&#10;&lt;/h2&gt;&lt;p&gt;WSL環境においても、Windowsの標準機能とPowerShellを組み合わせることで、Macの&lt;code&gt;pbcopy&lt;/code&gt;/&lt;code&gt;pbpaste&lt;/code&gt;と同等の機能を実現できる。エイリアスを設定することで、Macからの移行時も違和感なく使用できるようになる。&lt;/p&gt;&#10;&lt;p&gt;この方法の最大の利点は、追加のソフトウェアをインストールすることなく、Windowsの標準機能のみで実現できることである。WSLでの開発効率を向上させる簡単で実用的な設定として、ぜひ活用していただきたい。&lt;/p&gt;&#10;</description></item><item><title>LinuxでmacOS風クリップボード操作を実現するxclipの設定方法</title><link>https://ai.hack-le.com/linux%E3%81%A7macos%E9%A2%A8%E3%82%AF%E3%83%AA%E3%83%83%E3%83%97%E3%83%9C%E3%83%BC%E3%83%89%E6%93%8D%E4%BD%9C%E3%82%92%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8Bxclip%E3%81%AE%E8%A8%AD%E5%AE%9A%E6%96%B9/</link><pubDate>Sat, 09 Aug 2025 20:03:51 +0900</pubDate><guid>https://ai.hack-le.com/linux%E3%81%A7macos%E9%A2%A8%E3%82%AF%E3%83%AA%E3%83%83%E3%83%97%E3%83%9C%E3%83%BC%E3%83%89%E6%93%8D%E4%BD%9C%E3%82%92%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8Bxclip%E3%81%AE%E8%A8%AD%E5%AE%9A%E6%96%B9/</guid><description>&lt;p&gt;この記事の内容は、X11ウィンドウシステムを使用するLinux環境で動作確認している。Wayland環境では&lt;code&gt;wl-clipboard&lt;/code&gt;パッケージを使用する必要があるため、事前に使用環境を確認してほしい。また、記事中のコマンド例は、Debian/Ubuntu系ディストリビューションでの実行を前提としている。&lt;/p&gt;&#10;&lt;h2 id="linuxでのcliクリップボード操作の必要性"&gt;LinuxでのCLIクリップボード操作の必要性&#10;&lt;/h2&gt;&lt;p&gt;Linuxでコマンドライン作業をしていると、コマンドの出力結果をブラウザやテキストエディタに貼り付けたい場面が頻繁にある。しかし、標準的なLinux環境では、ターミナル出力を直接システムクリップボードに送る機能が用意されていない。一方、macOSでは&lt;code&gt;pbcopy&lt;/code&gt;と&lt;code&gt;pbpaste&lt;/code&gt;コマンドが標準で提供されており、パイプを使って簡単にクリップボード操作ができる。Linuxでも同様の機能を実現するためのツールが&lt;code&gt;xclip&lt;/code&gt;である。&lt;/p&gt;&#10;&lt;p&gt;xclipは、X11環境でコマンドライン出力をシステムクリップボードに送ったり、クリップボードの内容をターミナルに出力したりできる軽量なユーティリティである。このツールを適切に設定することで、macOSと同じような感覚でクリップボード操作を行うことができる。&lt;/p&gt;&#10;&lt;h2 id="xclipのインストール手順"&gt;xclipのインストール手順&#10;&lt;/h2&gt;&lt;p&gt;xclipのインストール方法は、使用しているLinuxディストリビューションによって異なる。主要なディストリビューションでの手順を以下に示す。&lt;/p&gt;&#10;&lt;p&gt;Debian系（Ubuntu、Linux Mint等）では、aptパッケージマネージャーを使用してインストールできる。まずパッケージリストを更新してから、xclipパッケージをインストールする。&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 update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install xclip&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Red Hat系（CentOS、RHEL、Fedora等）では、使用しているバージョンに応じてyumまたはdnfを使用する。Fedoraの場合は以下のコマンドでインストールできる。&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 dnf install xclip&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;CentOS 7やRHEL 7の場合は、EPELリポジトリを有効にしてからインストールする必要がある。&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 yum install epel-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo yum install xclip&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Arch Linuxでは、pacmanパッケージマネージャーを使用してインストールできる。&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 pacman -S xclip&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;インストールが完了したら、簡単なテストを行ってxclipが正常に動作することを確認する。&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;echo &amp;#34;test message&amp;#34; | xclip -selection clipboard&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このコマンドを実行後、テキストエディタやブラウザでCtrl+Vを押して「test message」が貼り付けられれば、インストールは成功している。&lt;/p&gt;&#10;&lt;h2 id="xclipの基本的な使用方法"&gt;xclipの基本的な使用方法&#10;&lt;/h2&gt;&lt;p&gt;xclipを使用してクリップボード操作を行う場合、主に&lt;code&gt;-selection clipboard&lt;/code&gt;オプションを使用する。このオプションを指定することで、一般的なアプリケーションでCtrl+C/Ctrl+Vで使用するクリップボードにアクセスできる。&lt;/p&gt;&#10;&lt;p&gt;コマンド出力をクリップボードにコピーする場合は、パイプを使ってxclipに出力を渡す。例えば、現在のディレクトリの詳細なファイル一覧をクリップボードにコピーしたい場合は、以下のコマンドを使用する。&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;ls -la | xclip -selection clipboard&#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;xclip -selection clipboard &amp;lt; file.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;クリップボードの内容を表示したい場合は、&lt;code&gt;-o&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;xclip -selection clipboard -o&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;-selection clipboard&lt;/code&gt;は頻繁に使用するため、&lt;code&gt;-sel clip&lt;/code&gt;と短縮形で記述することも可能である。&lt;/p&gt;&#10;&lt;h2 id="macos風エイリアスの設定方法"&gt;macOS風エイリアスの設定方法&#10;&lt;/h2&gt;&lt;p&gt;MacとLinuxの両方を使用している場合、同じコマンドでクリップボード操作ができると非常に便利である。macOSの&lt;code&gt;pbcopy&lt;/code&gt;と&lt;code&gt;pbpaste&lt;/code&gt;コマンドと同じ感覚で使用できるように、bashまたはzshの設定ファイルにエイリアスを追加する。&lt;/p&gt;&#10;&lt;p&gt;bashを使用している場合は、ホームディレクトリの&lt;code&gt;.bashrc&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;alias pbcopy=&amp;#39;xclip -selection clipboard&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;alias pbpaste=&amp;#39;xclip -selection clipboard -o&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;zshを使用している場合は、&lt;code&gt;.zshrc&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;echo &amp;#39;alias pbcopy=&amp;#34;xclip -selection clipboard&amp;#34;&amp;#39; &amp;gt;&amp;gt; ~/.bashrc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;echo &amp;#39;alias pbpaste=&amp;#34;xclip -selection clipboard -o&amp;#34;&amp;#39; &amp;gt;&amp;gt; ~/.bashrc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;source ~/.bashrc&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;設定後は、macOSと全く同じコマンドでクリップボード操作が可能になる。&lt;/p&gt;&#10;&lt;h2 id="実際の活用例"&gt;実際の活用例&#10;&lt;/h2&gt;&lt;p&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;pbcopy &amp;lt; config.json&#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;git log --oneline --graph | pbcopy&#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;uname -a | pbcopy&#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;pbpaste &amp;gt; output.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;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;pbcopy &amp;lt; ~/.ssh/id_rsa.pub&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これらの例のように、パイプやリダイレクションと組み合わせることで、様々な場面でクリップボード操作を活用できる。特に、長いコマンド出力やファイル内容を他のアプリケーションに貼り付ける際に、マウス操作によるコピー&amp;amp;ペーストよりも効率的である。&lt;/p&gt;&#10;&lt;h2 id="その他のクリップボードツールとの比較"&gt;その他のクリップボードツールとの比較&#10;&lt;/h2&gt;&lt;p&gt;X11環境でのクリップボード操作ツールとしては、xclip以外にも&lt;code&gt;xsel&lt;/code&gt;がある。xselも同様の機能を提供するが、xclipの方が一般的に広く使用されており、ドキュメントやコミュニティサポートが充実している。また、パッケージマネージャーでの提供状況もxclipの方が良好である。&lt;/p&gt;&#10;&lt;p&gt;Wayland環境を使用している場合は、&lt;code&gt;wl-clipboard&lt;/code&gt;パッケージの&lt;code&gt;wl-copy&lt;/code&gt;と&lt;code&gt;wl-paste&lt;/code&gt;コマンドを使用する必要がある。使用方法はxclipと類似しているが、オプションの指定方法が異なるため注意が必要である。&lt;/p&gt;&#10;&lt;p&gt;現在の環境がX11かWaylandかを確認するには、以下のコマンドを実行する。&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;echo $XDG_SESSION_TYPE&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;出力が「x11」であればxclipを、「wayland」であればwl-clipboardを使用することを推奨する。&lt;/p&gt;&#10;&lt;p&gt;この設定により、LinuxとmacOSの間での作業環境の切り替えが円滑になり、クリップボード操作に関する認知的負荷を軽減できる。特に、複数のOSを使い分けている開発者にとっては、コマンドの統一性が作業効率の向上に大きく貢献する。&lt;/p&gt;&#10;</description></item><item><title>AWKを使った簡単な合計計算の方法</title><link>https://ai.hack-le.com/awk-sum/</link><pubDate>Thu, 19 Dec 2024 11:02:34 +0900</pubDate><guid>https://ai.hack-le.com/awk-sum/</guid><description>&lt;p&gt;AWKはテキスト処理に非常に便利なツールであり、数値の合計を簡単に計算する方法を備えています。本記事では、AWKを使用して数値の合計を求める方法について解説します。&lt;/p&gt;&#10;&lt;h2 id="背景"&gt;背景&#10;&lt;/h2&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;64&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;65&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;71&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;82&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;82&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;79&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これらの数値の合計を求める必要がある場合、AWKを使うことで簡単に処理できます。&lt;/p&gt;&#10;&lt;h2 id="基本コマンド"&gt;基本コマンド&#10;&lt;/h2&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;awk &amp;#39;{sum += $1} END {print sum}&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="コマンドの仕組み"&gt;コマンドの仕組み&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;{sum += $1}&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;各行の1列目（&lt;code&gt;$1&lt;/code&gt;）を変数&lt;code&gt;sum&lt;/code&gt;に加算します。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;sum&lt;/code&gt;は最初に自動的に0で初期化されます。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="2"&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;END {print sum}&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;すべての行を処理し終えた後に&lt;code&gt;END&lt;/code&gt;ブロックが実行され、合計値&lt;code&gt;sum&lt;/code&gt;を出力します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="実例"&gt;実例&#10;&lt;/h2&gt;&lt;h3 id="データの例"&gt;データの例&#10;&lt;/h3&gt;&lt;p&gt;以下のような数値データを持つファイル&lt;code&gt;data.txt&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;64&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;65&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;71&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;82&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;82&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;79&#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;cat data.txt | awk &amp;#39;{sum += $1} END {print sum}&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="出力結果"&gt;出力結果&#10;&lt;/h3&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;443&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="findコマンドとの組み合わせ"&gt;&lt;code&gt;find&lt;/code&gt;コマンドとの組み合わせ&#10;&lt;/h3&gt;&lt;p&gt;複数のJSONファイルに対してPythonスクリプトを実行し、その結果の合計を求めるケースを考えます。&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;find . -name &amp;#34;*.json&amp;#34; -exec python a.py {} \; | awk &amp;#39;{sum += $1} END {print sum}&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;&#10;&lt;li&gt;&lt;code&gt;find&lt;/code&gt;コマンドで&lt;code&gt;.json&lt;/code&gt;ファイルを検索。&lt;/li&gt;&#10;&lt;li&gt;各ファイルに対して&lt;code&gt;python a.py&lt;/code&gt;を実行。&lt;/li&gt;&#10;&lt;li&gt;AWKで出力結果を集計し、合計値を出力。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="出力例"&gt;出力例&#10;&lt;/h3&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;1445&#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;AWKの&lt;code&gt;sum&lt;/code&gt;変数を応用して、さまざまな計算が可能です：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;平均値の計算&lt;/strong&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;awk &amp;#39;{sum += $1; count++} END {print sum / count}&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;最大値と最小値の計算&lt;/strong&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;awk &amp;#39;NR == 1 || $1 &amp;gt; max {max = $1} NR == 1 || $1 &amp;lt; min {min = $1} END {print &amp;#34;Max:&amp;#34;, max, &amp;#34;Min:&amp;#34;, min}&amp;#39;&#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;AWKはシンプルな構文で強力なテキスト処理を可能にするツールです。特に数値データの合計計算は、短いコマンドで簡単に実現できます。ぜひ活用してみてください！&lt;/p&gt;&#10;</description></item><item><title>JPGなど画像ファイルを圧縮したCBZ,ZIPファイルをPDFに変換する</title><link>https://ai.hack-le.com/zip-cbz-pdf/</link><pubDate>Wed, 25 Sep 2024 12:50:58 +0900</pubDate><guid>https://ai.hack-le.com/zip-cbz-pdf/</guid><description>&lt;p&gt;電子書籍や漫画のフォーマットとしてよく使われる&lt;code&gt;CBZ&lt;/code&gt;ファイルは、実際にはZIP形式で圧縮されたJPEG画像の集まりです。今回は、この&lt;code&gt;CBZ&lt;/code&gt;ファイルを簡単に&lt;code&gt;PDF&lt;/code&gt;に変換する方法を紹介します。&lt;/p&gt;&#10;&lt;p&gt;手順は非常にシンプルで、無料のコマンドラインツールを使って効率よく変換できます。ぜひ試してみてください。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="必要なツール"&gt;必要なツール&#10;&lt;/h2&gt;&lt;p&gt;以下のツールが必要です。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;unzip&lt;/code&gt;（通常のZIPファイル解凍に使います）&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;img2pdf&lt;/code&gt;（画像をPDFにまとめるためのツール）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;code&gt;img2pdf&lt;/code&gt;はPythonベースのツールで、簡単にインストールできます。まだインストールしていない場合、次のコマンドを使用してインストールしましょう。&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;pip install img2pdf&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h2 id="手順"&gt;手順&#10;&lt;/h2&gt;&lt;h3 id="cbzファイルを解凍する"&gt;CBZファイルを解凍する&#10;&lt;/h3&gt;&lt;p&gt;まず、&lt;code&gt;.cbz&lt;/code&gt;ファイルを&lt;code&gt;unzip&lt;/code&gt;コマンドで解凍し、中のJPEG画像を取り出します。次のようにコマンドを実行してください。&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;unzip your_file.cbz -d extracted_images&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;your_file.cbz&lt;/code&gt;は変換したいCBZファイルの名前、&lt;code&gt;extracted_images&lt;/code&gt;は画像を解凍するディレクトリです。&lt;/p&gt;&#10;&lt;h3 id="画像をpdfに変換する"&gt;画像をPDFに変換する&#10;&lt;/h3&gt;&lt;p&gt;次に、解凍されたJPEG画像を1つのPDFファイルにまとめます。&lt;code&gt;img2pdf&lt;/code&gt;コマンドを使って、指定したディレクトリ内のJPEG画像をPDF形式に変換します。&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;img2pdf extracted_images/*.jpg -o output.pdf&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで、&lt;code&gt;output.pdf&lt;/code&gt;という名前のPDFファイルが作成されます。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="スクリプト化"&gt;スクリプト化&#10;&lt;/h2&gt;&lt;p&gt;次のようなBashスクリプトを作成すれば、&lt;code&gt;.cbz&lt;/code&gt;ファイルをPDFに変換し、同じファイル名のPDFを出力し、途中で生成された不要なファイルを削除できます。&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="cp"&gt;#!/bin/bash&#10;&lt;/span&gt;&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;# CBZファイルを引数として受け取る&lt;/span&gt;&#10;&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;$1&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;&#10;&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;Usage: &lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt; filename.cbz&amp;#34;&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;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&#10;&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;&#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="nv"&gt;cbz_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="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;basename &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$cbz_file&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; .cbz&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;directory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;dirname &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$cbz_file&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&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="nv"&gt;temp_dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;mktemp -d&lt;span class="k"&gt;)&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;# CBZファイルを解凍&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;unzip &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$cbz_file&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; -d &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$temp_dir&lt;/span&gt;&lt;span class="s2"&gt;&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;# 画像ファイルをPDFに変換&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;img2pdf &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$temp_dir&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;/*.jpg -o &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$directory&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$filename&lt;/span&gt;&lt;span class="s2"&gt;.pdf&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;rm -rf &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$temp_dir&lt;/span&gt;&lt;span class="s2"&gt;&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="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Conversion completed: &lt;/span&gt;&lt;span class="nv"&gt;$filename&lt;/span&gt;&lt;span class="s2"&gt;.pdf&amp;#34;&lt;/span&gt;&#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;以上で、CBZファイルを簡単にPDFに変換できる手順を紹介しました。特別なソフトウェアは必要なく、コマンドラインだけでサクッと変換できるので、ぜひこの方法を活用してください。漫画や電子書籍をPDF化して整理したい方にぴったりの方法です。&lt;/p&gt;&#10;</description></item><item><title>カレントディレクトリの.rarファイルを展開する(Bash, Fish)</title><link>https://ai.hack-le.com/%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%88%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AE-rar%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%B1%95%E9%96%8B%E3%81%99%E3%82%8Bbash-fish/</link><pubDate>Wed, 03 Jan 2024 09:21:21 +0900</pubDate><guid>https://ai.hack-le.com/%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%88%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AE-rar%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%B1%95%E9%96%8B%E3%81%99%E3%82%8Bbash-fish/</guid><description>&lt;p&gt;&lt;code&gt;.rar&lt;/code&gt; ファイルを Bash や Fish シェルで展開するためには、&lt;code&gt;unrar&lt;/code&gt; または &lt;code&gt;rar&lt;/code&gt; コマンドを使用します。これらのコマンドは &lt;code&gt;.rar&lt;/code&gt; 形式のファイルを処理するための標準的なツールです。まず、これらのコマンドがシステムにインストールされているか確認し、インストールされていなければ適切な手順でインストールしてください。&lt;/p&gt;&#10;&lt;h3 id="bash-での-rar-ファイルの展開"&gt;Bash での .rar ファイルの展開&#10;&lt;/h3&gt;&lt;p&gt;Bash シェルを使用して &lt;code&gt;.rar&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;for file in *.rar; do unrar x &amp;#34;$file&amp;#34;; done&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このコマンドは、カレントディレクトリに存在する全ての &lt;code&gt;.rar&lt;/code&gt; ファイルを検索し、&lt;code&gt;unrar x&lt;/code&gt; コマンドを使ってそれぞれを展開します。&lt;/p&gt;&#10;&lt;h3 id="fish-での-rar-ファイルの展開"&gt;Fish での .rar ファイルの展開&#10;&lt;/h3&gt;&lt;p&gt;Fish シェルで &lt;code&gt;.rar&lt;/code&gt; ファイルを展開する場合、コマンドは少し異なりますが、基本的なプロセスは同じです。以下が Fish でのコマンドです：&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 file in *.rar; unrar x $file; end&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このコマンドも、カレントディレクトリの全ての &lt;code&gt;.rar&lt;/code&gt; ファイルに対して &lt;code&gt;unrar&lt;/code&gt; コマンドを実行します。&lt;/p&gt;&#10;&lt;h3 id="注意点"&gt;注意点&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;unrar&lt;/code&gt; コマンドがシステムにインストールされている必要があります。Linux や Unix 系の OS では、パッケージマネージャを通じてインストールできます。例えば、Debian 系のディストリビューションでは &lt;code&gt;sudo apt-get install unrar&lt;/code&gt; コマンドでインストールできます。&lt;/li&gt;&#10;&lt;li&gt;Macの場合は &lt;a class="link" href="https://qiita.com/wm-ytakano/items/ec03961978f5578906a2" target="_blank" rel="noopener"&#10; &gt;MacでRARファイルをコマンドラインで解凍する(unrar) #Mac - Qiita&lt;/a&gt; より &lt;code&gt;$ brew install carlocab/personal/unrar&lt;/code&gt;でインストールできます。&lt;/li&gt;&#10;&lt;li&gt;展開したいファイルが保存されているディレクトリに移動してからコマンドを実行してください。&lt;/li&gt;&#10;&lt;li&gt;ファイル名にスペースや特殊文字が含まれている場合は、ファイル名をダブルクォートで囲むことで、正しく処理されるようにしてください。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>カレントディレクトリの.lzhファイルをBashとFishで展開する方法</title><link>https://ai.hack-le.com/lzh-bash-fish/</link><pubDate>Wed, 03 Jan 2024 09:01:58 +0900</pubDate><guid>https://ai.hack-le.com/lzh-bash-fish/</guid><description>&lt;p&gt;コンピュータを使った作業では、様々なファイルを扱いますが、特にアーカイブファイルはその中でも重要な役割を果たしています。アーカイブファイルには多くの種類がありますが、今回は&lt;code&gt;.lzh&lt;/code&gt;形式のファイルに注目します。&lt;code&gt;.lzh&lt;/code&gt;はかつて日本で広く使われていた圧縮形式で、今でも歴史的なデータや特定のコンテンツを扱う際に見かけることがあります。&lt;/p&gt;&#10;&lt;p&gt;このブログ記事では、&lt;code&gt;.lzh&lt;/code&gt;ファイルを効率的に展開する方法を、BashとFishという二つの異なるシェルを使って紹介します。BashはLinuxやUnix系のオペレーティングシステムで最も一般的に使われるシェルで、その強力なスクリプト機能は多くのユーザーに愛されています。一方で、Fishはより最近のシェルで、そのユーザーフレンドリーな設計と直感的な構文が特徴です。&lt;/p&gt;&#10;&lt;h2 id="bashでのlzhファイルの展開"&gt;Bashでの.lzhファイルの展開&#10;&lt;/h2&gt;&lt;p&gt;Bashシェルは、LinuxやUnix系のオペレーティングシステムで広く採用されているコマンドラインインターフェースです。その強力なスクリプティング機能と柔軟性により、多くの開発者やシステム管理者にとって欠かせないツールとなっています。ここでは、Bashを使用して&lt;code&gt;.lzh&lt;/code&gt;ファイルを効率的に展開する方法を紹介します。&lt;/p&gt;&#10;&lt;p&gt;まず、&lt;code&gt;.lzh&lt;/code&gt;ファイルの展開には&lt;code&gt;lha&lt;/code&gt;コマンドが必要です。このコマンドは多くのLinuxディストリビューションやUnix系OSで利用可能ですが、インストールされていない場合は、パッケージマネージャを通じてインストールする必要があります。例えば、Debian系のLinuxディストリビューションでは、次のコマンドで&lt;code&gt;lha&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;sudo apt-get install lha&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;インストールが完了したら、カレントディレクトリにあるすべての&lt;code&gt;.lzh&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="k"&gt;for&lt;/span&gt; file in *.lzh&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; lha x &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done&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;.lzh&lt;/code&gt;ファイルに対して、ループを用いて一つずつ&lt;code&gt;lha x&lt;/code&gt;コマンドを実行します。&lt;code&gt;for&lt;/code&gt;ループの中で、&lt;code&gt;*.lzh&lt;/code&gt;はカレントディレクトリ内の全ての&lt;code&gt;.lzh&lt;/code&gt;ファイルにマッチします。各ファイル名は&lt;code&gt;file&lt;/code&gt;変数に格納され、&lt;code&gt;lha x &amp;quot;$file&amp;quot;&lt;/code&gt;コマンドによってそれぞれのファイルが展開されます。ダブルクォーテーションは、ファイル名にスペースや特殊文字が含まれている場合に備えて、ファイル名を正しく処理するために使用します。&lt;/p&gt;&#10;&lt;h2 id="fishでのlzhファイルの展開"&gt;Fishでの.lzhファイルの展開&#10;&lt;/h2&gt;&lt;p&gt;Fishシェルは、使いやすさと直感的な機能を重視した近代的なコマンドラインシェルです。Bashと比較して、より洗練されたユーザーインターフェースとシンプルな構文を提供しています。ここでは、Fishを使用して&lt;code&gt;.lzh&lt;/code&gt;ファイルを効率的に展開する方法を紹介します。&lt;/p&gt;&#10;&lt;p&gt;Bashと同様に、Fishでの展開にも&lt;code&gt;lha&lt;/code&gt;コマンドが必要です。&lt;code&gt;lha&lt;/code&gt;がまだインストールされていない場合は、システムのパッケージマネージャを使ってインストールしてください。インストールが完了したら、以下のコマンドを実行して、カレントディレクトリにある全ての&lt;code&gt;.lzh&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="k"&gt;for&lt;/span&gt; file in *.lzh&lt;span class="p"&gt;;&lt;/span&gt; lha x &lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; end&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このコマンドは、カレントディレクトリ内の全ての&lt;code&gt;.lzh&lt;/code&gt;ファイルに対して&lt;code&gt;lha&lt;/code&gt;コマンドを使用します。&lt;code&gt;for&lt;/code&gt;ループは、指定されたパターンにマッチする各ファイルに対してコマンドを実行します。ここでの&lt;code&gt;*.lzh&lt;/code&gt;は、カレントディレクトリの全ての&lt;code&gt;.lzh&lt;/code&gt;ファイルを指します。&lt;code&gt;lha x $file&lt;/code&gt;コマンドはそれぞれのファイルを展開し、&lt;code&gt;end&lt;/code&gt;キーワードでループが終了します。&lt;/p&gt;&#10;&lt;p&gt;Fishシェルの特徴の一つは、その構文の簡潔さです。Bashに比べてコマンドが短く、読みやすいため、シェルスクリプティングの初心者にも理解しやすいかもしれません。また、Fishには、コマンドの自動補完やシンタックスハイライトなどの便利な機能が標準で備わっており、日々の作業をより効率的にします。&lt;/p&gt;&#10;&lt;h2 id="注意点"&gt;注意点&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;.lzh&lt;/code&gt; ファイルを Bash や Fish で展開する際には、いくつかの重要な注意点があります。これらを理解し、適切に対処することで、ファイルの展開をスムーズかつ安全に行うことができます。&lt;/p&gt;&#10;&lt;h3 id="lha-コマンドのインストールと確認"&gt;&lt;code&gt;lha&lt;/code&gt; コマンドのインストールと確認&#10;&lt;/h3&gt;&lt;p&gt;最初に、&lt;code&gt;.lzh&lt;/code&gt; ファイルを扱うためには &lt;code&gt;lha&lt;/code&gt; コマンドが必須です。このコマンドはすべてのシステムに標準でインストールされているわけではありません。自分のシステムに &lt;code&gt;lha&lt;/code&gt; がインストールされているかを確認し、なければ適切なパッケージマネージャ（例えば、Linux の場合は &lt;code&gt;apt&lt;/code&gt; や &lt;code&gt;yum&lt;/code&gt;）を使用してインストールしてください。&lt;/p&gt;&#10;&lt;h3 id="ディレクトリの確認"&gt;ディレクトリの確認&#10;&lt;/h3&gt;&lt;p&gt;コマンドを実行する前に、カレントディレクトリが正しいかを確認することが大切です。&lt;code&gt;pwd&lt;/code&gt; コマンドを使用して現在のディレクトリを確認し、必要に応じて &lt;code&gt;cd&lt;/code&gt; コマンドで移動してください。これは、意図しないディレクトリのファイルを誤って操作することを防ぐためです。&lt;/p&gt;&#10;&lt;h3 id="ファイルのバックアップ"&gt;ファイルのバックアップ&#10;&lt;/h3&gt;&lt;p&gt;特に大切なデータを扱う場合、コマンドを実行する前にファイルのバックアップを取ることを強くお勧めします。これにより、万が一の事態が発生した場合でもデータを保護することができます。&lt;/p&gt;&#10;&lt;h3 id="ファイル名の特殊文字"&gt;ファイル名の特殊文字&#10;&lt;/h3&gt;&lt;p&gt;ファイル名にスペースや特殊文字が含まれている場合、これらを適切に処理するためにはファイル名をダブルクォートで囲むことが重要です。これは、シェルがファイル名を正しく解釈するために必要です。&lt;/p&gt;&#10;&lt;p&gt;これらの注意点を頭に入れておくことで、&lt;code&gt;.lzh&lt;/code&gt; ファイルの展開を安全かつ効率的に行うことができます。次のセクションでは、今回学んだ内容をまとめ、日常的なタスクの自動化の観点からこれらのコマンドの利用価値を評価します。&lt;/p&gt;&#10;&lt;h2 id="まとめ"&gt;まとめ&#10;&lt;/h2&gt;&lt;p&gt;この記事では、BashおよびFishシェルを用いてカレントディレクトリにある全ての&lt;code&gt;.lzh&lt;/code&gt;ファイルを効率的に展開する方法について学びました。Bashはその強力なスクリプティング能力で広く利用されており、Fishはユーザーフレンドリーな構文と使い勝手の良さで注目されています。どちらのシェルも、&lt;code&gt;.lzh&lt;/code&gt;ファイルのような特定のファイルタイプを扱う際に、効率的で強力なツールです。&lt;/p&gt;&#10;&lt;h3 id="bashとfishの比較"&gt;BashとFishの比較&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Bash&lt;/strong&gt;: 従来からのLinuxユーザーにとって馴染み深い。スクリプティングにおける複雑なタスクを処理するのに適しており、広範囲にわたる機能を提供します。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Fish&lt;/strong&gt;: シンプルで直感的な構文を持つ新しいシェル。自動補完やシンタックスハイライトなどの便利な機能が標準で備わっており、シェルスクリプティング初心者にも扱いやすいです。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="自動化と効率化"&gt;自動化と効率化&#10;&lt;/h3&gt;&lt;p&gt;このようなシェルコマンドを使うことで、日常的に発生する繰り返しのタスクを自動化し、作業効率を大幅に向上させることが可能です。特に多くのアーカイブファイルを扱う場合、これらのコマンドを使うことで、手作業による時間の浪費を避け、より重要なタスクに集中することができます。&lt;/p&gt;&#10;&lt;h3 id="結論"&gt;結論&#10;&lt;/h3&gt;&lt;p&gt;BashとFishを使った&lt;code&gt;.lzh&lt;/code&gt;ファイルの展開方法は、日々の作業をスムーズに進めるための有効な手段です。シェルスクリプティングは、単なるコマンドライン操作以上の可能性を秘めており、これを習得することは、あらゆるIT専門家にとって価値のあるスキルです。&lt;/p&gt;&#10;&lt;p&gt;この記事が、BashとFishの使い方を理解し、より効率的なワークフローを構築する一助となれば幸いです。&lt;/p&gt;&#10;</description></item><item><title>direnvを活用したAWSアカウントの自動切り替え方法</title><link>https://ai.hack-le.com/direnv-aws/</link><pubDate>Sun, 10 Dec 2023 00:39:39 +0900</pubDate><guid>https://ai.hack-le.com/direnv-aws/</guid><description>&lt;p&gt;クラウドリソースを頻繁に使用する場合、異なるプロジェクトやクライアントごとに異なるAWSアカウントを切り替える必要があることは珍しくありません。この記事では、開発環境におけるAWSアカウントの自動切り替えを実現するために&lt;code&gt;direnv&lt;/code&gt;というツールの使用方法に焦点を当てます。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;direnv&lt;/code&gt;は、シェル環境においてディレクトリごとに環境変数を自動で切り替えることができる非常に便利なツールです。これにより、プロジェクトや作業環境に応じて、AWSプロファイルや他の環境設定を簡単に切り替えることが可能になります。この記事では、&lt;code&gt;direnv&lt;/code&gt;の基本的なインストール方法から、AWSアカウントの切り替え設定までをステップバイステップで説明していきます。&lt;/p&gt;&#10;&lt;h2 id="direnvのインストールと設定"&gt;direnvのインストールと設定&#10;&lt;/h2&gt;&lt;p&gt;開発環境のカスタマイズにおいて、&lt;code&gt;direnv&lt;/code&gt;は非常に重要なツールの一つです。&lt;code&gt;direnv&lt;/code&gt;を使用すると、異なるディレクトリに移動した際に自動的に環境変数を切り替えることができ、特に複数のAWSアカウントを使い分ける際に大いに役立ちます。ここでは、&lt;code&gt;direnv&lt;/code&gt;のインストールと基本的な設定方法について説明します。&lt;/p&gt;&#10;&lt;h3 id="direnvのインストール"&gt;direnvのインストール&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;direnv&lt;/code&gt;は多くのUnix系オペレーティングシステムで利用可能です。以下は、主要なOSにおける&lt;code&gt;direnv&lt;/code&gt;のインストール方法です：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;macOS&lt;/strong&gt;: Homebrewを使用して簡単にインストールできます。&lt;/li&gt;&#10;&lt;/ul&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;brew install direnv&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Ubuntu/Debian&lt;/strong&gt;: aptパッケージマネージャを利用します。&lt;/li&gt;&#10;&lt;/ul&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;sudo apt-get install direnv&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Fedora&lt;/strong&gt;: dnfを使用してインストールします。&lt;/li&gt;&#10;&lt;/ul&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;sudo dnf install direnv&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="シェルにdirenvをフックする"&gt;シェルにdirenvをフックする&#10;&lt;/h3&gt;&lt;p&gt;インストール後、&lt;code&gt;direnv&lt;/code&gt;を使用するためにはシェルにフックする必要があります。これは、使用しているシェルの設定ファイルに特定の行を追加することで行います。以下は、いくつかの一般的なシェルの設定方法です：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Bash (&lt;code&gt;.bashrc&lt;/code&gt; or &lt;code&gt;.bash_profile&lt;/code&gt;)&lt;/strong&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-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;direnv hook bash&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Zsh (&lt;code&gt;.zshrc&lt;/code&gt;)&lt;/strong&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-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;direnv hook zsh&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Fish (&lt;code&gt;.config/fish/config.fish&lt;/code&gt;)&lt;/strong&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-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;direnv hook fish&lt;span class="o"&gt;)&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;h3 id="基本的な使用法"&gt;基本的な使用法&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;direnv&lt;/code&gt;を使うための最初のステップは、環境変数や設定を含む&lt;code&gt;.envrc&lt;/code&gt;ファイルを作成することです。このファイルは、特定のディレクトリに配置され、&lt;code&gt;direnv&lt;/code&gt;によって自動的に読み込まれます。&lt;code&gt;.envrc&lt;/code&gt;ファイルには、AWSプロファイルの設定や他の必要な環境変数を指定できます。&lt;/p&gt;&#10;&lt;p&gt;セキュリティ上の理由から、新しい&lt;code&gt;.envrc&lt;/code&gt;ファイルは&lt;code&gt;direnv&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;direnv allow .&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このコマンドは、&lt;code&gt;.envrc&lt;/code&gt;ファイルが安全であることを&lt;code&gt;direnv&lt;/code&gt;に伝え、そのディレクトリでの変更を有効にします。&lt;/p&gt;&#10;&lt;h2 id="direnvを使用したawsアカウントの実践例とトラブルシューティング"&gt;direnvを使用したAWSアカウントの実践例とトラブルシューティング&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;direnv&lt;/code&gt;を活用することで、AWSアカウントの切り替えをスムーズに行うことができます。このセクションでは、実際の使用例と一般的な問題の解決方法について説明します。&lt;/p&gt;&#10;&lt;h3 id="実際の使用例"&gt;実際の使用例&#10;&lt;/h3&gt;&lt;p&gt;想定するシナリオは、異なるAWSアカウントを使用する複数のプロジェクトに取り組んでいる状況です。それぞれのプロジェクトディレクトリに&lt;code&gt;.envrc&lt;/code&gt;ファイルを作成し、適切なAWSプロファイル名を設定します。&lt;/p&gt;&#10;&lt;p&gt;例えば、プロジェクトAとプロジェクトBがあり、それぞれ異なるAWSアカウントを使用するとします。プロジェクトAのディレクトリの&lt;code&gt;.envrc&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;export&lt;/span&gt; &lt;span class="nv"&gt;AWS_PROFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;projectA-profile&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;同様に、プロジェクトBの&lt;code&gt;.envrc&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;export&lt;/span&gt; &lt;span class="nv"&gt;AWS_PROFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;projectB-profile&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これにより、各プロジェクトディレクトリに移動するだけで、&lt;code&gt;direnv&lt;/code&gt;が自動的にAWSプロファイルを適切なものに切り替えます。&lt;/p&gt;&#10;&lt;h3 id="トラブルシューティングのヒント"&gt;トラブルシューティングのヒント&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;問題：&lt;code&gt;.envrc&lt;/code&gt;が読み込まれない&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;解決策：&lt;code&gt;direnv allow&lt;/code&gt;コマンドを使用して、&lt;code&gt;.envrc&lt;/code&gt;ファイルを承認します。また、シェルの設定ファイル（例：&lt;code&gt;.bashrc&lt;/code&gt;、&lt;code&gt;.zshrc&lt;/code&gt;、&lt;code&gt;.config/fish/config.fish&lt;/code&gt;）で&lt;code&gt;direnv&lt;/code&gt;が正しくフックされていることを確認してください。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;問題：AWSプロファイルが切り替わらない&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;解決策：&lt;code&gt;AWS_PROFILE&lt;/code&gt;変数が正しく設定されているか確認します。また、AWS CLIがインストールされていること、および&lt;code&gt;~/.aws/credentials&lt;/code&gt;と&lt;code&gt;~/.aws/config&lt;/code&gt;に正しい認証情報が設定されていることを確認してください。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;問題：セキュリティ上の懸念&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;解決策：&lt;code&gt;.envrc&lt;/code&gt;ファイルに機密情報（例：アクセスキー、シークレットキー）を直接書かないようにします。代わりに、プロファイル名のみを使用し、認証情報は&lt;code&gt;~/.aws/credentials&lt;/code&gt;に安全に保存します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="まとめ"&gt;まとめ&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;direnv&lt;/code&gt;を使用したAWSプロファイルの自動切り替えの方法について詳しく説明しました。この手法は、複数のAWSアカウントを扱う際の生産性を高め、エラーの可能性を減らすのに役立ちます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;主なポイントの再確認&lt;/strong&gt;:&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;direnv&lt;/code&gt;をインストールし、シェルにフックする。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;.envrc&lt;/code&gt;ファイルを使用して、ディレクトリごとに異なるAWSプロファイルを設定する。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;direnv allow&lt;/code&gt;を実行して、新しい&lt;code&gt;.envrc&lt;/code&gt;ファイルを承認する。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;応用例&lt;/strong&gt;: この手法はAWSプロファイルに限らず、他の環境変数や設定（例えば、データベース接続設定やAPIキー）の管理にも応用できます。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;セキュリティ上の注意&lt;/strong&gt;: &lt;code&gt;.envrc&lt;/code&gt;ファイルに機密情報を直接記述することは避け、安全な方法で認証情報を管理することが重要です。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;参考記事&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;direnv公式ドキュメント&lt;/strong&gt;: &lt;a class="link" href="https://direnv.net/" target="_blank" rel="noopener"&#10; &gt;direnv公式ウェブサイト&lt;/a&gt;には、インストール方法、使用方法、さまざまな設定オプションに関する詳細情報があります。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS CLI公式ドキュメント&lt;/strong&gt;: AWS CLIの使用方法に関する詳細情報は、&lt;a class="link" href="https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html" target="_blank" rel="noopener"&#10; &gt;AWS公式ドキュメント&lt;/a&gt;で提供されています。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;関連ブログ記事やフォーラム&lt;/strong&gt;: コミュニティの経験やベストプラクティスを共有する多くのブログ記事やフォーラムが存在します。これらは、具体的なシナリオや高度な使用例を理解するのに役立つかもしれません。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>[Mac] シェルスクリプトでファイルを日付別に整理する方法</title><link>https://ai.hack-le.com/mac-shell-date-folder/</link><pubDate>Tue, 31 Oct 2023 22:34:55 +0900</pubDate><guid>https://ai.hack-le.com/mac-shell-date-folder/</guid><description>&lt;h4 id="はじめに"&gt;はじめに&#10;&lt;/h4&gt;&lt;p&gt;ファイルの整理は作業効率を上げる重要なステップです。特に、多くのファイルがあるディレクトリでは、ファイルを日付別に分類することで目的のファイルを素早く見つけられるようになります。&lt;/p&gt;&#10;&lt;p&gt;この記事では、シェルスクリプトを使用してファイルを最終変更日に基づいて日付別のフォルダに自動で移動する方法を紹介します。&lt;/p&gt;&#10;&lt;h4 id="手順"&gt;手順&#10;&lt;/h4&gt;&lt;ol&gt;&#10;&lt;li&gt;ターミナルを開き、整理したいファイルがあるディレクトリに移動します。&lt;/li&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;&lt;span class="cp"&gt;#!/bin/bash&#10;&lt;/span&gt;&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="k"&gt;for&lt;/span&gt; file in *&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&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; -d &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$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;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;continue&lt;/span&gt;&#10;&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;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;stat -f &lt;span class="s2"&gt;&amp;#34;%Sm&amp;#34;&lt;/span&gt; -t &lt;span class="s2"&gt;&amp;#34;%Y-%m-%d&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&#10;&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; ! -d &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$date&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;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; mkdir &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$date&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&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;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; mv &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$date&lt;/span&gt;&lt;span class="s2"&gt;/&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&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;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;chmod +x script.sh&#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;./script.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="まとめ"&gt;まとめ&#10;&lt;/h4&gt;&lt;p&gt;この記事では、シェルスクリプトを使用してファイルを最終変更日に基づいて日付別のフォルダに自動で分類する方法を紹介しました。簡単なスクリプトで作業効率が大幅に向上します。是非お試しください。&lt;/p&gt;&#10;</description></item><item><title>Fishスクリプトでファイル名に日付時刻を追加する</title><link>https://ai.hack-le.com/fish-file-timestamp/</link><pubDate>Fri, 29 Sep 2023 07:52:46 +0900</pubDate><guid>https://ai.hack-le.com/fish-file-timestamp/</guid><description>&lt;p&gt;Fishシェルは、その美しいシンタックスと強力な機能で知られています。この記事では、Fishスクリプトを使用してカレントディレクトリの各ファイル名にタイムスタンプ（ここでは日付と時刻の文字列）を追加する方法を紹介します。このスクリプトは、既にタイムスタンプが付いているファイルは無視するので、複数回実行しても安全です。また、ディレクトリは対象外です。&lt;/p&gt;&#10;&lt;p&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-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; file in *&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt; -f &lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; and not string match -r &lt;span class="s2"&gt;&amp;#34;^[0-9]{14}_&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;$file&lt;/span&gt; &amp;gt; /dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; timestamp &lt;span class="o"&gt;(&lt;/span&gt;date -r &lt;span class="nv"&gt;$file&lt;/span&gt; +&lt;span class="s2"&gt;&amp;#34;%Y%m%d%H%M%S&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; mv &lt;span class="nv"&gt;$file&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$timestamp&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;_&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; end&lt;span class="p"&gt;;&lt;/span&gt; end&#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;&lt;span class="k"&gt;for&lt;/span&gt; file in *&#10;&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;test&lt;/span&gt; -f &lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; and not string match -r &lt;span class="s2"&gt;&amp;#34;^[0-9]{14}_&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;$file&lt;/span&gt; &amp;gt; /dev/null&#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; timestamp &lt;span class="o"&gt;(&lt;/span&gt;date -r &lt;span class="nv"&gt;$file&lt;/span&gt; +&lt;span class="s2"&gt;&amp;#34;%Y%m%d%H%M%S&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; mv &lt;span class="nv"&gt;$file&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$timestamp&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;_&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; end&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;end&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;bashバージョン:&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="k"&gt;for&lt;/span&gt; file in *&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&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="nv"&gt;$file&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; ! &lt;span class="nv"&gt;$file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;~ ^&lt;span class="o"&gt;[&lt;/span&gt;0-9&lt;span class="o"&gt;]{&lt;/span&gt;14&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 class="k"&gt;then&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;timestamp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date -r &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; +&lt;span class="s2"&gt;&amp;#34;%Y%m%d%H%M%S&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; mv &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&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;timestamp&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;_&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&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;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&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;ol&gt;&#10;&lt;li&gt;&lt;code&gt;test -f&lt;/code&gt;コマンドを使用して、アイテムがファイルであることを確認します（ディレクトリは除外されます）。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;string match&lt;/code&gt;コマンドを使用して、ファイル名が既にタイムスタンプを含んでいるかどうかを確認します。&lt;/li&gt;&#10;&lt;li&gt;タイムスタンプが含まれていない場合、&lt;code&gt;date&lt;/code&gt;コマンドを使用してファイルのタイムスタンプを生成します。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;mv&lt;/code&gt;コマンドを使用して、生成されたタイムスタンプとアンダースコアをファイル名の先頭に追加し、ファイル名を変更します。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;このスクリプトは、ファイルの整理と管理を容易にし、ファイルのバージョン管理を簡単に行えるようにします。&lt;/p&gt;&#10;</description></item><item><title>カレントディレクトリのサブディレクトリを.cbz形式で圧縮するBashワンライナー</title><link>https://ai.hack-le.com/current-cbz/</link><pubDate>Sat, 23 Sep 2023 00:46:20 +0900</pubDate><guid>https://ai.hack-le.com/current-cbz/</guid><description>&lt;p&gt;自炊ユーザ必携スクリプト。カレントディレクトリにあるjpgの塊のサブフォルダを.cbzにするワンライナをChatGPTに書かせたのであった。昔コツコツ書いていた自作のスニペットもう全部不要……。&lt;/p&gt;&#10;&lt;h3 id="イントロ"&gt;イントロ&#10;&lt;/h3&gt;&lt;p&gt;BashおよびFishシェルは、UNIX系オペレーティングシステムにおいて、コマンドラインから操作するためのインターフェースを提供します。これらのシェルを利用することで、システムの様々なタスクを一行のコマンドで実行できます。本記事では、これらのシェルを使用して、サブディレクトリを&lt;code&gt;.cbz&lt;/code&gt;形式で圧縮する方法を紹介します。&lt;/p&gt;&#10;&lt;h3 id="bashでの実行"&gt;Bashでの実行&#10;&lt;/h3&gt;&lt;p&gt;Bashでは、以下のワンライナーを使用することで、カレントディレクトリに存在する全てのサブディレクトリを&lt;code&gt;.cbz&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;for dir in */; do dir_name=&amp;#34;${dir%/}&amp;#34;; zip -r &amp;#34;$dir_name.zip&amp;#34; &amp;#34;$dir_name&amp;#34;; mv &amp;#34;$dir_name.zip&amp;#34; &amp;#34;$dir_name.cbz&amp;#34;; done&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="fishでの実行"&gt;Fishでの実行&#10;&lt;/h3&gt;&lt;p&gt;Fishシェルでは、少し構文が異なります。以下のワンライナーを使用します。&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 dir in */; set dir_name (string trim -r -c &amp;#39;/&amp;#39; $dir); zip -r $dir_name.zip $dir_name; mv $dir_name.zip $dir_name.cbz; end&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="プロセスの説明"&gt;プロセスの説明&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;カレントディレクトリの全サブディレクトリをリストアップします。&lt;/li&gt;&#10;&lt;li&gt;各サブディレクトリに対して、ディレクトリ名から末尾のスラッシュ(&lt;code&gt;/&lt;/code&gt;)を削除し、その名前を変数にセットします。&lt;/li&gt;&#10;&lt;li&gt;次に、そのディレクトリをzip形式で圧縮します。&lt;/li&gt;&#10;&lt;li&gt;最後に、生成されたzipファイルの拡張子を&lt;code&gt;.zip&lt;/code&gt;から&lt;code&gt;.cbz&lt;/code&gt;に変更します。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;.cbz形式は通常、コミックブックのリーダーアプリで使用される形式で、基本的にはzipアーカイブです。このワンライナーは、特にコミックや画像集の整理に有用で、シンプルでありながら、大量のディレクトリを効率的に圧縮するのに役立ちます。&lt;/p&gt;&#10;</description></item><item><title>fishシェルの環境変数設定：-Ux vs -gx</title><link>https://ai.hack-le.com/fish-ux-vs-gx/</link><pubDate>Sun, 17 Sep 2023 12:50:48 +0900</pubDate><guid>https://ai.hack-le.com/fish-ux-vs-gx/</guid><description>&lt;p&gt;環境変数の設定方法いつも忘れてしまうので、メモっておく。&lt;/p&gt;&#10;&lt;h2 id="イントロ"&gt;イントロ&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;fish&lt;/code&gt;シェルは、その直感的な機能とユーザーフレンドリーな設定方法で多くの開発者から支持を受けています。この記事では、&lt;code&gt;fish&lt;/code&gt;シェルで環境変数を設定する2つの一般的な方法、&lt;code&gt;-Ux&lt;/code&gt;と&lt;code&gt;-gx&lt;/code&gt;の違いと、それぞれの利点と欠点について詳しく説明します。&lt;/p&gt;&#10;&lt;h2 id="2つの方法"&gt;2つの方法&#10;&lt;/h2&gt;&lt;p&gt;大別して、&lt;code&gt;-Ux&lt;/code&gt;を使う方法と&lt;code&gt;-gx&lt;/code&gt;を使う方法があります。&lt;/p&gt;&#10;&lt;h3 id="-uxユニバーサル変数としてエクスポート"&gt;&lt;code&gt;-Ux&lt;/code&gt;：ユニバーサル変数としてエクスポート&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;set -U&lt;/code&gt;：変数を永続的なユニバーサル変数として設定します。これは、すべてのfishインスタンスで共有され、セッション間で保存される変数です。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;set -x&lt;/code&gt;：変数をエクスポートします。これにより、その変数が子プロセスに利用可能になります。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;例として、&lt;code&gt;MY_VARIABLE&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;set -Ux MY_VARIABLE &amp;#34;Some Value&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このコマンドを実行すると、&lt;code&gt;MY_VARIABLE&lt;/code&gt;はすべてのfishインスタンスと子プロセスで利用可能となります。そして、システムを再起動してもこの設定は保持されます。&lt;/p&gt;&#10;&lt;p&gt;ユニバーサル変数を削除する場合は、&lt;code&gt;set -e&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;set -e MY_VARIABLE&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このコマンドにより、指定されたユニバーサル変数が削除されます。&lt;/p&gt;&#10;&lt;h4 id="メリット"&gt;メリット:&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;永続性&lt;/strong&gt;: すべてのセッション間で保持され、システム再起動後も失われません。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;共有&lt;/strong&gt;: すべての&lt;code&gt;fish&lt;/code&gt;インスタンス間で変数が共有されます。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;インタラクティブ設定&lt;/strong&gt;: コマンドラインから直接変数を設定・変更が可能です。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="デメリット"&gt;デメリット:&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;オーバーヘッド&lt;/strong&gt;: 多くのユニバーサル変数を使用すると、起動時のオーバーヘッドが増加する可能性があります。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;混乱の原因&lt;/strong&gt;: 変数の変更が他の全ての&lt;code&gt;fish&lt;/code&gt;インスタンスに影響します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="オススメするケース"&gt;オススメするケース:&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;共通の設定&lt;/strong&gt;: 複数の &lt;code&gt;fish&lt;/code&gt; セッションやインスタンス間で共有したい設定がある場合。例えば、特定のプログラムのパスを追加したいときなど。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;一時的な変更&lt;/strong&gt;: インタラクティブに変数を変更し、その設定を暫定的にすべてのセッションで利用したい場合。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;マシン全体の設定&lt;/strong&gt;: 複数のユーザーアカウント間で共有したい設定がある場合。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="-gxグローバル変数としてエクスポート"&gt;&lt;code&gt;-gx&lt;/code&gt;：グローバル変数としてエクスポート&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;-g&lt;/code&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;いくつかの代表的な設定パターンを列挙します。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;PATH変数にディレクトリを追加する&lt;/strong&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;set -gx PATH $PATH /path/to/your/directory&#10;&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;&#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;set -gx MY_VARIABLE &amp;#34;Some Value&amp;#34;&#10;&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;&#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;set -gx PATH &amp;#34;/new/path:$PATH&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;nano ~/.config/fish/config.fish&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="メリット-1"&gt;メリット:&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;明確な初期化&lt;/strong&gt;: 変数の初期化が明確になり、文書化しやすくなります。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;セッション固有&lt;/strong&gt;: 特定のセッションにのみ変数や設定を適用可能です。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="デメリット-1"&gt;デメリット:&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;非永続性&lt;/strong&gt;: セッションが終了すると変数は消失します。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;変更の手間&lt;/strong&gt;: 変数の変更のためには設定ファイルを編集し、新しいセッションを開始または設定ファイルを再読み込みする必要があります。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="オススメするケース-1"&gt;オススメするケース:&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;セッション固有の設定&lt;/strong&gt;: あるセッションに特定の変数や設定を適用したいが、他のセッションには影響を与えたくない場合。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;明確な管理&lt;/strong&gt;: セッションの設定や起動時の動作を明確に制御したい場合。&lt;code&gt;config.fish&lt;/code&gt; に明確な指示を書くことで、どの変数がセットされているか、なぜそれがそうなっているかを文書化しやすくなります。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;多数の変数を設定&lt;/strong&gt;: 多くの環境変数を設定する場合、それらを一か所（&lt;code&gt;config.fish&lt;/code&gt;）にまとめることで、管理や変更が容易になります。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="-gxを推奨"&gt;&lt;code&gt;-gx&lt;/code&gt;を推奨&#10;&lt;/h2&gt;&lt;p&gt;一般的なシナリオでは、&lt;code&gt;-gx&lt;/code&gt;オプションを&lt;code&gt;config.fish&lt;/code&gt;に記述する方法が推奨されます。これにより、設定の一元管理が容易になり、意図しない変数の共有や競合を避けることができます。しかしながら、特定の状況やニーズに応じて&lt;code&gt;-Ux&lt;/code&gt;オプションを選択することも有効です。&lt;/p&gt;&#10;&lt;p&gt;環境変数の設定方法は、その用途やニーズに応じて最も適した方法を選択することが重要です。どちらの方法を選ぶかは、具体的な使用ケースやニーズに応じて異なるため、各プロジェクトやタスクの要件をよく理解し、適切な選択をするよう努めましょう。&lt;/p&gt;&#10;&lt;h2 id="寸評"&gt;寸評&#10;&lt;/h2&gt;&lt;p&gt;こういう話題は得意だよねChatGPT。基本的には設定ファイルに書いてるかな。持ち運べるし。&lt;/p&gt;&#10;</description></item><item><title>Node.jsのバージョン一覧をCLIから取得する方法</title><link>https://ai.hack-le.com/node-js-cli/</link><pubDate>Wed, 19 Jul 2023 15:54:41 +0900</pubDate><guid>https://ai.hack-le.com/node-js-cli/</guid><description>&lt;p&gt;fishではnvmのサポートが微妙ということで、Node.jsのバージョン管理にはvoltaを使うことにした。が、voltaは配布されているNodeのバージョン一覧を取得するコマンドがない。まぁ &lt;code&gt;volta install node@18&lt;/code&gt;とかでざっくりインストールすればいいからだと思うが。まぁそうは言っても、バージョン一覧をCLIから取得したいなぁと思って、ChatGPT-4に聞いた。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;M2 Pro MacBook Pro 14インチ&lt;/li&gt;&#10;&lt;li&gt;macOS 13.4.1&lt;/li&gt;&#10;&lt;li&gt;fish 3.6.1&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="はじめに"&gt;はじめに&#10;&lt;/h2&gt;&lt;p&gt;Node.jsはJavaScriptをサーバーサイドで実行するための環境で、そのバージョン管理は重要な作業の一部です。今日は、Node.jsの公式配布元から利用可能なすべてのNode.jsのバージョンを一覧表示する方法を紹介します。これにより、特定のバージョンが存在するか確認したり、どのバージョンをインストールすべきか決定する際の参考にすることができます。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="nodejsのバージョン一覧を取得するコマンド"&gt;Node.jsのバージョン一覧を取得するコマンド&#10;&lt;/h2&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;curl -s https://nodejs.org/dist/ &lt;span class="p"&gt;|&lt;/span&gt; grep -Eo &lt;span class="s1"&gt;&amp;#39;v[0-9]+\.[0-9]+\.[0-9]+/&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;s/\///g&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sort -V&#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;v0.1.14&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v0.1.14&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v0.1.15&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v0.1.15&#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;v20.1.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v20.2.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v20.2.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v20.3.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v20.3.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v20.3.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v20.3.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v20.4.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v20.4.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このコマンドは以下の操作を行っています：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;code&gt;curl -s https://nodejs.org/dist/&lt;/code&gt;：Node.jsの公式配布元からHTMLを取得します。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;grep -Eo 'v[0-9]+\.[0-9]+\.[0-9]+/'&lt;/code&gt;：取得したHTMLからバージョン番号を抽出します。&lt;code&gt;-E&lt;/code&gt;オプションは拡張正規表現を使用することを指定し、&lt;code&gt;-o&lt;/code&gt;オプションは一致した部分のみを出力します。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;sed 's/\///g'&lt;/code&gt;：バージョン番号の末尾にあるスラッシュ(&lt;code&gt;/&lt;/code&gt;)を削除します。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;sort -V&lt;/code&gt;：バージョン番号を順番に並べ替えます。&lt;code&gt;-V&lt;/code&gt;オプションはバージョン番号のような形式を正しくソートすることを指定します。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="注意点"&gt;注意点&#10;&lt;/h2&gt;&lt;p&gt;このコマンドはUNIXベースのシステム（LinuxやmacOSなど）で動作します。Windowsの場合、同等の操作を行うためにはWindows Subsystem for Linux（WSL）や、cygwin、git bashなどのツールが必要です。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="まとめ"&gt;まとめ&#10;&lt;/h2&gt;&lt;p&gt;Node.jsのバージョン管理は、プロジェクトの安定性や互換性を確保するために重要です。今回紹介したコマンドを使えば、CLIから簡単にNode.jsのバージョン一覧を取得でき、適切なバージョンの選択に役立つでしょう。&lt;/p&gt;&#10;&lt;h2 id="寸評"&gt;寸評&#10;&lt;/h2&gt;&lt;p&gt;質問一発で返ってきそうだが、以外にも引っかかっている。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;node.jsのマネージャであるvoltaでnodeを入れたいのだが、インストールできるバージョンの一覧はどのように取得できるのか&lt;/li&gt;&#10;&lt;li&gt;コマンドラインからNode.jsで配布されているバージョンを簡単に取得するにはどうしたらよいか&lt;/li&gt;&#10;&lt;li&gt;grep: invalid option &amp;ndash; P usage: grep [-abcdDEFGHhIiJLlMmnOopqRSsUVvwXxZz] [-A num] [-B num] [-C[num]] [-e pattern] [-f file] [&amp;ndash;binary-files=value] [&amp;ndash;color=when] [&amp;ndash;context[=num]] [&amp;ndash;directories=action] [&amp;ndash;label] [&amp;ndash;line-buffered] [&amp;ndash;null] [pattern] [file &amp;hellip;] とエラーが出た。Macのターミナルで実行した。&lt;/li&gt;&#10;&lt;li&gt;何も出力されない。awkによる抽出が失敗していると見られる。curlのレスポンスを一部抜粋した。これを見て修正できるか。（コードを貼る）&lt;/li&gt;&#10;&lt;li&gt;うまく動いた！ 備忘録としてブログにまとめたい。CLIからnodeのバージョン一覧を取得する方法について、ブログ記事としてまとめてくれ。適切に見出しを入れてくれ。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;失敗したが、実際の出力を貼ることでうまくいった。&lt;/p&gt;&#10;</description></item><item><title>WSL2でMacのようにクリップボードを操作する方法</title><link>https://ai.hack-le.com/wsl2-mac-clipboard/</link><pubDate>Sun, 16 Jul 2023 00:52:55 +0900</pubDate><guid>https://ai.hack-le.com/wsl2-mac-clipboard/</guid><description>&lt;p&gt;Macだとpbcopyやpbpasteといったコマンドでクリップボードの内容をターミナル上で扱うことができて、これが非常に便利。Windowsでも同じことができないか、ChatGPT-4に聞いたところ非常にうまくいったので、ブログ記事としてまとめさせた。&lt;/p&gt;&#10;&lt;h2 id="イントロ"&gt;イントロ&#10;&lt;/h2&gt;&lt;p&gt;Windows Subsystem for Linux 2（WSL2）は、Windows上でLinuxを動作させることができる強力なツールです。しかし、Macユーザーが利用できる便利な&lt;code&gt;pbcopy&lt;/code&gt;と&lt;code&gt;pbpaste&lt;/code&gt;コマンドのような、クリップボードに直接アクセスする機能がデフォルトではありません。この記事では、WSL2でこれらのコマンドを模倣する方法を解説します。&lt;/p&gt;&#10;&lt;h2 id="windowsのクリップボードにコピー"&gt;Windowsのクリップボードにコピー&#10;&lt;/h2&gt;&lt;p&gt;WSL2からWindowsのクリップボードにコピーするには、Windows側の&lt;code&gt;clip.exe&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;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;テキスト&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; clip.exe&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="windowsのクリップボードからペースト"&gt;Windowsのクリップボードからペースト&#10;&lt;/h2&gt;&lt;p&gt;逆に、WindowsのクリップボードからWSL2にペーストするには、&lt;code&gt;powershell.exe&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;powershell.exe -command &lt;span class="s1"&gt;&amp;#39;Get-Clipboard&amp;#39;&lt;/span&gt;&#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;これらのコマンドは有用ですが、特にペーストの方は長く、打つのが面倒かもしれません。それを解決するために、&lt;code&gt;pbcopy&lt;/code&gt;と&lt;code&gt;pbpaste&lt;/code&gt;というエイリアスを定義します。&lt;/p&gt;&#10;&lt;h3 id="bashの場合"&gt;bashの場合&#10;&lt;/h3&gt;&lt;p&gt;bash シェルを使っている場合、&lt;code&gt;.bashrc&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;alias&lt;/span&gt; &lt;span class="nv"&gt;pbcopy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;clip.exe&amp;#39;&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;alias&lt;/span&gt; &lt;span class="nv"&gt;pbpaste&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;powershell.exe -command Get-Clipboard&amp;#39;&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;&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで、Macのように &lt;code&gt;pbcopy&lt;/code&gt; と &lt;code&gt;pbpaste&lt;/code&gt; コマンドを使用することができます。&lt;/p&gt;&#10;&lt;h3 id="fishの場合"&gt;fishの場合&#10;&lt;/h3&gt;&lt;p&gt;Fish shellでは、関数として定義して、&lt;code&gt;config.fish&lt;/code&gt;ファイルに保存することで、同様の機能を実現できます。&lt;/p&gt;&#10;&lt;p&gt;まず、Fish shellで新しい関数を作成します:&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="k"&gt;function&lt;/span&gt; pbcopy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; -n &lt;span class="nv"&gt;$argv&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; clip.exe&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;end&#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="k"&gt;function&lt;/span&gt; pbpaste&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; powershell.exe -command &lt;span class="s1"&gt;&amp;#39;Get-Clipboard&amp;#39;&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;end&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次に、これらの関数を保存します。以下のコマンドは、作成した関数を &lt;code&gt;~/.config/fish/functions/&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;funcsave pbcopy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;funcsave pbpaste&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以上の手順で、&lt;code&gt;pbcopy&lt;/code&gt;と&lt;code&gt;pbpaste&lt;/code&gt;の機能をFish shellで使用できるようになります。新たなシェルセッションでもこれらの関数が使用可能になるよう、手動で定義するのではなく、&lt;code&gt;funcsave&lt;/code&gt; コマンドを使って保存することが重要です。&lt;/p&gt;&#10;&lt;h2 id="結論"&gt;結論&#10;&lt;/h2&gt;&lt;p&gt;これにより、WSL2でもMacのようにクリップボードを操作することが可能になります。この機能を利用すれば、シェルスクリプトやコマンドラインツールから直接クリップボードにアクセスすることができ、作業の効率を上げることができます。&lt;/p&gt;&#10;&lt;h2 id="寸評"&gt;寸評&#10;&lt;/h2&gt;&lt;p&gt;これでWSL2でも&lt;code&gt;pbcopy&lt;/code&gt;や&lt;code&gt;pbpaste&lt;/code&gt;といったコマンドを使えるようになった。pbcopyで一行改行ができるのが少し気になるが……。まぁでもこれは便利だね。&lt;/p&gt;&#10;&lt;p&gt;以下、質問した内容。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Macではpbcoyやpbpasteでクリップボードの内容をターミナルで利用できますが、WindowsのWSL2で同じようなことはできませんか&lt;/li&gt;&#10;&lt;li&gt;いいね。しかし、clip.exeはいいがペーストのほうはコマンドが長すぎる。&lt;/li&gt;&#10;&lt;li&gt;最高だ。完璧に&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;まちがって途中で送信してしまった&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="4"&gt;&#10;&lt;li&gt;それでは、この素晴らしい方法を、いつでも思い出して使えるように、あるいは他の人もできるように、ブログ記事としてまとめてくれ。&lt;/li&gt;&#10;&lt;li&gt;fishだとどうなる？&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;今回は記事の方もあまり手直ししていない。&lt;/p&gt;&#10;</description></item></channel></rss>