<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>akky blog</title>
    <link>http://blog.akky.me/</link>
    <description>Recent content on akky blog</description>
    <generator>Hugo</generator>
    <language>jp-ja</language>
    <lastBuildDate>Sat, 20 Dec 2025 00:00:00 +0900</lastBuildDate>
    <atom:link href="http://blog.akky.me/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Why are you in my computer?</title>
      <link>http://blog.akky.me/blog/20251213-why-cli/</link>
      <pubDate>Sat, 13 Dec 2025 18:05:44 +0900</pubDate>
      <guid>http://blog.akky.me/blog/20251213-why-cli/</guid>
      <description>&lt;p&gt;この記事は &lt;a href=&#34;https://adventar.org/calendars/11433&#34;&gt;whywaita Advent Calendar 2025&lt;/a&gt; 13日目の記事です。&lt;/p&gt;&#xA;&lt;h2 id=&#34;背景&#34;&gt;背景&lt;/h2&gt;&#xA;&lt;p&gt;近年はLLMでコーディングするためのCLIツールが増えてきましたね。&#xA;便利な一方で、試しに入れては消し、別の手段でまた入れ……を繰り返していると、「このコマンド、結局どのパッケージマネージャで入れたんだっけ？」がすぐ分からなくなります。&lt;/p&gt;&#xA;&lt;p&gt;自分は今まで、 &lt;code&gt;whereis&lt;/code&gt; コマンドでパスを調べてパスの雰囲気からパッケージマネージャを推測していました。&#xA;ただ、毎回同じことをやっているだけなので、自動化できそうです。&#xA;そこで今回、「そのコマンドはどこ由来か」を推定して表示する &lt;code&gt;why&lt;/code&gt; コマンドを作って公開しました。&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-は何をするのか&#34;&gt;&lt;code&gt;why&lt;/code&gt; は何をするのか&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;why &amp;lt;command&amp;gt;&lt;/code&gt; で、コマンドのパスとそのパスから推定したパッケージマネージャを表示します。&#xA;やっていることは簡単で、&lt;code&gt;PATH&lt;/code&gt; に含まれるコマンドのシンボリックリンクを辿って、実体パスを取得して、そのパスから事前に設定したルールに従ってパッケージマネージャを推定します。&#xA;文字列処理かつバイナリ配布の容易なNimでLLMを利用して作成しました。&#xA;&lt;a href=&#34;https://github.com/akriaueno/why-cli&#34;&gt;リポジトリ&lt;/a&gt; はこちら。&lt;/p&gt;&#xA;&lt;h2 id=&#34;インストール&#34;&gt;インストール&lt;/h2&gt;&#xA;&lt;p&gt;Linux/macOSの場合は Homebrew からインストールできます。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;brew install akriaueno/tap/why&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;使い方&#34;&gt;使い方&lt;/h2&gt;&#xA;&lt;p&gt;whyの第一引数にコマンド名を指定します。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;why &amp;lt;command&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;例&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ why node&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Command:     node&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Provider:    Homebrew&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Origin Path: /home/linuxbrew/.linuxbrew/bin/node&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Real Path:   /home/linuxbrew/.linuxbrew/Cellar/node/25.2.1/bin/node&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ why codex&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Command:     codex&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Provider:    Homebrew&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Origin Path: /home/linuxbrew/.linuxbrew/bin/codex&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Real Path:   /home/linuxbrew/.linuxbrew/Caskroom/codex/0.72.0/codex-x86_64-unknown-linux-musl&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ why repomix&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Command:     repomix&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Provider:    Homebrew&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Origin Path: /home/linuxbrew/.linuxbrew/bin/repomix&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Real Path:   /home/linuxbrew/.linuxbrew/Cellar/repomix/1.9.1/libexec/lib/node_modules/repomix/bin/repomix.cjs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ why cursor&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Command:     cursor&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Provider:    apt/dpkg &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;cursor&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Origin Path: /usr/bin/cursor&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Real Path:   /usr/share/cursor/bin/cursor&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ why steam&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Hint: Command &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;steam&amp;#39;&lt;/span&gt; not found in PATH, but found &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;com.valvesoftware.Steam&amp;#39;&lt;/span&gt; in Flatpak.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Command:     steam&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Provider:    Flatpak&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Origin Path: /var/lib/flatpak/exports/bin/com.valvesoftware.Steam&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Real Path:   /var/lib/flatpak/app/com.valvesoftware.Steam/current/active/export/bin/com.valvesoftware.Steam&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ why why&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Checking self-identity...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Command:     why&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Provider:    Homebrew&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Origin Path: /home/linuxbrew/.linuxbrew/bin/why&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Real Path:   /home/linuxbrew/.linuxbrew/Cellar/why/0.1.4/bin/why&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;今後の展望&#34;&gt;今後の展望&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;依存関係の表示機能&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;npm why&lt;/code&gt; のようにコマンドが依存されているパッケージマネージャを表示する機能を追加したいと思います。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;同じコマンドが複数インストールされている場合の対応&#xA;&lt;ul&gt;&#xA;&lt;li&gt;現在は &lt;code&gt;PATH&lt;/code&gt; の先頭から順番に実体パスを取得しているので、複数インストールされている場合は先頭のものが表示されます。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;HomebrewのBottleに対応&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ビルドに2分程度かかってしまいます。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;最後に&#34;&gt;最後に&lt;/h2&gt;&#xA;&lt;p&gt;ぜひご利用ください。&#xA;何かご意見があれば、&lt;a href=&#34;https://github.com/akriaueno/why-cli/issues&#34;&gt;GitHub&lt;/a&gt; までお寄せください。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hugo に OpenTelemetry を追加してみる</title>
      <link>http://blog.akky.me/blog/20251211-add-otel-hugo/</link>
      <pubDate>Thu, 11 Dec 2025 23:53:00 +0900</pubDate>
      <guid>http://blog.akky.me/blog/20251211-add-otel-hugo/</guid>
      <description>&lt;p&gt;この記事は &lt;a href=&#34;https://qiita.com/advent-calendar/2025/otel&#34;&gt;OpenTelemetry Advent Calendar 2025&lt;/a&gt; 11日目の記事です。&lt;/p&gt;&#xA;&lt;h2 id=&#34;背景&#34;&gt;背景&lt;/h2&gt;&#xA;&lt;p&gt;このサイトは&lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt; を利用しており、OpenTelemetry を利用して計装してみたかったので、追加してみました。&#xA;トレースは &lt;a href=&#34;https://www.honeycomb.io/&#34;&gt;Hoenycomb&lt;/a&gt; に送信します。&#xA;ただし、フロントエンドに Honeycomb の API Key を設定するわけには行かないため、Cloudflare Workers をバックエンドとして利用してトレースを転送します。&lt;/p&gt;&#xA;&lt;h2 id=&#34;構成&#34;&gt;構成&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;フロントエンド(Hugo)に OpenTelemetry のスクリプトを追加する&lt;/li&gt;&#xA;&lt;li&gt;バックエンド(Cloudflare Workers)にトレースを送信して Honeycomb に転送する&lt;/li&gt;&#xA;&lt;li&gt;Honeycomb でトレースを確認する&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;手順&#34;&gt;手順&lt;/h2&gt;&#xA;&lt;h3 id=&#34;1-フロントエンドhugoに-opentelemetry-のスクリプトを追加する&#34;&gt;1. フロントエンド(Hugo)に OpenTelemetry のスクリプトを追加する。&lt;/h3&gt;&#xA;&lt;p&gt;Hugoの&lt;a href=&#34;https://gohugo.io/functions/js/build/&#34;&gt;JS.Build&lt;/a&gt;という機能を利用して、OpenTelemetryの計装スクリプトをフロントエンドに追加します。&#xA;バンドラはesbuildが兼ね備えているので、TypeScriptをそのまま記述してもビルドができます。&#xA;TypescriptとOpenTelemetryの依存関係を追加します。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm i -D -E typescript&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm i -E @opentelemetry/api &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    @opentelemetry/context-zone &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    @opentelemetry/exporter-trace-otlp-http &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    @opentelemetry/instrumentation-document-load&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    @opentelemetry/instrumentation-user-interaction &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    @opentelemetry/instrumentation-xml-http-request &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    @opentelemetry/resources &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    @opentelemetry/sdk-trace-web &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    @opentelemetry/semantic-conventions&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;TypeScriptの設定ファイルを作成します。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npx tsc --init&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Otel計装用のスクリプト document-load.ts を作成します。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir -p assets/js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;touch assets/js/document-load.ts&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;document-load.ts は以下のようになります。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Auto-Login Script for SonarCloud with GitHub Authentication</title>
      <link>http://blog.akky.me/blog/20241223-tampermonkey-sonarcloud-auto-login/</link>
      <pubDate>Mon, 23 Dec 2024 00:00:00 +0000</pubDate>
      <guid>http://blog.akky.me/blog/20241223-tampermonkey-sonarcloud-auto-login/</guid>
      <description>&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;&#xA;&lt;p&gt;This Tampermonkey script automatically handles the SonarCloud login process when you encounter authentication errors. It detects error pages and automatically initiates GitHub login, making the authentication process seamless.&lt;/p&gt;&#xA;&lt;h2 id=&#34;script&#34;&gt;Script&lt;/h2&gt;&#xA;&lt;p&gt;Create a new Tampermonkey script and paste the following code:&lt;/p&gt;&#xA;&lt;script src=&#34;https://gist.github.com/akriaueno/4dd997666d4fcfdca2b8ec8c67b5acb6.js&#34;&gt;&lt;/script&gt;&#xA;&#xA;&lt;h2 id=&#34;how-it-works&#34;&gt;How it Works&lt;/h2&gt;&#xA;&lt;p&gt;The script performs the following tasks:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Error Page Detection&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Waits for the error message &amp;ldquo;The requested project does not exist, or you have not authenticated with SonarQube Cloud&amp;rdquo;&lt;/li&gt;&#xA;&lt;li&gt;Automatically clicks the &amp;ldquo;Login&amp;rdquo; button when found&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;&lt;strong&gt;Login Page Handling&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Detects when redirected to the login page&lt;/li&gt;&#xA;&lt;li&gt;Automatically clicks the configured social authentication button (GitHub by default)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;&lt;strong&gt;Utilities&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;waitUntil&lt;/code&gt;: A utility function that waits for specific conditions to be met&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;findAndClick&lt;/code&gt;: Finds and clicks elements using XPath selectors&lt;/li&gt;&#xA;&lt;li&gt;Built-in timeout mechanism to prevent infinite loops&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;installation&#34;&gt;Installation&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Install the Tampermonkey browser extension&lt;/li&gt;&#xA;&lt;li&gt;Create a new script&lt;/li&gt;&#xA;&lt;li&gt;Copy and paste the provided code&lt;/li&gt;&#xA;&lt;li&gt;Save the script&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;configuration&#34;&gt;Configuration&lt;/h2&gt;&#xA;&lt;p&gt;The script includes two main configurable settings:&lt;/p&gt;</description>
    </item>
    <item>
      <title>激安中華miniPCでKubernetesクラスタを構築する</title>
      <link>http://blog.akky.me/blog/20231207-home-k8s-lab/</link>
      <pubDate>Thu, 07 Dec 2023 00:00:00 +0000</pubDate>
      <guid>http://blog.akky.me/blog/20231207-home-k8s-lab/</guid>
      <description>&lt;p&gt;この記事は &lt;a href=&#34;https://adventar.org/calendars/8553&#34;&gt;whywaita Advent Calendar 2023&lt;/a&gt; 7 日目の記事です。&lt;/p&gt;&#xA;&lt;p&gt;前日は &lt;a href=&#34;https://enoki.hatenablog.com/entry/2023/12/06/224550&#34;&gt;k_enoki さんの記事&lt;/a&gt; でした。&lt;/p&gt;&#xA;&lt;p&gt;whywaita さんといえば、インフラエンジニアのイメージがあります。&#xA;今どきのインフラエンジニアといえば、Kubernetes ですよね。そこで、今回は Kubernetes の勉強を兼ねて、自宅で Kubernetes を動かすための環境を構築してみました。&#xA;お金はあまりかけたくないが、クラウドでやっても面白くないので、激安中華 miniPC を使います。&lt;/p&gt;&#xA;&lt;h2 id=&#34;今回の環境&#34;&gt;今回の環境&lt;/h2&gt;&#xA;&lt;p&gt;Amazon で &lt;a href=&#34;https://www.amazon.co.jp/gp/product/B0C2HMDB74&#34;&gt;Beelink EQ12&lt;/a&gt; x 3 台と&lt;a href=&#34;https://www.amazon.co.jp/dp/B0BWMWFCSG&#34;&gt;Beelink S12 Pro&lt;/a&gt; x 1 台を購入しました。これを Kubernetes クラスタとして構築します。&#xA;スペックは CPU: Alder Lake 4 コア、メモリ: 16GB、SSD: 500GB NVME です。&#xA;これで 1 台 3 万円弱でした。激安ですね。&#xA;3 台の EQ12 は ワーカーノード、1 台の S12 Pro はコントロールプレーンとします。&lt;/p&gt;&#xA;&lt;h2 id=&#34;os-のインストール&#34;&gt;OS のインストール&lt;/h2&gt;&#xA;&lt;p&gt;まずは OS をインストールします。今回は Ubuntu Server 22.04 LTS をインストールしました。&#xA;PXE などでかっこよく自動インストールしたかったのですが、設定が大変そうだったので、手動で USB メモリを使ってインストールしました。&lt;/p&gt;</description>
    </item>
    <item>
      <title>gcloudのフィルタについて</title>
      <link>http://blog.akky.me/blog/20220928-gcloud-filter/</link>
      <pubDate>Wed, 28 Sep 2022 00:00:00 +0000</pubDate>
      <guid>http://blog.akky.me/blog/20220928-gcloud-filter/</guid>
      <description>&lt;h2 id=&#34;フィルタ可能なキーを探す&#34;&gt;フィルタ可能なキーを探す&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://cloud.google.com/sdk/gcloud/reference/topic/filters#term-1:~:text=Determine%20which%20fields%20are%20available%20for%20filtering&#34;&gt;ドキュメント&lt;/a&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcloud &amp;lt;サブコマンド&amp;gt; --format&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;yaml --limit&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;フィルタ&#34;&gt;フィルタ&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcloud &amp;lt;サブコマンド&amp;gt; --filter&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;lt;key&amp;gt;=&amp;lt;value&amp;gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;keyに&lt;code&gt;.&lt;/code&gt;や&lt;code&gt;/&lt;/code&gt;が含まれる場合はシングルクオートで囲む。&lt;/p&gt;&#xA;&lt;h2 id=&#34;複数フィルタ&#34;&gt;複数フィルタ&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://cloud.google.com/sdk/gcloud/reference/topic/filters#term-1:~:text=False%2C%20otherwise%20False.-,term%2D1%20AND%20term%2D2,-True%20if%20both&#34;&gt;ドキュメント&lt;/a&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcloud &amp;lt;サブコマンド&amp;gt; --filter&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;lt;key1&amp;gt;=&amp;lt;value1&amp;gt; AND &amp;lt;key2&amp;gt;=&amp;lt;value2&amp;gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Lock Gnome Screen via SSH</title>
      <link>http://blog.akky.me/blog/20220605-lock-gnome-screen-via-ssh/</link>
      <pubDate>Sun, 05 Jun 2022 02:30:43 +0900</pubDate>
      <guid>http://blog.akky.me/blog/20220605-lock-gnome-screen-via-ssh/</guid>
      <description>&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;&#xA;&lt;p&gt;I want to lock gnome-session(Desktop) with a user logged in via ssh.&lt;/p&gt;&#xA;&lt;h2 id=&#34;script&#34;&gt;Script&lt;/h2&gt;&#xA;&lt;p&gt;Save below script and execute it.&lt;/p&gt;&#xA;&lt;script src=&#34;https://gist.github.com/akriaueno/b83963eb4ce320ea21945720ac877c3d.js&#34;&gt;&lt;/script&gt;&#xA;&#xA;&lt;p&gt;There are two key points at line 10.&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-gnome-screensaver-command--l&#34;&gt;1. &lt;code&gt;gnome-screensaver-command -l&lt;/code&gt;&lt;/h3&gt;&#xA;&lt;p&gt;Execute &lt;code&gt;gnome-screensaver-command&lt;/code&gt; as GNOME logged in user.&lt;/p&gt;&#xA;&lt;h3 id=&#34;2-dbus_session_bus_address&#34;&gt;2. &lt;code&gt;DBUS_SESSION_BUS_ADDRESS&lt;/code&gt;&lt;/h3&gt;&#xA;&lt;p&gt;Set dbus environment varibale to execute &lt;code&gt;gnome-screensaver-command&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;reference&#34;&gt;Reference&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://askubuntu.com/questions/7776/how-do-i-lock-the-desktop-screen-via-command-line&#34;&gt;https://askubuntu.com/questions/7776/how-do-i-lock-the-desktop-screen-via-command-line&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://askubuntu.com/questions/707984/lock-screen-with-gnome-screensaver-command-as-root-from-etc-pm-sleep-d-script&#34;&gt;https://askubuntu.com/questions/707984/lock-screen-with-gnome-screensaver-command-as-root-from-etc-pm-sleep-d-script&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Growiの管理者パスワードを手動で変更する</title>
      <link>http://blog.akky.me/blog/20220328-change-growi-password-manually/</link>
      <pubDate>Mon, 28 Mar 2022 07:55:57 +0000</pubDate>
      <guid>http://blog.akky.me/blog/20220328-change-growi-password-manually/</guid>
      <description>&lt;h2 id=&#34;概要&#34;&gt;概要&lt;/h2&gt;&#xA;&lt;p&gt;Growiのログインパスワードを忘れてしまい、パスワードを変更しようとしたが自身が管理者だったためログインしてユーザのパスワードを変更することができない状況に陥った。&#xA;MongoDBに保存されているパスワードのハッシュ値を手動で書き換えることで解決した。&lt;/p&gt;&#xA;&lt;h2 id=&#34;手順&#34;&gt;手順&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;環境変数&lt;code&gt;PASSWORD_SEED&lt;/code&gt;を確認&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;docker-composeを用いている場合は&lt;code&gt;docker-compse.yml&lt;/code&gt;に書かれているので、その値を使う。&#xA;ここでは&lt;code&gt;changeme&lt;/code&gt;とする。&lt;/p&gt;&#xA;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;設定したいパスワードを決める&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;ここでは&lt;code&gt;password024&lt;/code&gt;とする。&lt;/p&gt;&#xA;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;パスワードのハッシュ値を計算する&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/weseek/growi/blob/60b9769b3a8081ce0567eba54223771f13028450/packages/app/src/server/models/user.js#L131&#34;&gt;growiのコード&lt;/a&gt;を参考に計算する。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;node&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;hasher&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;crypto&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;createHash&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;sha256&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;undefined&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;hasher&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;update&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;changeme&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password024&amp;#39;&lt;/span&gt;);  &lt;span style=&#34;color:#75715e&#34;&gt;// &amp;#39;PASSWORD_SEEDの値&amp;#39; + &amp;#39;設定したいパスワード&amp;#39;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Hash&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;_options&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;undefined&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  [&lt;span style=&#34;color:#a6e22e&#34;&gt;Symbol&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;kHandle&lt;/span&gt;)]&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;BaseObject&lt;/span&gt; {},&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  [&lt;span style=&#34;color:#a6e22e&#34;&gt;Symbol&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;kState&lt;/span&gt;)]&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; { [&lt;span style=&#34;color:#a6e22e&#34;&gt;Symbol&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;kFinalized&lt;/span&gt;)]&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt; }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;hasher&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;digest&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;hex&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;f2206eee5a5669a1028b4e4cf2c511056f6d5b576b7c05524b7750199bd64ce4&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;// パスワードのハッシュ値&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;4&#34;&gt;&#xA;&lt;li&gt;MongoDBのパスワードのハッシュ値を書き換える&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;growiデータベースのusersコレクションの当該ドキュメントを書き換える。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;mongo&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;growi&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;db&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;users&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;find&lt;/span&gt;({&lt;span style=&#34;color:#a6e22e&#34;&gt;email&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;admin@akky.me&amp;#34;&lt;/span&gt;});  &lt;span style=&#34;color:#75715e&#34;&gt;// パスワードを変更したいユーザのメールアドレスを指定&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;{ &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;_id&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ObjectId&lt;/span&gt;(...&lt;span style=&#34;color:#a6e22e&#34;&gt;略&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;db&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;users&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;update&lt;/span&gt;({&lt;span style=&#34;color:#a6e22e&#34;&gt;email&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;admin@akky.me&amp;#34;&lt;/span&gt;}, {&lt;span style=&#34;color:#a6e22e&#34;&gt;$set&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {&lt;span style=&#34;color:#a6e22e&#34;&gt;password&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;f2206eee5a5669a1028b4e4cf2c511056f6d5b576b7c05524b7750199bd64ce4&amp;#34;&lt;/span&gt;}});  &lt;span style=&#34;color:#75715e&#34;&gt;// 変更する&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;WriteResult&lt;/span&gt;({ &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;nMatched&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;nUpserted&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;nModified&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; })&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;updateの際に&lt;code&gt;$set&lt;/code&gt;を指定しないと元のドキュメントのpassword以外のフィールドが全て削除されてしまうので注意。&#xA;docker-composeを用いている場合は&lt;code&gt;docker-compose exec mongo mongo growi&lt;/code&gt;とかでMongoDBへログイン出来るかと思う。&lt;/p&gt;&#xA;&lt;p&gt;以上の手順を踏むとパスワード&lt;code&gt;password024&lt;/code&gt;でログインできるはずだ。&lt;/p&gt;</description>
    </item>
    <item>
      <title>CloudflareのDNSを利用しているドメインの証明書をcertbotで発行する</title>
      <link>http://blog.akky.me/blog/20220109-certbot-cloudflare-dns/</link>
      <pubDate>Sun, 09 Jan 2022 05:49:06 +0000</pubDate>
      <guid>http://blog.akky.me/blog/20220109-certbot-cloudflare-dns/</guid>
      <description>&lt;h2 id=&#34;概要&#34;&gt;概要&lt;/h2&gt;&#xA;&lt;p&gt;Cloudflare の DNS を利用しているドメインの証明書を certbot で発行する。&#xA;ワイルドカード証明書を発行する場合、certbot を使い DNS 認証(DNS-01)で DNS レコードを手で修正していたが、Cloudflare の API を利用すれば自動化できる。さらに&lt;code&gt;certbot-dns-cloudflare&lt;/code&gt;というプラグインにより簡単に設定できるので紹介する。&lt;/p&gt;&#xA;&lt;h2 id=&#34;api-トークンの取得と設定&#34;&gt;API トークンの取得と設定&lt;/h2&gt;&#xA;&lt;p&gt;Cloudflare の&lt;code&gt;My Profile&lt;/code&gt;の&lt;code&gt;APIトークン&lt;/code&gt;&amp;gt;&lt;code&gt;トークンを作成する&lt;/code&gt;&amp;gt;&lt;code&gt;ゾーン DNS を編集する&lt;/code&gt;を選択し API トークンを発行する。&#xA;以下は設定例。&#xA;&lt;img src=&#34;http://blog.akky.me/img/cloudflare_api_token.png&#34; alt=&#34;cloudflare-api.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;発行した API トークンを含むクレデンシャルファイルを適当な場所に作成する。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo mkdir /etc/letsencrypt/cloudflare&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo vim /etc/letsencrypt/cloudflare/akky.me.ini&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dns_cloudflare_api_token&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&amp;lt;発行したAPIトークン&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo chmod &lt;span style=&#34;color:#ae81ff&#34;&gt;700&lt;/span&gt; /etc/letsencrypt/cloudflare&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo chmod &lt;span style=&#34;color:#ae81ff&#34;&gt;600&lt;/span&gt; /etc/letsencrypt/cloudflare/akky.me.ini&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;certbot-のインストール&#34;&gt;certbot のインストール&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://certbot.eff.org/instructions/&#34;&gt;公式&lt;/a&gt;の手順に従う。&#xA;今回は Web サーバが Nginx，OS が Debian buster なので snap を使ってインストールする手順が表示された。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install snapd &lt;span style=&#34;color:#75715e&#34;&gt;# snapが入ってなければ&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo snap install core; sudo snap refresh core&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo snap install --classic certbot&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo ln -s /snap/bin/certbot /usr/bin/certbot&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;プラグインのインストール&#34;&gt;プラグインのインストール&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;certbot-dns-cloudflare&lt;/code&gt;プラグインをインストールする。&lt;/p&gt;</description>
    </item>
    <item>
      <title>自己紹介</title>
      <link>http://blog.akky.me/about-me/</link>
      <pubDate>Sun, 05 Dec 2021 12:50:55 +0000</pubDate>
      <guid>http://blog.akky.me/about-me/</guid>
      <description>&lt;h2 id=&#34;私について&#34;&gt;私について&lt;/h2&gt;&#xA;&lt;p&gt;Webアプリケーションを開発しています。TypeScript/Elixir/Python/Shell Scriptを使うことが多いです。&#xA;最近の興味はLLMを用いて良いコードを書くことです。&#xA;&lt;a href=&#34;https://u-rth.com/&#34;&gt;Urth株式会社&lt;/a&gt;でエンジニアとして働いています。&lt;/p&gt;&#xA;&lt;h2 id=&#34;リンク集&#34;&gt;リンク集&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/akriaueno&#34;&gt;GitHub&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; (&lt;a href=&#34;https://x.com/__akky&#34;&gt;https://x.com/__akky&lt;/a&gt;__)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;趣味について&#34;&gt;趣味について&lt;/h2&gt;&#xA;&lt;h3 id=&#34;趣味1-インフラ構築保守&#34;&gt;趣味1: インフラ構築・保守&lt;/h3&gt;&#xA;&lt;p&gt;以下は自宅システムで用いているマシンの紹介です。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;スイッチ: &lt;a href=&#34;https://mikrotik.com/product/crs309_1g_8s_in&#34;&gt;CRS309-1G-8S+IN&lt;/a&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;10Gbpsの回線を活用するために使用しています。&lt;/li&gt;&#xA;&lt;li&gt;安い！&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;ルータ: Ubuntu Server 24.04 LTS&#xA;&lt;ul&gt;&#xA;&lt;li&gt;市販の10Gbpsのルータを買っても面白くないので、自作しました。&lt;/li&gt;&#xA;&lt;li&gt;Neteplanとnftablesを使用しています。&lt;/li&gt;&#xA;&lt;li&gt;NICはMellanox ConnectX-3 10Gbpsをヤフオクで買いました。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;趣味2-ゲーム&#34;&gt;趣味2: ゲーム&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://store.steampowered.com/app/1158310/Crusader_Kings_III/&#34;&gt;Crusader Kings III&lt;/a&gt;&#xA;中世ヨーロッパの王朝を繁栄させるゲームです。このゲームが他の戦略系シミュレーションゲームと異なるのは、プレーヤーが操作しているキャラクター（君主）が死ぬと王位継承権一位のキャラクターに操作対象が移ることです。世継ぎのことも考えながらプレイする必要があるので、君主の大変さが分かり面白いです。&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>正規表現でマッチしたグループを複数抽出する</title>
      <link>http://blog.akky.me/blog/20210723-shell-extract-match/</link>
      <pubDate>Fri, 23 Jul 2021 19:14:19 +0000</pubDate>
      <guid>http://blog.akky.me/blog/20210723-shell-extract-match/</guid>
      <description>&lt;h2 id=&#34;概要&#34;&gt;概要&lt;/h2&gt;&#xA;&lt;p&gt;正規表現でマッチしたグループを複数抽出する場合はsedを使うと良い．グループが1つの場合はgrepでも&lt;code&gt;-oP&lt;/code&gt;と&lt;code&gt;\K&lt;/code&gt;で抽出できるが，グループが複数あるとできない．&lt;/p&gt;&#xA;&lt;h2 id=&#34;コード&#34;&gt;コード&lt;/h2&gt;&#xA;&lt;p&gt;i番目のグループ(&lt;code&gt;()&lt;/code&gt;で囲まれた部分)を\iで置換する．&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sed -r &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&amp;#39;&lt;/span&gt;s/&amp;lt;正規表現&amp;gt;/&lt;span style=&#34;color:#ae81ff&#34;&gt;\i&lt;/span&gt;/g&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;例&#34;&gt;例&lt;/h2&gt;&#xA;&lt;p&gt;vncのポート番号とpidを抽出する例&lt;/p&gt;&#xA;&lt;h3 id=&#34;sed&#34;&gt;sed&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ss -ltp | grep vnc &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LISTEN    &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;         &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;                  0.0.0.0:5901             0.0.0.0:*        users:&lt;span style=&#34;color:#f92672&#34;&gt;((&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Xtigervnc&amp;#34;&lt;/span&gt;,pid&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;3193,fd&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;7&lt;span style=&#34;color:#f92672&#34;&gt;))&lt;/span&gt;                                            &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LISTEN    &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;         &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;                  0.0.0.0:5902             0.0.0.0:*        users:&lt;span style=&#34;color:#f92672&#34;&gt;((&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Xtigervnc&amp;#34;&lt;/span&gt;,pid&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;4404,fd&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;7&lt;span style=&#34;color:#f92672&#34;&gt;))&lt;/span&gt;                                            &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LISTEN    &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;         &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;                  0.0.0.0:5903             0.0.0.0:*        users:&lt;span style=&#34;color:#f92672&#34;&gt;((&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Xtigervnc&amp;#34;&lt;/span&gt;,pid&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;4453,fd&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;7&lt;span style=&#34;color:#f92672&#34;&gt;))&lt;/span&gt;                                            &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LISTEN    &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;         &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;                     &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;::&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;:5901                &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;::&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;:*        users:&lt;span style=&#34;color:#f92672&#34;&gt;((&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Xtigervnc&amp;#34;&lt;/span&gt;,pid&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;3193,fd&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;8&lt;span style=&#34;color:#f92672&#34;&gt;))&lt;/span&gt;                                            &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LISTEN    &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;         &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;                     &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;::&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;:5902                &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;::&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;:*        users:&lt;span style=&#34;color:#f92672&#34;&gt;((&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Xtigervnc&amp;#34;&lt;/span&gt;,pid&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;4404,fd&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;8&lt;span style=&#34;color:#f92672&#34;&gt;))&lt;/span&gt;                                            &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LISTEN    &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;         &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;                     &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;::&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;:5903                &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;::&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;:*        users:&lt;span style=&#34;color:#f92672&#34;&gt;((&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Xtigervnc&amp;#34;&lt;/span&gt;,pid&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;4453,fd&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;8&lt;span style=&#34;color:#f92672&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ss -ltp | grep vnc | sed -r &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;s/^.*:([0-9]+).*pid=([0-9]+).*$/\1 \2/&amp;#39;&lt;/span&gt; | sort -u&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;5901&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3193&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;5902&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4404&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;5903&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4453&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;うまくいく．&lt;/p&gt;&#xA;&lt;h3 id=&#34;grep&#34;&gt;grep&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ss -ltp | grep vnc | grep -oP &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;:\K(\d+).*pid=\K(\d+)&amp;#39;&lt;/span&gt; | sort -u&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3193&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;4404&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;4453&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最後にマッチした部分のみが抽出されてしまう．&lt;/p&gt;&#xA;&lt;h2 id=&#34;参考&#34;&gt;参考&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://unix.stackexchange.com/questions/13466/can-grep-output-only-specified-groupings-that-match&#34;&gt;https://unix.stackexchange.com/questions/13466/can-grep-output-only-specified-groupings-that-match&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://qiita.com/koara-local/items/2911bd81df2420a420ad&#34;&gt;https://qiita.com/koara-local/items/2911bd81df2420a420ad&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
  </channel>
</rss>
